mysql實現高可用之MHAnode
1、簡介mysql
MHA(Master HA)是一款開源的 MySQL 的高可用程序,它爲 MySQL 主從複製架構提供了 automatinglinux
master failover (自動化主故障轉移)功能。MHA 在監控到 master 節點故障時,會提高其中擁有最新數據的sql
slave 節點成爲新的master 節點,在此期間,MHA 會經過於其它從節點獲取額外信息來避免一致性方面的問題。數據庫
MHA 還提供了 master 節點的在線切換功能,即按需切換 master/slave 節點。 MHA 是由日本人vim
yoshinorim(原就任於DeNA現就任於FaceBook)開發的比較成熟的 MySQL 高可用方案。MHA 可以在30秒內實現服務器
故障切換,並能在故障切換中,最大可能的保證數據一致性。目前淘寶也正在開發類似產品 TMHA, 目前已支持一網絡
主一從。架構
2、MHA服務app
2.1服務角色
MHA 服務有兩種角色, MHA Manager(管理節點)和 MHA Node(數據節點): MHA Manager: 一般單獨
部署在一臺獨立機器上管理多個 master/slave 集羣(組),每一個 master/slave 集羣稱做一個 application,用來管理
統籌整個集羣。 MHA node: 運行在每臺 MySQL 服務器上(master/slave/manager),它經過監控具有解析和
清理 logs 功能的腳原本加快故障轉移。 主要是接收管理節點所發出指令的代理,代理須要運行在每個 mysql
節點上。簡單講 node 就是用來收集從節點服務器上所生成的 bin-log 。對比打算提高爲新的主節點之上的從節點的
是否擁有並完成操做,若是沒有發給新主節點在本地應用後提高爲主節點
咱們能夠看出,每一個複製組內部和 Manager 之間都須要ssh實現無密碼互連,只有這樣,在 Master 出故障時,
Manager 才能順利的鏈接進去,實現主從切換功能。
2.3工做原理
MHA工做原理總結爲如下幾條: (1) 從宕機崩潰的 master 保存二進制日誌事件(binlog events); (2) 識別
含有最新更新的 slave ; (3) 應用差別的中繼日誌(relay log) 到其餘 slave ; (4) 應用從 master 保存的二進制
日誌事件(binlog events); (5) 提高一個 slave 爲新 master ;
3、實現過程
環境搭建
manager 192.168.11.151 用於監控管理
master 192.168.11.152 開啓bin-log(二進制日誌) relay-log(中繼日誌)關閉relay_log_purge
slave1 192.168.11.160 開啓bin-log(二進制日誌) relay-log(中繼日誌)關閉relay_log_purge
slave2 192.168.11.12 開啓bin-log(二進制日誌) relay-log(中繼日誌)關閉relay_log_purge
全部節點進行初始化關閉防火牆,selinux重啓系統
manager hostname --static set-hostname manager
master hostname --static set-hostname master
slave1 hostname --static set-hostname slave1
slave2 hostname --static set-hostname slave2
=======================================
如下4臺服務器都要作
setenforce 臨時關閉selinux
systemctl stop firewalld 臨時關閉防火牆
在/etc/hosts文件中寫入
192.168.37.151 manager.qf.com manager
192.168.37.152 master.qf.com master
192.168.37.160 slave1.qf.com slave1
192.168.37.12 slave2.qf.com slave2
====================================
如下3臺機器都要作
2.安裝mariadb
yum -y install MariaDB-server MariaDB-client
3.初始化mariadb
mysql_secure_installation
4.修改master的數據庫配置文件
vim /etc/my.cnf.d/server.cnf
意思分別爲
複製集羣中的各節點的id均必須惟一
開啓二進制日誌
開啓中繼日誌
關閉名稱解析(非必須)
重啓mariadb服務
systemctl restart mariadb
5.配置slave節點
slave1主機
[mysqld]
server-id = 2 //複製集羣中的各節點的id均必須惟一;
log-bin = master-log //開啓中繼日誌
relay-log=relay-log //開啓二進制日誌
skip_name_resolve //啓用只讀屬性
read-only=on //是否自動清空再也不須要中繼日誌
relay-log-purge = 0 //關閉名稱解析(非必須)
log-slave-updates = 1 //使得更新的數據寫進二進制日誌中
slave2主機
[mysqld]
server-id = 3 //複製集羣中的各節點的id均必須惟一;
log-bin = master-log //開啓中繼日誌
relay-log=relay-log //開啓二進制日誌
skip_name_resolve //啓用只讀屬性
read-only=on //是否自動清空再也不須要中繼日誌
relay-log-purge = 0 //關閉名稱解析(非必須)
log-slave-updates = 1 //使得更新的數據寫進二進制日誌中
systemctl restart mariadb //重啓mariadb服務
=======================================
配置一主多從複製架構
master節點上
mysql -uroot -p'0' //密碼時前面初始化設的
MariaDB [(none)]>grant replication slave,replication client on *.* to
'slave'@'192.168.%.%' identified by 'keer';
# 備份數據導出到從庫
[root@master ~]# mysqldump -uroot -p'0' --all-databases > `date +%F`-mysql-all.sql
[root@master ~]# scp *mysql-all.sql 192.168.11.160:/root
[root@master ~]# scp *mysql-all.sql 192.168.11.12:/root
[root@master ~]# mysql -uroot -p'keer'
MariaDB [(none)]> show master status;
====================================================
slave節點上 2個備都要作
#導入數據
[root@slave1 ~]# mysql -uroot -p'0' < *mysql-all.sql
[root@slave1 ~]# mysql -uroot -p'0'
MariaDB [(none)]> change master to master_host='192.168.11.152',
-> master_user='slave',
-> master_password='keer',
-> master_log_file='master-log.000002',
-> master_log_pos=483458;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
看到有2個yes就成功了
能夠測試一下,在主上新建一個庫,看備上有沒有同步
====================================================
5.安裝配置MHA
3.2.1 在 master 上進行受權
在全部 Mysql 節點受權擁有管理權限的用戶可在本地網絡中有其餘節點上遠程訪問。 固然, 此時僅須要且只能
在 master 節點運行相似以下 SQL 語句便可。
[root@master ~]# mysql -uroot -p'0'
MariaDB [(none)]> grant all on *.* to 'mhaadmin'@'192.168.%.%' identified by 'mhapass';
6.準備ssh互通環境
mananger節點
ssh-keygen //生成祕鑰對
ssh-copy-id 192.168.11.151 //傳公鑰給本身
master節點
ssh-keygen
ssh-copy-id 192.168.11.151 ////傳公鑰給manager
slave1節點
ssh-keygen
ssh-copy-id 192.168.11.151 ////傳公鑰給manager
slave2節點
ssh-keygen
ssh-copy-id 192.168.11.151 ////傳公鑰給manager
而後在manager節點上
cd .ssh
scp authorized_keys 192.168.11.152:/root/.ssh/
scp authorized_keys 192.168.11.160:/root/.ssh/
scp authorized_keys 192.168.11.12:/root/.ssh/
作完以後
cat .ssh/authorized_keys
4臺機器都有着4個公鑰,那麼4臺機器就能夠實現ssh無密碼互通了
6.安裝MHA包
四個節點都需安裝: mha4mysql-node-0.56-0.el6.norch.rpm ,Manager 節點另須要安裝: mha4mysqlmanager-0.56-0.el6.noarch.rpm
manager:
yum -y install mha4mysql-node.noarch
yum -y install mha4mysql-manager
master:
yum -y install mha4mysql-node.noarch
slave1
yum -y install mha4mysql-node.noarch
slave2
yum -y install mha4mysql-node.noarch
7.初始化MHA,進行配置
Manager 節點須要爲每一個監控的 master/slave 集羣提供一個專用的配置文件,而全部的 master/slave 集羣也
可共享全局配置。全局配置文件默認爲 /etc/masterha_default.cnf ,其爲可選配置。若是僅監控一組
master/slave 集羣,也可直接經過 application 的配置來提供各服務器的默認配置信息。而每一個 application 的配置
文件路徑爲自定義。具體操做見下一步驟。
8. 定義 MHA 管理配置文件
mkdir /etc/mha_master
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.152 //節點2主機地址
ssh_port=22 //節點2的ssh端口
candidate_master=1 //未來可不能夠成爲master候選節點/主節點
[server2]
hostname=192.168.11.160
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.11.12
ssh_port=22
candidate_master=1
8.對4個節點進行檢測
1)檢測各節點間 ssh 互信通訊配置是否 ok 咱們在 Manager 機器上輸入下述命令來檢測:
[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf //檢測互信命令
2)檢查管理的MySQL複製集羣的鏈接配置參數是否OK
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
9.啓動MHA
在manager節點執行操做
[root@manager ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &>
/etc/mha_master/manager.log &
會查到有個進程
啓動成功後,咱們來查看一下master節點的狀態
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:28109) is running(0:PING_OK), master:192.168.11.152
上面的信息中「mha (pid:28109) is running(0:PING_OK)」表示MHA服務運行OK,不然, 則會顯示爲相似「mha is
stopped(1:NOT_RUNNING).」 若是,咱們想要中止 MHA ,則須要使用 stop 命令:
[root@manager ~]# masterha_stop -conf=/etc/mha_master/mha.cnf
======================================================
測試MHA故障轉移
在 master 節點關閉 mariadb 服務,模擬主節點數據崩潰
[root@master ~]# killall5 -9 mysqld mysqld_safe
10.在manaer節點查看日誌
[root@manager ~]# tail -200 /etc/mha_master/manager.log
……
Thu Nov 23 09:17:19 2017 - [info] Master failover to
192.168.37.160(192.168.37.160:3306) completed successfully
表示 manager 檢測到192.168.11.152節點故障, 然後自動執行故障轉移, 將192.168.11.160提高爲主節點。
注意,故障轉移完成後, manager將會自動中止, 此時使用 masterha_check_status 命令檢測將會遇到錯誤
提示, 以下所示:
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha is stopped(2:NOT_RUNNING).
能夠看到master斷掉以後,slave經過競選成爲主
在slave節點上,能夠看到,有一個slave成爲了主
11. 提供新的從節點以修復複製集羣
原有 master 節點故障後,須要從新準備好一個新的 MySQL 節點。基於來自於master 節點的備份恢復數據後,
將其配置爲新的 master 的從節點便可。注意,新加入的節點若是爲新增節點,其 IP 地址要配置爲原來 master 節點
的 IP,不然,還須要修改 mha.cnf 中相應的 ip 地址。隨後再次啓動 manager ,並再次檢測其狀態。 咱們就以
剛剛關閉的那臺主做爲新添加的機器,來進行數據庫的恢復: 本來的 slave1 已經成爲了新的主機器,因此,我
們對其進行徹底備份,然後把備份的數據發送到咱們新添加的機器上
slave節點上:
[root@slave1 ~]# mkdir /backup
[root@slave1 ~]# mysqldump --all-database > /backup/`date +%F-%T`-mysql-all.mysql
[root@slave1 ~]# scp /backup/2019-04-25-19\:07\:05-mysql-all.mysql 192.168.11.152:/
在原master節點上進行數據恢復
啓動mariadb
# 啓動並初始化 mariadb
[root@master ~]# systemctl start mariadb
[root@master ~]# mysql_secure_installation
[root@master ~]#mysql < 2019-04-25-mysql-all.sql //還原數據
接下來就是配置主從,看一下如今的主的二進制日誌和位置,而後進行以下設置
[root@slave1 ~]# mysql -uroot -p'keer'
MariaDB [(none)]> show master status;
#配置主從
[root@master ~]# mysql -uroot -p'0'
MariaDB [(none)]>change master to master_host='192.168.11.160', master_user='slave',
master_password='keer', master_log_file='master-log.000002', master_log_pos=483458;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.11.160
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000002
Read_Master_Log_Pos: 483458
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 556
Relay_Master_Log_File: master-log.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 483458
Relay_Log_Space: 859
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
ERROR: No query specified
==============================================
12.新節點提供後再次執行檢查操做
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
若沒有問題,則啓動 manager,注意,此次啓動要記錄日誌:
[root@manager ~]# masterha_manager -conf=/etc/mha_master/mha.cnf >/etc/mha_master/manager.log 2>&1 &
[1] 40773
啓動成功之後,咱們來查看一下 master 節點的狀態:
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:9561) is running(0:PING_OK), master:192.168.37.160
咱們的服務已經成功繼續了。
3.7新節點上線, 故障轉換恢復注意事項
1)在生產環境中, 當你的主節點掛了後, 必定要在從節點上作一個備份, 拿着備份文件把主節點手動提高爲
從節點, 並指明從哪個日誌文件的位置開始複製 2)每一次自動完成轉換後, 每一次的(replication health )
檢測不ok始終都是啓動不了必須手動修復主節點, 除非你改配置文件 3)手動修復主節點提高爲從節點後, 再
次運行檢測命令
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:9561) is running(0:PING_OK), master:192.168.37.160
4)再次運行起來就恢復成功了
[root@manager ~]# masterha_manager --conf=/etc/mha_master/mha.cnf
以上。咱們的實驗已經圓滿完成。