MySQL-MHA高可用及读写分离

时间:2020-05-30
本文章向大家介绍MySQL-MHA高可用及读写分离,主要包括MySQL-MHA高可用及读写分离使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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;

原文地址:https://www.cnblogs.com/opesn/p/12994075.html