MHA
MHA(Master HA )是一款開源的MYSQL的高可用程序,它為MYSQL主從復制架構提供了automating master failover 功能。MHA在監控到master節點故障時,會提升其中擁有最新數據的slave節點成為新的master節點,在此期間,MHA會通過于其他從節點獲取額外信息來避免一致性方面的問題。MHA還提供了master節點的在線切換功能,即按需切換master/slave節點。
MHA服務有兩種角色,MHA Manager(管理節點)和MHA Node(數據節點):
? ? ? ? ? ? MHA Manager:通常單獨部署在一臺獨立機器上管理多個master/slave集群,每個master/slave集群稱作一個application;
? ? ? ? ? ?MHA node:運行在每臺MYSQL服務器上(master/slave/manager),它通過監控具備解析和清理logs功能的腳本來加快故障轉移。
MHA組件:
MHA會提供諸多工具程序,其常見的如下所示。
? ? ? ? ? ? ? Manager節點:
? ? ? ? ? ? ? ? ? masterha_check_ssh :MHA依賴的ssh環境監測工具
? ? ? ? ? ? ? ? ? masterha_check_repl: MYSQL復制環境檢測工具;
? ? ? ? ? ? ? ? ? masterga_manager: MHA 服務主程序
? ? ? ? ? ? ? ? ? masterha_check_status: MHA 運行狀態探測工具;
? ? ? ? ? ? ? ? ? masterha_master_monitor:MYSQL master節點可用性監測工具;
? ? ? ? ? ? ? ? ? masterha_master_swith:master節點切換工具;
? ? ? ? ? ? ? ? ? masterha_conf_host:添加或刪除配置的節點;
? ? ? ? ? ? ? ? ? masterha_stop:關閉MHA服務的工具。
? ? ? ? ? ? ?Node節點:
? ? ? ? ? ? ? ? ?save_binary_logs:保存和復制master的二進制日志;
? ? ? ? ? ? ? ? ?apply_diff_relay_logs:識別差異的中繼日志事件并應用于其他slave;
? ? ? ? ? ? ? ? ?filter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已不再使用這個工具
? ? ? ? ? ? ? ? ?purge_relay_logs:清除中繼日志(不會阻塞SQL線程);
? ? ? ? ? 自定義擴展:
? ? ? ? ? ? ? ? ?secondary_check_script:通過多條網絡路由檢測master的可用性;
? ? ? ? ? ? ? ? ?master_ip_failover_script:更新application使用的masterip;
? ? ? ? ? ? ? ? ?report_script:發送報告
? ? ? ? ? ? ? ? ?init_conf_load_script:加載初始配置參數;
? ? ? ? ? ? ? ? ?master_ip_online_change_script:更新master節點ip地址;
實驗:實現主從復制的高可用,主節點故障時,進行故障轉移;以及回復整個復制集群。
?1、準備實驗MYSQL Replication環境:
MHA對MYSQL復制環境有特殊要求,例如各節點都要開啟二進制日志及中繼日志,各從節點必須顯示啟用其read-only屬性,并關閉relay_log_purge功能等,這里對配置做事先說明。
? ? ? ? ? ? ? ? ? ? 本實驗環境共有四個節點,其角色分配如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?node1:MariaDB master
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?node2: MariaDB slave
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?node3: MariaDB slave
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?node4: MHA Manager
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ?各節點的/etc/hosts文件配置內容中添加:
? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.252.18 node1.magedu.com node1
? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.252.17 node2.magedu.com node2
? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.252.20 node3.magedu.com node3
? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.252.21 node4.magedu.com node4
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? 初始主節點master配置:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[mysqld]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?server-id = 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?log-bin = master-log
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relay-log = relay-log
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?skip_name_resolve = ON
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?innodb_file_per_table = ON
? ? ? ? ? ? ? ? ? ? 所有slave節點依賴的配置:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [mysqld]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? server-id = 2 ? ? #復制集群中的各節點的id均必須唯一;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? relay-log = relay-log
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? log-bin = master-log
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? read_only = ON
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? relay_log_purge = 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? skip_name_resolve = ON
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? innodb_file_per_table = ON
按上述要求分別配置好主從節點之后,按MYSQL復制配置架構的配置方式將其配置完成并啟動master節點和各slave節點,以及為各slave節點啟動其IO和SQL線程,確保主從復制運行無誤。操作如下:
master節點上:
MariaDB [(none)]>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON
*.* TO ‘repluser’@172.16.252.%’ IDENTIFIED BY ‘replpass’;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> SHOW MASTER STATUS;
+——————-+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————-+———-+————–+——————+
| master-log.000003 | 498 | | |
+——————-+———-+————–+——————+
各slave節點上:
[root@node3 ~]# mysql
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST=’172.16.252.18′,MASTER_USER=’repluser’,MASTER_PASSWORD=’replpass’,MASTER_LOG_FILE=’master-log.000003′,MASTER_LOG_POS=498;
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G
而后,在所有MYSQL節點授權擁有管理權限的用戶可在本地網絡中有其他節點上遠程訪問。當然,此時僅需要且只能在master節點運行類似如下SQL語句即可。
mysql> GRANT ALL ON *.* ?TO ? ?‘mhaadmin’@’172.16.252.%’ ? IDENTIFIED ? ?BY ‘mhapass’;
各slave節點可以查看:
? ? ? ? ? ? ? ? ?SHOW GRANTS FOR ‘proxysql’@’172.16.252.%’;

2、安裝配置MHA
? ? ? ?a、準備基于SSH互信通信環境:
MHA集群中的各節點彼此之間均需要基于ssh互信通信,以實現遠程控制及數據管理功能。簡單起見,可在Manager節點生成密鑰對兒,并設置其可遠程連接本地主機后,將私鑰文件及authorized_keys文件復制給余下的所有節點即可。
? ? ? ? ? 下面操作在node4:Manager 節點上操作:
? ? ? ? ? ? ? ? ? ? ? [root@node4 ~]# ssh-keygen -t rsa -P ”
? ? ? ? ? ? ? ? ? ? ? [root@node4 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@node4
? ? ? ? ? ? ? ? ? ? ? ?自己連接自己進行驗證
[root@node4 ~]# for i in {1..3}; do scp -p .ssh/id_rsa .ssh/authorized_keys root@node$i:/root/.ssh/; done
編寫一個小循環把.ssh/id_rsa (私鑰)、shh/authorized_keys(記錄進行公鑰認證的信息)復制到三個節點上。復制完成后,各節點可以互信通信連接測試,進行驗證。
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? 驗證發現各節點之間進行ssh連接時,老是要回答yes:
? ? ? ? ? ? ? ? ? ?可以修改/etc/ssh/ssh_config 配置文件:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? StrictHostKeyChecking no
? ? ? ? ? ? ? ? ? 或者可以用ssh -o 選項進行參數的傳遞:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ssh -o StrictHostKetchecking=no node1
? ? ? ? ? b、安裝MHA
? ? ? ? ? ? ? ? ?除了源碼包,MHA官方也提供了rpm格式的程序包,其下載地址為:
? ? ? ? ? ?Centos7系統可直接使用適用于el6的程序包。另外,MHA Manage和MHA Node 程序包的版本并不強制要求一致。
? ? ? ? ? ? ? 這里我直接在FTP共享里面下載的rpm包:
? ? ? ? ? ? ? ? ? lftp 172.16.0.1/pub
? ? ? ? ? ? ? ? ? ? ? >cd Sources/6.x86_64/mha
? ? ? ? ? ? ? ? ? ? ?>mget mha4mysql-node-0.56-0.el6.norch.rpm ? ??mha4mysql-manager-0.560.el6.noarch.rpm
? ? ? ? ? ? ?Manager 節點:
? ? ? ? ? ? ? ? ? ? ? ?#yum install mha4mysql-manager-0.56-0.el6.noarch.rpm
? ? ? ? ? ? ? 所有節點,包括Manager:
? ? ? ? ? ? ? ? ? ? ? ?#yum install mha4mysql-node-0.56-0.el6.norch.rpm
? ? ? ? ? c、初始化MHA,進行配置
Manager 節點需要為每個監控的master/slave集群提供一個專用的配置文件,而所有的master/slave集群也可共享全局配置。全局配置文件默認為/etc/masterha_default.cnf,其為可選配置。如果僅監控一組master/slave集群,也可直接通過application的配置來提供各服務器的默認配置信息。而每個application的配置文件路徑為自定義。
? ? ? ? ? ? ? ?例如,本示例中將使用/etc/masterha/app1.cnf,其操作如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[root@node4 ~]# mkdir /etc/masterha
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[root@node4 ~]# vim /etc/masterha/app1.cnf
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[server default]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? user=mhaadmin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? password=mhaadminpass
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? manager_workdir=/data/masterha/app1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? manager_log=/data/masterha/app1/manager.log
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? remote_wordir=/data/masterha/app1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ssh_user=root
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? repl_user=repluser
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? repl_password=replpass
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ping_interval=1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[server1]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?hostname=172.16.252.18
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?candidate_master=1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [server2]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hostname=172.16.252.17
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? candidate_master=1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [server3]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?hostname=172.16.252.20
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?candidate_master=1
? ? ? ? ? ? ? ? ? 檢測各節點間ssh互信通信配置是否Ok:
? ? ? ? ? ? ? ? ? ? ? ? [root@node4 ~]# master_check_ssh –conf=/etc/masterha/app1.cnf
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸出信息最后一行類似如下信息,表示其通過檢測。
? ? ? ? ? ? ? ? ? ? ? ? ? ? [info]All SSH connection tests passed successfully.
? ? ? ? ? ? ? ? ?檢查管理的MySQL復制集群的連接配置參數是否OK:
? ? ? ? ? ? ? ? ? ? ? ? ? ?[root@node4 ~]#master_check_repl –conf=/etc/masterha/app1.cnf
? ? ? ? ? ? ? ? ? ? ?測試時會報錯:從節點上沒有賬號,因為這個架構,任何一個從節點,將有可能成為主節點, ? ? ? ? ? ? ? ? ? ? ?所以也需要創建賬號。
? ? ? ? ? ? ? ? ?因此,這里只要在mater節點上再次執行以下操作即可:
? ? ? ? ? ? ? ? ?MariaDB [(none)]>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON ? ?*.* TO ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?‘repluser’@172.16.252.%’ IDENTIFIED BY ‘replpass’;
? ? ? ? ? ? ? ? ?MariaDB [(none)]> FLUSH PRIVILEGES;
? ? ? ? ? ? ? ? ?Manager節點上再次運行,就顯示Ok了。
? ? ?d、啟動MHA
?[root@node4 ~]#nohup masterha_manager –conf=/etc/master/aap1.cnf ? &> /data/masterha/manager.log ?&
? ? ? ? ? ? ? ?啟動成功后,可用過如下命令來查看master節點的狀態:
? ? ? ? ? ? ? ? ? ? ?[root@node4 ~]#masterha_check_status –conf=/etc/master/aap1.cnf
? ? ? ? ? ? ? ? ? ? ? app1 (pid:4978)is running(0:PING_OK),master:172.16.252.18
? ? ? ? ? ? ? ? ? ?上面的信息中“app1 (pid:4978)is running(0:PING_OK)”表示MHA服務運行OK,否則,則會顯 ? ? ? ? ? ? ? ? ? ? ?示為類似“app1 is stopped(1:NOT_RUNNINg).”
? ? ? ? ? ? ? 如果要停止MHA,需要使用master_stop命令。
? ? ? ? ? ? ? [root@node4 ~]#masterha_stop –conf=/etc/masterha/app1.cnf
? ? ? ?e 、測試故障轉移
? ? ? ? ? ? ? (1)在master節點關閉mariadb服務,模擬主節點數據崩潰
? ? ? ? ? ? ? ? ? ? ? ? #killall -9 mysqld mysqld_safe
? ? ? ? ? ? ? ? ? ? ? ? #rm -rf /var/lib/mysql/*
? ? ? ? ? ? ?(2)在manager節點查看日志:
/data/masterha/app1/manager.log 日志文件中出現如下信息,表示manager檢測到172.16.252.18節點故障,而后自動執行故障轉移,將172.16.252.17提升為主節點。
注意,故障轉移完成后,manager將會自動停止,此時使用masterha_check_status命令檢測將會遇到錯誤提示,如下所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ?#masterha_check_status –conf=/etc/masterha/app1.cnf
? ? ? ? ? ? ? ? ? ? ? ? ? ? app1 is stopped(2:NOT_RINNING).
? ? ? ? ? ? (3)提供新的從節點以修復復制集群
原有master節點故障后,需要重新準備好一個新的MySQL節點?;趤碜杂趍aster節點的備份恢復數據后,將其配置為新的master的從節點即可。注意,新加入的節點如果為新增節點,其Ip地址要配置為原來master節點的IP,否則,還需要修改app1.cnf中相應的ip地址。隨后再次啟動manager,并再次檢測其狀態。
? ? ? ? ? ? ? ? ?此時node2為主節點,進行一次完全數據備份:
? ? ? ? ? ? ? ? ? ? #mysqldump -x -R –triggers –events –master-data=2 –flush-logs –all-databases > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /tmp/alldatabases.sql
? ? ? ? ? ? ? ? ? ? #scp /tmp/databases.sql node1:/root/
? ? ? ? ? ? ? ?note1:
? ? ? ? ? ? ? ? ? ? ? #sysytemctl start mariadb.service
? ? ? ? ? ? ? ? ? ? ?#mysql < /root/databases.sql 進行數據重放,還原。
? ? ? ? ? ? ? ? ? ? ?連入mysql發現數據已回復了。
? ? ? ? ? ? ? ? ? ? #head -30 alldatabases.sql
CHANGE MASTER to MASTER_LOG_FILE=’master-log.000002′, MASTER_LOG_POS=245; 備份那一刻,日志文件,處于哪個位置.
? ? ? ? ? ? ? ? ? ?#mysql
? ? ? ? ? ? ? ? ? ?>CHANGE MASTER TO MASTER_HOST=’172.16.0.17′,MASTER_USER=’repluser’,MASTER_PASSWORD=’replpass’,MASTER_LOG_FILE=’master-log.000002′,MASTER_LOG_POS=245;
? ? ? ? ? ? ? ? ? ?>START SLAVE;
? ? ? ? ? ? ? ? ?# vim /etc/my.cnf.d/server.cnf
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[mysql]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? server-id = 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?log-bin = master-log
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?relay-log = relay-log
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?skip_name_resolve = ON
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?innodb_file_per_table = ON
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?read_only = ON
? ? ? ? ? ? ? ? ? ? ? ? ?#systemctl restart mariadb.service
? ? ? ? ? ? ? ? ? ? ? ? ?note4:Manager節點上在次啟動,并檢測MYSQL復制集群;
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87554