使用MHA實現mysql高可用性(centos7.5+mysql5.7.23+MHA0.58)

一、MHA概述

1、MHA

         MHA(Master High Availability)事由日本人DeNA開發的一套MySQL高可用性環境下故障切換和主從提升的軟件,目前在MySQL高可用方面是一個相對成熟的解決方案。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成數據庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。

2、MHA的主要功能

(1)自動故障檢測和自動故障轉移

(2)交互式(手動)故障轉移

(3)在線切換Master到不同的主機

3、MHA的優勢

(1)自動故障轉移快

(2)主庫崩潰不存在數據一致性問題

(3)配置不需要對當前mysql環境做重大修改

(4)不需要添加額外的服務器(僅一臺manager就可管理上百個replication)

(5)性能優秀,可工作在半同步複製和異步複製

(6)只要replication支持的存儲引擎,MHA都支持,不會侷限於innodb

4、MHA的組成部分

         MHA由Manager節點和Node節點組成;MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave集羣,也可以部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上。

5、MHA工作原理

(1)MHA Manager會定時探測集羣中的master節點

(2)當master出現故障時,從宕機崩潰的master保存二進制日誌事件(binlog events);

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

(4)應用差異的中繼日誌(relay log)到其他的slave;

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

(6)提升一個slave爲新的master,使其他的slave連接新的master進行復制;

二、MHA安裝部署

1、環境準備

(1)環境準備

主機名

IP地址

節點信息

數據庫版本

系統版本

MYSQL01

192.168.16.151

Mysql主節點

5.7.23

centos7.5

MYSQL02

192.168.16.152

Mysql從節點

5.7.23

centos7.5

MYSQL03

192.168.16.153

Mysql從節點

5.7.23

centos7.5

MANAGER

192.168.16.155

MHA manager節點

 

centos7.5

(2)拓撲結構

(3)設置主機名並互相做祕鑰的認證

         首先需要在各個節點上配置各個主機的主機名,使各節點通過主機名能夠互相解析。

]# tail -4f /etc/hosts
192.168.16.151 MYSQL01
192.168.16.152 MYSQL02
192.168.16.152 MYSQL03
192.168.16.155 MANAGER

         由於MHA manager通過SSH訪問所有的node節點,各個node節點也同樣通過SSH來相互發送不同的relay log 文件,所以要在每一個node和manager上配置SSH無密碼登陸。

# 在每個節點上分別生成祕鑰對
[root@MYSQL01 ~]# ssh-keygen
# 每臺節點分別將自己的公鑰發送到另外的三臺節點
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

2、配置mysql主從環境

(1)配置mysql主節點及從節點

         Mysql主節點的配置如下:

[mysqld]
log-bin=mysql-bin 
server-id=1
replicate-do-db=course
character-set-server=utf8
init_connect='SET AUTOCOMMIT=0;set names utf8'

         mysql兩臺slave節點的配置如下:

[mysqld]
log-bin=mysql-bin 
server-id=2|3     #兩個節點的id配置不同
replicate-do-db=course   # 只同步course庫
# 更新數據的語句也記錄在slave自己的bin log中
log-slave-updates=true
# 設置relay_log的清除方式
relay_log_purge=0 
skip-slave-start=1
# 設置字符集及連接客戶端字符集
character-set-server=utf8
init_connect='SET AUTOCOMMIT=0;set names utf8'

(2)創建用於複製的用戶

         由於同步數據時將所有的數據都同步到了主庫,所有創建用於同步的用戶時只需在主庫創建,如果同步時不同步”mysql”庫,需要在三臺數據庫主機上分別創建用於複製的用戶。

# 創建用於複製的用戶
mysql> CREATE USER 'repl'@'192.168.16.%' IDENTIFIED BY 'replication';   
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.16.%';

(3)同步數據

         1)獲取主庫的bin log信息以及備份主庫

# 將主庫鎖定
mysql> FLUSH TABLES WITH READ LOCK;
# 獲取bin log日誌信息
mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000006
         Position: 4838
# 備份庫
]# mysqldump --all-databases --master-data -u root -p > course.sql
# 登錄主庫釋放鎖
mysql>  unlock tables;
# 將備份文件傳到從庫
]# scp course.sql [email protected]:/data/
]# scp course.sql [email protected]:/data/

         2)在從庫上導入數據並開啓主從複製

# 在兩臺slave上分別導入數據
]# mysql -uroot -p </data/mysql.sql
# 登錄兩臺從庫分別配置同步
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.16.151',
    -> MASTER_PORT=3306,
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='replication',
    -> MASTER_LOG_FILE='mysql-bin.000006',
    -> MASTER_LOG_POS=4838;
# 開啓同步
mysql> start slave;

(4)設置mysql程序及binglog程序的軟連接

         雖然mysql程序已經加入了環境變量,如果缺省路徑下mysql客戶端不存在在使用MHA時會報錯。

]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog

3、安裝MHA

(1)在各節點上安裝mha4mysql-node

         在四臺機器上上分別安裝mha4mysql-node。

         mha4mysql-node下載地址:https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

         mha4mysql-manager下載地址:https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58

# 安裝net-tools,最小化安裝的centos7中沒有一些網絡管理工具
]# yum install –y net-tools
# 安裝epel yum源
]# yum install epel-release
# 在安裝前先安依賴軟件
]# yum install –y perl-DBD-MySQL
# 安裝mha4mysql-node
]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

(3)在管理節點上安裝manage節點

# 在管理節點安裝依賴軟件
]# yum install -y perl-Config-Tiny perl-Log-Dispatch  perl-Parallel-ForkManager
# 在管理節點安裝mha4mysql-manager
]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

(4)manager管理工具

         在manager節點安裝完成後會生成一些管理工具,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信息

4、配置MHA

(1)配置MHA

         MHA管理端和客戶端安裝完成後,在管理端需要創建MHA的配置文件,配置文件內容如下:

# 創建manager工作目錄
]# mkdir /data/manager –p
# manager的配置文件
[root@MANAGER ~]# cat /etc/manager/manager.conf 
[server default] 
user=root 
password=dayi123
ssh_user=root 
manager_workdir=/data/manager
remote_workdir=/tmp
repl_user=repl 
repl_password=replication 
[server1] 
hostname=MYSQL01
port=3306 
master_binlog_dir=/data/mysql/data

[server2] 
hostname=MYSQL02
port=3306 
master_binlog_dir=/data/mysql/data
[server3] 
hostname=MYSQL03
port=3306 
master_binlog_dir=/data/mysql/data

(2)MHA主要配置文件說明

         manager_workdir=/var/log/masterha/app1.log:設置manager的工作目錄     

         manager_log=/var/log/masterha/app1/manager.log:設置manager的日誌文件  

         master_binlog_dir=/data/mysql:設置master 保存binlog的位置,以便MHA可以找到master的日誌                      

         master_ip_failover_script= /usr/local/bin/master_ip_failover:設置自動failover時候的切換腳本

         master_ip_online_change_script= /usr/local/bin/master_ip_online_change:設置手動切換時候的切換腳本 

         user=root:設置監控mysql的用戶

         password=dayi123:設置監控mysql的用戶,需要授權能夠在manager節點遠程登錄

         ping_interval=1:設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有迴應的時候自動進行railover    

         remote_workdir=/tmp:設置遠端mysql在發生切換時binlog的保存位置

         repl_user=repl :設置mysql中用於複製的用戶密碼

         repl_password=replication:設置mysql中用於複製的用戶        

         report_script=/usr/local/send_report:設置發生切換後發送的報警的腳本 

         shutdown_script="":設置故障發生後關閉故障主機腳本(該腳本的主要作用是關閉主機放在發生腦裂,這裏沒有使用)

         ssh_user=root //設置ssh的登錄用戶名

         candidate_master=1:在節點下設置,設置當前節點爲候選的master

         slave check_repl_delay=0 :在節點配置下設置,默認情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作爲一個新的master;這個選項對於對於設置了candidate_master=1的主機非常有用

5、檢查MHA的環境是否工作正常

(1)通過masterha_check_ssh腳本檢測SSH連接是否配置正常

]# masterha_check_ssh --conf=/etc/app1.cnf 
Mon Oct 29 12:05:48 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Oct 29 12:05:48 2018 - [info] Reading application default configuration from /etc/app1.cnf..
Mon Oct 29 12:05:48 2018 - [info] Reading server configuration from /etc/app1.cnf..
Mon Oct 29 12:05:48 2018 - [info] Starting SSH connection tests..
Mon Oct 29 12:05:53 2018 - [debug] 
…….
Mon Oct 29 12:05:52 2018 - [debug]  Connecting via SSH from root@MYSQL03(192.168.16.153:22) to root@MYSQL02(192.168.16.152:22)..
Mon Oct 29 12:05:52 2018 - [debug]   ok.
Mon Oct 29 12:05:53 2018 - [info] All SSH connection tests passed successfully.

(2)在管理節點檢查複製配置

         爲了讓MHA正常工作,所有的master和slave必須在配置文件中正確配置,MHA可通過masterha_check_repl 腳本檢測複製是否正確配置。

]# masterha_check_repl --conf=/etc/app1.cnf 
Fri Nov  2 16:27:47 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Nov  2 16:27:47 2018 - [info] Reading application default configuration from /etc/app1.cnf..
……
Fri Nov  2 16:27:53 2018 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.

三、MHA的管理

         Mysql中主從的工作狀態監測及切換事由manager節點來完成的,MHA安裝完成以及檢測通過後就可以根據自己的需求開啓以及停止manager,讓manager工作起來。

1、啓動Manager

         Manager是通過 masterha_manager 命令開啓,啓動後需要將它放在後臺運行。

         當MHA manager啓動監控以後,如果沒有異常則不會打印任何信息。我們可通過masterha_check_status命令檢查manager的狀態。

# 啓動Manager
]# nohup masterha_manager --conf=/etc/app1.cnf > /var/log/mha_manager.log < /dev/null &
# 檢測manager的工作狀態
]# masterha_check_status --conf=/etc/app1.cnf
app1 (pid:22330) is running(0:PING_OK), master:MYSQL0

2、停止MHA manager

         當需要停止manager時,可以通過 masterha_stop命令來停止manager。

# 停止manager
]#  masterha_stop --conf=/etc/app1.cnf 
Stopped app1 successfully.

3、故障的切換

(1)自動故障切換

         Manager啓動後,manager會自動去監測主從同步的狀態,當主節點故障時,會自動進行故障的轉移將從節點提升爲主節點,讓其他的從節點去新的主節點同步。

# 將主庫192.168.16.151關閉後,查看manager的日誌,主要的切換記錄如下:
]# tail -100f /var/log/mha_manager.log
……
app1: MySQL Master failover MYSQL01(192.168.16.151:3306) to MYSQL02(192.168.16.152:3306) succeeded
Master MYSQL01(192.168.16.151:3306) is down!
Check MHA Manager logs at MANAGER for details.
Started automated(non-interactive) failover.
The latest slave MYSQL02(192.168.16.152:3306) has all relay logs for recovery.
Selected MYSQL02(192.168.16.152:3306) as a new master.
MYSQL02(192.168.16.152:3306): OK: Applying all logs succeeded.
MYSQL03(192.168.16.153:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
MYSQL03(192.168.16.153:3306): OK: Applying all logs succeeded. Slave started, replicating from MYSQL02(192.168.16.152:3306)
MYSQL02(192.168.16.152:3306): Resetting slave info succeeded.
Master failover to MYSQL02(192.168.16.152:3306) completed successfully.

(2)手動故障切換

         當在業務上沒有啓用MHA自動切換功能,當主服務器故障時,需要人工手動調用MHA來進行故障切換操作。

# 進行配置停掉的主節點,讓成新的從節點;並manager進程時停掉的,否則會影響手動故障轉移
]#  masterha_stop --conf=/etc/app1.cnf
# 切換時需要將master停掉,否則會報錯,在切換命令中使用主機名,不要使用ip,否則也會報錯,在切換時也需要確認切換
]# masterha_master_switch --master_state=dead --conf=/etc/app1.cnf --dead_master_host=MYSQL02 --dead_master_port=3306 --new_master_host=MYSQL01 --new_master_port=3306 --ignore_last_failover……..
Started manual(interactive) failover.
The latest slave MYSQL01(192.168.16.151:3306) has all relay logs for recovery.
Selected MYSQL01(192.168.16.151:3306) as a new master.
MYSQL01(192.168.16.151:3306): OK: Applying all logs succeeded.
MYSQL03(192.168.16.153:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
MYSQL03(192.168.16.153:3306): OK: Applying all logs succeeded. Slave started, replicating from MYSQL01(192.168.16.151:3306)
MYSQL01(192.168.16.151:3306): Resetting slave info succeeded.
Master failover to MYSQL01(192.168.16.151:3306) completed successfully.

(3)在線切換

         爲了保證數據完全一致性,在最快的時間內完成切換,MHA的在線切換必須滿足以下條件纔會切換成功,否則會切換失敗。

         1)所有slave的IO線程都在運行       

         2)所有slave的SQL線程都在運行    

         3)所有的show slave status的輸出中Seconds_Behind_Master參數小於或者等於running_updates_limit秒,如果在切換過程中不指定running_updates_limit,那麼默認情況下running_updates_limit爲1秒。

         4)在master端,通過show processlist輸出,沒有一個更新花費的時間大於running_updates_limit秒。

# 在切換前先停掉manage,同時也恢復上面手動切換時停掉的MYSQL02爲MYSQL01的從節點
]# masterha_stop --conf=/etc/app1.cnf
# 在線切換MYSQL03爲主節點,切換時不需要停掉現有的主節點,在切換的過程中需要確認
]# masterha_master_switch --conf=/etc/app1.cnf --master_state=alive --new_master_host=MYSQL03 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
…..
Sat Nov  3 11:17:27 2018 - [info]  Executed CHANGE MASTER.
Sat Nov  3 11:17:27 2018 - [info]  Slave started.
Sat Nov  3 11:17:27 2018 - [info] All new slave servers switched successfully.
Sat Nov  3 11:17:27 2018 - [info] 
Sat Nov  3 11:17:27 2018 - [info] * Phase 5: New master cleanup phase..
Sat Nov  3 11:17:27 2018 - [info] 
Sat Nov  3 11:17:27 2018 - [info]  MYSQL03: Resetting slave info succeeded.
Sat Nov  3 11:17:27 2018 - [info] Switching master to MYSQL03(192.168.16.153:3306) completed successfully.

         在線切換完成後,從節點MYSQL03成爲了主節點,原來的主節點MYSQL01變爲從節點,兩個從節點會去新的主節點MYSQL03複製。

         在切換過程中的參數說明:

         -orig_master_is_new_slave:切換時加上此參數是將原 master 變爲 slave 節點,如果不加此參數,原來的 master 將不啓動

         --running_updates_limit=10000:故障切換時,候選master 如果有延遲的話, mha 切換不能成功,加上此參數表示延遲在此時間範圍內都可切換(單位爲s),但是切換的時間長短是由recover 時relay 日誌的大小決定。

4、在MHA環境中配置VIP

         通過MHA進行故障轉以後,連接Mysql數據庫的服務並不知道Mysql複製環境中進行了故障的轉移,同時連接mysql的服務也無法知曉主節點是哪一個,此時,可以通過配置VIP的方式讓所有的應用程序連接VIP,當mysql故障切換時,VIP會自動漂移到新的主節點。vip配置可以採用兩種方式,一種通過keepalived的方式管理;另外一種通過腳本方式啓動VIP,下面以腳本的方式進行演示。

# 爲mysql主節點在配置一個IP地址
]# ifconfig eno16777736:2 192.168.16.156/24
# 修改manager配置文件,添加VIP漂移腳本配置文件
master_ip_failover_script=/usr/local/bin/master_ip_failover
# 創建腳本/usr/local/bin/master_ip_failover,內容如下
]# cat /usr/local/bin/master_ip_failover 
#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
    $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
    $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
);

my $vip = '192.168.16.156/24';
my $key = '2';
my $ssh_start_vip = "/sbin/ifconfig eno16777736:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eno16777736:$key down";

GetOptions(
    'command=s'          => \$command,
    'ssh_user=s'         => \$ssh_user,
    'orig_master_host=s' => \$orig_master_host,
    'orig_master_ip=s'   => \$orig_master_ip,
    'orig_master_port=i' => \$orig_master_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
);

exit &main();

sub main {

    print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

    if ( $command eq "stop" || $command eq "stopssh" ) {

        my $exit_code = 1;
        eval {
            print "Disabling the VIP on old master: $orig_master_host \n";
            &stop_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {

        my $exit_code = 10;
        eval {
            print "Enabling the VIP - $vip on the new master - $new_master_host \n";
            &start_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}

sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
     return 0  unless  ($ssh_user);
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
# 爲腳本賦予執行的權限
]# chmod a+x master_ip_failover

         切換腳本中的去連接mysql各節點配置vip是通過”user”@”hostname”的方式去連接各節點配置vip的,所以在配置完各節點配置完ssh祕鑰認證後,要通過”ssh user@hostname”的方式去連接各個節點建立緩存(第一次通過祕鑰登錄需要輸入”yes”確認);否則腳本在執行到”Disabling the VIP on old master”會執行不下去。

 

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