1.關于MHA
MHA是一款開源的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服務器上(包括manager),它通過監控具備解析和清理logs功能的腳本來加快故障轉移。
(1)提升一個從節點為主節點 (2)在提升之前,會把所有其他從節點記錄的所有數據合并到要提升為主節點的那個從節點上
2、MHA的組件
(1)Manager節點
masterha_check_ssh:MHA依賴的SSH環境檢測工具 masterha_check_repl:mysql復制環境檢測工具 masterha_manager:MHA服務主程序 masterha_check_status:MHA運行狀態探測工具 masterha_master_monitor:mysql master節點可用性檢測工具 masterha_master_switch:master節點切換工具 masterha_conf_host:添加或刪除配置的節點 masterha_stop:關閉MHA服務的工具
(2)Node節點
save_binary_logs:保存和復制master的二進制日志 apply_diff_relay_logs:識別差異的中繼日志事件并應用于其它slave filter_mysqlbinlog:去除不必要的rollback事件(MHA已不再使用這個工具) purge_relay_logs:清除中繼日志(不會阻塞SQL線程)
(3)自定義擴展
secondary_check_script:通過多條網絡路由檢測master的可用性 master_ip_failover_script:更新application使用的masterip shutdown_script:強制關閉master節點 report_script:發送報告 init_conf_load_script:加載初始配置參數 master_ip_online_change_script:更新master節點ip地址
3、MHA的實現配置
注意各節點之間的時間同步
(1)主從復制的實現
1)master節點的配置
安裝mariadb-server
[root@localhost ~]# yum -y install mariadb-server
編輯/etc/my.cnf文件
[root@localhost ~]# vim /etc/my.cnf 在[mysqld]段的最后面添加如下內容 innodb_file_per_table = ON skip_name_resolve = ON server-id = 1 relay-log = relay-log log-bin = master-log
授權具有復制權限的用戶
[root@localhost ~]# systemctl start mariadb.service [root@localhost ~]# mysql MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'10.1.51.%' identified by 'replpass'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-log.000003 | 495 | | | +-------------------+----------+--------------+------------------+ MariaDB [(none)]> show binlog events in 'master-log.000003';
由上圖可以看到,我們等下在slave設置復制開始位置為245,即可省去手動在slave節點設置復制權限。
2)slave節點的配置
兩個從節點的配置出來server-id不同外,其他配置完全相同,后面會特別指出。
安裝mariadb-server
[root@localhost ~]# yum -y install mariadb-server
編輯/etc/my.cnf文件
[root@localhost ~]# vim /etc/my.cnf 在[mysqld]段的最后面添加如下內容 innodb_file_per_table = ON skip_name_resolve = ON server-id = 2 # 注意slave2的server-id = 3 relay-log = relay-log log-bin = master-log read-only = 1 relay-log-purge = 0
指定master節點
[root@localhost ~]# systemctl start mariadb.service [root@localhost ~]# mysql MariaDB [(none)]> change master to master_host='10.1.51.30',master_user='repluser',master_password='replpass',master_log_file='master-log.000003',master_log_pos=245; MariaDB [(none)]> start slave; MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.1.51.30 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-log.000003 Read_Master_Log_Pos: 495 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 780 Relay_Master_Log_File: master-log.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes ... ... MariaDB [(none)]> select user,host from mysql.user; +----------+-----------------------+ | user | host | +----------+-----------------------+ | repluser | 10.1.51.% | # repluser用戶已經同步過來了 | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | localhost.localdomain | | root | localhost.localdomain | +----------+-----------------------+
至此,mariadb服務的主從復制集群已然配置完成。
(2)準備基于ssh互相通信環境
在manager節點上完成以下操作
[root@localhost ~]# ssh-keygen -t rsa -P '' #創建私鑰 [root@localhost ~]# cat .ssh/id_rsa.pub > .ssh/authorized_keys [root@localhost ~]# scp .ssh/authorized_keys .ssh/id_rsa .ssh/id_rsa.pub 10.1.51.30:/root/.ssh/ [root@localhost ~]# scp .ssh/authorized_keys .ssh/id_rsa .ssh/id_rsa.pub 10.1.51.50:/root/.ssh/ [root@localhost ~]# scp .ssh/authorized_keys .ssh/id_rsa .ssh/id_rsa.pub 10.1.51.60:/root/.ssh/
(3)MHA實現的具體操作
MHA官方提供了RPM格式的程序包,可自行下載
1)安裝MHA
Manager節點
[root@localhost ~]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm
所有節點,包括manager
[root@localhost ~]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
2)在manager節點上配置MHA
Manager節點需要為每個監控的master/slave集群提供一個專用的配置文件,而所有的master/slave集群也可共享全局配置。每個application的配置文件是自定義的,此處將使用/etc/masterha/app.cnf。
為了安全起見,需要在master節點上創建一個管理mysql的用戶
MariaDB [(none)]> grant all on *.* to 'mhaadmin'@'10.1.51.%' identified by 'mhapass';
編輯/etc/masterha/app.cnf
[root@localhost ~]# vim /etc/masterha/app.cnf [server default] user=mhaadmin #mysql的管理用戶 password=mhapass #mysql的管理用戶的密碼 manager_workdir=/data/masterha/app #manager的工作路徑,會自動創建 manager_log=/data/masterha/app/manager.log #manager日志文件 remote_workdir=/data/masterha/app #遠程主機的工作路徑 ssh_user=root repl_user=repluser repl_password=replpass ping_intervarl=1 [server1] hostname=10.1.51.30 ssh_port=22 candidate_master=1 [server2] hostname=10.1.51.50 ssh_port=22 candidate_master=1 [server3] hostname=10.1.51.60 ssh_port=22 candidate_master=1
檢測各節點間ssh互相通信配置是否正常
[root@localhost ~]# masterha_check_ssh --conf=/etc/masterha/app.cnf 輸出的結果最后兩行如下,表示正常 Sat Nov 26 20:25:40 2016 - [debug] ok. Sat Nov 26 20:25:40 2016 - [info] All SSH connection tests passed successfully.
檢查管理的mysql復制集群的連接配置參數是否正常
[root@localhost ~]# masterha_check_repl --conf=/etc/masterha/app.cnf 輸出的最后一行如下,表示正常 MySQL Replication Health is OK.
啟動MHA
[root@localhost ~]# masterha_manager --conf=/etc/masterha/app.cnf 此命令會一直保持連接在前臺 可以另啟一個終端查看master節點的狀態 [root@localhost ~]# masterha_check_status --conf=/etc/masterha/app.cnf app (pid:5740) is running(0:PING_OK), master:10.1.51.30
3)測試
手動停止master節點上的mariadb服務
[root@localhost ~]# killall -9 mysqld mysqld_safe
查看manager節點日志
[root@localhost ~]# cat /data/masterha/app/manager.log Started automated(non-interactive) failover. The latest slave 10.1.51.50(10.1.51.50:3306) has all relay logs for recovery. Selected 10.1.51.50(10.1.51.50:3306) as a new master. #master自動切換到10.1.51.50節點上 10.1.51.50(10.1.51.50:3306): OK: Applying all logs succeeded. 10.1.51.60(10.1.51.60:3306): This host has the latest relay log events. Generating relay diff files from the latest slave succeeded. 10.1.51.60(10.1.51.60:3306): OK: Applying all logs succeeded. Slave started, replicating from 10.1.51.50(10.1.51.50:3306) 10.1.51.50(10.1.51.50:3306): Resetting slave info succeeded. Master failover to 10.1.51.50(10.1.51.50:3306) completed successfully. 此時MHA將無法啟動
在10.1.51.60節點上查看其狀態
4)修復10.1.51.30節點,使其成為從節點
在/etc/my.cnf的[mysqld]段最后添加下面兩行
read-only = 1 relay-log-purge = 0 [root@localhost ~]# systemctl start mariadb
指定master節點
注意:需要查看master節點的狀態位置 MariaDB [(none)]> change master to master_host='10.1.51.50',master_user='repluser',master_password='replpass',master_log_file='master-log.000003',master_log_pos=245; MariaDB [(none)]> start slave;
再次啟動MHA即可恢復正常
[root@localhost ~]# masterha_manager --conf=/etc/masterha/app.cnf [root@localhost ~]# masterha_check_status --conf=/etc/masterha/app.cnf app (pid:6343) is running(0:PING_OK), master:10.1.51.50
補充:主節點的手動切換
1)在當前的主節點(10.1.51.50)中執行以下命令
MariaDB [(none)]> FLUSH NO_WRITE_TO_BINLOG TABLES;
2)在manager節點中執行以下命令,注意要先停止MHA
[root@localhost ~]# masterha_stop --conf=/etc/masterha/app.cnf [root@localhost ~]# masterha_master_switch --master_state=alive --conf=/etc/masterha/app.cnf 輸出結果如下,表示切換成功切換到10.1.51.30節點
3)在當前的主節點(10.1.51.50)中執行以下命令
MariaDB [(none)]> change master to master_host='10.1.51.30',master_user='repluser',master_password='replpass',master_log_file='master-log.000003',master_log_pos=245; MariaDB [(none)]> start slave;
3)重新啟動MHA
[root@localhost ~]# masterha_manager --conf=/etc/masterha/app.cnf [root@localhost ~]# masterha_check_status --conf=/etc/masterha/app.cnf app (pid:7758) is running(0:PING_OK), master:10.1.51.30
原創文章,作者:pao,如若轉載,請注明出處:http://www.www58058.com/60808