天天看點

mysql 主從複制 mha_MHA實作MySQL主從複制高可用

一、MHA介紹

1.1 MHA概述

一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟體

支援故障切換

在MySQL故障切換過程中,MHA能做到在0~30秒之内自動完成資料庫的故障切換操作,并且在進行故障切換的過程中,MHA能在最大程度上保證資料的一緻性,以達到真正意義上的高可用

1.2 MHA組成

MHA Manager(管理節點)

用來接收外部信号,監控下方資料節點的工作狀态

MHA Node(資料節點)

工作的機關,負責具體的工作

1.3 MHA的特點

自動故障切換過程中,MHA試圖從當機的主伺服器上儲存二進制日志,最大程度的保證資料的不丢失

使用 MySQL55的半同步複制,可以大大降低資料丢失的風險

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

二、MHA實驗

2.1 實驗目的

通過MHA監控MySQL資料庫,在故障時自動進行切換,不影響業務

當主庫失效時,備選主庫自動成為主庫

2.2 實驗拓撲圖

mysql 主從複制 mha_MHA實作MySQL主從複制高可用

2.3.實驗思路

1) 安裝 MySQL 資料庫

2) 配置 MySQL 一主兩從

3) 安裝 MHA 軟體

4) 配置無密碼認證

5) 配置 MySQL MHA 高可用

6) 模拟 master 故障切換

2.3.1 安裝mysql

在三台 MySQL 節點上分别安裝資料庫,MySQL 版本請使用 5.6.36,cmake 版本請使

用 2.8.6。之前部落格有詳細安裝mysql步驟,這邊不再說明。

2.3.2 搭建mysql主從複制環境

參考之前的部落格:

https://www.cnblogs.com/bushilengmo/p/13668756.html

所有資料庫授權mha使用者對資料庫的操作權限,每一個mysql資料庫都要設定

1 在所有資料庫節點上授權兩個使用者,一個是從庫同步使用,另外一個是 manager 使用。2 mysql> grant replication slave on *.* to 'myslave'@'192.168.195.%' identified by '123';3 mysql> grant all privileges on *.* to 'mha'@'192.168.195.%' identified by 'manager';4 mysql> flush privileges;

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

mysql>show master status;+-------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+-------------------+----------+--------------+------------------+-------------------+

| master-bin.000001 | 1215 | | | |

+-------------------+----------+--------------+------------------+-------------------+

2.3.4 接下來在 Mysql2 和 Mysql3 分别執行同步。

mysql> change master to master_host='192.168.195.129',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1215;

mysql> start slave;

2.3.5 檢視 IO 和 SQL 線程都是 yes 代表同步是否正常。

mysql>show slave status\G;

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

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

mysql> set global read_only=1;

2.4 所有節點安裝環境和Node元件和Manager元件

所有伺服器上都要安裝mha依賴的環境,此處僅展示mha_manager的安裝

[[email protected]_manager ~]# yum install epel-release --nogpgcheck -y

[[email protected]_manager~]# yum install -y perl-DBD-MySQL \

perl-Config-Tiny \

perl-Log-Dispatch \

perl-Parallel-ForkManager \

perl-ExtUtils-CBuilder \

perl-ExtUtils-MakeMaker \

perl-CPAN

所有伺服器都安裝安裝node元件,此處僅展示master伺服器的安裝

[[email protected] ~]# tar zxvf /mnt/shuju資料庫/mha/mha4mysql-node-0.57.tar.gz

[[email protected]~]# cd mha4mysql-node-0.57/[[email protected] mha4mysql-node-0.57]# yum install perl-Module-Install -y

[[email protected] mha4mysql-node-0.57]# perl Makefile.PL==> Auto-install the 1 mandatory module(s) from CPAN? [y] y '//輸入y'[[email protected] mha4mysql-node-0.57]# make

[[email protected] mha4mysql-node-0.57]# make install

僅mha_manager伺服器安裝manager元件

[[email protected]_manager ~]# tar zxvf /mnt/shuju資料庫/mha/mha4mysql-manager-0.57.tar.gz

[[email protected]_manager~]# cd mha4mysql-manager-0.57/[[email protected]_manager mha4mysql-manager-0.57]# perl Makefile.PL

[[email protected]_manager mha4mysql-manager-0.57]# make

[[email protected]_manager mha4mysql-manager-0.57]# make install

2.5 配置節點間SSH免互動登陸

mha_manager主機配置到所有資料庫節點的密鑰對驗證

[[email protected] ~]# ssh-keygen -t rsa //一路按Enter鍵

[[email protected] ~]# ssh-copy-id 192.168.195.129[[email protected] ~]# ssh-copy-id 192.168.195.130[[email protected] ~]# ssh-copy-id 192.168.195.131

在master上配置到資料庫節點slave1和slave2的免密驗證

[[email protected] ~]# ssh-keygen -t rsa

[[email protected]~]# ssh-copy-id 192.168.195.130[[email protected]~]# ssh-copy-id 192.168.195.131

在slave1上配置到資料庫節點master和slave2的免密驗證

[[email protected] ~]# ssh-keygen -t rsa

[[email protected]~]# ssh-copy-id 192.168.195.129[[email protected]~]# ssh-copy-id 192.168.195.131

在slave2上配置到資料庫節點master和slave1的免密驗證

[[email protected] ~]# ssh-keygen -t rsa

[[email protected]~]# ssh-copy-id 192.168.195.129[[email protected]~]# ssh-copy-id 192.168.195.130

2.6 配置MHA-Manager元件

在 manager 節點上複制相關腳本到/usr/local/bin 目錄

[[email protected]_manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

[[email protected]_manager samples]# ls-l /usr/local/bin/scripts/

-rwxr-xr-x. 1 1001 1001 3648 5月 31 2015master_ip_failover 自動切換時 VIP管理的腳本-rwxr-xr-x. 1 1001 1001 9870 5月 31 2015master_ip_online_change 線上切換VIP的管理-rwxr-xr-x. 1 1001 1001 11867 5月 31 2015power_manager 故障發生後關閉主機的腳本-rwxr-xr-x. 1 1001 1001 1360 5月 31 2015send_report 因故障切換後發送報警的腳本

[[email protected]_manager~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/ '//自動切換時 VIP管理的腳本'

修改master_ip_failover 腳本

[[email protected]_manager ~]# vim /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.195.200';

my $brdc= '192.168.195.255';

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

exit0;

}else{&usage();

exit1;

}

}

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

}

建立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

[serverdefault]

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

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

master_binlog_dir=/usr/local/mysql/data/#master儲存binlog的位置,這裡的路徑要與master裡配置的binlog的路徑一緻,以便mha能找到

#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使用者的密碼,這個密碼是前文中建立監控使用者的那個密碼

user=mha        #設定監控使用者root

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

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

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

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

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

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.195.130 -s 192.168.195.131shutdown_script=""#設定故障發生後關閉故障主機腳本(該腳本的主要作用是關閉主機放在發生腦裂,這裡沒有使用)

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

[server1]

hostname=192.168.195.129port=3306[server2]

hostname=192.168.195.130port=3306candidate_master=1    #//設定為候選master,如果設定該參數以後,發生主從切換以後将會将此從庫提升為主庫,即使這個主庫不是叢集中事件最新的slave

check_repl_delay=0

[server3]

hostname=192.168.195.131port=3306

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

[[email protected] ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

Tue Nov26 23:09:45 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Tue Nov26 23:09:45 2019 - [info] Reading application default configuration from /etc/masterha/app1.cnf..

Tue Nov26 23:09:45 2019 - [info] Reading server configuration from /etc/masterha/app1.cnf..

Tue Nov26 23:09:45 2019 -[info] Starting SSH connection tests..

Tue Nov26 23:09:46 2019 -[debug]

Tue Nov26 23:09:45 2019 - [debug] Connecting via SSH from [email protected](192.168.195.130:22) to [email protected](192.168.195.131:22)..

Tue Nov26 23:09:46 2019 -[debug] ok.

Tue Nov26 23:09:47 2019 -[debug]

Tue Nov26 23:09:46 2019 - [debug] Connecting via SSH from [email protected](192.168.195.131:22) to [email protected](192.168.195.130:22)..

Tue Nov26 23:09:47 2019 -[debug] ok.

Tue Nov26 23:09:47 2019 - [info] All SSH connection tests passed successfully.

2.8 啟動MHA

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

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

啟動mha

[[email protected] ~]# 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] 129929

三、驗證明驗

1 [[email protected] ~]#tailf /var/log/masterha/app1/manager.log //啟用監控觀察日志記錄

2 [[email protected] ~]# pkill -9 mysql //檢視master變化

3.1 故障模拟:

在主庫上:pkill mysqld

可以看到從庫的狀态,其中之一肯定有切換到主庫的

切換備選主庫的算法:

1.一般判斷從庫的是從(position/GTID)判斷優劣,資料有差異,最接近于master的slave,成為備選主。

2.資料一緻的情況下,按照配置檔案順序,選擇備選主庫。

3.設定有權重(candidate_master=1),按照權重強制指定備選主。

1)預設情況下如果一個slave落後master 100M的relay logs的話,即使有權重,也會失效。

2)如果check_repl_delay=0的話,即使落後很多日志,也強制選擇其為備選主。

3.2 故障修複步驟:

修複db

/etc/init.d/mysqld start

修複主從

>change master to master_host='192.168.195.130',master_user='myslave',master_password='123',master_log_file='master-bin.000002',master_log_pos=154;>start slave;

修改配置檔案(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)

vi /etc/masterha/app1.cnf

[server1]

hostname=192.168.195.129port=3306

啟動manager(在manager那台機器上)

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 &