1. 程式人生 > 其它 >MySQL之MHA高可用配置及故障切換例項

MySQL之MHA高可用配置及故障切換例項

目錄

一、MHA概述

    1.1 MHA是什麼

    1.2 MHA的組成

       1) MHA Node (資料節點)

       2) MHA Manager (管理節點)

    1.3 MHA的特點

二、MHA搭建準備

    2.1實驗思路

    2.2實驗準備

三、MHA搭建的步驟

    3.1配置主從複製

     1.初始化環境

     2.修改Master、Slave1、Slave2節點的主機名

     3.配置主從同步

     4.Master、Slave1、Slave2節點上都建立兩個軟連結

     5.登入資料庫主從配置授權

     6.Master節點檢視二進位制檔案和同步點、在Slave1、Slave2節點執行同步操作

     7.驗證主從同步

    3.2安裝MHA軟體

     1.所有伺服器上都安裝MHA依賴的環境,首先安裝epel源

     2.安裝MHA軟體包,先在所有伺服器上必須先安裝node 元件

     3.在MHA-manager節點上安裝manager 元件

     4.在所有伺服器上配置無密碼認證

     5.在manager節點上操作

    3.3故障模擬

    3.4故障修復

 

 

 

 

 

 

 

一、MHA概述

1.1 MHA是什麼

  • MHA(MasterHigh Availability)是一套優秀的MySQL高可用環境下故障切換和主從複製的軟體。
  • MHA 的出現就是解決MySQL 單點的問題。
  • MySQL故障切換過程中,MHA能做到0-30秒內自動完成故障切換操作。
  • MHA能在故障切換的過程中最大程度上保證資料的一致性,以達到真正意義上的高可用。

 

1.2 MHA的組成

1) MHA Node (資料節點)

MHA Node 執行在每臺 MySQL 伺服器上。

2) MHA Manager (管理節點)

  • MHA Manager 可以單獨部署在一臺獨立的機器上,管理多個 master-slave 叢集;也可以部署在一臺 slave 節點上。
  • MHA Manager 會定時探測叢集中的 master 節點。當 master 出現故障時,它可以自動將最新資料的 slave 提升為新的 master, 然後將所有其他的 slave 重新指向新的 master。整個故障轉移過程對應用程式完全透明。

 

1.3 MHA的特點

  • 自動故障切換過程中,MHA試圖從宕機的主伺服器上儲存二進位制日誌,最大程度的保證資料不丟失;
  • 使用半同步複製,可以大大降低資料丟失的風險,如果只有一個slave已經收到了最新的二進位制日誌,MHA可以將最新的二進位制日誌應用於其他所有的slave伺服器上,因此可以保證所有節點的資料一致性;
  • 目前MHA支援一主多從架構,最少三臺服務,即一主兩從.

 

二、MHA搭建準備

2.1實驗思路

1.MHA架構 ①資料庫安裝 ②一主兩從 ③MHA搭建

2.故障模擬 ①主庫失效 ②備選主庫成為主庫 ③原故障主庫恢復重新加入到MHA成為從庫

 

2.2實驗準備

 

三、MHA搭建的步驟

3.1配置主從複製

1.初始化環境

1 #在四臺伺服器上初始化環境
2 systemctl stop firewalld
3 systemctl disable firewalld
4 setenforce 0

 

⒉修改manager、Master、Slave1、Slave2節點的主機名

 1 #定義節點伺服器名稱
 2 hostnamectl set-hostname manager
 3 su
 4 
 5 hostnamectl set-hostname master
 6 su
 7 
 8 hostnamectl set-hostname slave1
 9 su
10 
11 hostnamectl set-hostname slave2
12 su

 

3.配置主從同步

 1 #修改 Master、Slave1、Slave2 節點的 Mysql主配置檔案/etc/my.cnf 
 2 ##Master 節點##
 3 vim /etc/my.cnf
 4 [mysqld]
 5 server-id = 1
 6 log_bin = master-bin
 7 log-slave-updates = true
 8  
 9 systemctl restart mysqld
10  
11 ##Slave1 節點##
12 vim /etc/my.cnf
13 server-id = 2                         #三臺伺服器的 server-id 不能一樣
14 log_bin = master-bin
15 relay-log = relay-log-bin
16 relay-log-index = slave-relay-bin.index
17  
18 systemctl restart mysqld
19  
20 ###Slave2 節點##
21 vim /etc/my.cnf
22 server-id = 3 
23 log_bin = master-bin
24 relay-log = relay-log-bin
25 relay-log-index = slave-relay-bin.index
26  
27 systemctl restart mysqld

 

4.Master、Slave1、Slave2節點上都建立兩個軟連結

1 ln -s /usr/local/mysql/bin/mysql /usr/sbin
2 ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin

 

5.登入資料庫主從配置授權

 1 #配置MySQL 一主兩從
 2 #在所有資料庫節點上授權兩個使用者,一個是從庫同步使用,另一個是manager使用
 3 grant replication slave on *.* to 'myslave'@'192.168.239.%' identified by '123456'; 
 4 grant all privileges on *.* to 'mha'@'192.168.239.%' identified by 'manager';
 5 
 6 
 7 #下面三條授權理論上不用新增,但是實驗環境通過MHA檢查MySQL主從報錯,
 8 報兩個從庫通過主機名連線不上主庫,所以所有資料庫都需要新增以下授權
 9 通過mha檢查的時候,是通過主機名的形式進行監控,這種情況會容易報錯
10 grant all privileges on *.* to 'mha'@'master' identified by 'manager';
11 grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
12 grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
13 
14 #所有從庫開啟只讀功能(不會對超級管理員super生效,普通使用者)
15 set global read_only=1;
16 
17 flush privileges;

 

6.Master節點檢視二進位制檔案和同步點、在Slave1、Slave2節點執行同步操作

###在master上###
show master status;
 
###在slave1、slave2節點執行同步操作##
change master to master_host='192.168.239.3',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1747;
start slave;
show slave status\G;

 

7.驗證主從同步

1 ##在主master上建立庫、表並插入資料##
2 create database kgc;
3 use kgc;
4 create table info (id int(10),name varchar(40));
5 insert into info values(1,'zhangsan');
6 select * from kgc.info;
7  
8 ##在slave1、slave2上驗證##
9 select * from kgc.info;

 

3.2安裝MHA軟體

1.所有伺服器上都安裝MHA依賴的環境,首先安裝epel源

 1 #在所有伺服器上安裝MHA依賴環境,首先安裝epel源,只有安裝了源 perl才會有
 2 #安裝epel源,並且不進行gph檢查
 3 yum install epel-release --nogpgcheck -y
 4 
 5 #perl針對於mysql資料庫
 6 #從配置檔案中提拿其中的值
 7 #log-日誌
 8 #多執行緒管理
 9 #擴充套件工具CBuilder  MakeMaker
10 #cpan perl中的資料庫
11 yum install -y perl-DBD-MySQL \
12 perl-Config-Tiny \
13 perl-Log-Dispatch \
14 perl-Parallel-ForkManager \
15 perl-ExtUtils-CBuilder \
16 perl-ExtUtils-MakeMaker \
17 perl-CPAN

 

2.安裝MHA軟體包,先在所有伺服器上必須先安裝node 元件

  • 對於每個作業系統版本不一樣,這裡 CentOS7.4 必須選擇 0.57 版本。

  • 在所有伺服器上必須先安裝 node 元件,最後在 MHA-manager 節點上安裝 manager 元件,因為 manager 依賴 node 元件。

 1 #同步阿里雲時間伺服器
 2 ntpdate ntp.aliyun.com
 3 
 4 ##將需要的包下載到/opt下##
 5  
 6 ##每臺伺服器上解壓安裝node元件##
 7 cd /opt
 8 tar zxf mha4mysql-node-0.57.tar.gz
 9 cd mha4mysql-node-0.57
10 perl Makefile.PL
11 make && make install

 

 

 

 

3.在MHA-manager節點上安裝manager 元件

1 tar zxf mha4mysql-manager-0.57.tar.gz 
2 cd mha4mysql-manager-0.57/
3 perl Makefile.PL
4 make && make install

 

 1 cd /usr/local/bin/
 2 #manager 元件安裝後在/usr/local/bin 下面會生成幾個工具,主要包括以下幾個:
 3 masterha_check_ssh 檢查 MHA 的 SSH 配置狀況
 4 masterha_check_repl 檢查 MySQL 複製狀況
 5 masterha_manger 啟動 manager的指令碼
 6 masterha_check_status 檢測當前 MHA 執行狀態
 7 masterha_master_monitor 檢測 master 是否宕機
 8 masterha_master_switch 控制故障轉移(自動或者 手動)
 9 masterha_conf_host 新增或刪除配置的 server 資訊
10 masterha_stop  關閉manager
11  
12 #node 元件安裝後也會在/usr/local/bin 下面會生成幾個指令碼(這些工具通常由 MHAManager 的指令碼觸發,無需人為操作)主要如下:
13 save_binary_logs 儲存和複製 master 的二進位制日誌
14 apply_diff_relay_logs 識別差異的中繼日誌事件並將其差異的事件應用於其他的 slave
15 filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
16 purge_relay_logs 清除中繼日誌(不會阻塞 SQL 執行緒)

 

4.在所有伺服器上配置無密碼認證

 1 #一、在mannager上配置到所有資料庫節點的無密碼認證
 2 #一路回車
 3 ssh-keygen -t rsa
 4 ssh-copy-id 192.168.239.3
 5 ssh-copy-id 192.168.239.4
 6 ssh-copy-id 192.168.239.6
 7 ssh-copy-id 192.168.239.5
 8 
 9 #二、在master上配置到slave1和salve2的無密碼認證
10 ssh-keygen -t rsa
11 ssh-copy-id 192.168.239.3
12 ssh-copy-id 192.168.239.4
13 ssh-copy-id 192.168.239.6
14 ssh-copy-id 192.168.239.5
15 
16 
17 #三、在slave1上配置到master和salve2的無密碼認證
18 ssh-keygen -t rsa
19 ssh-copy-id 192.168.239.3
20 ssh-copy-id 192.168.239.4
21 ssh-copy-id 192.168.239.6
22 ssh-copy-id 192.168.239.5
23 
24 
25 #四、在slave2上配置到master和salve1的無密碼認證
26 ssh-keygen -t rsa
27 ssh-copy-id 192.168.239.3
28 ssh-copy-id 192.168.239.4
29 ssh-copy-id 192.168.239.6
30 ssh-copy-id 192.168.239.5

 

5.在manager節點上操作

  11)##在 manager 節點上覆制相關指令碼到/usr/local/bin 目錄
  2 cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
  3  
  4 #拷貝後會有四個執行檔案
  5 ll /usr/local/bin/scripts/
  6 master_ip_failover          #自動切換時 VIP 管理的指令碼
  7 master_ip_online_change     #線上切換時 vip 的管理
  8 power_manager                 #故障發生後關閉主機的指令碼
  9 send_report                 #因故障切換後傳送報警的指令碼
 10  
 112)##複製上述的自動切換時 VIP 管理的指令碼到 /usr/local/bin 目錄,這裡使用master_ip_failover指令碼來管理 VIP 和故障切換
 12 cp /usr/local/bin/scripts/* /usr/local/bin
 13  
 14 (3)##修改master_ip_failover 全部刪除,新增以下內容,修改相關引數
 15  
 16 #!/usr/bin/env perl
 17 use strict;
 18 use warnings FATAL => 'all';
 19  
 20 use Getopt::Long;
 21  
 22 my (
 23 $command, $ssh_user, $orig_master_host, $orig_master_ip,
 24 $orig_master_port, $new_master_host, $new_master_ip, $new_master_port
 25 );
 26 #############################新增內容部分#########################################
 27 my $vip = '192.168.59.188';                                    #指定vip的地址
 28 my $brdc = '192.168.59.255';                                #指定vip的廣播地址
 29 my $ifdev = 'ens33';                                        #指定vip繫結的網絡卡
 30 my $key = '1';                                                #指定vip繫結的虛擬網絡卡序列號
 31 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";        #代表此變數值為ifconfig ens33:1 192.168.59.188
 32 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";        #代表此變數值為ifconfig ens33:1 192.168.59.188 down
 33 my $exit_code = 0;                                            #指定退出狀態碼為0
 34 #my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
 35 #my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
 36 ##################################################################################
 37 GetOptions(
 38 'command=s' => \$command,
 39 'ssh_user=s' => \$ssh_user,
 40 'orig_master_host=s' => \$orig_master_host,
 41 'orig_master_ip=s' => \$orig_master_ip,
 42 'orig_master_port=i' => \$orig_master_port,
 43 'new_master_host=s' => \$new_master_host,
 44 'new_master_ip=s' => \$new_master_ip,
 45 'new_master_port=i' => \$new_master_port,
 46 );
 47  
 48 exit &main();
 49  
 50 sub main {
 51  
 52 print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
 53  
 54 if ( $command eq "stop" || $command eq "stopssh" ) {
 55  
 56 my $exit_code = 1;
 57 eval {
 58 print "Disabling the VIP on old master: $orig_master_host \n";
 59 &stop_vip();
 60 $exit_code = 0;
 61 };
 62 if ($@) {
 63 warn "Got Error: $@\n";
 64 exit $exit_code;
 65 }
 66 exit $exit_code;
 67 }
 68 elsif ( $command eq "start" ) {
 69  
 70 my $exit_code = 10;
 71 eval {
 72 print "Enabling the VIP - $vip on the new master - $new_master_host \n";
 73 &start_vip();
 74 $exit_code = 0;
 75 };
 76 if ($@) {
 77 warn $@;
 78 exit $exit_code;
 79 }
 80 exit $exit_code;
 81 }
 82 elsif ( $command eq "status" ) {
 83 print "Checking the Status of the script.. OK \n";
 84 exit 0;
 85 }
 86 else {
 87 &usage();
 88 exit 1;
 89 }
 90 }
 91 sub start_vip() {
 92 `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
 93 }
 94 ## A simple system call that disable the VIP on the old_master
 95 sub stop_vip() {
 96 `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
 97 }
 98  
 99 sub usage {
100 print
101 "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";
102 }
103  
104 #刪除註釋
105 :2,87 s/^#//
106  
107 (4)##建立 MHA 軟體目錄並拷貝配置檔案,這裡使用app1.cnf配置檔案來管理 mysql 節點伺服器
108  
109 #建立 MHA 軟體目錄並拷貝配置檔案
110 cd /opt/mha4mysql-manager-0.57/samples/conf/
111 ls
112 mkdir /etc/masterha
113 cp app1.cnf /etc/masterha/
114  
115  
116 #修改app1.cnf配置檔案,刪除原文所有內容,新增下面的
117 vim /etc/masterha/app1.cnf
118 [server default]
119 manager_workdir=/var/log/masterha/app1
120 master_binlog_dir=/usr/local/mysql/data
121 manager_log=/var/log/masterha/app1/manager.log
122 manager_workdir=/var/log/masterha/app1
123 master_binlog_dir=/usr/local/mysql/data
124 master_ip_failover_script=/usr/local/bin/master_ip_failover
125 master_ip_online_change_script=/usr/local/bin/master_ip_online_change
126 password=manager
127 ping_interval=1
128 remote_workdir=/tmp
129 repl_password=123456
130 repl_user=myslave
131 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.239.4 -s 192.168.239.6
132 shutdown_script=""
133 ssh_user=root
134 user=mha
135  
136 [server1]
137 hostname=192.168.239.3
138 port=3306
139  
140 [server2]
141 candidate_master=1
142 check_repl_delay=0
143 hostname=192.168.239.4
144 port=3306
145  
146 [server3]
147 hostname=192.168.239.6
148 port=3306
149  
150 (5)###在主節點開啟虛擬IP
151 ifconfig  ens33:1 192.168.239.100/24
152  
153 (6)##在 manager 節點上測試 ssh 無密碼認證,如果正常最後會輸出 successfully。如下所示
154 masterha_check_ssh -conf=/etc/masterha/app1.cnf
155  
156 (7)##在 manager 節點上測試 mysql 主從連線情況,最後出現 MySQL Replication Health is OK 字樣說明正常。如下所示。
157 masterha_check_repl -conf=/etc/masterha/app1.cnf
158  
159 (8)##在 manager 節點上啟動 MHA
160 nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
161  
162 (9)##檢視 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
163 masterha_check_status --conf=/etc/masterha/app1.cnf
164  
165 (10)檢視 MHA 日誌,也以看到當前的 master 是 192.168.239.3,如下所示。
166 cat /var/log/masterha/app1/manager.log | grep "current master"
167  
168 (11)##檢視 Mysql1 的 VIP 地址 192.168.239.100 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。
169 ifconfig
170  
171 //若要關閉 manager 服務,可以使用如下命令。
172 masterha_stop --conf=/etc/masterha/app1.cnf
173 或者可以直接採用 kill 程序 ID 的方式關閉。

 

解釋配置如下:

 1 [server default]
 2 manager_log=/var/log/masterha/app1/manager.log      #manager日誌
 3 manager_workdir=/var/log/masterha/app1            #manager工作目錄
 4 master_binlog_dir=/usr/local/mysql/data/         #master儲存binlog的位置,這裡的路徑要與master裡配置的binlog的路徑一致,以便MHA能找到
 5 master_ip_failover_script=/usr/local/bin/master_ip_failover  #設定自動failover時候的切換指令碼,也就是上面的那個指令碼
 6 master_ip_online_change_script=/usr/local/bin/master_ip_online_change  #設定手動切換時候的切換指令碼
 7 password=manager            #設定mysql中root使用者的密碼,這個密碼是前文中建立監控使用者的那個密碼
 8 ping_interval=1                #設定監控主庫,傳送ping包的時間間隔,預設是3秒,嘗試三次沒有迴應的時候自動進行failover
 9 remote_workdir=/tmp            #設定遠端mysql在發生切換時binlog的儲存位置
10 repl_password=123456           #設定複製使用者的密碼
11 repl_user=myslave            #設定複製使用者的使用者
12 report_script=/usr/local/send_report     #設定發生切換後傳送的報警的指令碼
13 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.239.4 -s 192.168.239.6    #指定檢查的從伺服器IP地址
14 shutdown_script=""            #設定故障發生後關閉故障主機指令碼(該指令碼的主要作用是關閉主機防止發生腦裂,這裡沒有使用)
15 ssh_user=root                #設定ssh的登入使用者名稱
16 user=mha                    #設定監控使用者root
17  
18 [server1]
19 hostname=192.168.239.3
20 port=3306
21  
22 [server2]
23 hostname=192.168.239.4
24 port=3306
25 candidate_master=1
26 #設定為候選master,設定該引數以後,發生主從切換以後將會將此從庫提升為主庫,即使這個從庫不是叢集中最新的slave
27  
28 check_repl_delay=0
29 #預設情況下如果一個slave落後master 超過100M的 relay logs的話,MHA將不會選擇該slave作為一個新的master, 因為對於這個slave的恢復需要花費很長時間;通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個引數對於設定了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master
30  
31 [server3]
32 hostname=192.168.239.6
33 port=3306

 

 

 

3.3故障模擬

 1 #在 manager 節點上監控觀察日誌記錄
 2 tail -f /var/log/masterha/app1/manager.log
 3  
 4 #在 Master 節點 Mysql1 上停止mysql服務
 5 systemctl stop mysqld
 6  7 pkill -9 mysql
 8  
 9 #在slave1,slave2上檢視,正常自動切換一次後,MHA 程序會退出。HMA 會自動修改 app1.cnf 檔案內容,將宕機的 mysql1 節點刪除。檢視 mysql2 是否接管 VIP
10 ifconfig
11  
12  
13 故障切換備選主庫的演算法:
14 1.一般判斷從庫的是從(position/GTID)判斷優劣,資料有差異,最接近於master的slave,成為備選主。
15 2.資料一致的情況下,按照配置檔案順序,選擇備選主庫。
16 3.設定有權重(candidate_master=1),按照權重強制指定備選主。
171)預設情況下如果一個slave落後master 100M的relay logs的話,即使有權重,也會失效。
182)如果check_repl_delay=0的話,即使落後很多日誌,也強制選擇其為備選主。

 

3.4故障修復

1.#修復mysql1
systemctl restart mysqld
 
2.#修復主從
#在現主庫伺服器 slave1 檢視二進位制檔案和同步點
show master status;
#在原主庫伺服器 master 執行同步操作
change master to master_host='192.168.239.4',master_user='myslave',master_password='123456',master_log_file='master-bin.000005',master_log_pos=154;
start slave;
show slave status\G;
 
3.#在 manager 節點上修改配置檔案app1.cnf(再把這個記錄新增進去,因為它檢測掉失效時候會自動消失)
vi /etc/masterha/app1.cnf
....
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.239.3 -s 192.168.239.6
....
[server1]
hostname=192.168.239.4
port=3306
 
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.239.3
port=3306
 
[server3]
hostname=192.168.239.6
port=3306
 
4.#在 manager 節點上啟動 MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &