docker+mha部署+压测+故障切换

mha简介

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在较大程度上保证数据的一致性,以达到真正意义上的高可用。

MHA工作原理

  1. 当master出现故障时,通过对比slave之间I/O线程读取master上binlog的位置,选取最接近的slave做为最新的slave(latest slave)。
  2. 其它slave通过与latest slave对比==生成差异中继日志,并应用
  3. 在latest slave上应用从master保存的binlog,同时将latest slave提升为master。
  4. 最后在其它slave上应用相应的差异中继日志并开始从新的master开始复制.

MHA组件

MHA Manager(管理节点) ==
MHA Manager可以单独部署在一台独立的机器上管理多个==master-slave集群,也可以部署在一台slave节点上。
MHA Node(数据节点)
MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

MHA组件介绍

• MHA Manager
运行一些工具,比如mastermha_manager工具实现自动监控MySQL Master和实现master故障切换,其它工具手动实现master故障切换、在线mater转移、连接检查等等。一个Manager可以管理多 个master-slave集群
• MHA Node
部署在所有运行MySQL的服务器上,无论是master还是slave。主要有三个作用:
1)保存二进制日志
如果能够访问故障master,会拷贝master的二进制日志
2)应用差异中继日志
从拥有最新数据的slave上生成差异中继日志,然后应用差异日志。
3)清除中继日志
在不停止SQL线程的情况下删除中继日志

相关工具介绍

工具 说明
masterha_check_ssh 检查MHA的SSH配置
masterha_check_repl 检查MySQL复制
masterha_manager 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 监测master是否宕机
masterha_master_switch 控制故障转移(自动或手动)
masterha_conf_host 添加或删除配置的server信息

二)Node工具
工具 说明
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并应用于其它slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)

master配置

[root@mysql ~]# mkdir -p /docker_data/{mysql_manager,mysql_m,mysql_s1,mysql_s2}
docker run -d --name c_mysql_m -h mysql_m
-p 33060:3306 -p 220:22 --net=pg-network --ip 172.72.6.2
-v /docker_data/mysql_m:/data/mysql
-e TZ=Asia/Shanghai
–privileged=true
–restart=always
centos7u6:mysql /usr/sbin/init

slave1配置

docker run -d --name c_mysql_s1 -h mysql_s1
-p 33061:3306 -p 221:22 --net=pg-network --ip 172.72.6.3
-v /docker_data/mysql_s1:/data/mysql
-e TZ=Asia/Shanghai
–privileged=true
–restart=always
centos7u6:mysql /usr/sbin/init

slave2配置

docker run -d --name c_mysql_s2 -h mysql_s2
-p 33062:3306 -p 222:22 --net=pg-network --ip 172.72.6.4
-v /docker_data/mysql_s2:/data/mysql
-e TZ=Asia/Shanghai
–privileged=true
–restart=always
centos7u6:mysql /usr/sbin/init

manager配置

docker run -d --name c_mysql_manager -h mysql_mgr
-p 33063:3306 -p 223:22 --net=pg-network --ip 172.72.6.5
-v /docker_data/mysql_manager:/data/mysql
-e TZ=Asia/Shanghai
–privileged=true
–restart=always
centos7u6:mysql /usr/sbin/init

MHA部署

创建MHA监控用户

mysql> create user ‘mha’@‘192.168.56.83’ identified by ‘123’;
Query OK, 0 rows affected (0.01 sec)

mysql> grant all privileges on . to ‘mha’@‘192.168.56.83’;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> grant all privileges on . to ‘mha’@‘%’ identified by ‘123’;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

环境部署

1)修改主机名和hosts ~ 所有节点
[root@mysql_m /]# cat /etc/hosts
172.72.6.2 mysql_m
172.72.6.3 slave1
172.16.6.4 slave2
172.72.6.5 mysql_mgr

2)关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i ‘/SELINUX=enforcing/cSELINUX=disabled’ /etc/selinux/config

3)关闭NetworkManager服务
systemctl stop NetworkManager
systemctl disable NetworkManager

4)配置yum源
方案一: 配置本地yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache

cat server.repo

[local]
name=local yum
baseurl=file:///mnt
enabled=1
gpgcheck=0
[aliyun]
name=this is aliyun yum
baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0
方案二:配置自建仓库,提前准备好软件包
注意:如果没有网络可以使用本地仓库,提前下载好包

cat server.repo

[local]
name=local yum
baseurl=file:///mnt
enabled=1
gpgcheck=0
[mha]
name=mha soft
baseurl=file:///soft/mha/mha-yum
enabled=1
gpgcheck=0
说明:
每台服务器都需要配置该文件
每台服务器都需要/soft/mha/mha-yum目录来保存相应的软件包
yum install epel-release
5) 安装依赖包
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Time-HiRes perl-Mail-Sender perl-Mail-Sendmail perl-MIME-Base32 perl-MIME-Charset perl-MIME-EncWords perl-Params-Classify perl-Params-Validate.x86_64 perl-Log-Dispatch perl-Parallel-ForkManager net-tools

搭建主从复制

1)创建配置文件
*** master
[mysqld]
port = 3306
datadir = /data/mysql/data
tmpdir = /data/mysql/tmp
log_error = /data/mysql/data/error.log
pid_file = /data/mysql/mysql.pid
log_bin = /data/mysql/logs/logbin
log_bin_index = /data/mysql/logs/logbin.index
socket = /tmp/mysql.sock
innodb_buffer_pool_size = 1G
wait_timeout=28800
interactive_timeout=28800
max_connections = 2000
expire_logs_days = 5
log_slave_updates=1
character_set_server=utf8mb4
server-id=10
log-slave-updates=1
gtid-mode=on
enforce-gtid-consistency=true
*** slave1
port = 3306
datadir = /data/mysql/data
tmpdir = /data/mysql/tmp
log_error = /data/mysql/data/error.log
pid_file = /data/mysql/mysql.pid
log_bin = /data/mysql/logs/logbin
log_bin_index = /data/mysql/logs/logbin.index
socket = /tmp/mysql.sock
innodb_buffer_pool_size = 1G
wait_timeout=28800
interactive_timeout=28800
max_connections = 2000
expire_logs_days = 5
log_slave_updates=1
character_set_server=utf8mb4
server-id=20
log-slave-updates=1
gtid-mode=on
enforce-gtid-consistency=true

***slave2
[mysqld]
server_id = 188414
port = 3306
datadir = /data/mysql/data
tmpdir = /data/mysql/tmp
log_error = /data/mysql/data/error.log
pid_file = /data/mysql/mysql.pid
log_bin = /data/mysql/logs/logbin
log_bin_index = /data/mysql/logs/logbin.index
socket = /tmp/mysql.sock
innodb_buffer_pool_size = 1G
wait_timeout=28800
interactive_timeout=28800
max_connections = 2000
expire_logs_days = 5
log_slave_updates=1
character_set_server=utf8mb4
#gtid-mode=on
#log-slave-updates=1
#enforce-gtid-consistency
server-id=30
log-slave-updates=1
gtid-mode=on
enforce-gtid-consistency=true

***删除auto.cnf ~ 所有从库
rm -f auto.cnf

MHA软件安装

#不同节点安装软件

说明:在所有节点安装 mha-node 软件包,在 mha 管理端再安装 mha-manager 软件包
[root@mysql_m mysql]# yum localinstall mha4mysql-node-0.57-0.el7.noarch.rpm
[root@mysql_s1 ~]# yum localinstall mha4mysql-node-0.57-0.el7.noarch.rpm
[root@mysql_s2 ~]# yum localinstall mha4mysql-node-0.57-0.el7.noarch.rpm
[root@mysql_mgr ~]# yum localinstall mha4mysql-manager-0.57-0.el7.noarch.rpm
[root@mysql_mgr ~]# yum localinstall mha4mysql-node-0.57-0.el7.noarch.rpm
注意:
管理节点需要安装node和manager双安装包

配置ssh互信

说明:

  1. 在生产环境中几乎都是禁止root远程登陆服务器的,所以ssh免密码登陆要在admin用户下进行配置,这是处于安全角度考虑出发。
  2. admin用户可以是任意普通用户
  3. 该普通用户用于mha的管理节点远程访问mysql复制组中的所有主机,完成一些其他工作

mgr端:

[root@mgr ~]# su - admin
[admin@mgr ~]$ ssh-keygen -P “” -f ~/.ssh/id_rsa
[admin@mgr ~]$ cd .ssh/
[admin@mgr .ssh]$ ls
id_rsa id_rsa.pub
[admin@mgr .ssh]$ mv id_rsa.pub authorized_keys测试免密登录:
[admin@mgr .ssh]$ for i in 80 81 82 83;do scp -r …/.ssh/ 192.168.56. i :   / ; d o n e [ a d m i n @ m y s q l m g r . s s h ] i:~/;done [admin@mysql_mgr .ssh] i: /;done[admin@mysqlmgr.ssh] ssh 172.72.6.2 date
[admin@mysql_mgr .ssh]$ ssh 172.72.6.3 date
[admin@mysql_mgr .ssh]$ ssh 172.72.6.4 date
[admin@mysql_mgr .ssh]$ ssh 172.72.6.5 date

配置admin用户的sudo权限

[root@mysql_mgr ~]# vim /etc/sudoers.d/admin
#User_Alias 表示具有sudo权限的用 户 列表; Host_Alias表示主机的列表
User_Alias MYSQL_USERS = admin
#Runas_Alias 表示用户以什么身份登录
Runas_Alias MYSQL_RUNAS = root
#Cmnd_Alias 表示允许执行命令的列表
Cmnd_Alias MYSQL_CMNDS = /sbin/ifconfig,/sbin/arping
MYSQL_USERS ALL = (MYSQL_RUNAS) NOPASSWD: MYSQL_CMNDS
[root@master ~]# for i in 2 3 4 5;do scp /etc/sudoers.d/admin 172.72.6.$i:/etc/sudoers.d/;done

测试admin用户是否可以挂载VIP

[admin@master ~]$ sudo /sbin/ifconfig enp0s8:1 192.168.56.85 broadcast 192.168.56.255 netmask 255.255.255.0
在这里插入图片描述
补充:
arping:用来向局域网内的其它主机发送ARP请求的指令,可以用来测试局域网内的某个IP是否已被使用。

-f:收到第一个响应包后退出。
-q:quite模式,不显示输出。
-c:发送指定的count个ARP REQUEST包后停止。如果指定了-w参数,则会等待相同数量的ARP REPLY包,直到超时为止。
-w:指定一个超时时间,单位为秒,arping在到达指定时间后退出,无论期间发送或接收了多少包。在这种情况下,arping在发送完指定的count(-c)个包后并不会停止,而是等待到超时或发送的count个包都进行了回应后才会退出。
-I:指定设备名,用来发送ARP REQUEST包的网络设备的名称。
-D:重复地址探测模式,用来检测有没有IP地址冲突,如果没有IP冲突则返回0。
-s:设置发送ARP包的IP资源地址
-U:无理由的(强制的)ARP模式去更新别的主机上的ARP CACHE列表中的本机的信息,不需要响应。
-h:显示帮助页。

创建mha相关配置文件

创建 mha 相关的工作目录

[root@mgr ~]# mkdir /etc/mha/
[root@mgr ~]# mkdir -p /data/mha/masterha/app1
[root@mgr ~]# chown -R admin. /data/mha

创建mha局部配置文件

cat /etc/mha/app1.conf
[server default]
设置监控用户和密码
user=mha
password=123

设置复制环境中的复制用户和密码
repl_user=slave
repl_password=123

设置ssh的登录用户名
ssh_user=admin

设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
ping_interval=3

设置mgr的工作目录
manager_workdir=/data/mha/masterha/app1

设置mysql master保存binlog的目录,以便MHA可以找到master的二进制日志
master_binlog_dir=/data/mysql/logs

设置master的pid文件
master_pid_file=/data/mysql/data/master.pid

设置mysql master在发生切换时保存binlog的目录(在mysql master上创建这个目录,因为切换的时候哪个节点都可能成为主库,所以所有节点都创建)
remote_workdir=/data/mysql/mha

设置mgr日志文件
manager_log=/data/mha/masterha/app1/mgr.log

MHA到master的监控之间出现问题,MHA Manager将会尝试从slave1和slave2登录到master上
secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.56.81 -s 192.168.56.82 --user=admin --port=22 --master_host=192.168.56.80 --master_port=3306

设置自动failover时候的切换脚本
master_ip_failover_script=“/etc/mha/master_ip_failover.sh 192.168.56.85 1”

设置手动切换时候的切换脚本
#master_ip_online_change_script=“/etc/mha/master_ip_online_change.sh 192.168.56.85 1”

设置故障发生后关闭故障主机脚本
shutdown_script=“/etc/mha/power_manager”

[server1]
hostname=192.168.56.80
port= 3306
candidate_master=1
[server2]
hostname=192.168.56.81
port= 3306
candidate_master=1
[server3]
hostname=192.168.56.82
port= 3306
candidate_master=1

上传相应脚本

[root@mgr ~]# ls /etc/mha/
app1.conf master_ip_failover.sh
注意:脚本内容中要修改网卡名字和连接用户为admin
my $vip = shift;
my $interface = ‘ens33’; 网卡名
my $key = shift;

sub stop_vip() {
my s s h u s e r = " a d m i n " ; 用户名 p r i n t " = = = = = = = ssh_user = "admin"; 用户名 print "======= sshuser="admin";用户名print"=======ssh_stop_vip==================\n";
ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \";
}

[root@mgr ~]# chmod +x /etc/mha/master_ip_*

状态检查

检查ssh互信和集群状态
[admin@mgr ~]$ masterha_check_ssh --conf=/etc/mha/app1.conf
在这里插入图片描述

检查集群状态

root@mgr mha]# su - admin
[admin@mgr ~]$ masterha_check_repl --conf=/etc/mha/app1.conf
在这里插入图片描述

检查MHA-Mgr状态

[admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app1.conf
app1 is stopped(2:NOT_RUNNING).
开启MHA Manager监控:
[admin@mgr ~]$ nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover &
再次查看监控状态:
[admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app1.conf
在这里插入图片描述
注意:

  1. 如果正常,会显示”PING_OK ”,否则会显示”NOT_RUNNING ”,说明 MHA监控没有开启
  2. 使用admin用户启动监控,否则会报权限拒绝
  3. 手动停止监控命令:masterha_stop --conf=/etc/mha/app1.conf

自动failover测试

安装测试工具

[root@master ~]# yum -y install sysbench

创建测试数据

mysql> create database test charset utf8mb4;
mysql> grant all on . to ‘mha’@‘localhost’ identified by ‘123’;
在这里插入图片描述
[root@master ~]# sysbench /usr/share/sysbench/oltp_read_only.lua
–mysql-host=192.168.56.80 --mysql-port=3306 --mysql-user=mha
–mysql-password=123 --mysql-socket=/tmp/mysql.sock
–mysql-db=test --db-driver=mysql --tables=1
–table-size=100000 --report-interval=10 --threads=128 --time=120 prepare
在这里插入图片描述

模拟故障

[root@master ~]# service mysqld stop
在这里插入图片描述

查看切换过程

[root@mgr yum.repos.d]# tail -f tail -f /data/mha/masterha/app1/mgr.log
切换之后记得在原来的主库上执行
mysql> show slave status\G;
注意:每次节点切换之后都要删除管理节点上配置文件中manager_workdir对对应目录下的mysql-mha.failover.complete文件,否则mha不能成功切换

切换故障

配置错误
1)检查所有节点ifconfig命令,如果没有
[root@slave2 mysql]# yum install -y net-tools.x86_64
在这里插入图片描述
在这里插入图片描述
注意红框标出部分,每自动切换一次会删除相应信息,所以要补上信息之后才能再次启用mha工具
配置MHA时数据只读设置
在这里插入图片描述
mysql> set @@global.read_only=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘read_only’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| read_only | ON |
±--------------±------+
1 row in set (0.00 sec)

原因:

  1. 复制用户slave没有相关权限,REPLICATION SLAVE和REPLICATION CLIENT
  2. 从服务器没有创建复制用户
    4、其他错误
    MHA集群至少需要2个slave,所以如果只有一台slave的话,检查也是通不过的!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶博雅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值