MySQL-MHA方案实践

1.什么是MHA

MHA(Mater High Availability)是用perl编写的一套流行实用的MySQL高可用方案软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

MHA由MHA Manager(管理节点)、MHA Node(数据节点)两个角色组成。MHA Manager可以单独部署在一台服务器上也可以部署在某一台从节点上。MHA Node需要部署在每一台MySQL服务器上。

2.MHA工作原理

3.节点规划

Master:192.168.244.132,MHA-node

Slave-01:192.168.244.133,MHA-node

Slave-02:192.168.244.134,MHA-node,MHA-manager

 vip:192.168.244.135

4.配置SSH密钥免密码登录

MHA管理节点在工作时,会通过SSH服务连接到其他节点服务器以及其本身进行探测或复制数据。在集群中的每台MySQL服务器创建密钥对并复制到集群中的其他节点包含其本身,以实现每台服务器之间相互信任。

自动部署SSH免密钥登录脚本:自动化部署SSH密钥认证

5.配置主从复制

>>>MySQL主从复制实践<<<

my.cnf需要添加额外的设置

log_bin=mysql-bin   #开启binlog
relay_log_purge = 0 #不自动删除relay log日志
expire_logs_days = 7 #自动删除7天前的binlog日志
log-slave-updates = 1 #更新的数据写进二进制日志中

6.安装MHA-node

[root@Master ~]# yum install -y perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-CPAN #安装依赖
[root@Master ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz #下载软件
[root@Master ~]# tar xf mha4mysql-node-0.58.tar.gz
[root@Master ~]# ll mha4mysql-node-0.58/bin/ #工具
total 48
-rwxr-xr-x. 1 mysql mysql 17639 Mar 23 2018 apply_diff_relay_logs #对比中继日志差异,并补全到各个节点
-rwxr-xr-x. 1 mysql mysql 4807 Mar 23 2018 filter_mysqlbinlog #过滤无用的回滚事件
-rwxr-xr-x. 1 mysql mysql 8337 Mar 23 2018 purge_relay_logs #清除无用的中继日志
-rwxr-xr-x. 1 mysql mysql 7525 Mar 23 2018 save_binary_logs #保存并恢复宕机的主库binlog日志数据
[root@Master mha4mysql-node-0.58]# perl Makefile.PL
[root@Master mha4mysql-node-0.58]# make && make install

添加MHA管理账号

[root@localhost ~]# mysql -e "grant all privileges on *.* to 'mha'@'192.168.244.%' identified by 'mha';"

第六步需要在所有节点上配置

7.安装MHA-manager

[root@Slave-02 ~]# curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@Slave-02 ~]# yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
[root@Slave-02 ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
[root@Slave-02 ~]# tar xf mha4mysql-manager-0.58.tar.gz
[root@Slave-02 mha4mysql-manager-0.58]# perl Makefile.PL
[root@Slave-02 mha4mysql-manager-0.58]# make && make install

8.配置MHA管理节点

[root@Slave-02 ~]# mv mha4mysql-manager-0.58 mha-manager
[root@Slave-02 ~]# mkdir -p /var/log/mha/app1
[root@Slave-02 ~]# mkdir -p /etc/mha
[root@Slave-02 ~]# cp mha-manager/samples/conf/app1.cnf /etc/mha/
root@Slave-02 ~]# cat /etc/mha/app1.cnf #配置文件
[server default]
manager_workdir=/var/log/mha/app1
manager_log=/var/log/mha/app1/manager.log
master_binlog_dir=/data/binlog/
master_ip_failover_script=/usr/local/bin/master_ip_failover
user=mha
password=mha
repl_user=rep
repl_password=rep
ssh_user=root
ping_interval=2
[server1]
hostname=192.168.244.132
port=3306
[server2]
hostname=192.168.244.133
candidate_master=1
check_repl_delay=0
port=3306
[server3]
hostname=192.168.244.134
port=3306

9.配置master_ip_failover

[root@Slave-02 ~]# cp mha4mysql-manager-0.58/samples/scripts/master_ip_failover /usr/local/bin/master_ip_failover
[root@Slave-02 ~]# cat /usr/local/bin/master_ip_failover
......
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.244.135/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,
......
# FIXME_xxx; #注释此行
[root@Slave-02 ~]# ifconfig ens33:0 192.168.244.135/24 #添加vip

10.检测SSH免密码登录

###设置环境变量,方便使用mha工具###
[root@Slave-02 bin]# echo "PATH=$PATH:/usr/local/bin" >> /etc/profile
[root@Slave-02 bin]# source /etc/profile
[root@Slave-02 bin]# masterha_check_ssh --conf=/etc/mha/app1.cnf
......
Sun Mar 15 23:44:04 2020 - [info] All SSH connection tests passed successfully.

11.检测MySQL集群健康状态

###在所有节点上创建以下软链接,因为MHA-MANAGER在检测的时候会在/usr/bin下寻找命令这两个命令###
[root@Slave-02 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@Slave-02 ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
###在MHA-MANAGER节点上创建除以上两个链接外,再创建以下软链接,因为发现健康检查的时候会寻找此命令###
[root@Slave-02 ~]# ln -s /usr/local/bin/apply_diff_relay_logs /usr/bin/apply_diff_relay_logs......
MySQL Replication Health is OK.

12.启动MHA

[root@Slave-02 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover< /dev/null >/var/log/mha/app1/manager.log 2>&1 &

13.测试

[root@Master ~]# systemctl stop mysql​   #停止主库服务
[root@Slave-02 ~]# mysql -e "show slave status\G;" #/var/log/mha/app1/manager.log​日志记录了详细过程
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.244.133 ###Slave-01变成了主库
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000014
Read_Master_Log_Pos: 154
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000014​
......


「 文章如果对你有帮助,请点个赞哦^^ 」 

0