MHA-altas-mysql高可用

MHA-altas-mysql高可用

标签(空格分隔): linux服务


文章目录

#1. MHA简介

  • MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件,能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行切换过程中,最大程度上保证数据库的一致性,以达到真正意义上的高可用。

  • MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独立部署在一*立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。

  • 工作流程

  1. 从宕机崩溃的master保存二进制日志事件(binlog events);
  2. 识别含有最新更新的slave;
  3. 应用差异的中继日志(relay log)到其他的slave;
  4. 应用从master保存的二进制日志事件(binlog events);
  5. 提升一个slave为新的master;
  6. 使其他的slave连接新的master进行复制;

#2. MHA环境准备
##2.1 基础环境配置

  • 实验需要三台服务器,基于centos6.5版本
  • 在三台机/etc/hosts都要做好映射,如下:
    192.168.200.184 mysql-master
    192.168.200.185 mysql-master-A
    192.168.200.183 mysql-master-B
  • 关闭selinux和iptables

##2.2 GTID介绍

  • GTID:(Global Transaction)全局事务标识符:是一个唯一的标识符,它创建并与源服务器(主)上提交的每个事务相关联。此标识符不仅对其发起的服务器是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间都有1对1的映射
  • GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增
  • 支持多线程(每个库每个独立线程);自动找点进行主从复制;把主从相关信息记录在table中,而不像原来记录在文件中;支持延迟复制

##2.3 安装mysql-5.6

#安装依赖
yum -y install ncurses-devel libaio
    
#二进制安装mysql
tar xf mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.6.17-linux-glibc2.5-x86_64 /usr/local/mysql
    
#初始化mysql
useradd -M -s /sbin/nologin mysql
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/

#修改配置文件及启动脚本
/bin/cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    
#加入开机自启并启动,修改mysql-root密码
ln -s /usr/local/mysql/bin/* /usr/local/bin/
chkconfig --add mysqld
/etc/init.d/mysqld start
mysqladmin -uroot password '123123'

##2.3 配置基于GTID的主从复制

  • 先决条件:主从都开启binlog日志,主从库server-id不同,主从库都有主从复制用户

###2.3.1 修改配置文件

修改配置文件为以下内容:
cat /etc/my.cnf

[client]
socket = /usr/local/mysql/data/mysql.sock

[mysqld]
#禁止自动删除relay log日志
relay_log_purge         = 0

#开启GTID功能
gtid_mode               = ON
log_slave_updates
enforce_gtid_consistency

lower_case_table_name   = 1
default-storage-engine  = InnoDB
port                    = 3306
datadir                 = /usr/local/mysql/data
character-set-server    = utf8
socket                  = /usr/local/mysql/data/mysql.sock

#开启binlog日志,设置每台server_id都不一样
log_bin                 = mysql-bin
server_id               = 1

innodb_buffer_pool_size = 200M
slave-parallel-workers  = 8
thread_cache_size       = 600
back_log                = 600
slave_net_timeout       = 60
max_binlog_size         = 512M
key_buffer_size         = 8M
query_cache_size        = 64M
join_buffer_size        = 2M
sort_buffer_size        = 2M
query_cache_type        = 1
thread_stack            = 192K

三台都修改,注意只有server-id不同,完成后,重启数据库
/etc/init.d/mysqld restart

###2.3.2 创建主从复制用户,开启主从复制
登录数据库后,进行以下操作:

#创建主从用户,查看是否正常,三台都创建,不然MHA测试主从正常会出错,也可以通过数据全备后实现,主从库的账号系统需要一致
grant replication slave on *.* to rep@'192.168.200.%' identified by '123123';
show grants for rep@'192.168.200.%';

#查看GTID是否开启,两项模式为ON则开启成功,所有主从库都需要开启,不开的库,无法正常主从复制
show global variables like '%gtid%';

#在两台从库上录入主库信息
CHANGE MASTER TO MASTER_HOST='192.168.200.184', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123123';

#在两台从库上开启主从,并查看状态:
start slave;
show slave status\G
#出现两个yes为成功

###2.3.3 关于主从同步错误的解决办法

  • 当 BIN-LOG 里面出现 SQL 级别错误导致主从不能同步的时候,可以用下面方法掠过该错误语句行,继续同步::
    关闭主从复制后,跳过指针,会出现一个问题:
    stop slave;
    set global sql_slave_skip_counter=1;
    错误提示:
    ERROR 1858 (HY000): sql_slave_skip_counter can not be set when theserver is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transactionthat you want to skip, generate an empty transaction with the same GTID as thetransaction
    解决方法:
    在主库上,查看关于GTID的UUID:
    show global variables like '%gtid%';
    gtid_executed为64f20ec6-a873-11e9-ad4b-000c29eda4cb
    然后在从库上:
    stop slave;
    show slave status\G
    记录下面这条信息(记录主库相同UUID后面的数,此处是1-9)
    Executed_Gtid_Set: 64f20ec6-a873-11e9-ad4b-000c29eda4cb:1-9
    重置主库状态信息:
    reset master;
    跳过报错的GTID的位置,只需要在1-9的基础加1即可;
    set global gtid_purged='64f20ec6-a873-11e9-ad4b-000c29eda4cb:1-10';
    重新录入主库信息:
    CHANGE MASTER TO MASTER_HOST=‘192.168.200.184’, MASTER_PORT=3307, MASTER_AUTO_N=1, MASTER_USER=‘rep’, MASTER_PASSWORD=‘123123’;
    开启主从同步,查看状态是否正常,若还是提示同样问题,可能需要跳过多次GTID位置,方法相同,多试几次:
    start slave;
    show slave status\G

#3. 部署MHA
##3.1 环境准备
三台机都需要配置以下操作

#安装依赖,节点包:
yum -y install perl-DBD-MySQL
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

#登录数据库,创建mha管理用户
grant all privileges on *.* to mha@'192.168.200.%' identified by '123123';
#主库创建,从库会复制

##3.2 将mysql-slave-B部署为管理节点
###3.2.1 安装manager管理节点包
#使用阿里云源+epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y clean all
yum makecache

#安装manager依赖包
yum -y install perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

#安装manager包
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

###3.2.2 编辑管理节点相关配置
#创建配置文件目录及日志目录
mkdir -p /etc/mha
mkdir -p /var/log/mha/mha1

#创建配置文件:
vim /etc/mha/mha1.conf

#内容为下,每行最后不要有空格:
[server default]
manager_log=/var/log/mha/mha1/manager
manager_workdir=/var/log/mha/mha1
#指定binlog存放路径的全局变量,优先级低于binlog日志模块
master_binlog_dir=/usr/local/mysql/data
#指定启用VIP命令的命令的路径
master_ip_failover_script=/usr/local/bin/master_ip_failover

#管理用户账号密码
user=mha
password=123123
#存活检查的间隔时间
ping_interval=2
#主从账号密码,用于ssh连接的用户
repl_password=123123
repl_user=rep
ssh_user=root

#放在server模块下,就是设置候选master
#candidate_master=1
#忽略relay日志的复制延迟,配合上个参数使用
#check_repl_delay=0

[server1]
hostname=192.168.200.184
port=3306

[server2]
hostname=192.168.200.185
port=3306

[server3]
hostname=192.168.200.183
port=3306

[binlog1]
no_master=1
hostname=192.168.200.183
master_binlog_dir=/data/mysql/binlog/

##3.3 配置ssh信任
三台机都创建密钥,并且给自己和另外两台机都分发公钥

ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa

ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.200.183
ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.200.184
ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.200.185

##3.4 启动测试

  • ssh连接测试,指定测试的配置文件(实例)
    masterha_check_ssh --conf=/etc/mha/mha1.cnf
    提示信息如下为成功:
    All SSH connection tests passed successfully
  • 主从复制测试
    masterha_check_repl --conf=/etc/mha/mha1.cnf
    提示信息如下为成功:
    MySQL replication health is OK

##3.5 启动MHA
nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &

多enter几次,且ps -ef | grep perl查看是否成功开启

#4. 测试MHA自动切换主库
##4.1 测试主库切换

  • 在管理节点上,查看slave状态,此时显示主库为192.168.200.184,也就是原master

  • 关闭master上的mysqld服务

  • 再查看管理节点上的slave状态,如master信息变为192.168.200.185则切换成功

##4.2 MHA及日志说明

  • 主库宕机,发生切换时,mha配置文件信息相关模块会被删除,且后台的mha进程由于执行成功,会结束
  • manageri日志记录了详细过程,也包含了往从库录入的新主库相关信息,可以用于故障节点恢复用

##4.3 测试故障还原

  • 将宕机的mysqld服务重新启动
  • 登录mysql,录入新主库信息,并开启主从复制
    mysql -uroot -p123123
    CHANGE MASTER TO MASTER_HOST=‘192.168.0.52’, MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER=‘rep’, MASTER_PASSWORD=‘123123’;
    start slave;
    然后查看slave状态是否正确:
    show slave status\G
  • 补全管理节点上mha配置文件的删除部分
    [server1]
    hostname=192.168.200.184
    port=3306
  • 再启动mha进程,监控master,主从复制架构的状态

#5. 解决切换过程主库IP变更,日志丢失问题
##5.1 配置VIP漂移解决IP变更

  • 通过keepalived的方式,管理虚拟IP的漂移
  • 通过MHA自带脚本方式,管理虚拟IP的漂移

    #获取管理脚本master_ip_failover,yum安装是没有,源码安装才有,解压源码包就可以得到
    tar xf mha4mysql-manager-0.56.tar.gz
    cd mha4mysql-manager-0.56/samples/scripts/
    cp master_ip_failover /usr/local/bin/

    #自带的模板脚本有多处需要修改,这里我们可以使用现成的,修改几个参数:
    cp master_ip_failover /usr/local/bin/
    chmod +x /usr/local/bin/master_ip_failover

    vim /usr/local/bin/master_ip_failover
    #需要修改以下几项:
    my $vip = ‘192.168.200.60/24’; #定义VIP
    my $key = ‘0’; #定义网卡后缀数值
    my sshstartvip=&quot;/sbin/ifconfigeth0:ssh_start_vip = &quot;/sbin/ifconfig eth0:sshs​tartv​ip="/sbin/ifconfigeth0:key $vip"; #绑定VIP的命令,注意网卡名
    my sshstopvip=&quot;/sbin/ifconfigeth0:ssh_stop_vip = &quot;/sbin/ifconfig eth0:sshs​topv​ip="/sbin/ifconfigeth0:key down"; #关闭VIP的命令

    #还需要在mha配置文件中添加一行参数,指定启用VIP的命令的路径
    master_ip_failover_script=/usr/local/bin/master_ip_failover

  • 重启管理节点的mha进程
    pkill perl
    nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &
    若启动失败,需要进行mha的ssh测试和主从复制测试

##5.2 配置binlog-server备份服务器
防止主库宕机,binlog复制不及时的问题,此处把备份服务器和管理节点配置为一台

#修改管理节点mha配置文件,在全局binlog存放位置下插入:
master_ip_failover_script=/usr/local/bin/master_ip_failover

#并且在文件最后,添加新模块
[binlog1]
#添加binlog模块
no_master=1
#不允许切换为主
hostname=192.168.200.183
#存放IP
master_binlog_dir=/data/mysql/binlog/
#binlog存放位置优先级比全局的高,主库上的binlog日志会被复制到这个IP的这个目录下

然后进行日志拉取:

#创建存放目录并进入
mkdir -p /data/mysql/binlog/
cd /data/mysql/binlog/

#关闭主从切换进程,才能开启拉取日志进程,不然报错
#拉取主库binlog日志,指定从VIP拉取,从00001开始且stop-never
#开启拉取进程后,再开启主库切换
pkill perl

mysqlbinlog -R --host=192.168.200.60 --user=mha --password=123123 --raw --stop-never mysql-bin.000001 &

nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &

#6 源码安装mha方法
##6.1 安装node节点:
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Params-Validate perl-CPAN perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
tar xf mha4mysql-node-0.56.tar.gz -C /usr/src/
cd /usr/src/mha4mysql-node-0.56/
perl Makefile.PL
make && make install
##6.2 安装manager节点:
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Params-Validate perl-CPAN perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
tar xf mha4mysql-manager-0.56.tar.gz -C /usr/src/
cd /usr/src/mha4mysql-manager-0.56/
perl Makefile.PL
make && make install

#7 Atlas实现读写分离
##7.1 简介

  • 开发于MySQL官方退出的MySQL-proxy0.8.2版本基础之上,属于一个基于mysql协议的中间件

  • 主要功能:

  1. 读写分离,从库负载均衡
  2. IP过滤
  3. 自动分表
  4. DBA可平滑上下线DB,自动摘除宕机DB

##7.2 manager管理节点上安装配置Atlas
#安装:
rpm -ivh Atlas-2.2.1.e16.×86_64.rpm

#配置:先备份该配置文件,然后修改

cat -n /usr/local/mysql-proxy/conf/test.cnf | egrep -w "12|15|18|36|48"
12 proxy-backend-addresses = 192.168.200.60:3307
15 proxy-read-only-backend-addresses = 192.168.200.185:3307@1,192.168.200.183:3307@1
18 pwds = root:++gAN07C/Q0=,mha:++gAN07C/Q0=
30 log-level = error
36 sql-log = ON
45 proxy-address = 192.168.200.183:8888
48 admin-address = 192.168.200.183:5555

#其中,12行填写主库地址及端口,若配置了VIP填写VIP
15行填写从库地址,@后面的数字代表了负责均衡权重
18MySQL授权用户账号密码,密码使用/usr/local/mysql-proxy/bin/encrypt进行加密
30设置日志级别
36开启日志
45设置提供代理的监听端口为8888
48设置管理监听端口为5555

##7.3 数据库初始环境修改

  • 若管理节点上开启了mha进程和binlog拉取进程,先关闭
  • 修改管理节点mha配置文件
    将三个server的port都改为3307

  • 修改主从mysql库的监听端口,从配置文件上修改为3307,由于端口修改,需要修改从库的主从复制信息,在两台从库上,进行以下步骤:

    #关闭主从,重新写入信息,查看是否能正常同步
    stop slave;
    change master to master_host=‘192.168.200.184’,master_port=3306,master_auto_position=1,master_user=‘rep’,master_password=‘123123’;
    start slave;
    show slave status\G

##7.4 启动Atlas服务
#启动mysqlbinlog日志备份进程:
mysqlbinlog -R --host=192.168.200.184 --port=3307 --user=mha --password=123123 --raw --stop-never mysql-bin.000001 &

#启动mha管理进程:
nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &

#启动Atlas服务:
/usr/local/mysql-proxy/bin/mysql-proxd test start

#指定实例test启动(可以多实例)
netstat -antup | grep mysql0-proxy
#查看代理端口8888和管理端口5555是否开启

##7.5 登录Atlas管理端口
在管理节点上,登录管理端口
mysql -uuser -ppwd -P5555 -h 192.168.200.183
查看有的权限:
select * from help;
查看各个库的读写分离属性
select * from backends;
主库应该是rw,从库应该是ro,状态应该都是up,这里是平滑管理界面,可以在这里根据选项修改设置

##7.6 进行读写分离机负载均衡测试
在mysql-slave-A和msql-slave-B上分别创建库db02,db03

mysql -uroot -p123123 -P3307
create database db02;

这里在mysql-masters上登录,查看,是看不到db02或者db03的,从库的操作,不会被同步到主库,可以登录远程管理节点(Atlas配置机)来测试读负载均衡:

mysql -uroot -p123123 -h 192.168.200.183 -P8888
show databases;
#出现db02,db03轮换代表负载成功

此时,创建一个表test01,再查看

create database test01;
show databases;
#多查看几次,若在有db02和db03情况下,都看到了test01,代表这个创建表的SQL语句,是写进了主库,经过主从同步到了从库,所以能证实读写分离
上一篇:MySQL-MHA


下一篇:专职DBA-基于MHA高可用搭建MySQL读写分离架构-Atlas