MySQL高可用--MHA

MySQL高可用--MHA


數據庫高可用-MHA

1、簡介node

        MHA(Master HA)是一款開源的 MySQL 的高可用程序,它爲 MySQL 主從複製架構提供了 automating master failover (自動化主故障轉移)功能。MHA 在監控到 master 節點故障時,會提高其中擁有最新數據的 slave 節點成爲新的master 節點,在此期間,MHA 會經過於其它從節點獲取額外信息來避免一致性方面的問題。MHA 還提供了 master 節點的在線切換功能,即按需切換 master/slave 節點。  python

        MHA 是由日本人 yoshinorim(原就任於DeNA現就任於FaceBook)開發的比較成熟的 MySQL 高可用方案。MHA 可以在30秒內實現故障切換,並能在故障切換中,最大可能的保證數據一致性。目前淘寶也正在開發類似產品 TMHA, 目前已支持一主一從。mysql

 

2、MHA服務linux

2.一、服務角色sql

MHA 服務有兩種角色, MHA Manager(管理節點)和 MHA Node(數據節點):數據庫

        MHA Manager:一般單獨部署在一臺獨立機器上管理多個 master/slave 集羣(組),每一個 master/slave 集羣稱做一個 application,用來管理統籌整個集羣;vim

        MHA node:運行在每臺 MySQL 服務器上(master/slave/manager),它經過監控具有解析和清理 logs 功能的腳原本加快故障轉移。  centos

主要是接收管理節點所發出指令的代理,代理須要運行在每個 mysql 節點上。簡單講 node 就是用來收集從節點服務器上所生成的 bin-log 。對比打算提高爲新的主節點之上的從節點的是否擁有並完成操做,若是沒有發給新主節點在本地應用後提高爲主節點。服務器

image.png

        由上圖咱們能夠看出,每一個複製組內部和 Manager 之間都須要ssh實現無密碼互連,只有這樣,在 Master 出故障時, Manager 才能順利的鏈接進去,實現主從切換功能。網絡

 

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.三、工做原理

image.png

MHA工做原理總結爲如下幾條:

(1) 從宕機崩潰的 master 保存二進制日誌事件(binlog events);

(2) 識別含有最新更新的 slave ;

(3) 應用差別的中繼日誌(relay log) 到其餘 slave ;

(4) 應用從 master 保存的二進制日誌事件(binlog events);

(5) 提高一個 slave 爲新 master ;

 

3、實現過程

環境準備:

主機名稱 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

 

----------部署過程----------

一、配置本地解析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退出保存

 

二、安裝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

 

三、修改數據庫配置文件對其進行初始化配置

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保存退出

image.png

重啓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保存退出

image.png

重啓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保存退出

image.png

重啓mariadb服務:systemctl   restart   mariadb

 

四、配置一主多從複製架構

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/

image.png

 

MariaDB [(none)]> show master status;

image.png

 

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;     #得到幫助配置主從複製

image.png

 

修改完成後粘貼進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
 

image.png

 

MariaDB [(none)]> start slave;

MariaDB [(none)]> show slave status\G

image.png

 

五、安裝配置MHA

在全部 Mysql 節點受權擁有管理權限的用戶可在本地網絡中有其餘節點上遠程訪問。 固然, 此時僅須要且只能在 master 節點運行相似以下 SQL 語句便可。

在master節點上面進行受權:

MariaDB [(none)]> grant all on *.* to 'mhaadmin'@'192.168.%.%' identified by 'mhapass';

MariaDB [(none)]> flush privileges;

image.png

 

準備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

在全部節點上執行以下命令

[root@centos7-01 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog

[root@centos7-01 ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql

[root@centos7-02 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog

[root@centos7-02 ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql

 

初始化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
 

image.png

 

六、對四個節點進行檢測

[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf      #檢測ssh互信是否ok

image.png

若是最後一行顯示爲[info]All SSH connection tests passed successfully.則表示成功。

 

[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf     #檢測mysql的主從複製是否ok

image.png

 

若是檢測主從複製沒法經過,則從新受權一下主從複製帳號:

MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer';    #受權主從帳號

MariaDB [(none)]> flush privileges;    #刷新權限表,使設置生效

 

七、啓動MHA

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

image.png

 

[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf    #查看master節點的狀態

image.png

 

#中止MHA的命令:

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

我就沒有執行了,由於我後面還有操做

 

八、測試MHA故障轉移

去master上面關閉mariadb服務:

[root@master ~]# systemctl stop mariadb

 

在manager節點查看日誌:

[root@manager ~]# tail -200 /etc/mha_master/manager.log

image.png

 

九、恢復原來拓機的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    #輸入密碼登陸

image.png

 

[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;
 

image.png

 

MariaDB [(none)]> start slave;      #開啓從功能

MariaDB [(none)]> show slave status\G      #顯示從狀態

 

image.png

到此,舊master已經從新加入到mysql主從集羣中了

 

十、新節點提供後再次進行檢測操做

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

image.png

 

#啓動MHA

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

image.png

 

#再次查看master節點的狀態

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

image.png

 

十一、新節點上線,故障轉換恢復注意事項

  1)在生產環境中, 當你的主節點掛了後, 必定要在從節點上作一個備份, 拿着備份文件把主節點手動提高爲從節點, 並指明從哪個日誌文件的位置開始複製

  2)每一次自動完成轉換後, 每一次的(replication health )檢測不ok始終都是啓動不了必須手動修復主節點, 除非你改配置文件

  3)手動修復主節點提高爲從節點後, 再次運行檢測命令

  4)再次運行起來就恢復成功了

            檢測主master節點:masterha_check_status -conf=/etc/mha_master/mha.cnf

相關文章
相關標籤/搜索