mysql 第八章 高可用MHA
一. MHA原理(Failover如何实现过程) ***
1. MHA通过masterha_manger脚本启动MHA的功能.
2. 在manager启动之前,会自动检查ssh互信(masterha_check_ssh)和主从状态(masterha_check_repl)
3. MHA-manager 通过 masterha_master_monitor脚本(每隔ping_interval秒)
4. masterha_master_monitor探测主库3次无心跳之后,就认为主库宕机了.
情况一: SSH能连,调用 save_binary_logs脚本,立即保存缺失部分的binlog到各个从节点,恢复
情况二: SSH无法连接,调用 apply_diff_relay_logs 脚本,计算从库的relaylog的差异,选择 relay_logs多的为主
5. 进行选主算法:
算法一: 读取配置文件中是否有强制选主的参数?
candidate_master=1 强制选主
check_repl_delay=0 不检查repl_log执行情况
算法二: 自动判断所有从库的日志量.将最接近主库数据的从库作为新主.
算法三: 按照配置文件先后顺序的进行选新主.
二. 注意事项 *****
1. MHA 所有节点 mysql的server_id 不能相同
2. 所有节点安装mysql, 配置关键程序软连接
3.所有节点必须开启gitd,必须开启二进制模式
4.所有节点互信
5.主库常见建mha用户
6. binlog_server 端会影响主库性能,只有事务写入到从库的磁盘才算commit
6. 软件安装
6.1 所有节点安装节点软件包 mysql(服务端) ,mha4mysql-node-0.56-0.el6.noarch.rpm等
6.2 Manager端软件安装 mysql(客户端端), mha4mysql-manager-0.56-0.el6.noarch.rpm等等
三.主库down 后,恢复主从流程 *****
1. 检查各个节点mysql是否启动
2.检查新的主是谁,查看vip是否在新的主, 然后在读写分离服务器下线主库的读权限
2. 从库重新 chan master to ,然后在读写分离服务器上线从库的的读权限
3. binglog_server 删除了,重新mysqlbinlog新的主
4. 修改配置文件
5. 启动
四. 构建MHA
1.准备节点
1.1 一主二从,且开启主从
1.2 一台binglog_server服务器
1.3 一台manger服务器
2.全部配置关键程序软连接
ln -s /application/mysql/bin/mysql /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql /usr/bin/mysql
3.全部护发公私秘钥对
3.1主库生成密钥对
参考ssh
3.2 主库分发公钥到从库
参考ssh
3.3 主库免交互推送私钥(主库拥有私钥,从库有公钥才行)
for num in {1..4};do rsync -avz /root/.ssh 10.0.0.$num:/root/ -e "ssh -o StrictHostKeyChecking=no"; done
3.4 测试
for num in {1..4};do ssh "-o StrictHostKeyChecking=no" 10.0.0.$num date;done
4.全部节点安装软件包
cp /server/tools/MH* /mnt
cd /mnt&&unzip MH*
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rp
5. master主库中创建VIP,创建mha需要的用户,从库会自动同步
mysql -S /data/3306/mysql.sock -e "create user mha@'10.0.0.%' identified by '123';"
mysql -S /data/3306/mysql.sock -e "grant all privileges on *.* to mha@'10.0.0.%';"
mysql -S /data/3306/mysql.sock -e "show grants for mha@'10.0.0.%';"
ifconfig eth0:1 10.0.0.55/24
6.额外的数据补偿(binlog_server):#找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启
mkdir -p /data/3306/binlog_server/binlog
chown -R mysql.mysql /data/
拉取主库binlog日志
cd /data/3306/binlog_server/ &&\
mysqlbinlog -R --host=10.0.0.1 --user=mha --password=123 --raw --stop-never mysql_3306_bin.000001 &
7. Manager端软件安装(db03)
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
cd /mnt &&rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
8.Manager端VIP飘逸脚本
cp /mnt/master_ip_failover /usr/local/bin/master_ip_failover
vim /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
dos2unix /usr/local/bin/master_ip_failover
chmod +x /usr/local/bin/master_ip_failover
(7)Manager端email 发送脚本
cd /mnt &&unzip email*
cp -a /mnt/email /usr/local/bin/
chmod +x /usr/local/bin/email/*
sed -i s#g_lee0916@126.com#liuxd13320127589@163.com#g /usr/local/bin/email/testpl
sed -i s#smtp.126.com:25#smtp.163.com:25#g /usr/local/bin/email/testpl
sed -i s#g_lee0916#liuxd13320127589#g /usr/local/bin/email/testpl
sed -i s#ybbhlkg1dddf#JZBYMGXFXMQZFDYQ#g /usr/local/bin/email/testpl
sed -i s#22654481@qq.com#1426477600@qq.com#g /usr/local/bin/email/testpl
9. Manager端配创建置文见\日志文件(db03)
mkdir -p /etc/mha && mkdir -p /var/log/mha/zhihu
cat > /etc/mha/zhihu.cnf <
[server default]
manager_log=/var/log/mha/zhihu/manager
manager_workdir=/var/log/mha/zhihu
#主库的二进制位置点
master_binlog_dir=/data/3306/binlog
user=mha
password=123
#每2秒检测一次主从健康,默认3此检测不成功就切换
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
#vip 飘逸脚本需要执行权限
master_ip_failover_script=/usr/local/bin/master_ip_failover
#email 告警脚本
report_script=/usr/local/bin/email/send
[server1]
#从51到52到53这个顺序主从切换,即51当了,52为主库
hostname=10.0.0.1
port=3306
[server2]
hostname=10.0.0.2
port=3306
[server3]
hostname=10.0.0.3
port=3306
#serverbinlog服务器,只提供二进制日志不参选主机竞选机制
[binlog1]
no_master=1
hostname=10.0.0.4
master_binlog_dir=/data/3306/binlog_server/
EOF
10 . MHA 命令集合 ***
10.1 互信检查 主从状态检查
masterha_check_ssh --conf=/etc/mha/zhihu.cnf
masterha_check_repl --conf=/etc/mha/zhihu.cnf
10.2 开启MHA(db03):
nohup masterha_manager --conf=/etc/mha/zhihu.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/zhihu/manager.log 2>&1 &
#manager.log:启动日志
# --remove_dead_master_conf: 主从切换后,自动把坏的主库从配置文件注销
#--ignore_last_failover 忽略切换时间间隔,可以立即切换
10.3 看状态
masterha_check_status --conf=/etc/mha/zhihu.cnf
10.4 #关闭
masterha_stop --conf=/etc/mha/zhihu.cnf
10.5 MHA 脚本集
MHA软件的构成(perl语言)
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工具包主要包括以下几个工具:这些工具通常由MHA Manager的脚本触发,无需人为操作
mha4mysql-node-0.56-0.el6.noarch.rpm
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs 清除中继日志(不会阻塞SQL线程)