暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MHA 搭建步骤

原创 sdy337969667 2021-04-06
1165

一、 MHA 搭建步骤:
主机及实例 IP
Manager : 192.168.1.13
Master : 192.168.1.11:3306
Slave1 : 192.168.1.12:3306
VIP : 192.168.1.100
1、环境检查-----------------------------------------
1.1 关闭防火墙:
service firewalld stop
service iptables stop
chkconfig iptables off
systemctl stop firewalld.service

centos7 系统关闭

systemctl stop firewalld
vi /etc/selinux/config

查看状态

systemctl status firewalld
seststua
查看 getenforce 是否关闭(需要关闭):
查看命令: getenforce
关闭命令: setenforce 02、配置主从半同步复制--------------------------------
2.1(旧环境改造场景下参照主从搭建步骤):
mysql>grant all on . to’rep’@’%’ identified by’Of123456’ with grant option;
mysql>grant all on . to’root’@’%’ identified by’Of123456’ with grant option;
mysql>flush privileges;
2.2 三个节点都要配置,用于当某个 slave 升为主后其他的从进行同步
mysql>change master to
master_host=‘192.168.1.11’,master_user=‘rep’,master_port=3306,master_password
=‘Of123456’,MASTER_AUTO_POSITION = 1;
2.3 从库开启复制:
mysql>start slave;
3、 MHA 部分------------------------------------
3.1.配置 SSH 互信
(1)配置 SSH 秘钥(三台服务器都需要执行)

ssh-keygen -t rsa

(2)11 和 12 执行服务器都需要执行(汇集所有服务器的密钥)
cd /root/.ssh
slave1 节点
scp id_rsa.pub 192.168.1.13:/root/.ssh/id_rsa.pub1
slave2 节点
scp id_rsa.pub 192.168.1.13:/root/.ssh/id_rsa.pub2(3)master 节点(生成公钥使所有服务器都有公钥)
cat id_rsa.pub id_rsa.pub1 id_rsa.pub2 > authorized_keys
chmod 600 authorized_keys
scp authorized_keys 192.168.1.11:/root/.ssh/
scp authorized_keys 192.168.1.12:/root/.ssh/
(4)三台服务器之间互相 ssh 登录验证:
ssh 192.168.1.12
ssh 192.168.1.13

3.2 安装 mha
(1)mha node 节点三台服务器都要上传安装包(确保都已完成安装)
yum install -y perl-DBD-MySQL
yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum install -y perl-devel perl-CPAN
解压安装 mha0.57node 包
tar -xvzf mha4mysql-node-0.57.tar.gz
mkdir -p /etc/mha/mhanode
mv mha4mysql-node-0.57/* /etc/mha/mhanode
cd /etc/mha/mhanode
perl Makefile.PL
make && make install---------------------------------------------
(2)mha manager 节点上传上安装包(13 为 manager)
上传这些包:
mha4mysql-manager-0.57.tar.gz
perl-Config-Tiny-2.12-1.el6.rfx.noarch.rpm
perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
perl-Params-Validate-0.92-3.el6.x86_64.rpm
perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm
创建 manager 目录并解压 manager 文件:
tar -xvf mha4mysql-manager-0.57.tar.gz
mkdir -p /etc/mha/mhamanager
cp -rf mha4mysql-manager-0.57/* /etc/mha/mhamanager
安装 manager(确保都已完成安装):
yum install -y perl-ExtUtils-Embed
yum install -y perl-Time-HiRes
yum localinstall -y perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
yum localinstall -y perl-Config-Tiny-2.14-7.el7.noarch.rpm
yum localinstall -y perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
yum localinstall -y perl-Params-Validate-1.08-4.el7.x86_64.rpm
cd /etc/mha/mhamanager/
perl Makefile.PLmake && make install

(3)所有 MHA 节点创建 MHA 工作目录
mkdir -p /etc/mha/app1

(4)在 manager 节点配置 MHA 启动文件
vim /etc/mha/app1.cnf
[server default]

working directory on the manager

manager_workdir=/etc/mha/app1
manager_log=/etc/mha/app1/manager.log
remote_workdir=/etc/mha/app1

In case of automatic file-over, the following script will be used

master_ip_failover_script=/etc/mha/master_ip_failover
master_ip_online_change_script=/etc/mha/master_ip_online_change
user=root
password=Of123456
#mha 连接 mysql 用户
repl_user=reprepl_password=Of123456
ssh_user=root
ping_interval=1
secondary_check_script= masterha_secondary_check -s 192.168.1.12 -s
192.168.1.13
[server1]
hostname=192.168.1.11
port=3306
master_binlog_dir="/usr/local/mysql/data"
candidate_master=1
ssh_port=22
[server2]
hostname=192.168.1.12
port=3306
master_binlog_dir="/usr/local/mysql/data"
candidate_master=1
ssh_port=22
[server3]hostname=192.168.1.13
port=3306
master_binlog_dir="/usr/local/mysql/data"
no_master=1
ssh_port=22
注:
no_master=1 #当主故障后不可以成为主
candidate_master=1 #当主故障后可以成为主
secondary_check_script= masterha_secondary_check -s 192.168.1.12 使用备库 IP
manager_workdir=##项目的主目录 manager_log=###mha 记录日志
master_binlog_dir=##node 服务器的 binlog 存放路径,如果每个 node 的 binlog 路径不一致的
话就在下面的每个 server 下面单独配置 master_ip_failover_script=##mha 在线自动
failover 时处理 VIP 的配置文件 master_ip_online_change_script=##在线手动执行 master
切换时 VIP 的处理文件
secondary_check_script=/usr/local/mha/bin/masterha_secondary_check -s backup
-s master --user=root --master_host=master --master_ip=192.168.137.10 –
master_port=3306 ##一旦 MHA 到 master 之间的网络出现问题, manager 会尝试从 backup 登
入到 masger #report_script= ##发生切换后执行的报警脚本 shutdown_script=""##故障后关
闭 master 主机的脚本(主要是使用 keepalive 做 VIP 时会出现脑裂导致 VIP 频繁切换所以会将故障
的 master 关闭) ping_interval=1 ###监控 mater, ping 的频率 remote_workdir=/tmp
##node 服务器在发生 master 切换时, binlog 保持的路径,每个 node 都会在该目录下保存一份差异
的 binlog,除非没有差异。 repl_password=repl##复制使用的用户名,每个 node 服务器都需要
存在

(5)在 manager 节点配置 vip 自动 failover 脚本
在 mha manager 节点 192.168.1.13 编写 master_ip_failover 脚本(自动切换时 vip 管理
的脚本,不是必须,推荐使用脚本方式实现主库故障时 vip 的自动漂移)vim /etc/mha/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.1.100/24’;
my $key = ‘0’;
my $ssh_start_vip = “/sbin/ifconfig ens33::$key $vip”;
my $ssh_stop_vip = “/sbin/ifconfig ens33::$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,
);
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”;
}
根据实际情况修改的位置如下
my $vip = ‘192.168.2.22/24’;
my $key = ‘0’;
my $ssh_start_vip = “/sbin/ifconfig ens33:$key $vip”;
my $ssh_stop_vip = “/sbin/ifconfig ens33:$key down”;
在迁移的过程中,ssh_stop_vip 在 master 节点执行,ssh_start_vip 在备用主节点执行,比对
你的网卡的名字

(6)在 manager 节点配置手动在线 failover 脚本
在 mha manager 节点 192.168.1.13 编写 master_ip_online_change 脚本(在线切换时vip 的管理,不是必须,同样可以可以自行编写简单的 shell 完成)
vim /etc/mha/master_ip_online_change
#!/usr/bin/env perl
use strict;
use warnings FATAL =>‘all’;
use Getopt::Long;
my $vip = ‘192.168.1.100/24’; # Virtual IP
my $key = “0”;
my $ssh_start_vip = “/sbin/ifconfig ens33::$key $vip”;
my $ssh_stop_vip = “/sbin/ifconfig ens33::$key down”;
my $exit_code = 0;
my (
$command, $orig_master_is_new_slave, $orig_master_host,
$orig_master_ip, $orig_master_port, $orig_master_user,
$orig_master_password, $orig_master_ssh_user, $new_master_host,
$new_master_ip, $new_master_port, $new_master_user,
$new_master_password, $new_master_ssh_user,
);
GetOptions(
‘command=s’ => $command,
‘orig_master_is_new_slave’ => $orig_master_is_new_slave,
‘orig_master_host=s’ => $orig_master_host,‘orig_master_ip=s’ => $orig_master_ip,
‘orig_master_port=i’ => $orig_master_port,
‘orig_master_user=s’ => $orig_master_user,
‘orig_master_password=s’ => $orig_master_password,
‘orig_master_ssh_user=s’ => $orig_master_ssh_user,
‘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,
‘new_master_ssh_user=s’ => $new_master_ssh_user,
);
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 “\n\n\n***************************************************************\n”;print “Disabling the VIP - $vip on old master: $orig_master_host\n”;
print “***************************************************************\n\n\n\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 “\n\n\n***************************************************************\n”;
print “Enabling the VIP - $vip on new master: $new_master_host \n”;
print “***************************************************************\n\n\n\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 $orig_master_ssh_user\@$orig_master_host \" $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 $new_master_ssh_user\@$new_master_host \" $ssh_start_vip \";
}

A simple system call that disable the VIP on the old_mastersub stop_vip() {

ssh $orig_master_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=po
rt -new_master_host=host -new_master_ip=ip -new_master_port=port\n”;
}
注:
根据实际情况修改的位置如下
my $vip = ‘192.168.2.22/24’;
my $key = ‘0’;
my $ssh_start_vip = “/sbin/ifconfig ens33:$key $vip”;
my $ssh_stop_vip = “/sbin/ifconfig ens33:$key down”;
在迁移的过程中,ssh_stop_vip 在 master 节点执行,ssh_start_vip 在备用主节点执行,比对
你的网卡的名字

(7)在 manager 节点脚本赋权限(变成可执行文件)
cd /etc/mhachmod +x master*
(8)在 manager 节点上检查 ssh 配置
/etc/mha/mhamanager/bin/masterha_check_ssh --conf=/etc/mha/app1.cnf
Fri Mar 23 19:25:12 2018 - [info] All SSH connection tests passed successfully.
(9)在 manager 节点检测整个复制环境(1 主 2 从的环境下才可以检测成功)
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
/etc/mha/mhamanager/bin/masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK
(10)在主库上添加 vip
ifconfig ens33:0 192.168.1.100 up
(11)在 manager 节点启动 mha
nohup /etc/mha/mhamanager/bin/masterha_manager --conf=/etc/mha/app1.cnf
–ignore_last_failover >/tmp/mha_manager.log < /dev/null 2>&1 &
(12)在 manager 节点检测 mha 状态
/etc/mha/mhamanager/bin/masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:7190) is running(0:PING_OK), master:192.168.1.11
二、自动 failover(主库故障自动主从切换)----
场景:启用 MHA 自动切换功能,, MHA manager 检测到 dead 的 server,将自动切换主从关系。
切换步骤如下:
1、主库故障, VIP 自动漂移到配置的其他候选主库;
2、候选主库升级为新的主库,备库可实施接受主库同步的数据;
3、 mha 无法开启至少需要 3 个节点,需要等待源主库故障恢复后以备库方式加入到主从
复制中后,再开启 MHA,此时 MHA 状态正常。
4、新主库和候选主库任何一个故障可自动来回切换主从复制关系。
三、手动在线 failover-----
场景: 启用 MHA 自动切换功能,但需要将现有的主服务器迁移到另外一台服务器上。
1.首先,停掉 MHA 监控:
masterha_stop --conf=/usr/local/mha/ha1/ha1.cnf
2.手动在线 failover 切换到新主
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive –
new_master_host=192.168.1.12 --new_master_port=3306 –
orig_master_is_new_slave --running_updates_limit=10000
注:
–orig_master_is_new_slave 切换时加上此参数是将原 master 变为 slave
节点,如果不加此参数,原来的 master 将不启动
–running_updates_limit=10000,故障切换时,候选master 如果有延迟的话, mha
切换不能成功,加上此参数表示延迟在此时间范围内都可切换(单位为s),但是切换的时
间长短是由recover 时relay 日志的大小决定
注意:手动在线用的failover脚本是“master_ip_online_change”
四、手动不在线 failover-----------------------------
场景:没有启用 MHA 自动切换功能,当主服务器故障时,人工手动调用 MHA 来进行故障切换
操作,具体命令如下:
masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf –
dead_master_host=192.168.1.11 --dead_master_port=3306 –
new_master_host=192.168.1.12 --new_master_port=3306 --ignore_fail_on_start –
ignore_last_failover
五、原主库故障恢复后处理-----------------
源主库故障恢复后加入到主从复制中:
1、重置源新的主库变成从库;
reset slave all;
2、从库:
(1)停止单个 channel 的同步:
STOP SLAVE FOR CHANNEL ‘’;
(2)指定新的主库:
change master to
master_host=‘192.168.1.11’,master_user=‘rep’,master_port=3306,master_password
=‘Of123456’,MASTER_AUTO_POSITION= 1;
(3)开启从库同步:
start slave;
--------------------------end----------------------------------当主库故障恢复后需要已备库的形式重新 change masterXXXX,重新同步新主库的数据,
作为备库形式存在。
当 MHA 发生一次切换后将自动退出 MHA,当新的主库选举出来后,需要手工重新启动
MHA。
9 退出 MHA
/etc/mha/mhamanager/bin/masterha_stop --conf=/etc/mha/app1.cnf
10 测试 failover
mha 在完成 vip 迁移后,会自动退出.
设置从节点 relay_log 关闭
relay_log_purge=0
这样造成的问题,磁盘空间使用量过大
解决办法
设置 relay_log 定时清理脚本

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论