三、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
相关资源: