MySQL MHA 集群
[toc]
MHA 簡介
MHA ( Master High Availability )
- youshimaton 開發(fā) https://github.com/yoshinorim
- 一套優(yōu)秀的實現(xiàn) MySQL 高可用的解決方案
- 數(shù)據(jù)庫的自動故障切換操作能做到在 0~30 秒之內(nèi)
- MHA 能確保在故障切換過程中保證數(shù)據(jù)的一致性,以達到真正意義上的高可用
MHA 組成
-
MHA Manager ( 管理節(jié)點 )
可以單獨部署在一臺獨立的機器上,管理其他節(jié)點
也可以部署在一臺slave節(jié)點上
-
MHA Node ( 數(shù)據(jù)節(jié)點 )
運行在每臺MySQL服務器上
MHA 工作過程
- 由 Manager 定時探測集群中的 master 節(jié)點
- 當 master 故障時,Manager 自動將擁有最新數(shù)據(jù)的 slave 提升為新的 master
- 關(guān)鍵點
- 從宕機崩潰的 master 保存二進制日志事件
- 識別含有最新更新的 slave
- 應用差異的中繼日志 ( relay log ) 到其他的 slave
- 應用從 master 保存的二進制日志事件
- 提升一個slave為新的master
- 使其他的slave 連接新的 master 進行復制
部署 MHA 集群
部署MySQL 高可用集群 ( MHA + 主從同步 )
1549818084936
拓撲結(jié)構(gòu)
拓撲圖
1549817915989
IP 規(guī)劃
角色 | IP地址 | 主機名 |
---|---|---|
Master主節(jié)點 | 192.168.1.101 | test1 |
備用1主節(jié)點 | 192.168.1.102 | test2 |
備用2主節(jié)點 | 192.168.1.103 | test3 |
第一臺slave | 192.168.1.104 | test4 |
第二臺slave | 192.168.1.105 | test5 |
MHA_manager (無mysqld) | 192.168.1.106 | test6 |
VIP地址 | 192.168.1.100 |
開始部署
部署 數(shù)據(jù)主機
101 ~ 105
-
配置一主多從
主機 角色 數(shù)據(jù)主機 192.168.1.101 master 數(shù)據(jù)主機 192.168.1.102 slave 備用1主節(jié)點 數(shù)據(jù)主機 192.168.1.103 slave 備用2主節(jié)點 數(shù)據(jù)主機 192.168.1.104 slave 數(shù)據(jù)主機 192.168.1.105 slave 管理主機 192.168.1.106 manager 安裝依賴的 perl 軟件包
#配置好 epel 源,yum node節(jié)點時,可自動安裝以下 perl 依賴包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
- 安裝軟件 mha-node
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
- 配置數(shù)據(jù)節(jié)點 ssh 認證,彼此之間 root 用戶無密碼登陸
#配置好后可測試, mha_check_ssh 腳本也可測試.
ssh host hostname;
- 授權(quán)監(jiān)控用戶
# 為所有數(shù)據(jù)主機授權(quán) root用戶 管理主機訪問監(jiān)控使用
grant all on *.* to 'root'@'%' identified by '123456';
- 所有數(shù)據(jù)主機服務器啟用不自動刪除本機的中繼日志文件
# 101~105
set global relay_log_purge=off;
# 永久配置
[mysqld]
relay_log_purge=off
- 主庫 及 備用主庫 特殊配置
# 為主庫 和 備用主庫 創(chuàng)建主從復制用戶 repl
# 此拓撲中 為 192.168.1.102 和 103 添加 repl 用戶,當默認主庫宕機,接管主庫的機器需要此用戶用作新的主從同步.
grant replication slave on *.* to 'repl'@'%' identified by '123456'
# 為主庫 和 備用主庫 半同步復制 101~103
# 高可用架構(gòu)下,master和slave需同時啟動,以便在主從切換后能繼續(xù)使用半同步復制
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
配置 管理主機
- 安裝依賴的 perl 軟件包
#配置好 epel 源,yum node節(jié)點時,可自動安裝以下 perl 依賴包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
- 安裝 node 和 manager 軟件包
#先安裝 node 節(jié)點包,manager 依賴 node
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
配置 ssh 認證, manager 主機,可以 使用 root 用戶訪問所有數(shù)據(jù)主機
修改配置文件
MHA 配置文件 app1.cnf
mkdir -p /etc/mha/
cat > /etc/mha/app1.cnf <<EOF
#默認配置 可單獨寫入 /etc/masterha_default.cnf
[server default]
manager_workdir=/etc/mha
manager_log=/etc/mha/manager.log
master_ip_failover_script=/etc/mha/master_ip_failover
# ssh 認證用戶 端口
ssh_user=root
ssh_port=22
#主從用戶 密碼
repl_user=repl
repl_password=123123
# manager 主機監(jiān)控用戶 密碼 訪問所有 數(shù)據(jù)主機
user=root
password=123456
[server1]
hostname=192.168.1.101
#默認3306,可省略
port=3306
candidate_master=1
[server2]
hostname=192.168.1.102
#設(shè)置為候選master
candidate_master=1
[server3]
hostname=192.168.1.103
candidate_master=1
[server4]
hostname=192.168.1.104
#不競選master
no_master=1
[server5]
hostname=192.168.1.105
no_master=1
EOF
master_ip_failover 腳本
腳本修改 25 - 28
my $vip = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
完整腳本,默認腳本無法正常執(zhí)行
cat > /etc/mha/master_ip_failover << EOF
#!/usr/bin/env perl
# Copyright (C) 2011 DeNA Co.,Ltd.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
## Note: This is a sample script and is not complete. Modify the script based on your environment.
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
use MHA::DBHelper;
my (
$command, $ssh_user, $orig_master_host,
$orig_master_ip, $orig_master_port, $new_master_host,
$new_master_ip, $new_master_port, $new_master_user,
$new_master_password
);
my $vip = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$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,
'new_master_user=s' => \$new_master_user,
'new_master_password=s' => \$new_master_password,
);
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";
}
測試配置文件
測試 ssh 認證
masterha_check_ssh --conf=/etc/mha/app1.cnf
測試 主從 狀態(tài)
masterha_check_repl --conf=/etc/mha/app1.cnf
啟動服務
手動部署 vip 至 當前主庫上
ifconfig eth0:1 192.168.1.100/24
常用參數(shù)
- 刪除宕機主庫配置
--remove_dead_master_conf
- 忽略xxx.health文件 ( 即8小時內(nèi) 連續(xù)切換主庫 )
--ignore_last_failover
啟動命令
masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
查看MHA運行狀態(tài)
masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:8842) is running(0:PING_OK), master:192.168.1.101
測試高可用集群
- 客戶端連接vip地址訪問數(shù)據(jù)庫
mysql -uweb -p123123 -h192.168.1.100
- 測試高可用
把主機 101 數(shù)據(jù)庫服務停止,自動切換主庫,和vip
mysql -uweb -p123123 -h192.168.1.100
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test1 |
+------------+
# 停止mysql 當前主庫
systemctl stop mysqld
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test2 |
+------------+
恢復 MHA 集群
把宕機的數(shù)據(jù)庫 A 服務器修復.
-
重新設(shè)置已修復 A 服務器 為當前主庫的從庫,保證數(shù)據(jù)主從同步.
生產(chǎn)環(huán)境,需要保證 A 數(shù)據(jù)先和 當前主庫數(shù)據(jù)保持一致.
重新添加服務器 A 配置文件.至
app1.cnf
重新啟動MHA,測試