探索MySQL高可用架構之MHA(7)
-----構建mysql高可用系列(共9篇)
上一篇文章介紹了本次架構的keepalive讀寫分離!
本篇文章主要介紹本次架構中的mha安裝部分!
關於MHA
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於 Facebook公司)開發,是一套優秀的作爲MySQL高可用性環境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在 0~30秒之內自動完成數據庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。
該軟件由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點)。MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave集羣,也可以部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集羣中的master節點,當master出現故障時,它可以自動將最新數據的slave提升爲新的master,然後將所有其 他的slave重新指向新的master。整個故障轉移過程對應用程序完全透明。
在MHA自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日誌,最大程度的保證數據的不丟失,但這並不總是可行的。例如,如果主服務器 硬件故障或無法通過ssh訪問,MHA沒法保存二進制日誌,只進行故障轉移而丟失了最新的數據。使用MySQL 5.5的半同步複製,可以大大降低數據丟失的風險。MHA可以與半同步複製結合起來。如果只有一個slave已經收到了最新的二進制日誌,MHA可以將最 新的二進制日誌應用於其他所有的slave服務器上,因此可以保證所有節點的數據一致性。
MHA工作原理
a.從宕機崩潰的master保存二進制日誌事件(binlog events)。
b.識別含有最新更新的slave。
c.應用差異的中繼日誌(relay log)到其它slave。
d.應用從master保存的二進制日誌事件(binlog events)。
e.提升一個slave爲新master。
f.使其它的slave連接新的master進行復制。
MHA工具包
Manager工具
a.masterha_check_ssh : 檢查MHA的SSH配置。
b.masterha_check_repl : 檢查MySQL複製。
c.masterha_manager : 啓動MHA。
d.masterha_check_status : 檢測當前MHA運行狀態。
e.masterha_master_monitor : 監測master是否宕機。
f.masterha_master_switch : 控制故障轉移(自動或手動)。
g.masterha_conf_host : 添加或刪除配置的server信息。
Node工具
a.save_binary_logs : 保存和複製master的二進制日誌。
b.apply_diff_relay_logs : 識別差異的中繼日誌事件並應用於其它slave。
c.filter_mysqlbinlog : 去除不必要的ROLLBACK事件(MHA已不再使用這個工具)。
d.purge_relay_logs : 清除中繼日誌(不會阻塞SQL線程)。
下面就讓我們開始操作吧:
安裝node源碼包(依賴很多per包,請按照我的安裝順序安裝!)
rpm -ivh perl-DBI-1.620-1.el5.rfx.x86_64.rpm rpm -ivh MySQL-shared-compat-5.6.21-1.rhel5.x86_64.rpm rpm -ivh perl-DBD-MySQL-3.0007-2.el5.x86_64.rpm #如果是6系統先安裝 rpm -ivhperl-Data-ShowTable-3.3-1.2.el6.rf.noarch.rpm tar xfmha4mysql-node-0.53.tar.gz cd mha4mysql-node-0.53 perl Makefile.PL make && make install #redhat5系列系統,會出現 Pleaseenter your CPAN site: [] 隨便輸入反正也不用CPAN模塊
安裝manager源碼包(依賴很多per包,請按照我的安裝順序安裝!)
rpm -ivh perl-Config-Tiny-2.10-1.el5.noarch.rpm rpm -ivh epel-release-5-4.noarch.rpm rpm -ivh perl-Parallel-ForkManager-0.7.5-4.el5.noarch.rpm rpm -ivh perl-Mail-Sender-0.8.16-1.el5.rf.noarch.rpm rpm -ivh perl-Mail-Sendmail-0.79-1.2.el5.rf.noarch.rpm rpm -ivh perl-Params-Validate-0.95-1.el5.rf.x86_64.rpm rpm -ihv perl-Email-Date-Format-1.002-4.el5.noarch.rpm rpm -ivh perl-MIME-Lite-3.029-1.el5.rf.noarch.rpm rpm -ivh perl-TimeDate-1.16-1.2.el5.rf.noarch.rpm #解決依賴:perl(Date::Format) perl(Date::Parse) rpm -ivh perl-Pod-Escapes-1.04-5.el5.noarch.rpm rpm -ivh perl-Pod-Simple-3.16-1.el5.rf.noarch.rpm rpm -ivh perl-Test-Pod-1.45-1.el5.rf.noarch.rpm rpm -ivh perl-MailTools-2.12-1.el5.rf.noarch.rpm #解決依賴:perl(Mail::send) rpm -ivh perl-Log-Dispatch-2.20-1.el5.noarch.rpm tar xfmha4mysql-manager-0.53.tar.gz cd mha4mysql-manager-0.53 perl Makefile.PL make && make install #redhat5系列系統,會出現 Pleaseenter your CPAN site: [] 隨便輸入反正也不用CPAN模塊
配置ssh信任(所有機器全做)
拿47機器舉例 (1)#生成公鑰 ssh-keygen -t rsa 生成公鑰 (2)#輸出公鑰匙 cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7........ (3)#在48、50、51、52分別操作, vi authorized_keys 增加47機器上 id_rsa.pub的內容 (4)#測試 ssh 10.142.132.52 date ssh 10.142.132.51 date ssh 10.142.132.50 date ssh 10.142.132.48 date ssh 10.142.132.47 date 總結:上面4步操作,在其它機器也一樣操作,所有機器就可以實現ssh信任了
編輯manager節點配置文件 //10.142.132.50
(1) mkdir -p /etc/masterha #創建目錄 (2) vi /etc/masterha/app1.cnf #增加如下內容 [server default] user=root #linux用於管理mysql用戶名 password=mysql #linux用於管理mysql密碼 ssh_user=root #ssh免密鑰登錄的帳號名 repl_user=lipengfei #mysql複製帳號,用來在主從機之間同步二進制日誌等 repl_password=lipengfei #mysql複製帳號的密碼 manager_workdir=/app/masterha/app1 #manager目錄 manager_log=/app/masterha/app1/app1.log #管理節點工作日誌文件 remote_workdir=/app/masterha/app1 #node 上用於產生日誌的工作目錄 ping_interval=1 #ping間隔,用來檢測master是否正常 [server1] hostname=10.142.132.52 #具體IP candidate_master=1 #優先級成爲新master check_repl_delay=0 #MHA在選擇新的Master時,會忽略複製延遲。 master_binlog_dir=/app/mysql/data #binlog日誌所在目錄 [server2] hostname=10.142.132.51 #具體IP candidate_master=1 #優先級成爲新master check_repl_delay=0 #MHA在選擇新的Master時,會忽略複製延遲。 master_binlog_dir=/app/mysql/data #binlog日誌所在目錄 [server3] hostname=10.142.132.48 #具體IP no_master=1 #不能成爲主庫 [server4] hostname=10.142.132.47 #具體IP no_master=1 #不能成爲主庫
啓動mha-manager
nohup masterha_manager--conf=/etc/masterha/app1.cnf --ignore_last_failover < /dev/null > /app/masterha/app1/app1.log2>&1 & #以nohup模式,放在後臺啓動
故障測試
a.手工停止 52上的mysql服務,service mysql stop b.大約30秒,51自動成爲新的主庫 #在47或48從庫上show slave status就可以看出來 c.52再次啓動mysql服務,要手工加入到AB架構中 #51是主庫,使用如下演示命令加入AB架構 change master to master_host='10.142.132.51', master_port=3306,master_user='lipengfei', master_password='lipengfei',master_log_file='binlog.000001',master_log_pos=120; d.手工停止51上的Mysql服務 e大約30秒,52自動成爲新的主庫 #在47或48從庫上show slave status就可以看出來
注意如下2個問題
a.當主DB故障,切換到另外的服務器上後,即使恢復了原來的主DB,也不能立即加入整套MHA系統中,得重新手工加入AB架構。 b.當發生一次切換後,管理節點的監控進程就會自動退出,需要用腳本來自動啓動。另外還得刪除app1.failover.complete這個文件,否則新的主DB出現問題MHA就不會切換了。
mha-manager常用命令
(1) nohup masterha_manager--conf=/etc/masterha/app1.cnf --ignore_last_failover < /dev/null > /app/masterha/app1/app1.log2>&1 & #開啓MHA Manager監控 (2) masterha_check_status--conf=/etc/masterha/app1.cnf #查看MHA Manager監控是否正常 (3) masterha_stop--conf=/etc/masterha/app1.cnf #關閉MHA Manage監控 (4)masterha_check_ssh--conf=/etc/masterha/app1.cnf #檢查SSH配置 (5)masterha_check_repl--conf=/etc/masterha/app1.cnf #檢查整個複製環境狀況
到此爲止,咱們的mah功能就配置結束了!
只要朋友們仔細點按着我寫的文章一步一步操作,相信你也可以成功的,加油吧!