1. 程式人生 > 資料庫 >MHA實現mysql主從自動切換

MHA實現mysql主從自動切換

MHA實現mysql主從自動切換

原理簡介

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 服務

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 才能順利的連線進去,實現主從切換功能。

二、MHA工作原理

(1) 從宕機崩潰的 master 儲存二進位制日誌事件(binlog events);
(2) 識別含有最新更新的 slave ;
(3) 應用差異的中繼日誌(relay log) 到其他 slave ;
(4) 應用從 master 儲存的二進位制日誌事件(binlog events);
(5) 提升一個 slave 為新 master ;
(6) 使用其他的 slave 連線新的 master 進行復制。

三、環境分配

機器名稱ip分配角色分配備註
Manager192.168.131.87Manager控制器用於監控管理
master192.168.131.83資料庫主伺服器開啟二進位制,中繼日誌
slave1192.168.131.84資料庫從伺服器開啟二進位制,中繼日誌
slave2192.168.131.85資料庫從伺服器開啟二進位制,中繼日誌

四、開始配置搭建

1、修改master節點配置:

vim /etc/my.cnf
      server-id = 1
      log-bin = mysql-bin
      relay-log = relay-log
      skip_name_resolve           #關閉名稱解析(非必須)
重啟資料庫
      systemctl restart mariadb

2、修改slave1節點配置:

vim /etc/my.cnf
     server-id = 2
     log-bin = mysql-bin          #開啟二進位制日誌
     relay-log = relay-log       #開啟中繼日誌
     skip_name_resolve           #關閉名稱解析(非必須)
     relay_log_purge = 0         #是否自動清空不再需要中繼日誌
     log_slave_updates = 1       #使得更新的資料寫進二進位制日誌中
     read_only = ON              #啟用只讀屬性
重啟資料庫
     systemctl restart mariadb

3、修改slave2節點配置:

vim /etc/my.cnf
     server-id = 3
     log-bin = mysql-bin          #開啟二進位制日誌
     relay-log = relay-log       #開啟中繼日誌
     skip_name_resolve           #關閉名稱解析(非必須)
     relay_log_purge = 0         #是否自動清空不再需要中繼日誌
     log_slave_updates = 1       #使得更新的資料寫進二進位制日誌中
     read_only = ON              #啟用只讀屬性
重啟資料庫
     systemctl restart mariadb

一主雙從搭建參考部落格:

4、準備ssh 免密互通:

MHA叢集中的各節點彼此之間均需要基於ssh互信通訊,以實現遠端控制及資料管理功能。簡單起見,可在Manager節點生成金鑰對兒,並設定其可遠端連線本地主機後, 將私鑰檔案及authorized_keys檔案複製給餘下的所有節點即可。
所有節點都需要執行:

       ssh-keygen -t rsa 
       ssh-copy-id -i .ssh/id_rsa.pub [email protected]
      

Manger節點執行:
檢視這個檔案裡有沒有4臺節點的公鑰,然後我們只需要把這個檔案傳送至另外三臺機器,這四臺機器就可以實現 ssh 無密碼互通了:
在這裡插入圖片描述
在這裡插入圖片描述
任意一臺機器登入測試:
在這裡插入圖片描述

5、MHA配置Manger節點:

在 master 上進行授權
在所有 Mysql 節點授權擁有管理許可權的使用者可在本地網路中有其他節點上遠端訪問。 當然, 此時僅需要且只能在 master 節點執行類似如下 SQL 語句即可。

grant all on *.* to 'mha'@'192.168.131.%' identified by '123';
flush privileges;   //重新整理

6、拖包上傳mha軟體包:

MHA軟體由兩部分組成,Manager工具包和Node工具包,具體的說明如下。
Manager工具包主要包括以下幾個工具:

masterha_check_ssh檢查MHA的SSH配置狀況
masterha_check_repl檢查MySQL複製狀況
masterha_manger啟動MHA
masterha_check_status檢測當前MHA執行狀態
masterha_master_monitor檢測master是否宕機
masterha_master_switch控制故障轉移(自動或者手動)
masterha_conf_host新增或刪除配置的server資訊

Node工具包(這些工具通常由MHA Manager的指令碼觸發,無需人為操作)
主要包括以下幾個工具:

save_binary_logs儲存和複製master的二進位制日誌
apply_diff_relay_logs識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
filter_mysqlbinlog去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
purge_relay_logs清除中繼日誌(不會阻塞SQL執行緒)

在這裡插入圖片描述
四個節點都需安裝:mha4mysql-node-0.58-0.el7.norch.rpm
Manager 節點另需要安裝:mha4mysql-manager-0.58-0.el7.noarch.rpm
Yum安裝即可

7、初始化 MHA ,進行配置

Manager 節點需要為每個監控的 master/slave 叢集提供一個專用的配置檔案,而所有的 master/slave 叢集也可共享全域性配置。全域性配置檔案預設為/etc/masterha_default.cnf,其為可選配置。如果僅監控一組 master/slave 叢集,也可直接通過 application 的配置來提供各伺服器的預設配置資訊。而每個 application 的配置檔案路徑為自定義。具體操作見下一步驟。

首先建立目錄
          mkdir /etc/mha_master
vim /etc/mha_master/mha.cnf
***********************************************
[server default]
user=mha                                  # MHA管理伺服器使用者名稱
password=123                              # 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=tom                             #  資料庫使用者名稱
repl_password=123                         #  資料庫密碼
ping_interval=1                           #  ping間隔時長
[server1]
hostname=192.168.131.83
ssh_port=22
candidate_master=1                        #  將來可不可以作為master候選主節點
[server2]
hostname=192.168.131.84
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.131.85
ssh_port=22
candidate_master=1

8、測試

檢測各節點ssh互相通訊配置是否OK:

masterha_check_ssh --conf=/etc/mha_master/mha.cnf

看到這個[info] All SSH connection tests passed successfully.表示測試成功
檢查管理的MYSQL複製叢集的連線配置引數是否OK:

masterha_check_repl -conf=/etc/mha_master/mha.cnf

在這裡插入圖片描述
因為沒有在master上授權給所有的從節點,以至於從節點上沒有相對應的賬號。因為這個架構,任何一個從節點都有可能成為主節點,所以也要建立賬號;
授權之後再次執行命令:

masterha_check_repl -conf=/etc/mha_master/mha.cnf

最後結果顯示:MySQL Replication Health is OK. 則表示成功
啟動mha:

nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &

其中“&> &”是將輸出結果全部重定向到/etc/mha_master/manager.log,也可以使用“2>&1”;

masterha_check_status -conf=/etc/mha_master/mha.cnf

#檢視master的狀態;

若是需要停止MHA,需要使用master_stop命令;

masterha_stop -conf=/etc/mha_master/mha.cnf

測試:
手動停掉192.168.131.83的主資料庫,檢視mha日誌
主轉移到192.168.131.84上,測試成功
在這裡插入圖片描述
這裡我翻譯了一下
在這裡插入圖片描述