天天看點

MHA高可用配置及故障切換一、MHA概述二、MHA高可用案例

文章目錄

  • 一、MHA概述
  • 二、MHA高可用案例
    • 實驗需求
    • 實驗環境
    • 實驗步驟
      • MySQL5.6版本主從同步
      • 安裝MHA軟體
    • 實驗驗證

一、MHA概述

●傳統的MySQL主從架構存在的問題

MySQL主伺服器出故障後就無法寫入資料了

●MHA簡介

一套優秀的MySQL高可用環境下故障切換和主從複制的軟體

MySQL故障過程中,MHA能做到0-30秒内自動完成故障切換

●MHA組成

MHA Manager(管理節點)和 MHA Node(資料節點)

MHA Manager 可以單獨部署在一台獨立的機器上,管理多個 master-slave 叢集(Manger是單獨一台監控master伺服器健康狀态的伺服器。);也可以部署在一台 slave 節點上。MHA Node 運作在每台 MySQL 伺服器上,MHA Manager 會定時探測叢集中的 master 節點。當 master 出現故障時,它可以自動将最新資料的 slave 提升為新的 master,然後将所有其他的 slave 重新指向新的 master。整個故障轉移過程對應用程式完 全透明。

●MHA特點(優勢)

在 MHA 自動故障切換過程中,MHA 試圖從當機的主伺服器上儲存二進制日志,最大程度的保證資料的不丢失,但這并不總是可行的。例如,如果主伺服器硬體故障或無法通過 SSH 通路,MHA 沒法儲存二進制日志,就會出現隻進行故障轉移但丢失了最新的資料的情況。

使用 MySQL 5.5 的半同步複制,可以大大降低資料丢失的風險。MHA 可以與半同步複 制結合起來。如果隻有一個 slave 已經收到了最新的二進制日志,MHA 可以将最新的二進 制日志應用于其他所有的 slave 伺服器上,是以可以保證所有節點的資料一緻性。

●MHA架構

目前MHA支援一主多從架構,最少三台服務,即一主兩從

二、MHA高可用案例

MHA高可用配置及故障切換一、MHA概述二、MHA高可用案例

實驗需求

MHA 監控 MySQL資料庫健康狀态,在主伺服器故障時進行自動切換,不影響業務。

實驗環境

MHA高可用配置及故障切換一、MHA概述二、MHA高可用案例

實驗步驟

MySQL5.6版本主從同步

1.安裝編譯依賴的環境

yum -y install ncurses-devel gcc gcc-c++ perl-Module-Install
           

2.編譯安裝的方式安裝gmake編譯軟體

tar zxf cmake-2.8.6.tar.gz
cd cmake-2.8.6/
./configure
gmake && gmake install
           

3.安裝MySQL5.6資料庫

tar zxf mysql-5.6.36.tar.gz
cd mysql-5.6.36/
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc

make && make install
cp support-files/my-default.cnf /etc/my.cnf
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql
chown -R mysql.mysql /usr/local/mysql
mkdir -p /data/mysql
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
--user=mysql
           

4.修改Master的主配置檔案/etc/my.cnf檔案,三台伺服器的server-id不能一樣

vim /etc/my.cnf
[mysqld]

server-id=1
log-bin=master-bin
log-slave-updates=true
配置slave伺服器的主配置檔案/etc/my.cnf
vim /etc/my.cnf
server-id=2
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
           

5.mysql1、mysql2、mysql3分别做兩個軟連結

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

6.mysql1、mysql2、mysql3啟動MySQL。

7.配置MySQL伺服器:一主、一從/主、一從

(1)先做主從複制的配置,需要注意授權。

在所有資料庫節點上授權兩個使用者,一個是從庫同步使用,另外一個是manager使用

grant replication slave on *.* to 'myslave'@'14.0.0.%' identified by 'abc123';
grant all privileges on *.* to 'mha'@'14.0.0.%' identified by 'manager';
flush privileges;
           

(2)下面三條授權按理論是不用添加的,但是做案例實驗環境時候通過MHA檢查MySQL主從有報錯,

報兩個從庫通過主機名連接配接不上主庫,是以所有資料庫要加上下面的授權。

grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
##不加這三條授權mha健康檢查時會報錯
           

(3)在Mysql1主機上檢視二進制檔案和同步點

(4)接下來在Mysql2和Mysql3分别執行同步

mysql> change master to master_host='14.0.0.10',master_user='myslave',master_password='abc123',master_log_file='',master_log_pos=;
mysql> start slave;
           

(5)檢視IO和SQL線程都是yes代表同步是否正常

(6)必須設定兩個從庫為隻讀模式:

注意:設定完成直接驗證主從複制功能

安裝MHA軟體

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

yum -y install epel-release --nogpgcheck

yum -y install perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
           

2.MHA軟體包對于每個作業系統版本不一樣,這裡Centos7.6必須選擇0.57版本,

注意:所有伺服器上必須安裝node元件,最後在MHA-manager節點上安裝manager元件

[[email protected] ~]# tar zxf mha4mysql-node-0.57.tar.gz
[[email protected] ~]# cd mha4mysql-node-0.57/
[[email protected] mha4mysql-node-0.57]# perl Makefile.PL
[[email protected] mha4mysql-node-0.57]# make
[[email protected] mha4mysql-node-0.57]# make install
           

3.在MHA-manager上安裝manager元件(注意:一定要先安裝node元件才能安裝manager元件)

[[email protected] ~]# tar zxf mha4mysql-manager-0.57.tar.gz
[[email protected] ~]# cd mha4mysql-manager-0.57/
[[email protected] mha4mysql-manager-0.57]# perl Makefile.PL
[[email protected] mha4mysql-manager-0.57]# make
[[email protected] mha4mysql-manager-0.57]# make install
           

manager安裝後在/usr/local/bin下面會生成幾個工具,主要包括以下幾個

masterha_conf_host 添加或删除配置的server資訊

masterha_manager 啟動manager的腳本

masterha_check_repl 檢查MySQL複制狀況

masterha_master_monitor 檢測master是否當機

masterha_check_ssh 檢查MHA的SSH配置情況

masterha_master_switch 控制故障轉移(自動或者手動)

masterha_check_status 檢查目前MHA運作狀态

masterha_stop 關閉manager

Manager的腳本觸發,無需人為操作)主要如下:

apply_diff_relay_logs 識别差異的中繼日志事件并将其差異的事件應用于其他的slave

filter_mysqlbinlog 去除不必要的rollback事件(MHA已不再使用這個工具)

purge_relay_logs 清除中繼日志(不會阻塞SQL線程)

save_binary_logs 儲存和複制master的二進制日志

5.配置無密碼認證

(1)在manager上配置到所有資料節點的無密碼認證
[[email protected] ~]# ssh-keygen -t rsa   ##一直按回車
[[email protected] ~]# ssh-copy-id 14.0.0.10
[[email protected] ~]# ssh-copy-id 14.0.0.30
[[email protected] ~]# ssh-copy-id 14.0.0.40
(2)在Mysql1上配置到Mysql2和Mysql3的無密碼認證
[[email protected] ~]# ssh-keygen -t rsa   ##一直按回車
[[email protected] ~]# ssh-copy-id 14.0.0.30
[[email protected] ~]# ssh-copy-id 14.0.0.40
(3)在Mysql2上配置到Mysql1和Mysql3的無密碼認證
[[email protected] ~]# ssh-keygen -t rsa   ##一直按回車
[[email protected] ~]# ssh-copy-id 14.0.0.10
[[email protected] ~]# ssh-copy-id 14.0.0.40
(4)在Mysql3上配置到Mysql1和Mysql2的無密碼認證
[[email protected] ~]# ssh-keygen -t rsa   ##一直按回車
[[email protected] ~]# ssh-copy-id 14.0.0.10
[[email protected] ~]# ssh-copy-id 14.0.0.30
           

6.配置MHA

(1)在manager節點上複制相關腳本到/usr/local/bin目錄。
[[email protected] ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin/
#拷貝後會有四個執行檔案
[[email protected] ~]# ll /usr/local/bin/scripts/
總用量 32
-rwxr-xr-x. 1 1001 1001  3648 5月  31 2015 master_ip_failover
-rwxr-xr-x. 1 1001 1001  9870 5月  31 2015 master_ip_online_change
-rwxr-xr-x. 1 1001 1001 11867 5月  31 2015 power_manager
-rwxr-xr-x. 1 1001 1001  1360 5月  31 2015 send_report
(2)複制上述的自動切換時vip管理的腳本到/usr/local/bin目錄,這裡使用腳本管理vip,
[[email protected] ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3)删除/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 = '14.0.0.200';                  #這裡改成同網段的一個未使用的ip作為虛拟ip
my $brdc = '14.0.0.255';                #虛拟ip的廣播位址
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#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;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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 ([email protected]) {
warn "Got Error: [email protected]\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 ([email protected]) {
warn [email protected];
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 \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`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";
}
           

4.建立MHA軟體目錄并拷貝配置檔案

[[email protected] ~]# mkdir /etc/masterha
[[email protected] ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[[email protected] ~]# vim /etc/masterha/app1.cnf  ##注意指定的目錄下檔案是否存在
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=abc123
repl_user=myslave
report_script=/usr/local/send_report
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 14.0.0.30 -s 14.0.0.40
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=14.0.0.10
port=3306

[server2]
hostname=14.0.0.30
port=3306
candidate_master=1   #設定為候選master,如果設定該參數以後,發生主從切換以後 會将此從庫提升為主庫,即使這個主庫不是叢集中最新的slave。
check_repl_delay=0     #預設情況下如果一個slave落後master 100M的relay logs的話,MHA将不會選擇該slave作為一個新的slave,但check_repl_delay=0的話,即使落後很多日志,也強制選擇其為備選主庫。

[server3]
hostname=14.0.0.40
port=3306

[[email protected] bin]# cd /usr/local/bin/scripts/
[[email protected] scripts]# ls
master_ip_failover  master_ip_online_change  power_manager  send_report
[[email protected] scripts]# cp master_ip_online_change ../
[[email protected] scripts]# cp send_report /usr/local/
           

#############################配置檔案解析###############################

[server default]

manager_log=/var/log/masterha/app1/manager.log #manager日志

manager_workdir=/var/log/masterha/app1 #manager工作目錄

master_binlog_dir=/usr/local/mysql/data #master儲存binlog的位置

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

master_ip_online_change_script=/usr/local/bin/master_ip_online_change #設定手動切換時的切換腳本

password=manager #設定mysql中root使用者的密碼,這個密碼是前面建立監控使用者的密碼

ping_interval=1 #設定監控主庫,發送ping包的時間間隔,預設是3秒,嘗試三次沒有回應的時候自動進行failover

remote_workdir=/tmp #設定遠端mysql在發生切換時binlog的儲存位置

repl_password=abc123 #設定複制使用者的密碼

repl_user=myslave #設定複制使用者的賬戶

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

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 14.0.0.30 -s 14.0.0.40

shutdown_script="" #設定故障發生後關閉故障主機腳本(該腳本的主要作用是關閉主機防止發生腦裂)

ssh_user=root #設定ssh的登入使用者名

user=mha #設定監控使用者

5.測試ssh無密碼認證,如果正常最後會輸出successfully,如下所示

[[email protected] scripts]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
...省略内容
Sat Aug 29 12:09:06 2020 - [debug]  Connecting via SSH from [email protected]14.0.0.10(14.0.0.10:22) to [email protected]14.0.0.40(14.0.0.40:22)..
Sat Aug 29 12:09:06 2020 - [debug]   ok.
Sat Aug 29 12:09:07 2020 - [info] All SSH connection tests passed successfully.
           

6.測試mha健康狀态,如果正常最後會輸出OK,如下所示

[[email protected] scripts]# masterha_check_repl -conf=/etc/masterha/app1.cnf
...省略内容
MySQL Replica:qtion Health is OK.
           

注意:第一次配置需要去master上手動開啟虛拟IP

[[email protected] ~]# /sbin/ifconfig ens33:1 14.0.0.200/24
           

7.啟動MHA

[[email protected] masterha]# 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 &
[1] 15486
           

–remove_dead_master_conf #代表當發生主從切換後,老的主庫的ip将會從配置檔案中移除

/var/log/masterha/app1/manager.log #日志存放位置

–ignore_last_failover #在預設情況下,如果MHA檢測到連續發生當機,且兩次當機間隔不足8小時的話,則不會進行failover,之是以這樣是為了避免ping-pong效應。該參數代表忽略上次MHA觸發切換産生的檔案,預設情況下,MHA發生切換後會在日志中記錄,下次再次切換的時候如果發現該目錄下存在該檔案将不允許觸發切換,除非在第一次切換後收到删除該檔案,為了友善這裡設定為–ignore_last_failover。

8.檢視MHA狀态,可以看到目前master是Mysql1節點

[[email protected] masterha]# masterha_check_status --conf=/etc/masterha/app1.cnf  
app1 (pid:15486) is running(0:PING_OK), master:14.0.0.10
           

9.檢視MHA日志,可以看到目前master是14.0.0.10

[[email protected] masterha]# cat /var/log/masterha/app1/manager.log
Checking the Status of the script.. OK
Sat Aug 29 17:16:01 2020 - [info]  OK.
Sat Aug 29 17:16:01 2020 - [warning] shutdown_script is not defined.
Sat Aug 29 17:16:01 2020 - [info] Set master ping interval 1 seconds.
Sat Aug 29 17:16:01 2020 - [info] Set secondary check script: /usr/local/bin/masterha_secondary_check -s 14.0.0.30 -s 14.0.0.40
Sat Aug 29 17:16:01 2020 - [info] Starting ping health check on 14.0.0.10(14.0.0.10:3306)..
           

實驗驗證

将master資料庫關閉,模拟當機

[[email protected] ~]# tail -f /var/log/masterha/app1/manager.log  #動态檢視日志,準備觀察變化
[[email protected] ~]# pkill -9 mysql                   
##将master資料庫關閉,檢視MHA中日志變化,如下所示主資料庫成功移動到主備資料庫上

Sat Aug 29 17:17:32 2020 - [info] Master failover to 14.0.0.30(14.0.0.30:3306) completed successfully.
Sat Aug 29 17:17:32 2020 - [info] Deleted server1 entry from /etc/masterha/app1.cnf .
Sat Aug 29 17:17:32 2020 - [info]

----- Failover Report -----

app1: MySQL Master failover 14.0.0.10(14.0.0.10:3306) to 14.0.0.30(14.0.0.30:3306) succeeded
           
#在主備資料庫上檢視網卡資訊,發現虛拟IP也成功漂移
[[email protected] ~]# ifconfig
...省略内容
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 14.0.0.200  netmask 255.255.255.0  broadcast 14.0.0.255
        ether 00:0c:29:34:57:c1  txqueuelen 1000  (Ethernet)