十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

MySQL高可用性大杀器之MHA

上一篇 / 下一篇  2011-12-20 13:46:55 / 个人分类:mysql

文章来源
  • 文章来源:【转载】

 提到MySQL高可用性,很多人会想到MySQL Cluster,亦或者Heartbeat+DRBD,不过这些方案的复杂性常常让人望而却步,与之相对,利用MySQL复制实现高可用性则显得容易很多,目前大致有MMM,PRM,MHA等方案可供选择:MMM是最常见的方案,可惜它问题太多;至于PRM,它还是个新项目,暂时不推荐用于产品环境,不过作为Percona的作品,它值得期待;如此看来目前只能选MHA了,好在经过DeNA大规模的实践应用证明它是个靠谱的工具。51Testing软件测试网y dv u{m(~8P

  安装:51Testing软件测试网m7m7m Go%L

  作为前提条件,应先配置MySQL复制,并设置SSH公钥免密码登录。下面以CentOS为例来说明,最好先安装EPEL,不然YUM可能找不到某些软件包。

wkG |0|0

  MHA由Node和Manager组成,Node运行在每一台MySQL服务器上,也就是说,不管是MySQL主服务器,还是MySQL从服务器,都要安装Node,而Manager通常运行在独立的服务器上,但如果硬件资源吃紧,也可以用一台MySQL从服务器来兼职Manager的角色。51Testing软件测试网-e4Fl~q)w\n5Z

  安装Node:

"K `u3o gSs)?0

51Testing软件测试网$s!g"VxW

  shell> yum install perl-DBD-MySQL 
  shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm

$w_;p&O1Pj0

  安装Manager:

&n$I'Pr@*N6e-j[y-a0

J};v{5~6`0
  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

4q&Fd,ETvX1s0

  配置:51Testing软件测试网s.Ay8M$Xb-V6}:tD.A5t

  配置全局设置:

J7e:Q-FpGO%_0

51Testing软件测试网VJ \^w_R{ n

  shell> cat /etc/masterha_default.cnf 
  [server default] 
  user=... 
  password=... 
  ssh_user=...

51Testing软件测试网Lx2dJ3hj5d.{ d-Z

  配置应用设置:

YVk7]0`6mbN0

d@.@(BynP0
  shell> cat /etc/masterha_application.cnf 
  [server_1] 
  hostname=... 
  [server_2] 
  hostname=...

OB*Lm!\5F2B0

  注:MHA配置文件中参数的详细介绍请参考官方文档。51Testing软件测试网 m ["l1X/S W:YfB2H~

  检查

:Y6a@VA0

  检查MySQL复制:

H{8xok[0

51Testing软件测试网?t*d3Y;k

  shell> masterha_check_repl --conf=/etc/masterha_application.cnf

51Testing软件测试网/~s!R wx)V(_

  检查SSH公钥免密码登录:51Testing软件测试网.|#{3C%bu#P/V2?

r$l(T!N!u0
  shell> masterha_check_ssh --conf=/etc/masterha_application.cnf

7ID xQW3W,G0

  实战

K)}K])A g/j0

  首先启动MHA进程:

Pm8Qzwgj&A+d0

51Testing软件测试网9H v+J"r7].E

  shell> masterha_manager --conf=/etc/masterha_application.cnf

2s$~S:^N U7z6l;Y0

  注:视配置情况而定,可能会提示read_only,relay_log_purge等警告信息。51Testing软件测试网]MM I sS.j+wC

  然后检查MHA状态:

U0C0` F-|y!h0

DH$_i2])XF`0
  shell> masterha_check_status --conf=/etc/masterha_application.cnf

51Testing软件测试网JD yRr@d4s^ W

  注:如果正常,会显示『PING_OK』,否则会显示『NOT_RUNNING』。

8fX8pDi9A$p Z0

  到此为止,一个基本的MHA例子就能正常运转了,不过一旦当前的MySQL主服务器发生故障,MHA把某台MySQL从服务器提升为新的MySQL主服务器后,如何通知应用呢?这就需要在配置文件里加上如下两个参数:51Testing软件测试网$I^p)sL

51Testing软件测试网dt fnZ$g

  master_ip_failover_script 
  master_ip_online_change_script

|Zdv/GHtd.v L0

  说到Failover,通常有两种方式:一种是虚拟IP地址,一种是全局配置文件。MHA并没有限定使用哪一种方式,而是让用户自己选择,虚拟IP地址的方式会牵扯到其它的软件,这里就不赘述了,以下简单说说全局配置文件,以PHP为实现语言,代码如下:51Testing软件测试网e;B$Y8[k0|%~

?3OK'f6S0
#!/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); 
?>

S`B4G!f H?9a0

  注:用其它语言实现这个脚本也是OK的,最后别忘了给脚本加上可执行属性。

eO)N'b1vB_0

  如果要测试效果的话,可以kill掉当前的MySQL主服务器,稍等片刻,MHA就会把某台MySQL从服务器提升为新的MySQL主服务器,并调用master_ip_failover_script脚本,如上所示,我们在master_ip_failover_script脚本里可以把新的MySQL主服务器的ip和port信息持久化到配置文件里,这样应用就可以使用新的配置了。

ktAXU6QsE'i7O[0

  有时候需要手动切换MySQL主服务器,可以使用masterha_master_switch命令,不过它调用的不是master_ip_failover_script脚本,而是master_ip_online_change_script脚本,但调用参数类似,脚本可以互用。51Testing软件测试网[_#L+a$I$F Y-`

ny3R u oe W){0
  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=...

51Testing软件测试网9n Z_L(`4B*X9cS/B

  注:针对原来的MySQL主服务器是否已经宕机,执行命令所需的参数有所不同。

TE1o#D`5Hf\)I0

  需要说明的是,如果MHA检测到MySQL主服务器连续发生宕机,且两次宕机时间间隔不足八小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。不过为了自动化,我们往往希望能取消这种限制,此时可以用如下方式启动Manager:

5Wu.`P^K+U0

51Testing软件测试网;@?:TW+},IV0?

  shell> nohup masterha_manager --conf=/etc/masterha_application.cnf --ignore_last_failover --remove_dead_master_conf &

*w.L7x2rv0

  注:请确保Manager的运行用户对masterha_application.cnf有写权限。

,kOr0DqdK6N0

TAG: MySQL

 

评分:0

我来说两句

Open Toolbar