Mysql8 MHA高可用搭建之MHA安装配置及测试

三、mysql8基于MHA的高可用集群
0、配置ssh密钥登入各服务器互信:
1、安装MHA软件
2、安装mha监控manager,只要在77机器上安装:
3、在manager管理机器上配置管理节点:
4、编写配置文件中提到的/data1/mysql_mha/master_ip_failover脚本:
5、给该脚本添加可执行权限:
6、在其他所有节点上创建mha的工作目录:
7、在master上创建mha这个用户来访问数据库节点:
8、进行检测工作,检测ssh免密和主从,在manager上执行:
9、检测没有报错,可以在manager上启动MHA:
10、用ps检测有没有进程:
11、第一次启动的时候,需要给master机器设置vip:
12、配置邮件提醒
13、配置企业微信提醒
14、MHA发生故障转移之后,再次启动步骤

0、配置ssh密钥登入各个机器互登:

#以这台master为例
#生成密钥
ssh-keygen

#配置免密登入
cd /root/.ssh/
ssh-copy-id -i id_rsa root@192.168.100.161
ssh-copy-id -i id_rsa root@192.168.100.162
ssh-copy-id -i id_rsa root@192.168.100.163

其他2台也一样执行以上语句!

1、安装MHA软件

#下载地址:
https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
#注意,所有节点都需要安装MHA node
#1、先安装相关依赖:
yum -y install epel-release perl-DBD-MySQL perl-DBI ncftp
#2、安装mha:
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

2、安装mha监控manager,只要在mha-manager机器(192.168.100.163)上安装:

#下载地址
https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

#下载好了之后,先安装依赖
yum -y install epel-release
yum -y install perl-Config-Tiny perl-Time-HiRes perl-Parallel-ForkManager perl-Log-Dispatch perl-DBD-MySQL ncftp

#如果有些依赖没有,就重新安装epel包
yum -y remove epel-release
yum -y install epel-release

#下载manager包之后安装
 rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
######################################################################################
#离线安装epel-release
下载rpm文件
http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/,
安装 epel-release rpm:
# rpm -Uvh epel-release*rpm
    
#离线安装perl-Config-Tiny perl-Time-HiRes perl-Parallel-ForkManager perl-Log-Dispatch perl-DBD-MySQL ncftp
Download the latest epel-release rpm from
http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/,下载rpm文件

3、在manager管理机器上配置管理节点:

#创建相关目录
mkdir /etc/mha
mkdir /data1/mysql_mha
#编写配置文件
vim /etc/mha/mysql_mha.cnf
#添加

mysql_mha.cnf文件内容:
------------------------------------------------------------------------
[server default]
#mha访问数据库的账号与密码
user=mha
password=pass123456
port=3306
#指定mha的工作目录
manager_workdir=/data1/mysql_mha
#指定管理日志路径
manager_log=/data1/mysql_mha/manager.log
#指定master节点存放binlog的日志文件的目录 log_bin=mysql_bin默认是在/var/lib/mysql
master_binlog_dir=/data1/mysql8/data
#指定mha在远程节点上的工作目录
remote_workdir=/data1/mysql_mha
#指定主从复制的mysql用户和密码
repl_user=repl
repl_password=pass456
#指定检测间隔时间
ping_interval=1
#指定一个脚本,该脚本实现了在主从切换之后,将虚拟ip漂移到新的master上
master_ip_failover_script=/data1/mysql_mha/master_ip_failover
#指定用于二次检查节点状态的节点,这里不要配置主节点的ip,否则主节点网络断掉或者机器断电就无法切换
secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.100.162 -s 192.168.100.163
#用于故障切换的时候发送邮件提醒
report_script=/data1/mysql_mha/send_mail
[server1]
hostname=192.168.100.161
port=3306
ssh_user=root
candidate_master=1
#check_repl_delay=0
[server2]
hostname=192.168.100.162
port=3306
ssh_user=root
candidate_master=1
#check_repl_delay=0

#注意,当163和MHA manager部署在一台机器的时候下面的内容直接注释掉,否则校验不通过(我的没有注释)
[server3]
hostname=192.168.100.163
ssh_user=root
port=3306
no_master=1
ignore_fail=1

4、编写配置文件中提到的/data1/mysql_mha/master_ip_failover脚本:
master_ip_failover脚本内容:

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
    $command, $orig_master_host, $orig_master_ip,$ssh_user,
    $orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
    $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);

# 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
my $vip = '192.168.100.166/24';
my $key = '1';
# 这里的网卡名称 “ens192” 需要根据你机器的网卡名称进行修改
# 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
# 我这边实际情况是修改成统一的网卡名称
my $ssh_start_vip = "sudo /sbin/ifconfig ens192:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens192:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I bond0 -c 3 -A $vip";

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,
    'orig_master_ssh_port=i' => \$orig_master_ssh_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
    'new_master_ssh_port' => \$new_master_ssh_port,
    'new_master_user' => \$new_master_user,
    'new_master_password' => \$new_master_password

);

exit &main();

sub main {
    $ssh_user = defined $ssh_user ? $ssh_user : 'root';
    print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();
        &start_arp();
            $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() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub start_arp() {
    `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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、给该脚本添加可执行权限:

chmod a+x /data1/mysql_mha/master_ip_failover

6、在其他所有节点上创建mha的工作目录:

mkdir /data1/mysql_mha

7、在master上创建mha这个用户来访问数据库节点:

mysql -uroot -p'pass123' 
create user 'mha'@'%' identified with mysql_native_password by 'pass123456';
grant all privileges on *.* to 'mha'@'%';
flush privileges;

8、进行检测工作,检测ssh免密和主从,在manager上执行:

masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf

masterha_check_repl --conf=/etc/mha/mysql_mha.cnf

9、检测没有报错,可以在manager上启动MHA:

#启动
nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf &> /data1/mysql_mha/manager.log &
#停止
masterha_stop --conf=/etc/mha/mysql_mha.cnf
#查看master状态
masterha_check_status --conf=/etc/mha/mysql_mha.cnf

10、用ps检测有没有进程:

ps aux |grep masterha_manager

root     15156  0.1  1.1 299592 22076 pts/1    S    13:23   0:06 perl /usr/bin/masterha_manager --conf=/etc/mha/mysql_mha.cnf

11、第一次启动的时候,需要给master机器设置vip:

ifconfig ens192:1 192.168.100.166/24

12、配置邮件提醒

#网上提供的邮件发送脚本都是需要SMTP授权码,但是由于我们公司没有SMTP授权码,所以自己写了一个邮件发送的脚本
#/etc/mha/mysql_mha.cnf增加下面内容
report_script=/data1/mysql_mha/send_mail

send_mail脚本内容:
-----------------------------------------------------------------------------------------------
#!/bin/bash
# 脚本的日志文件
LOGFILE="/data1/mysql_mha/email.log"
:>"$LOGFILE"
exec 1>"$LOGFILE"
exec 2>&1
SMTP_server='smtp.123.com'
username='123@456.com'
password='111*'
from_email_address='123@456.com'
to_email_address='***@***,***@***'

message_subject_utf8="MHA集群主库故障转移提醒"

HTML_PATH=html_path
echo "<h2 style="color:red">">$HTML_PATH
echo "MHA集群主节点发生故障,进行节点故障转移,请及时解决查看!!!">>$HTML_PATH
echo "</h2>">>$HTML_PATH
echo "<p>以下为MHA集群的相关信息:</p>">>$HTML_PATH
echo "<table border="1" cellspacing="0"  width="700"><tr><th>节点</th><th>角色</th>     <th>作用</th></tr><tr><td>10.6.110.170</td><td>MHA manager</td> <td>MHA监控节点</td></tr><tr><td>10.8.40.77</td><td>master/master.bak</td>      <td>主库或者主备</td></tr><tr><td>10.8.40.68</td><td>master/master.bak</td>     <td>主库或者主备</td></tr><tr><td>10.6.119.241</td><td>slave</td>       <td>从库</td></tr><tr><td>10.8.40.79</td><td>VIP</td>   <td>虚拟ip</td></tr></table>">>$HTML_PATH

echo "<br>">>$HTML_PATH
echo "<h4>详细错误日志路径为:10.6.110.170:/data1/mysql_mha/manager.log</h4>">>$HTML_PATH

message_body_utf8=$(cat $HTML_PATH)

#message_body_utf8="mysql的MHA集群主节点发生故障,进行节点故障转移,请及时解决查看!!!"
# 转换邮件标题为GB2312,解决邮件标题含有中文,收到邮件显示乱码的问题。
message_subject_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_subject_utf8
EOF`
[ $? -eq 0 ] && message_subject="$message_subject_gb2312" || message_subject="$message_subject_utf8"
# 转换邮件内容为GB2312,解决收到邮件内容乱码
message_body_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_body_utf8
EOF`
[ $? -eq 0 ] && message_body="$message_body_gb2312" || message_body="$message_body_utf8"
# 发送邮件
sendEmail='/usr/bin/sendEmail'
set -x
$sendEmail -s "$SMTP_server" -xu "$username" -xp "$password" -f "$from_email_address" -t "$to_email_address" -u "$message_subject" -m "$message_body" -o message-content-type=html -o message-charset=gb2312
#同时配置了企业微信通知
sh  /data1/mysql_mha/send_wechat

13、配置企业微信提醒

 vim /data1/mysql_mha/send_wechat

#!/bin/bash

curl -X POST -H 'Content-Type: application/json'  --data '{"content": "MHA集群主节点发生故障,进行节点故障转移,请及时解决查看!!!详细错误日志路径为:10.6.110.170:/data1/mysql_mha/manager.log","users": "xxx"}'  http://ip:port/wechat/api/sendText > /data1/mysql_mha/wechat.log

14、MHA发生故障转移之后,再次启动步骤

#1、
在mha-manager节点删除/data1/mysql_mha/mysql_mha.failover.complete文件
rm /data1/mysql_mha/mysql_mha.failover.complete

#2、把宕机节点重新加入mysql集群
stop slave;
reset slave all;
CHANGE MASTER TO MASTER_HOST='192.168.100.162',MASTER_USER='repl',MASTER_PASSWORD='pass456',master_auto_position=0;
CHANGE MASTER TO MASTER_HOST='192.168.100.162',MASTER_USER='repl',MASTER_PASSWORD='pass456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=1546;
start slave;
show slave status\G;
    
#3、修改/etc/mha/mysql_mha.cnf中的

secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.100.161 -s 192.168.100.163 把主节点去掉,增加新的从节点
    
#4、做网络互联检查
masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf
    
#5、mha状态检查
masterha_check_repl --conf=/etc/mha/mysql_mha.cnf

如果出现:Error 'Operation CREATE USER failed for 'repl'@'%'' on query. Default database: ''. Query: 'CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*7BCE242F93347C50E8EDE2E1575E757422487E61''

说明从库已经有了该用户,在重放操作时产生冲突

这个时候给报错的从库重新设置 主从复制信息就好
    
#6、启动mha
nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf &> /data1/mysql_mha/manager.log &
    
#7、查看mha状态
masterha_check_status --conf=/etc/mha/mysql_mha.cnf

文章参考:
原文链接:https://blog.csdn.net/qq_15350581/article/details/114090794


作者:前浪浪奔浪流
链接:https://www.jianshu.com/p/964c6c437528

相关资源:

GitOps 初探 - Dcsdn

行业分类-设备装置-一种用于数据库运维的移动平台及其使用方法 - Dcsdn

redis(哨兵模式配置) - Dcsdn

Redis数据的导出和导入 - Dcsdn

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值