mysql實現高可用架構之MHA

mysql實現高可用之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: 通常單獨

部署在一臺獨立機器上管理多個 master/slave 集羣(組),每個 master/slave 集羣稱作一個 application,用來管理

統籌整個集羣。 MHA node: 運行在每臺 MySQL 服務器上(master/slave/manager),它通過監控具備解析和

清理 logs 功能的腳本來加快故障轉移。 主要是接收管理節點所發出指令的代理,代理需要運行在每一個 mysql

節點上。簡單講 node 就是用來收集從節點服務器上所生成的 bin-log 。對比打算提升爲新的主節點之上的從節點的

是否擁有並完成操作,如果沒有發給新主節點在本地應用後提升爲主節點

image.png


我們可以看出,每個複製組內部和 Manager 之間都需要ssh實現無密碼互連,只有這樣,在 Master 出故障時,

Manager 才能順利的連接進去,實現主從切換功能。

2.3工作原理

image.png

MHA工作原理總結爲以下幾條: (1) 從宕機崩潰的 master 保存二進制日誌事件(binlog events); (2) 識別

含有最新更新的 slave ; (3) 應用差異的中繼日誌(relay log) 到其他 slave ; (4) 應用從 master 保存的二進制

日誌事件(binlog events); (5) 提升一個 slave 爲新 master ;

三、實現過程

環境搭建

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

image.png

意思分別爲

複製集羣中的各節點的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;

image.png

====================================================

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;

image.png

看到有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

image.png

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                //檢測互信命令

image.png

2)檢查管理的MySQL複製集羣的連接配置參數是否OK

[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf

image.png


9.啓動MHA

在manager節點執行操作

[root@manager ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &>

/etc/mha_master/manager.log &

image.png

會查到有個進程


啓動成功後,我們來查看一下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成爲了主

image.png

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;

image.png

#配置主從

[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

以上。我們的實驗已經圓滿完成。 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章