Mysql高可用方案之MHA

一、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



上一篇:/tmp/mysql.sock无故丢失的故障分析


下一篇:阿里云TSDB在大数据集群监控中的方案与实战