提到MySQL高可用性,不少人會想到MySQL Cluster,亦或者Heartbeat+DRBD,不過這些方案的複雜性經常讓人望而卻步,與之相對,利用MySQL複製實現高可用性則顯得容易不少,目前大體有MMM,MHA等方案可供選擇:MMM是最多見的方案,惋惜它問題太多(What’s wrong with MMM,Problems with MMM for MySQL);相比之下,MHA是個更好的選擇,通過DeNA大規模的實踐應用證實它是個靠譜的工具。php
做爲前提條件,應先配置MySQL複製,並設置SSH公鑰免密碼登陸。下面以CentOS爲例來講明,最好先安裝EPEL,否則YUM可能找不到某些軟件包。node
MHA由Node和Manager組成,Node運行在每一臺MySQL服務器上,也就是說,不論是MySQL主服務器,仍是MySQL從服務器,都要安裝Node,而Manager一般運行在獨立的服務器上,但若是硬件資源吃緊,也能夠用一臺MySQL從服務器來兼職Manager的角色。mysql
安裝Node:linux
shell> yum install perl-DBD-MySQL shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm
安裝Manager:sql
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
shell> cat /etc/masterha_default.cnf [server default] user=... password=... ssh_user=...
配置應用設置:ubuntu
shell> cat /etc/masterha_application.cnf [server_1] hostname=... [server_2] hostname=...
注:MHA配置文件中參數的詳細介紹請參考官方文檔。服務器
檢查MySQL複製:app
shell> masterha_check_repl --conf=/etc/masterha_application.cnf
檢查SSH公鑰免密碼登陸: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主服務器後,如何通知應用呢?這就須要在配置文件里加上以下兩個參數:
說到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主服務器,http://www.gwdang.com可使用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主服務器是否已經宕機,執行命令所需的參數有所不一樣。
須要說明的是,缺省狀況http://www.gwdang.com/app/extension下,若是MHA檢測到連續發生宕機,且兩次宕機時間間隔不足八小時的話,則不會進行Failover,之因此這樣限制是爲了不ping-pong效應。不過爲了自動化,咱們每每但願能取消這種限制,此時能夠用以下方式啓動Manager:
shell> nohup masterha_manager --conf=/etc/masterha_application.cnf --ignore_last_failover --remove_dead_master_conf &
注:請確保Manager的運行用戶對masterha_application.cnf有寫權限。
…
本文只是MHA的一個簡要介紹,至於詳細說明,建議你們閱讀官方文檔。