一、簡介
官方介紹:https://code.google.com/p/mysql-master-ha/
MHA(Master HA)是一款開源的 MySQL 的高可用程序,它爲 MySQL 主從複製架構提供了 automating master failover (自動化主故障轉移)功能。MHA 在監控到 master 節點故障時,會提升其中擁有最新數據的 slave 節點成爲新的master 節點,在此期間,MHA 會通過於其它從節點獲取額外信息來避免一致性方面的問題。MHA 還提供了 master 節點的在線切換功能,即按需切換 master/slave 節點。
MHA 是由日本人 yoshinorim(原就職於DeNA現就職於FaceBook)開發的比較成熟的 MySQL 高可用方案。MHA 能夠在30秒內實現故障切換,並能在故障切換中,最大可能的保證數據一致性。目前淘寶也正在開發相似產品 TMHA, 目前已支持一主一從。
我的理解:
該軟件由兩部分組成: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主要支持一主多從的架構,要搭建MHA,要求一個複製集羣中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫slave,因爲至少需要三臺服務器,出於機器成本的考慮,淘寶也在該基礎上進行了改造,目前淘寶TMHA已經支持一主一從。另外對於想快速搭建的可以參考:MHA快速搭建
我們自己使用其實也可以使用1主1從,但是master主機宕機後無法切換,以及無法補全binlog。master的mysqld進程crash後,還是可以切換成功,以及補全binlog的。
二、MHA 服務
1、 服務角色
MHA 服務有兩種角色, MHA Manager(管理節點)和 MHA Node(數據節點):
MHA Manager:
通常單獨部署在一臺獨立機器上管理多個 master/slave 集羣(組),每個 master/slave 集羣稱作一個 application,用來管理統籌整個集羣。
MHA node:
運行在每臺 MySQL 服務器上(master/slave/manager),它**通過監控具備解析和清理 logs 功能的腳本來加快故障轉移。
主要是接收管理節點所發出指令的代理,代理需要運行在每一個 mysql 節點上。簡單講 node 就是用來收集從節點服務器上所生成的 bin-log 。對比打算提升爲新的主節點之上的從節點的是否擁有並完成操作,如果沒有發給新主節點在本地應用後提升爲主節點。
2、提供的工具
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節點:(這些工具通常由MHA Manager的腳本觸發,無需人爲操作)
`save_binary_logs`:保存和複製 master 的二進制日誌;
`apply_diff_relay_logs`:識別差異的中繼日誌事件並應用於其他 slave;
`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地址。
3、工作原理
MHA工作原理總結爲以下幾條:
(1) 從宕機崩潰的 master 保存二進制日誌事件(binlog events);
(2) 識別含有最新更新的 slave ;
(3) 應用差異的中繼日誌(relay log) 到其他 slave ;
(4) 應用從 master 保存的二進制日誌事件(binlog events);
(5) 提升一個 slave 爲新 master ;
三、實現步驟
1、相關配置
MHA 對 MYSQL 複製環境有特殊要求,例如各節點都要開啓二進制日誌及中繼日誌,各從節點必須顯示啓用其`read-only`屬性,並關閉`relay_log_purge`功能等,這裏對配置做事先說明。
本實驗環境共有四個節點, 其角色分配如下(實驗機器均爲centos 7):
機器名稱 | IP | 角色 | 備註 |
manager | 192.168.11.11 | manager 控制器 | 用於監控管理 |
master | 192.168.11.12 | 數據庫主服務器 | 開啓bin-log relay-log 關閉relay-log-purge |
slave1 | 192.168.11.13 | 數據庫從服務器 | 開啓bin-log relay-log 關閉relay-log-purge |
slave2 | 192.168.11.14 | 數據庫從服務器 | 開啓bin-log relay-log 關閉relay-log-purge |
[root@node11 ~]# hostnamectl --static set-hostname manager
[root@manager ~]# systemctl status firewalld
[root@manager ~]# systemctl stop firewalld
[root@manager ~]# systemctl disable firewalld
[root@manager ~]# vim /etc/selinux/config
修改 SELINUX=disabled
[root@manager ~]# getenforce
[root@node12 ~]# hostnamectl --static set-hostname master
[root@master ~]# systemctl status firewalld
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# vim /etc/selinux/config
修改 SELINUX=disabled
[root@node13 ~]# hostnamectl --static set-hostname slave1
[root@slave1 ~]# systemctl status firewalld
[root@slave1 ~]# systemctl stop firewalld
[root@slave1 ~]# systemctl disable firewalld
[root@slave1~]# vim /etc/selinux/config
修改 SELINUX=disabled
[root@node14 ~]# hostnamectl --static set-hostname slave2
[root@slave2 ~]# systemctl status firewalld
[root@slave2 ~]# systemctl stop firewalld
[root@slave2 ~]# systemctl disable firewalld
[root@slave2 ~]# vim /etc/selinux/config
修改 SELINUX=disabled
爲了方便我們後期的操作,我們在各節點的/etc/hosts文件配置內容中添加如下內容:
2、在master、slave1、slave2上都安裝mariadb
(1)、安裝
[root@master ~]# yum -y install mariadb-server mariadb-client
(2)、初始化mariadb
[root@master ~]# mysql_secure_installation
3、初始主節點master的配置
[root@master ~]# vim /etc/my.cnf/server.cnf
[mysqld]
server-id = 1 //複製集羣中的各節點的id均必須唯一
log-bin = master-log //開啓二進制日誌
relay-log = relay-log //開啓中繼日誌
skip_name_resolve //關閉名稱解析(非必須)
[root@master ~]# systemctl restart mariadb
4、所有slave節點的配置
[root@slave1 ~]# vim /etc/my.cnf
[mysqld]
server-id = 2 //複製集羣中的各節點的id均必須唯一;
relay-log = relay-log //開啓中繼日誌
log-bin = master-log //開啓二進制日誌
read_only = ON //啓用只讀屬性
relay_log_purge = 0 //是否自動清空不再需要中繼日誌
skip_name_resolve //關閉名稱解析(非必須)
log_slave_updates = 1 //使得更新的數據寫進二進制日誌中
[root@slave1 ~]# systemctl restart mariadb
[root@slave2 ~]# vim /etc/my.cnf
[mysqld]
server-id = 3 //複製集羣中的各節點的id均必須唯一;
relay-log = relay-log //開啓中繼日誌
log-bin = master-log //開啓二進制日誌
read_only = ON //啓用只讀屬性
relay_log_purge = 0 //是否自動清空不再需要中繼日誌
skip_name_resolve //關閉名稱解析(非必須)
log_slave_updates = 1
[root@slave2 ~]# systemctl restart mariadb
5、配置一主多從複製架構
master節點上:
授權同步數據賬號
[root@master ~]# mysql -uroot -p'keer'
MariaDB [(none)]>grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer';
備份數據導出到slave1、slave2從庫
[root@master ~]# mysqldump -uroot -p'keer' --all-databases > `date +%F`-mysql-all.sql
[root@master ~]# scp *mysql-all.sql 192.168.11.13:/root
[root@master ~]# mysql -uroot -p'keer'
MariaDB [(none)]> show master status;
slave節點上:
導入數據
[root@slave1 ~]# mysql -uroot -p'keer' < *mysql-all.sql
[root@slave1 ~]# mysql -uroot -p'keer'
MariaDB [(none)]> change master to master_host='192.168.11.12',
-> master_user='slave',
-> master_password='keer',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=415;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
6、在master上授權
在所有 Mysql 節點授權擁有管理權限的用戶可在本地網絡中有其他節點上遠程訪問。 當然, 此時僅需要且只能在 master 節點運行類似如下 SQL 語句即可。
[root@master ~]# mysql -uroot -p'keer'
MariaDB [(none)]> grant all on *.* to 'mhaadmin'@'192.168.%.%' identified by 'mhapass';
MariaDB [(none)]>\q
準備ssh多機通信
MHA集羣中的各節點彼此之間均需要基於ssh互信通信,以實現遠程控制及數據管理功能。簡單起見,可在Manager節點生成密鑰對兒,並設置其可遠程連接本地主機後, 將私鑰文件及authorized_keys文件複製給餘下的所有節點即可。
[root@manager ~]# ssh-keygen -t rsa
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub 192.168.11.11
[root@manager ~]# cd .ssh/
[root@manager .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
[root@manager .ssh]# cat authorized_keys
四臺機器的公鑰都已經在authorized_keys這個文件中了,接着,我們只需要把這個文件發送至另外三臺機器,這四臺機器就可以實現 ssh 無密碼互通了:
[root@manager .ssh]# scp authorized_keys root@master:~/.ssh/
[root@manager .ssh]# scp authorized_keys root@slave1:~/.ssh/
[root@manager .ssh]# scp authorized_keys root@slave2:~/.ssh/
7、安裝MHA
四個節點都需安裝:mha4mysql-node-0.56-0.el6.norch.rpm
Manager 節點另需要安裝:mha4mysql-manager-0.56-0.el6.noarch.rpm
[root@manager ~]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager ~]# yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm
注:其餘機器也分別進行安裝,就不一一舉例了。
vim /etc/mha_master/mha.cnf
[server default] //適用於server1,2,3個server的配置
user=mhaadmin //mha管理用戶
password=mhapass //mha管理密碼
manager_workdir=/etc/mha_master/app1 //mha_master自己的工作路徑
manager_log=/etc/mha_master/manager.log //mha_master自己的日誌文件
remote_workdir=/mydata/mha_master/app1 //每個遠程主機的工作目錄在何處
ssh_user=root //基於ssh的密鑰認證
repl_user=slave //數據庫用戶名
repl_password=magedu //數據庫密碼
ping_interval=1 //ping間隔時長
[server1] //節點2
hostname=192.168.11.12 //節點2主機地址
ssh_port=22 //節點2的ssh端口
candidate_master=1 //將來可不可以成爲master候選節點/主節點
[server2]
hostname=192.168.11.13
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.11.14
ssh_port=22
candidate_master=1