mysql5.7.28+mha配置
1 簡介
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟體。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成資料庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證資料的一致性,以達到真正意義上的高可用。
2 環境
OS
|
CentOS |
7.6 |
|
|
|
|
|
軟體包
|
mysql |
5.7.28 |
|
|
|
|
172.17.0.6 |
node1 |
master |
172.17.0.7 |
node2 |
slave1 |
172.17.0.8 |
node3 |
slave2 |
172.17.0.9 |
manager |
mha-manager |
3 依賴安裝
1.yum install -y unzip perl openssl-devel.aarch64 openssl.aarch64 libaio.aarch64 numactl-libs.aarch64 net-tools perl-Data-Dumper.aarch64 perl-JSON.noarch initscripts iptables-services selinux-policy.noarch perl-DBD-MySQL.aarch64 openssh-clients openssh-server
2.關閉防火牆、selinux
4 主從搭建
本次搭建不涉及mysql資料庫安裝,
4.1 節點配置--修改my.cnf配置
4.1.1 開啟日誌、開啟gtid
4.1.1.1 node1
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
binlog_format = row
gtid_mode=ON ##GTID複製又叫全域性事物ID,代替了基於binlog和position號的主從複製搭建的方式,更便於主從複製的搭建
enforce_gtid_consistency=ON ##確保gtid全域性的一致性
4.1.1.2 Slave1
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=2
log-bin=mysql-bin
binlog_format = row
gtid_mode=ON
enforce_gtid_consistency=ON
4.1.1.3 Slave2
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=3
log-bin=mysql-bin
binlog_format = row
gtid_mode=ON
enforce_gtid_consistency=ON
4.1.2 開啟半同步複製
本次搭建主從使用半同步複製,建議無論主從都安裝semisync_master.so和semisync_slave.so模組,為了避免在高可用模式下,主從切換後,半同步失效。
4.1.2.1 node1
1)安裝相關外掛
install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
2)修改配置
方法1:(重啟mysql後引數失效)
set
global
rpl_semi_sync_master_enabled=1;
set
global
rpl_semi_sync_master_timeout=2000;
set
global
rpl_semi_sync_slave_enabled=1;
方法2:修改my.cnf檔案配置(引數永久有效)
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 2000;
rpl_semi_sync_slave_enabled=1;
3)重啟mysql服務,檢視修改的引數
show global
variables like
'%rpl_semi%';
4.1.2.2 Salve1
1)安裝相關外掛
install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
2)修改配置
方法1:(重啟mysql後引數失效)
set
global
rpl_semi_sync_master_enabled=1;
set
global
rpl_semi_sync_master_timeout=2000;
set
global
rpl_semi_sync_slave_enabled=1;
方法2:修改my.cnf檔案配置(引數永久有效)
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 2000;
rpl_semi_sync_slave_enabled=1;
3)重啟mysql服務,檢視修改的引數
show global
variables like
'%rpl_semi%';
4.1.2.3 Salve2
1)安裝相關外掛
install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
2)修改配置
方法1:(重啟mysql後引數失效)
set
global
rpl_semi_sync_master_enabled=1;
set
global
rpl_semi_sync_master_timeout=2000;
set
global
rpl_semi_sync_slave_enabled=1;
方法2:修改my.cnf檔案配置(引數永久有效)
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 2000;
rpl_semi_sync_slave_enabled=1;
3)重啟mysql服務,檢視修改的引數
show global
variables like
'%rpl_semi%';
4.2 主從配置
node1為主,node2、node3為從
主從模型為:一主對多從
node1(主)---node2(從)
node1(主)---node3(從)
4.2.1 node1授權
mysql> alter user root@'localhost' identified by 'Aa!123456';
mysql> grant replication slave on *.* to root@'%' identified by 'Aa!123456';
mysql> grant all privileges on *.* to root@'%' identified by 'Aa!123456';
mysql> flush privileges;
mysql> show master status\G
4.2.2 node2授權
mysql> alter user root@'localhost' identified by 'Aa!123456';
mysql> grant all privileges on *.* to root@'%' identified by 'Aa!123456';
mysql> change master to master_host='172.17.0.6',master_user='root',master_password='Aa!123456',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
4.2.3 node3授權
mysql> alter user root@'localhost' identified by 'Aa!123456';
mysql> grant all privileges on *.* to root@'%' identified by 'Aa!123456';
mysql> change master to master_host='172.17.0.6',master_user='root',master_password='Aa!123456',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
4.2.4 測試同步
4.2.4.1 建庫
1)node1
2)salve1、salve2
4.2.4.2建表
1)node1
2)salve1、salve2
4.2.4.3插入語句
1)node1
2)salve1、salve2
5 安裝mha
5.1 node安裝
5.1.1 Github下包
5.1.2 node1~3節點安裝
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
5.2 manager安裝
5.2.1 安裝依賴包
1) yum install -y perl-Config-Tiny perl-Class-Load.noarch perl-Params-Validate.aarch64 perl-IO-Socket-SSL.noarch perl-Net-SSLeay.aarch64 perl-Sys-Syslog.aarch64
2) 下載依賴包
3) 安裝依賴包
rpm -ivh perl-MIME-Types-1.38-2.el7.noarch.rpm
rpm -ivh perl-Email-Date-Format-1.002-15.el7.noarch.rpm
rpm -ivh perl-MIME-Lite-3.030-1.el7.noarch.rpm
rpm -ivh perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
rpm -ivh perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
rpm -ivh perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
4) 安裝perl-Log-Dispatch
https://download-ib01.fedoraproject.org/pub/epel/7/aarch64/Packages/p/perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
yum install perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm -y
5.2.2 安裝manager
1)下載安裝包
2)安裝
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
5.2.3 配置mha-manager
- 建立配置目錄
mkdir /etc/mhamanger/ -p
2. 編輯配置檔案
vim /etc/mhamanger/app.conf
[server default]
manager_workdir=/etc/mhamanger ##manager工作目錄
manager_log=/etc/mhamanger/mha.log ##manager日誌檔案
master_binlog_dir=/var/lib/mysql ##master節點存放binlog日誌路徑
remote_workdir=/tmp ##發生切換時slave節點存放binlog日誌路徑
user=root ##目標mysql例項的管理帳號,儘量是root使用者,因為執行所有的管理命令需要使用
password=Aa!123456 ##資料庫使用者密碼
ping_interval=1 ##設定監控主庫,傳送ping包的時間間隔,嘗試三次沒有迴應的時候自動進行failover
repl_password=Aa!123456 ##資料庫使用者密碼
repl_user=root ##在所有slave上執行change master的複製使用者名稱,這個使用者最好是在主庫上擁有replication slave許可權
ssh_user=root ##訪問MHA manger和MHA mysql節點登入使用者
master_ip_failover_script=/usr/local/bin/master_ip_failover ##通常需要分配一個VIP供master用於對外提供讀寫服務,如果master掛了,HA軟體指引備用伺服器接管VIP
master_ip_online_change_script=/usr/local/bin/master_ip_failover ##這是一個與上面引數很接近的引數,但是這個引數不使用故障轉移命令,而是master的線上change命令
[server1]
hostname=172.17.0.6
port=3306
[server2]
hostname=172.17.0.7
post=3306
#candidate_master=1 ##設定為候選master,如果設定該引數以後,發生主從切換以後將會將此從庫提升為主庫,即使這個主庫不是叢集中事件最新的slave
#check_repl_delay=0 ##配合candidate_master=1使用,關閉日誌量的檢查,強制選擇候選節點。
[server3]
hostname=172.17.0.8
port=3306
說明:
主庫宕機誰來接管?
1. 所有從節點日誌都是一致的,預設會以配置檔案的順序去選擇一個新主。
2. 從節點日誌不一致,自動選擇最接近於主庫的從庫
3. 如果對於某節點設定了權重(candidate_master=1),權重節點會優先選擇。
5.2.4 配置vip
在master節點上,新增vip
5.2.5 master_ip_failover指令碼
5.2.5.1修改內容
只需要修改以下4行內容:
my $vip = '172.17.0.100/16'; # Virtual IP
my $key = "0";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
5.2.5.2新增許可權
chmod +x /etc/mha/master_ip_failover
5.2.5.3複製指令碼
cp /usr/local/bin/master_ip_failover /usr/local/bin/master_ip_online_change_script
5.2.5.4指令碼內容
#!/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 = '172.17.0.100/16'; # Virtual IP
my $key = "0";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
$ssh_user = "root";
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" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
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" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc) here.
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";
`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
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 {
"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";
}
5.3 故障轉移時間設定
在搭建好mha後,mha的自動故障轉移的時間設定為8小時,即如果上次故障轉移是在8小時內完成的,則本次不自動執行故障轉移
我們可以通過修改修改指令碼內容,改為1分鐘
vim /usr/share/perl5/vendor_perl/MHA/MasterFailover.pm
將480改為1,儲存退出。
5.1 ssh互信
5.4.1 檢查ssh服務
service sshd status
5.4.2 配置免密登入
1)在每個節點執行ssh-keygen -t rsa,生成私鑰和公鑰。
2)ssh-copy-id ,將公鑰傳送到manager機器。
3)然後在manager機器再將公鑰傳送到三個node節點
scp /root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys
4)測試
masterha_check_ssh --conf=/etc/mhamanger/app.conf
5.5 檢查狀態
5.5.1 master節點授權
mysql> grant replication slave on *.* to root@'%' identified by 'Aa!123456';
mysql> grant super,replication client on *.* to root@'%' identified by 'Aa!123456';
mysql> flush privileges;
5.5.2 節點檢測
masterha_check_repl --conf=/etc/mhamanger/app.conf
5.6 啟動服務
nohup masterha_manager --conf=/etc/mhamanger/app.conf >/etc/mhamanger/mha.log 2>&1 &
masterha_check_status --conf=/etc/mhamanger/app.conf ##檢視狀態
至此,mysql雙主+mha搭建完成