天天看點

mha mysql 兩台機器_MySQL主從複制(8)MHA實作主從高可用

一、MHA介紹

1、MHA的作用

MHA是實作MySQL高可用的一種成熟解決方案,可以在主從故障時自動完成主從切換,切換速度在30-60秒,并且可以最大程度的去保持資料一緻性。MHA由管理節點(Manager)和資料節點(Node)組成,一套MHA Manager可以管理多套MySQL叢集。當Manager發現MySQL Master出現故障時自動将一個擁有最新資料的Slave提升為Master,并讓另外的Slave重新指向到新的Master上來。除此之外MHA還可以線上進行主從切換,大概2秒内就可以完成。

2、MHA工作流程

· 主庫發生故障時,MHA把binlog通過scp傳到其他節點。如果主庫已經無法SSH,則在兩個從庫中進行差異補償。是以建議準備一台專門存放binlog的機器。

·将所有從庫的relaylog進行對比,找到一個擁有最新position資訊的slave,如slave01

·通過slave01的relaylog對其它從庫的relaylog進行補全,保持和slave01一緻

·将slalve01提升為Master,并讓其它從庫指向到slave01

·将第一步所儲存的binlog資訊補全到slave01

·開啟其它節點slave的主從複制,保持和slave01一緻

二、MHA的部署(至少一主兩從,否則MHA無法啟動,另外最好再配置一台存放binlog的伺服器)

1、首先在每個節點都安裝上perl-DBD-MySQL,該元件會對MHA所需軟體提供依賴,因為所用MHA軟體是perl語言寫的程式(Xtrabackup也是)

yum install perl-DBD-MySQL

2、下載下傳MHA的Manager和Node安裝包(下載下傳位址https://github.com/yoshinorim/mha4mysql-manager)。雖然Manager可以裝在某個從節點上,但建議單獨找機器部署,這樣可以避免節點故障導緻MHA無法工作,而且一套MHA是可以同時監控多套MySQL主從。而Node則需要裝在每一個MySQL節點上(沒有Node的話Manager也裝不上)

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm #每個節點都要裝Node

yum localinstall mha4mysql-manager-0.58-0.el7.centos.noarch.rpm #找一個從節點或者獨立伺服器裝Manager

3、在每個資料庫節點上都建立一個用于主從複制的賬号,因為發生主從切換後其他節點就會用到該賬号。在所有節點建立mha使用者并授權,這裡在主庫執行授權語句即可,由于之前已經是主從關系,是以該語句也會同步到其他從庫上。另外還要保證主從節點都要開啟binlog,另外從庫的隻讀選項不能寫在配置檔案裡,需要使用指令行臨時設定

GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO [email protected]'192.168.36.11' IDENTIFIED BY '123456789'; #為每個節點建立一個主從複制賬号

grant all privileges on *.* to [email protected]'10.0.0.%' identified by 'mha'; #為mha建立賬号

set global read_only=1 #隻在從庫配置

4、在Manager節點上建立MHA配置檔案,配置檔案樣例檔案可以在安裝包裡擷取到。對于MHA binlog server的實時同步可以參考本站文章《【MySQL運維】使用mysqlbinlog實時同步binlog日志》

mkdir -p /etc/mha /var/log/mha

vi /etc/mha/linuxe_mha.cnf #多套主從可以建立多個配置檔案

[server default]

manager_log=/var/log/mha/manager.log #MHA日志,發生主從切換時都會在這裡詳細記錄

manager_workdir=/var/log/mha #MHA日志存放目錄

master_binlog_dir=/data/mysql/ #主庫binlog路徑,如果MHA管理多個主從,有主節點路徑不一緻則可以單獨寫在主機标簽中

user=mha #MHA管理使用者

password=mha #管理使用者密碼

ping_interval=2 #每2秒檢查一次主庫狀态,4次不可連就觸發切換

repl_password=123456 #主從複制的密碼

repl_user=repl #主從複制的使用者,用于發生主從切換後告知MHA用什麼賬号來建構新的主從

ssh_user=root #MHA 會使用scp傳輸日志,是以節點之間做好密鑰登入

ssh_port=22

[server1] #主機标簽,數字大小會影響優先級

hostname=10.0.0.51

port=3306

master_binlog_dir=/data/mysql/binlog #單獨定義了一個binlog路徑

[server2]

#candidate_master=1 #強制該節點成為候選master,由于少了判斷過程,可以節約切換時間,通常用于兩地三中心架構,優先切就近節點為主

#check_repl_delay=0 #和上面配置配合使用,忽略從庫複制延時的問題,否則延遲大于100M的話候選master也不會被選舉為master

hostname=10.0.0.51

port=3306

[server3]

hostname=10.0.0.52

port=3306

[binlog1] #配置一台binlog伺服器用來實時備份binlog,防止主庫斷電導緻binlog無法傳輸。該機器需要自行使用mysqlbinlog實時擷取binlog

no_master=1 #該節點不會被提升為master

hostname=10.0.0.54

master_binlog_dir=/data/mysql/binlog

5、通過Manager自帶腳本masterha_check_ssh檢查各節點免密登入是否正常;通過masterha_check_repl腳本檢查主從複制是否正常

masterha_check_ssh --conf=/etc/mha/mha.cnf #各節點配置好免密登入

masterha_check_repl --conf=/etc/mha/mha.cnf #至少一主兩從

6、啟動MHA

nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/manager.log 2>&1 &

# remove_dead_master_conf:會在MHA配置檔案中去掉已經當機的主庫配置資訊

# ignore_last_failover:MHA預設8小時内隻切換一次,加該選項可以忽略這個限制

# ignore_fail_on_start:不加該參數的話如果有一個或多個從庫處于當機狀态,MHA不會啟動

7、MHA部署完成後使用masterha_check_status腳本檢查MHA狀态

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

三、MHA故障轉移與修複

· masterha_master_switch手動故障轉移

适用于管理節點沒有啟動MHA manager或需要手動切換主從的場景

masterha_master_switch --master_state=dead --conf=/etc/mha.cnf --dead_master_host=192.168.0.100 --dead_master_port=3306 --new_master_host=192.168.0.101 --new_master_port=3306 --ignore_last_failover

# --master_state=dead:指定主庫狀态,alive代表線上主從切換,dead則是故障切換

· 主從切換後故障節點的修複

1、當主節點故障并發生主從切換後,原Master就處于暫停服務狀态,需要手動修複資料才可以使用。在重新部署主從時,通過MHA日志可以找到發生切換時的Position資訊,然後直接複制那條CHANGE MASTER語句即可讓其成為從庫,日志内容大緻如下:

All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.2.129', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=61791, MASTER_USER='repl', MASTER_PASSWORD='xxx';

2、MHA發生切換後,配置檔案會被重寫,原有的Master節點的資訊會被删除(可以了解為配置檔案如果發生了變化,那就意味發生過切換),是以在恢複了服務後還需要手動在MHA配置檔案中增加一台節點

3、binlog server上的mysqlbinlog會自動停止,是以重新運作mysqlbinlog拉取日志,運作前修改節點IP為新的主庫、binlog名字

四、MHA的VIP漂移

傳統的VIP管理通常是keepalive,但是用它做MHA VIP管理的話無法保證VIP漂移到擁有最新資料的Slave上,因為keepalive并不知道節點的資料情況。是以需要使用MHA自帶的腳本進行VIP管理。下面是配置步驟:

1、編輯mha配置檔案,在[server default]标簽增加一行

master_ip_failover_script=/usr/local/bin/master_ip_failover #腳本可以從manager源碼包samples/script目錄中複制,然後修改一些VIP配置等資訊

2、增加執行權限

chmod +x /usr/local/bin/master_ip_failover

3、檢查腳本

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

4、第一次需要在主庫手動配置VIP,然後重新開機MHA

ifconfig eth0:1 192.168.10.199/24 #建立一個VIP

masterha_stop --conf=/etc/mha/mha1.cnf #停止MHA

nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/manager.log 2>&1 &