提到MySQL高可用性,很多人会想到MySQL Cluster,亦或者Heartbeat+DRBD,不过这些方案的复杂性常常让人望而却步,与之相对,利用MySQL复制实现高可用性则显得容易很多,目前大致有MMM,PRM,MHA等方案可供选择:MMM是最常见的方案,可惜它问题太多;至于PRM,它还是个新项目,暂时不推荐用于产品环境,不过作为Percona的作品,它值得期待;如此看来目前只能选MHA了,好在经过DeNA大规模的实践应用证明它是个靠谱的工具。
安装:
作为前提条件,应先配置MySQL复制,并设置SSH公钥免密码登录。下面以CentOS为例来说明,最好先安装EPEL,不然YUM可能找不到某些软件包。
MHA由Node和Manager组成,Node运行在每一台MySQL服务器上,也就是说,不管是MySQL主服务器,还是MySQL从服务器,都要安装Node,而Manager通常运行在独立的服务器上,但如果硬件资源吃紧,也可以用一台MySQL从服务器来兼职Manager的角色。
安装Node:
shell> yum install perl-DBD-MySQL shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm |
安装Manager:
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 |
配置:
配置全局设置:
shell> cat /etc/masterha_default.cnf [server default] user=… password=… ssh_user=… |
配置应用设置:
shell> cat /etc/masterha_application.cnf [server_1] hostname=… [server_2] hostname=… |
注:MHA配置文件中参数的详细介绍请参考官方文档。
检查
检查MySQL复制:
shell> masterha_check_repl –conf=/etc/masterha_application.cnf |
检查SSH公钥免密码登录:
shell> masterha_check_ssh –conf=/etc/masterha_application.cnf |
实战
首先启动MHA进程:
shell> masterha_manager –conf=/etc/masterha_application.cnf |
注:视配置情况而定,可能会提示read_only,relay_log_purge等警告信息。
然后检查MHA状态:
shell> masterha_check_status –conf=/etc/masterha_application.cnf |
注:如果正常,会显示『PING_OK』,否则会显示『NOT_RUNNING』。
到此为止,一个基本的MHA例子就能正常运转了,不过一旦当前的MySQL主服务器发生故障,MHA把某台MySQL从服务器提升为新的MySQL主服务器后,如何通知应用呢?这就需要在配置文件里加上如下两个参数:
master_ip_failover_script master_ip_online_change_script |
说到Failover,通常有两种方式:一种是虚拟IP地址,一种是全局配置文件。MHA并没有限定使用哪一种方式,而是让用户自己选择,虚拟IP地址的方式会牵扯到其它的软件,这里就不赘述了,以下简单说说全局配置文件,以PHP为实现语言,代码如下:
#!/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); ?> |
注:用其它语言实现这个脚本也是OK的,最后别忘了给脚本加上可执行属性。
如果要测试效果的话,可以kill掉当前的MySQL主服务器,稍等片刻,MHA就会把某台MySQL从服务器提升为新的MySQL主服务器,并调用master_ip_failover_script脚本,如上所示,我们在master_ip_failover_script脚本里可以把新的MySQL主服务器的ip和port信息持久化到配置文件里,这样应用就可以使用新的配置了。
有时候需要手动切换MySQL主服务器,可以使用masterha_master_switch命令,不过它调用的不是master_ip_failover_script脚本,而是master_ip_online_change_script脚本,但调用参数类似,脚本可以互用。
shell> masterha_master_switch –conf=/etc/masterha_application.cnf –master_state=dead –dead_master_host=… shell> masterha_master_switch –conf=/etc/masterha_application.cnf –master_state=alive –new_master_host=… |
注:针对原来的MySQL主服务器是否已经宕机,执行命令所需的参数有所不同。
需要说明的是,如果MHA检测到MySQL主服务器连续发生宕机,且两次宕机时间间隔不足八小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。不过为了自动化,我们往往希望能取消这种限制,此时可以用如下方式启动Manager:
shell> nohup masterha_manager –conf=/etc/masterha_application.cnf –ignore_last_failover –remove_dead_master_conf & |
注:请确保Manager的运行用户对masterha_application.cnf有写权限。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
如何使用服务来平衡Oracle RAC 数据库工作负载
为不同的应用程序配置不同的服务,DBA可以更有效地平衡集群工作负载,在Oracle RAC数据库环境下实现更好的应用程序性能。