MySQL-MHA高可用
MHA FailOver过程详解
#什么是Failover?
故障转移.
主库宕机一直到业务恢复正常的处理过程(自动)
#Failover让你实现怎么做?
(1) 快速监控到主库宕机
(2) 选择新主
(3) 数据补偿
(4) 解除从库身份
(5) 剩余从库和新主库构建主从关系
(6) 应用透明
(7) 故障节点自愈(待开发...)
(8) 故障提醒
架构工作原理
#MHA的Failover如何实现?
(1) masterha_manager 启动
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
调用: masterha_check_ssh, 检测所有节点的SSH的连通性和互信情况
调用: masterha_check_repl ,检测1主2从的主从状态
(2)监控
通过masterha_master_monitor,每隔(ping_interval=2)秒数,检查主库状态.
如果3-4次,还没连通,就认为主库宕机,进行failover
(3) 选主
1. 权重,candidate_master=1,优先选择带有权重的节点
2. 没有权重,根据日志量,选择最接近于主库的从库.
3. 没有权重,日志量相同,按照配置文件顺序.
(4) 数据补偿
1. 主库ssh能连,立即通过save_binary_logs,将各个从库缺失的部分binlog保存至/var/tmp,并立即补偿.
2. 主库ssh不能连,通过apply_diff_relay_logs ,自动计算从库relaylog的差异,并进行补偿
(5) 切换
通过masterha_master_switch进行切换
stop slave; 停止所有从库
reset slave all; 解除所有从库身份.
change master to..;start slave; 重构新主从
(6) Failover完成后,通过masterha_conf_host脚本将故障节点踢出集群, masterha_manager自杀.
#Manager额外参数介绍
(1) ping_interval=1
#设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover
(2) candidate_master=1
#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
(3)check_repl_delay=0
#默认情况下如果一个slave落后master 100M的relay logs的话,
MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
MHA软件构成
#Manager工具包主要包括以下几个工具:
mha4mysql-manager-0.56-0.el6.noarch.rpm
masterha_manger #启动MHA
masterha_check_ssh #检查MHA的SSH配置状况
masterha_check_repl #检查MySQL复制状况
masterha_master_monitor #检测master是否宕机
masterha_check_status #检测当前MHA运行状态
masterha_master_switch #控制故障转移(自动或者手动)
masterha_conf_host #添加或删除配置的server信息
#Node工具包主要包括以下几个工具:
mha4mysql-node-0.56-0.el6.noarch.rpm
这些工具通常由MHA Manager的脚本触发,无需人为操作
save_binary_logs #保存和复制master的二进制日志
apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs #清除中继日志(不会阻塞SQL线程)
MHA环境搭建
主机名 |
ip地址 |
sql01 |
10.0.1.110 |
sql02 |
10.0.1.120 |
sql03 |
10.0.1.130 |
#下载mha软件
mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
#节点规划
manager端: sql03
node端: sql01,sql02,sql03
1主2从,独立数据库实例
#MHA 配置过程细节说明
#软连接
[root@sql01 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@sql01 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
#配置各节点互信
[root@sql01 ~]# ssh-keygen
[root@sql01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.1.110
[root@sql01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.1.120
[root@sql01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.1.130
[root@sql01 ~]# ssh 10.0.1.110 hostname
sql01
[root@sql01 ~]# ssh 10.0.1.120 hostname
sql02
[root@sql01 ~]# ssh 10.0.1.130 hostname
sql03
[root@sql01 ~]#
#安装软件包(所有节点)
[root@sql01 ~]# yum install perl-DBD-MySQL -y
[root@sql01 ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
#在db01主库中创建mha需要的用户
mysql> grant all privileges on *.* to mha@'10.0.1.%' identified by 'mha';
#Manager软件安装(sql03)
[root@sql03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
[root@sql03 ~]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
#配置文件准备(sql03)
#创建配置文件目录
[root@sql03 ~]# mkdir -p /etc/mha
#创建日志目录
[root@sql03 ~]# mkdir -p /var/log/mha/app1
#编辑mha配置文件
[root@sql03 ~]# vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/binlog
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
[server1]
hostname=10.0.1.110
port=3306
[server2]
hostname=10.0.1.120
port=3306
[server3]
hostname=10.0.1.130
port=3306
[root@sql03 ~]# mkdir -p /data/binlog
[root@sql03 ~]# chown -R mysql:mysql /data
#状态检查(sql03)
[root@sql03 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
[root@sql03 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
#开启MHA(sql03):
[root@sql03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
#查看MHA状态
[root@sql03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:17274) is running(0:PING_OK), master:10.0.1.110
[root@sql03 ~]#
MHA 应用透明(vip)
#sql03:
[root@sql03 ~]# cp /root/master_ip_failover.txt /usr/local/bin/master_ip_failover
[root@sql03 ~]# vim /usr/local/bin/master_ip_failover
my $vip = '10.0.1.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
[root@sql03 ~]# dos2unix /usr/local/bin/master_ip_failover
[root@sql03 ~]# chmod +x /usr/local/bin/master_ip_failover
[root@sql03 ~]#
#更改manager配置文件:
[root@sql03 ~]# vim /etc/mha/app1.cnf
master_ip_failover_script=/usr/local/bin/master_ip_failover
#sql01:手工添加vip
[root@sql01 ~]# ifconfig eth0:1 10.0.1.55/24
#sql03 : 重启MHA
[root@sql03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
[root@sql03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
MHA 故障提醒
1. 参数:
report_script=/usr/local/bin/send
2. 准备邮件脚本
send_report
(1)准备发邮件的脚本(上传 email_2019-最新.zip中的脚本,到/usr/local/bin/中)
(2)将准备好的脚本添加到mha配置文件中,让其调用
[root@sql03 ~]# cp -a email/* /usr/local/bin/
[root@sql03 ~]# cd /usr/local/bin/
[root@sql03 bin]# chmod +x *
#修改manager配置文件,调用邮件脚本
[root@sql03 ~]# vim /etc/mha/app1.cnf
report_script=/usr/local/bin/send
#重启MHA
[root@sql03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
[root@sql03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
binlog_server
找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启,这里直接用的第二个slave(sql03)
[root@sql03 ~]# vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.1.130
master_binlog_dir=/data/mysql/binlog
#创建必要目录
[root@sql03 ~]# mkdir -p /data/mysql/binlog
[root@sql03 ~]# chown -R mysql:mysql /data
[root@sql03 ~]#
#拉取主库binlog日志
[root@sql03 binlog]# mysqlbinlog -R --host=10.0.1.110 --user=mha --password=mha --raw --stop-never mysql-bin.000005 &
注意:拉取日志的起点,需要按照目前主库正在使用的binlog为起点.
#重启MHA
[root@sql03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
[root@sql03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
故障处理
主库宕机,binlogserver 自动停掉,manager 也会自动停止。
处理思路:
1. 修故障库,并恢复1主2从
2. 修复配置文件
3. 修复binlogserver
5. 检查ssh和主从
6. 启动MHA
Atlas实现读写分离
1. Atlas 介绍
Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。
它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。
360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。
下载地址
https://github.com/Qihoo360/Atlas/releases
安装配置
[root@sql03 ~]# yum -y install Atlas-2.2.1.el6.x86_64.rpm
[root@sql03 ~]# cd /usr/local/mysql-proxy/conf/
[root@sql03 conf]# mv test.cnf test.cnf.bak
[root@sql03 conf]# vim test.cnf
[mysql-proxy]
admin-username = user
admin-password = pwd
proxy-backend-addresses = 10.0.1.55:3306
proxy-read-only-backend-addresses = 10.0.1.110:3306,10.0.1.120:3306
pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /usr/local/mysql-proxy/log
sql-log=ON
proxy-address = 0.0.0.0:33060
admin-address = 0.0.0.0:2345
charset=utf8
#启动atlas
[root@sql03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
atlas添加用户
#主库创建用户
mysql> grant select,update,insert on *.* to app@'10.0.1.%' identified by '123456';
#atlas添加用户
[root@sql03 ~]# /usr/local/mysql-proxy/bin/encrypt 123456
/iZxz+0GRoA=
[root@sql03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=,app:/iZxz+0GRoA=
[root@sql03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
[root@sql03 ~]# mysql -uapp -p123456 -h10.0.1.130 -P33060
Atlas基本管理
#连接管理接口
mysql -uuser -ppwd -h127.0.0.1 -P2345
#打印帮助:
mysql> select * from help;
#查询后端所有节点信息:
mysql> select * from backends;
#动态添加删除节点:
mysql> remove backend 3;
#动态添加节点:
mysql> add slave 10.0.1.120:3306;
#保存配置到配置文件:
mysql> save config;