一、MHA概述
MHA是由日本Mysql专家用Perl写的一套Mysql故障切换方案以保障数据库的高可用性,它能在0-30s之内实现主Mysql故障转移。
适用场景:
个人认为此系统非常适合一主挂多从的拓扑结构。故障转移后,所有的slave都能自动切换到新的master上去,而且主从保持一致。 在大规模的读写分离系统中,实用性非常强。 其他场景有待挖掘。
优点:
1)当master crash后,MHA自动识别slave间relay logevents的不同,然后应用到不同的slave,最终所有slave都同步。 2)在master挂载了很多slave的场景下,当master crash后,它能自动将slave切换到新的master上去,而不发生主从一致性问题。
缺点:
1)在线切换时,会阻塞写操作0.5-2秒。 2)故障转移后,原master会被踢出集群,需要重新部署才能加入集群。 3)故障转移中的原master和新master之间的数据一致性仍然依赖半同步。
二、MHA配置
1.架构规划
需要至少3台机器,机器部署如下:
主库:192.168.66.13 备选主库:192.168.66.67 从库:192.168.66.218 MONITOR:192.168.66.91
2.配置MySQL主从复制
这个依照相关文档配置即可 http://wiki.sa.inzwc.com/wiki/index.php/Linux下MYSQL主从复制配置
3.设置SSH公钥免密码登录
有篇文档写的非常好,也不再赘述了 http://blog.163.com/lgh_2002/blog/static/44017526201011333227161/ 需要配置所有机器的双向ssh免密码登录
4.安装node及manage
Node运行在每一台MySQL服务器上,而manage安装到MONITOR机器上即可,如果资源吃紧,也可以选其中一台机器充当MONITOR。 安装node:
shell> yum install perl-DBD-MySQL shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm
安装manage:
shell> yum install perl-DBD-MySQL shell> yum install perl-Config-Tiny shell> yum install perl-Log-Dispatch shell> yum install perl-Parallel-ForkManager shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.52-0.noarch.rpm
5.进行各种相关配置
1)在MONITOR节点配置全局配置文件
[server default] manager_workdir=/masterha/app1 manager_log=/masterha/app1/manager.log remote_workdir=/usr/local/mysql user=mha password=mha ssh_user=root repl_user=rep repl_password=slavepasswd ping_interval=3 shutdown_script="" master_ip_failover_script=/usr/local/bin/master_ip_failover master_ip_online_change_script=/usr/local/bin/master_ip_online_change_script report_script="" #multi_tier_slave=1 [server1] hostname=192.168.66.13 port=3312 master_binlog_dir=/data/mysqldata/3312/binlog/ #candidate_master=1 [server2] hostname=192.168.66.67 port=3308 master_binlog_dir=/data/mysqldata/3306/data/ candidate_master=1 [server3] hostname=192.168.66.218 master_binlog_dir=/data/mysqldata/3306/binlog/ no_master=1
2)在manage上检查ssh连接
命令:masterha_check_ssh --conf=/etc/app1.cnf
3)在manage上检查复制配置
命令:masterha_check_repl --conf=/etc/app1.cnf
6.启动MHA
1)启动MHA进程
命令:masterha_manager --conf=/etc/app1.cnf 在生产机上使用nohup使此进程后台运行
2)检查MHA状态
命令:masterha_check_status --conf=/etc/app1.cnf
3)停止MHA
命令:masterha_stop --conf=/etc/app1.cnf
7.failover的两种方式
1)全局配置文件
将如下脚本添加至master_ip_failover_script,并赋予可执行权限。使用其他脚本也是可以的。 #!/usr/bin/env php <?php $longopts = array( 'command:', 'ssh_user:', 'orig_master_host:', 'orig_master_ip:', 'orig_master_port:', 'new_master_host::', 'new_master_ip::', 'new_master_port::', ); $options = getopt(null, $longopts); if ($options['command'] == 'start') { $params = array( 'ip' => $options['new_master_ip'], 'port' => $options['new_master_port'], ); $string = '<?php return ' . var_export($params, true) . '; ?>'; file_put_contents('config.php', $string, LOCK_EX); } exit(0); ?>
2)使用VIP方式
软件推荐keepalived,具体实现方式不再赘述
三、MHA测试
kill掉或关掉主库上的mysql,观察其他主机上的变化,并观察MONITOR上的日志观察切换是如何进行的。
观察发现,kill掉主库后,备选主库接管成为新的master,其他slave指向新的master并开始同步。旧的master被踢出集群,manage管理进程关闭。并且重启进程后,旧的master不会再次提升为master。
四、总结
经过测试和分析,得出如下结论: MHA适合一主挂多从的场景,其故障转移后所有的slave指向新master的特性,可以很好的应用于读写分离的集群中。如果是一主多从并且写少读多,或者写入允许延迟的情况下,也可以启用半同步来保证数据的一致性。五、参考资料
1.官方文档 https://code.google.com/p/mysql-master-ha/
2.MySQL高可用性大杀器之MHA http://huoding.com/2011/12/18/139
3.mysql-mha高可用 http://blog.chinaunix.net/uid-28437434-id-3476641.html