一、工作原理
MHA工作原理总结为以下几条:
(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);
(2) 识别含有最新更新的 slave ;
(3) 应用差异的中继日志(relay log) 到其他 slave ;
(4) 应用从 master 保存的二进制日志事件(binlog events);
(5) 通过Manager控制器提升一个 slave 为新 master ;
(6) 使用其他的 slave 连接新的 master 进行复制。
概念
二、实现过程
MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等,这里对配置做事先说明。
机器名称 | IP配置 | 服务角色 | 备注 |
---|---|---|---|
Manager | 10.0.0.44 | Manager控制器 | 用于监控管理 |
Master | 10.0.0.41 | 数据库主服务器 | 开启bin-log relay-log 关闭relay_log_purge |
Slave1 | 10.0.0.42 | 数据库从服务器 | 开启bin-log relay-log 关闭relay_log_purge |
Slave2 | 10.0.0.43 | 数据库从服务器 | 开启bin-log relay-log 关闭relay_log_purge |
1、首先我们需要配置master
[root@master ~]# vim /etc/my.cnf
server-id=1 #复制集群中的各节点的id均必须唯一
log-bin=mysql-bin #开启二进制日志
relay-log=mysql-relay #开启中继日志
skip-name-resolve #关闭名称解析(非必须)
[root@master ~]# systemctl restart mariadb
[root@slave1 ~]# vim /etc/my.cnf
[mysqld]
server-id = 2 #复制集群中的各节点的id均必须唯一;
relay-log = relay-log #开启中继日志
log-bin =mysql-log #开启二进制日志
read_only = ON #启用只读属性(非必须)
relay_log_purge = 0 #是否自动清空不再需要中继日志(非必须)
skip_name_resolve #关闭名称解析(非必须)
log_slave_updates = 1 #使得更新的数据写进二进制日志中
[root@slave1 ~]# systemctl restart mariadb
[root@slave2 ~]# vim /etc/my.cnf
[mysqld]
server-id = 3 #复制集群中的各节点的id均必须唯一;
relay-log = relay-log #开启中继日志
log-bin =mysql-log #开启二进制日志
read_only = ON #启用只读属性(非必须)
relay_log_purge = 0 #是否自动清空不再需要中继日志(非必须)
skip_name_resolve #关闭名称解析(非必须)
log_slave_updates = 1 #使得更新的数据写进二进制日志中
[root@slave2 ~]# systemctl restart mariadb
3、配置一主多从架构
master节点上:
MariaDB [(none)]>grant all on *.* to 'he'@'10.0.%.%' identified by '123';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show master status;
两台slave节点上:
MariaDB [(none)]> change master to master_host='10.0.0.41',
-> master_user='he',
-> master_password='123',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=862;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
三、安装配置MHA高可用
1、在所有 Mysql 节点授权拥有管理权限的用户可在本地网络中有其他节点上远程访问。 当然, 此时仅需要且只能在 master 节点运行类似如下 SQL 语句即可,为MHA专门创建一个管理用户, 方便以后使用, 三个节点自动同步:。
MariaDB [(none)]> grant all on *.* to 'xiao'@'10.0.%.%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2、配置 ssh 互通环境,就是四台主机,包括自己互相都能免密
操作较多,自己操作
批量免密脚本
3、安装 MHA 包
在本步骤中, Manager节点需要另外多安装一个包。具体需要安装的内容如下:
下载压缩包
MHA压缩包下载
四个节点都需安装:mha4mysql-node-0.56-0.el6.norch.rpm
Manager 节点另需要安装:mha4mysql-manager-0.56-0.el6.noarch.rpm
我们使用rz命令分别上传,然后使用yum安装即可。
定义 MHA 管理配置文件
Manager节点:
mkdir /etc/mha_master
vim /etc/mha_master/mha.cnf
配置文件如下
[server default] #适用于server1,2,3个server的配置
user=xiao #xiao管理用户,每台数据库都得有
password=123 #xiao管理密码
manager_workdir=/etc/mha_master/app1 #mha_master自己的工作路径
manager_log=/etc/mha_master/manager.log # mha_master自己的日志文件
remote_workdir=/mydata/mha_master/app1 #每个远程主机的工作目录在何处
ssh_user=root # 基于ssh的密钥认证
repl_user=he #数据库用户名,做主从的用户
repl_password=123 #数据库密码
ping_interval=1 #ping间隔时长
[server1] #节点1 master
hostname=10.0.0.41 #节点1主机地址
ssh_port=22 #节点1的ssh端口
candidate_master=1 #将来可不可以成为master候选节点/主节点
[server2] #节点2 slave
hostname=10.0.0.42
ssh_port=22
candidate_master=1
[server3] //节点3 slave
hostname=10.0.0.43
ssh_port=22
candidate_master=1
no_master=1 #从不将这台主机转换为master
4、对四个节点进行检测
1)检测各节点间 ssh 互信通信配置是否 ok
我们在 Manager 机器上输入下述命令来检测:
[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf
2)检查管理的MySQL复制集群的连接配置参数是否OK
因此,我们需要在master节点上再次执行以下操作:
MariaDB [(none)]> grant all on *.* to 'he'@'10.0.%.%' identified by '123';
MariaDB [(none)]> flush privileges;
之后在Manager
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
5、启动 MHA
我们在 manager 节点上执行以下命令来启动 MHA:
[root@manager ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
[1] 7598
启动成功以后,我们来查看一下 节点的状态:
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:7598) is running(0:PING_OK), master:10.0.0.41
6、测试 MHA 故障转移
在 master 节点关闭 mariadb 服务,模拟主节点数据崩溃
[root@master ~]# systemctl stop mariadb
在manager节点
我们在来查看一下 节点的状态:
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha is stopped(2:NOT_RUNNING)
修复主库
systemctl restart mariadb
manager节点
cat /etc/mha_master/manager.log
恢复主从结构
普通主从不行就用以下从日志里的
CHANGE MASTER TO MASTER_HOST='10.0.0.42', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-log.000003', MASTER_LOG_POS=747, MASTER_USER='he', MASTER_PASSWORD='123';
[root@manager ~]# masterha_stop -conf=/etc/mha_master/mha.cnf
——————————————————————————————————————————————————
重要!!!!!删除以下文件,必须删掉,要不MHA不可重用
rm -rf /etc/mha_master/app1 //mha_master自己的工作路径
rm -rf /etc/mha_master/manager.log // mha_master自己的日志文件
rm -rf /mydata/mha_master/app1 //每个远程主机的工作目录在何处 三个节点的
rm -r remote_workdir=/mydata/mha_master/app1 // 三个节点的
启动之前记得保持数据同步,从新HAM高可用,因为MHA是一次性的
我们在 manager 节点上执行以下命令来启动 MHA:
[root@manager ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
[1] 7598
启动成功以后,我们来查看一下 节点的状态:
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:7598) is running(0:PING_OK), master:10.0.0.42
配置MHA的VIP漂移
1、首先编写VIP漂移脚本
mkdir -p /masterha/app1
vi /masterha/app1/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 = '10.0.0.100';#设置Virtual IP
my $gateway = '10.0.0.254';#网关Gateway IP
my $interface = 'ens33';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway >/dev/null 2>&1";
my $ssh_stop_vip = "/sbin/ifconfig $interface:$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" ) {
# $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\@$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 $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";
}
chmod +x /masterha/app1/master_ip_failover
2、配置managerMHA脚本整合VIP漂移脚本
vim /etc/mha_master/mha.cnf
[server default]
user=xiao
password=123
manager_workdir=/etc/mha_master/app1
manager_log=/etc/mha_master/manager.log
remote_workdir=/mydata/mha_master/app1
ssh_user=root
repl_user=he
repl_password=123
ping_interval=1
master_ip_failover_script=/masterha/app1/master_ip_failover
[server1]
hostname=10.0.0.41
ssh_port=22
candidate_master=1
master_binlog_dir=/var/lib/mysql #mysql数据目录
[server2]
hostname=10.0.0.42
ssh_port=22
candidate_master=1
master_binlog_dir=/var/lib/mysql
[server3]
hostname=10.0.0.43
ssh_port=22
candidate_master=1
master_binlog_dir=/var/lib/mysql
no_master=1 #从不将这台主机转换为master
3、启动manager,并测试VIP是否漂移
masterha_check_repl -conf=/etc/mha_master/mha.cnf
nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
masterha_check_status -conf=/etc/mha_master/mha.cnf
systemctl stop mariadb
漂移成功
——————————————————————————————————————————————
MHA只能漂移一次,如果多次使用必须删除以下文件,要不MHA不可重用
rm -rf /etc/mha_master/app1 //mha_master自己的工作路径
rm -rf /etc/mha_master/manager.log // mha_master自己的日志文件
rm -rf /mydata/mha_master/app1 //每个远程主机的工作目录在何处 三个节点的
rm -r remote_workdir=/mydata/mha_master/app1 // 三个节点的
启动之前记得保持数据同步,从新HAM高可用,因为MHA是一次性的
我们在 manager 节点上执行以下命令来启动 MHA:
[root@manager ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
[1] 7598
启动成功以后,我们来查看一下 节点的状态:
[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:7598) is running(0:PING_OK), master:10.0.0.42