MHA原理分析
mysql复制是个异步过程,当主库上的日志还没来及传到从库上时主库发生crash容易导致主从数据不一致,例如mysql crash,os crash,掉电等,这时便引出了MHA技术。
安装基本环境介绍:一主一从
Mha manager & slave | test2 | 192.168.1.115 |
Master | test1 | 192.168.1.114 |
vip | 192.168.1.100 |
思考:MHA manager 为什么要放到slave上。
为实验方便将防火墙关闭:
[root@test1 ~]# service iptables stop && setenforce 0
[root@test2 ~]# service iptables stop && setenforce 0
1.两台服务器建立key信任:
[root@test1 ~]# ssh-keygen
[root@test1 ~]# cd ~/.ssh/
[root@test1 .ssh]# cat id_rsa.pub >> authorized_keys
[root@test1 .ssh]# chmod 600 *
[root@test1 .ssh]# scp * 192.168.1.115:/root/.ssh/
2.创建复制账号和mha_manager监控账号:
root@test1:mysql3306.sock [(none)]>grant replication slave on *.* to 'zhangshuo' identified by 'zhangshuo';
root@test1:mysql3306.sock [(none)]>grant all privileges on *.* to 'mysql'@'%' identified by 'mysql';
root@test1:mysql3306.sock [(none)]>flush privileges;
3.搭建主从复制结构。
4.使用epel源解决依赖关系:yum install epel-release -y , yum -y localinstall mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm,在一主一从的结构中建议两个节点都要安装manager,node包。安装文件可从https://code.google.com/p/mysql-master-ha/wiki/Downloads下载。
5.主从Mha配置相同,如下:
配置文件:
更多参数详解请看http://wubx.net/mha-parameters/
6.主库上启动vip :192.168.1.100对外提供服务
[root@test1 masterha]# sh init_vip.sh
7.检测ssh和复制是否ok
[root@test2 masterha]# masterha_check_repl --global-conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf
[root@test2 masterha]# masterha_check_ssh --global-conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf
8.启动masterha_manager监控master server,如果狗带就进行切换。
模拟master mysqld crash 并分析mha切换过程
[root@test1 debug]# /usr/local/mysql/bin/mysqladmin -S /tmp/mysql3306.sock shutdown
vip成功漂移到test2。
mha_manager调用save_binary_logs到master上找到比slave多的日志并在master生成以slave机器名为前缀的增量日志。
4次尝试ssh master
确定master Dead并检查所有在线的从库
vip切换
检查所有slave 的binary log file/position 同步位置是否与master_bin_log位置一致,若不一致将save_binary_logs生成的增量日志 scp到slave,然后在slave调用mysqlbinlog做日志重放,实现所有slave数据一致。
选举新master
在新master上做show master status动作,告诉所有从库从这里开始复制。
最后生成故障接管报告。
mha处理一主两从主库宕机时会找到同步靠前的节点,从relay log中把差异数据提取出来补给同步靠后的节点,从而达到节点数据一致。