MySQL高可用--MHA
MySQL高可用--MHA
資料庫高可用-MHA
一、簡介
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服務
2.1、服務角色
MHA 服務有兩種角色, MHA Manager(管理節點)和 MHA Node(資料節點):
MHA Manager
MHA node:執行在每臺 MySQL 伺服器上(master/slave/manager),它通過監控具備解析和清理 logs 功能的指令碼來加快故障轉移。
主要是接收管理節點所發出指令的代理,代理需要執行在每一個 mysql 節點上。簡單講 node 就是用來收集從節點伺服器上所生成的 bin-log 。對比打算提升為新的主節點之上的從節點的是否擁有並完成操作,如果沒有發給新主節點在本地應用後提升為主節點。
由上圖我們可以看出,每個複製組內部和 Manager 之間都需要ssh實現無密碼互連,只有這樣,在 Master 出故障時, Manager 才能順利的連線進去,實現主從切換功能。
2.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地址
2.3、工作原理
MHA工作原理總結為以下幾條:
(1) 從宕機崩潰的 master 儲存二進位制日誌事件(binlog events);
(2) 識別含有最新更新的 slave ;
(3) 應用差異的中繼日誌(relay log) 到其他 slave ;
(4) 應用從 master 儲存的二進位制日誌事件(binlog events);
(5) 提升一個 slave 為新 master ;
三、實現過程
環境準備:
主機名稱 | IP | 服務角色 | 備註 |
manager | 192.168.11.11 | manager控制器 | 用於監控管理 |
master | 192.168.11.22 | 資料庫主伺服器 | 開啟bin-log,relay-log,關閉relay-log-purge |
slave1 | 192.168.11.23 | 資料庫從伺服器 | 開啟bin-log,relay-log,關閉relay-log-purge |
slave2 | 192.168.11.24 | 資料庫從伺服器 | 開啟bin-log,relay-log,關閉relay-log-purge |
所有節點進行初始化關閉防火牆,關閉selinux
更改主機名:
hostnamectl --static set-hostname manager
hostnamectl --static set-hostname master
hostnamectl --static set-hostname slave1
hostnamectl --static set-hostname slave2
----------部署過程----------
1、配置本地解析hosts檔案,便於之後操作
四臺節點機器同時做:
vim /etc/hosts
192.168.11.11 manager.hj.com manager
192.168.11.22 master.hj.com master
192.168.11.23 slave1.hj.com slave1
192.168.11.24 slave2.hj.com slave2
wq退出儲存
2、安裝mariadb源,裝mariadb,初始化資料庫
四臺節點機器同時做:
vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
wq退出儲存
安裝mariadb-client和mariadb-server:
yum -y install MariaDB-server MariaDB-client
三臺節點機器做:
開啟mariadb服務:systemctl start mariadb
初始化資料庫:mysql_secure_installation
直接回車-->n-->y-->設定你的密碼(我設定為0)-->y-->y-->y-->y
3、修改資料庫配置檔案對其進行初始化配置
192.168.11.22上面做:
vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id = 1 //複製叢集中的各節點的id均必須唯一
log-bin = master-log //開啟二進位制日誌
relay-log = relay-log //開啟中繼日誌
skip_name_resolve //關閉名稱解析(非必須)
wq儲存退出
重啟mariadb服務:systemctl restart mariadb
192.168.11.23上面做:
vim /etc/my.cnf.d/server.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 //使得更新的資料寫進二進位制日誌中
wq儲存退出
重啟mariadb服務:systemctl restart mariadb
192.168.11.24上面做:
vim /etc/my.cnf.d/server.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 //使得更新的資料寫進二進位制日誌中
wq儲存退出
重啟mariadb服務:systemctl restart mariadb
4、配置一主多從複製架構
master節點上:
[root@master ~]# mysql -uroot -p #輸入你設定的密碼登入
MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer'; #授權主從賬號
MariaDB [(none)]> flush privileges; #重新整理許可權表,使設定生效
[root@master ~]# mysqldump -uroot -p --all-databases > `date +%F`-mysql-all.sql #備份資料儲存到從庫
[root@master ~]# scp 2019-04-25-mysql-all.sql 192.168.11.23:/root/ #傳資料到兩個從上面
[root@master ~]# scp 2019-04-25-mysql-all.sql 192.168.11.24:/root/
MariaDB [(none)]> show master status;
slave節點上(兩臺slave都要做):
[root@slave1 ~]# mysql -uroot -p < 2019-04-25-mysql-all.sql #匯入資料
[root@slave1 ~]# mysql -uroot -p #輸入密碼登入mysql
MariaDB [(none)]> help change master to; #獲得幫助配置主從複製
修改完成後貼上進mariadb:
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.11.22',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='keer',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='master-log.000001',
-> MASTER_LOG_POS=666;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G
5、安裝配置MHA
在所有 Mysql 節點授權擁有管理許可權的使用者可在本地網路中有其他節點上遠端訪問。 當然, 此時僅需要且只能在 master 節點執行類似如下 SQL 語句即可。
在master節點上面進行授權:
MariaDB [(none)]> grant all on *.* to 'mhaadmin'@'192.168.%.%' identified by 'mhapass';
MariaDB [(none)]> flush privileges;
準備ssh互通環境:
四臺節點機器同時做:
ssh-keygen #一路回車
manager上面做:ssh-copy-id 192.168.11.11 #將公鑰傳給自己
master上面做:ssh-copy-id 192.168.11.11 #將公鑰傳給manager
slave上面做:ssh-copy-id 192.168.11.11 #將公鑰傳給manager
slave上面做:ssh-copy-id 192.168.11.11 #將公鑰傳給manager
manager上面做:scp .ssh/authorized_keys 192.168.11.22:/root/.ssh #傳公鑰給其他節點,做雙機互信
manager上面做:scp .ssh/authorized_keys 192.168.11.23:/root/.ssh
manager上面做:scp .ssh/authorized_keys 192.168.11.24:/root/.ssh
安裝mha包:
我的mha網盤分享安裝包,大家可以自己訪問下載
連結:https://pan.baidu.com/s/1royHPWKgWBtWeBDYAHqKug
提取碼:hf3q
複製這段內容後開啟百度網盤手機App,操作更方便哦
四個節點都需安裝:mha4mysql-node-0.56-0.el6.norch.rpm
Manager 節點另需要安裝:mha4mysql-manager-0.56-0.el6.noarch.rpm
四臺節點機器同時安裝:yum -y install mha4mysql-node
manager節點還需安裝:yum -y install mha4mysql-manager
初始化MHA:
Manager 節點需要為每個監控的 master/slave 叢集提供一個專用的配置檔案,而所有的 master/slave 叢集也可共享全域性配置。全域性配置檔案預設為/etc/masterha_default.cnf,其為可選配置。如果僅監控一組 master/slave 叢集,也可直接通過 application 的配置來提供各伺服器的預設配置資訊。而每個 application 的配置檔案路徑為自定義。具體操作見下一步驟。
定義MHA管理配置檔案:
為MHA專門建立一個管理使用者, 方便以後使用, 在mysql的主節點上, 三個節點自動同步:
[root@manager ~]# mkdir /etc/mha_master
[root@manager ~]# 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=keer //資料庫密碼
ping_interval=1
//ping間隔時長
[server1] //節點2
hostname=192.168.11.22 //節點2主機地址
ssh_port=22 //節點2的ssh埠
candidate_master=1 //將來可不可以成為master候選節點/主節點
[server2]
hostname=192.168.11.23
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.11.24
ssh_port=22
candidate_master=1
6、對四個節點進行檢測
[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf #檢測ssh互信是否ok
如果最後一行顯示為[info]All SSH connection tests passed successfully.則表示成功。
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf #檢測mysql的主從複製是否ok
如果檢測主從複製無法通過,則重新授權一下主從複製賬號:
MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer'; #授權主從賬號
MariaDB [(none)]> flush privileges; #重新整理許可權表,使設定生效
7、啟動MHA
[root@manager ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf #檢視master節點的狀態
#停止MHA的命令:
[root@manager ~]# masterha_stop -conf=/etc/mha_master/mha.cnf
我就沒有執行了,因為我後面還有操作
8、測試MHA故障轉移
去master上面關閉mariadb服務:
[root@master ~]# systemctl stop mariadb
在manager節點檢視日誌:
[root@manager ~]# tail -200 /etc/mha_master/manager.log
9、恢復原來拓機的master到新的主從叢集中
#在slave1[新的master]上面,備份庫傳給舊的master
[root@slave1 ~]# mkdir /backup
[root@slave1 ~]# mysqldump --all-databases > /backup/`date +%F-%T`-myql-all.sql
[root@slave1 ~]# scp /backup/2019-04-25-22\:57\:13-myql-all.sql 192.168.11.22:/root/
#在master節點進行資料恢復
[root@master ~]# systemctl restart mariadb #啟動mariadb資料庫服務
[root@master ~]# mysql_secure_installation #重新初始化資料庫
[root@master ~]# mysql < 2019-04-25-22\:57\:13-myql-all.sql #還原資料
#重新配置主從,照例檢視現在的主的二進位制日誌和位置
[root@slave1 ~]# mysql -uroot -p #輸入密碼登入
[root@master ~]# mysql -uroot -p #輸入密碼登入
CHANGE MASTER TO
MASTER_HOST='192.168.11.23',
MASTER_USER='slave',
MASTER_PASSWORD='keer',
MASTER_PORT=3306,
MASTER_LOG_FILE='master-log.000001',
MASTER_LOG_POS=483331;
MariaDB [(none)]> start slave; #開啟從功能
MariaDB [(none)]> show slave status\G #顯示從狀態
到此,舊master已經重新加入到mysql主從叢集中了
10、新節點提供後再次進行檢測操作
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
#啟動MHA
[root@manager ~]# masterha_manager -conf=/etc/mha_master/mha.cnf > /etc/mha_master/manager.log 2>&1 &
#再次檢視master節點的狀態
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
11、新節點上線,故障轉換恢復注意事項
1)在生產環境中, 當你的主節點掛了後, 一定要在從節點上做一個備份, 拿著備份檔案把主節點手動提升為從節點, 並指明從哪一個日誌檔案的位置開始複製
2)每一次自動完成轉換後, 每一次的(replication health )檢測不ok始終都是啟動不了必須手動修復主節點, 除非你改配置檔案
3)手動修復主節點提升為從節點後, 再次執行檢測命令
4)再次執行起來就恢復成功了
檢測主master節點:masterha_check_status -conf=/etc/mha_master/mha.cnf<