MySQLMHA部署教程
## 01.环境准备
三台及以上机器或者多实例,本次搭建使用三台机器,MHA高可用是建立在主从架构的基础上的,首先搭建好一主两从的架构,将 Manager节点安装在从库上。
| IP 主机名 角色 备注
| ------------------------------------------------------------ | ---- | ---- | ---- |
| 192.168.59.137 mysql1 主 master节点
| 192.168.59.136 mysql2 从 node节点
|192.168.59.128 mysql3 从 Manager、 node节点
## 02.一主两从搭建
1.安装mysql5.7.35(三台都安装)
此处省略,请参考mysql一键安装脚本https://www.jianshu.com/p/01d2e835a3fb
配置三台my.cnf配置文件
主库:192.168.59.137
#[mysqld]标签下追加
#表示是本机的序号为1,一般来讲就是master的意思
server_id =1
#服务器在关闭它之前在一个连接上等待行动的秒数。
wait_timeout=360000
#开启Binlog日志
log-bin=binlog
#当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘
sync-binlog = 1
#表示自增长字段从那个数开始,他的取值范围是1 .. 65535
auto_increment_offset = 2
#表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535
auto_increment_increment = 2
# 将relaylog的同步内容记录到binlog中
log_slave_updates=on
# 开启GTID复制模式gtid_mode=ON
enforce_gtid_consistency=1
从库1:192.168.59.136
从库2:192.168.59.128
#[mysqld]标签下追加
server_id = 2 #id另外一个从库需要变下
log-bin=binlog
#定义relay_log的位置和名称
#服务器在关闭它之前在一个连接上等待行动的秒数。
wait_timeout=360000
relay_log=relay_bin
log_slave_updates=on
gtid_mode=ON
enforce_gtid_consistency=1
2.搭建主从关系
创建同步用户
进入mysql操作界面,在主服务器上为从服务器建立一个连接帐户,该帐户必须授予REPLICATION SLAVE权限。
mysql> grant replication slave on *.* to 'replicate'@'192.168.59.%' identified by '123456';
mysql> flush privileges;
创建好同步连接帐户后,我们可以通过在从服务器(Slave)上用replicat帐户对主服务器(Master)数据库进行访问下,看下是否能连接成功。
在两个从服务器(Slave)上输入如下指令:
# mysql -h192.168.59.134 -ureplicate -p123456 ---可以连接表示正常
用change mster 语句指定同步位置
这步是最关键的一步了,两台从库都执行,在进入mysql操作界面后,输入如下指令:
mysql>stop slave; //先停步slave服务线程,这个是很重要的,如果不这样做会造成以下操作不成功。
mysql>change master to master_host='192.168.59.137',master_user='replicate',master_password='123456',master_log_file=' mysql-bin.000001',master_log_pos=154;
mysql>start slave
注:master_log_file, master_log_pos由主服务器(Master)查出的状态值中确定。也就是刚刚叫注意的。master_log_file对应File, master_log_pos对应Position
如果还出现问题,不同步,则要重新设置slave。指令如下
mysql>stop slave;
mysql>reset slave;
之后停止slave线程重新开始。成功后,则可以开启slave线程了。
mysql>start slave;
查看从服务器(Slave)状态
mysql> show slave status\G;
查看下面两项值均为Yes,即表示设置从服务器成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3、测试同步
查看主库和从库的数据是否一致,如不一致需要调整至一致。
4、配置ssh免密登录
配置集群内所有主机之间能够通过ssh免密登录,因为MHA是基于ssh去实现远程控制及数据管理的。例如,故障转移过程中保存原Master节点的二进制日志以及配置虚拟IP等。
1. 关闭防火墙查看防火状态 systemctl status firewalld
暂时关闭防火墙systemctl stop firewalld
永久关闭防火墙systemctl disable firewalld
重启防火墙systemctl enable firewalld
2. 关闭SELinux永久生效
修改 /etc/selinux/config 文件中的 SELINUX=enforcing 修改为 SELINUX=disabled ,然后重启临时生效 setenforce 0
3. 分别在两台机器上生成私钥/公钥对
[root@localhost ~]# ssh-keygen -t rsa
4. 将master主机下的id_rsa.pub复制到其他几台主机下
[root@localhost ~]$ scp .ssh/id_rsa.pub root@192.168.59.136:~
5. 192.168.59.136主机须将复制过来的id_rsa.pub文件中的内容添加到/home/user/.ssh/authorzied_keys文件中
[root@node1 ~]# cat id_rsa.pub >> .ssh/authorized_keys
[root@node1~]#chmod 600 .ssh/authorized_keys
说明:第4、5步可以用一个命令搞定:ssh-copy-id 192.168.59.136
其他几台一样的操作 。
6. 验证是否可以免密码登录
[root@node1 ~]$ ssh 192.168.59.136
5、安装MHA软件包
| IP 主机名 角色 备注
| ------------------------------------------------------------ | ---- | ---- | ---- |
| 192.168.59.137 mysql1 主 master节点
| 192.168.59.136 mysql2 从 node节点
|192.168.59.128 mysql3 从 Manager、 node节点
1、首先在所有的节点上安装mha4mysql-node软件包,安装包可到如下地址进行下载:
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
2、在安装该rpm包之前需要先安装perl相关依赖:
[root@master ~]# yum -y install epel-release
[root@master ~]# yum -y install perl-DBD-MySQL perl-DBI ncftp
安装完依赖后,安装mha4mysql-node,三个节点都安装。
[root@master ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
3、接着是在监控节点manager上安装mha4mysql-manager软件包,安装包到如下地址进行下载:
4、再安装perl环境依赖
[root@manager ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch* perl-Parallel-ForkManager*
如果有错误提示,先安装epel包,再执行上个命令。,如果还不行,需要下载epel-release-latest-7.noarch.rpm包,再执行上个yum命令,直至安装不报错为止。
然后安装mha4mysql-manager包,命令如下:
[root@manager ~]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
不提示错误为止。
5、创建MHA家目录
[root@manager ~]# mkdir -p /usr/local/mha
[root@manager ~]# mkdir -p /usr/local/mha/scritps/
[root@manager ~]# mkdir -p /etc/mha
6、下载MHA切换脚本
[root@manager ~]# wget https://github.com/yoshinorim/mha4mysql-manager/archive/v0.58.tar.gz
[root@manager ~]# tar -zxvf v0.58.tar.gz
[root@manager ~]# cd mha4mysql-manager-0.58/samples/scripts/
[root@manager ~]# cp ./* /usr/local/mha/scritps/
7、添加如下配置到master_ip_failover脚本
# 这里定义的虚拟IP可以根据实际情况进行修改
my $vip = '192.168.59.110/24';
my $key = '1';
# 这里的网卡名称 “ens33” 需要根据你机器的网卡名称进行修改
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
my $exit_code = 0;
还需要给该脚本添加可执行权限,否则MHA是无法调用的:
[root@manager ~]# chmod a+x /usr/local/mha/scritps/master_ip_failover
8、编辑MHA启动配置文件
创建MHA的配置文件存放目录和工作目录:
[root@manager ~]# mkdir /etc/mha
[root@manager ~]# mkdir /home/mysql_mha
切至/etc/mha目录下,编制app1.cnf文件
[server default]
user=mha #mha管理用户
password=123456 #mha管理用户密码
manager_workdir=/apps/mysql_mha #mha_master自己的工作路径
manager_log=/apps/mysql_mha/manager.log # mha_master自己的日志文件
remote_workdir=/apps/mysql_mha #每个远程主机的工作目录在何处
ssh_user=root
repl_user=replicate
repl_password=123456
ping_interval=1 #ping间隔时长
master_binlog_dir=/data/mysql
master_ip_failover_script=/usr/local/mha/scritps/master_ip_failover
#secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.59.137 -s 192.168.59.136 -s 192.168.59.128
[server1]
hostname=192.168.59.137
candidate_master=1
#master_binlog_dir=/data/mysql
[server2]
hostname=192.168.59.136
#master_binlog_dir=/data/mysql
candidate_master=1
[server3]
hostname=192.168.59.128
#master_binlog_dir=/usr/local/mysql/data
no_master=1
根据配置文件中remote_workdir的配置,需在其他节点上创建MHA的远程工作目录:
[root@master ~]# mkdir /home/mysql_mha
5、在配置文件中指定了让manager使用mha这个用户来访问数据库节点,所以需要在master节点上创建mha用户:
grant all privileges on *.* to mha@'%' identified by 123456';
flush privileges;
6、完成以上所有步骤后,在manager节点上使用masterha_check_ssh和masterha_check_repl对配置进行检查
masterha_check_ssh用于检查ssh登录是否正常
[root@manager ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl则用于检查主从节点的复制链路是否正常
[root@manager ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
7、故障解决:
如果报错主从不一致,实际上一致,则需要去主从查询同步同步用户的权限
[root@master ~]#show grants for replicate
在从库执行
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'%'
如果报mysqlbinlog 异常(不明白为什么会出现这个问题。)
Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 106.
mysqlbinlog version command failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client options
解决
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog 三台机器都操作
如果报mysql: command not found问题(不明白为什么会出现这个问题。)
Checking slave recovery environment settings..
Relay log found at /mysql/data, up to relay.000002
Temporary relay log file is /mysql/data/relay.000002
Testing mysql connection and privileges..sh: mysql: command not found
mysql command failed with rc 127:0!
解决:
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql 三台机器都操作
8、以上检测都通过后,就可以启动MHA服务了。启动命令如下:
[root@manager ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf &
启动完成后,可以使用ps命令查看masterha_manager进程是否存在,如下存在则代表启动成功:
[root@manager ~]# ps aux |grep masterha_manager
最后我们需要到master节点上,手动去配置虚拟IP。因为MHA只会在主从切换时漂移虚拟IP到新的Master节点,而不会在第一次启动时主动去设置Master的虚拟IP,所以我们需要手动设置。设置虚拟IP的命令如下:
[root@master ~]# ifconfig ens33:1 192.168.59.110/24
设置成功后,使用ip addr命令可以看到网卡上绑定的虚拟IP:
不用的话可以手动删除
ip addr del 192.168.59.110/24 dev ens33
9、测试MHA服务
到此为止,我们就已经完成了MHA高可用架构的搭建,接下来我们对其进行一些简单的测试。例如,测试下是否能正常ping通虚拟IP,毕竟应用端访问数据库时连接的是虚拟IP,所以首先得确保虚拟IP是能够被访问的。如下:
能ping通之后,使用Navicat等远程连接工具测试下能否正常通过虚拟IP连接上数据库:
确定了虚拟IP能正常访问后,接着测试MHA是否能够正常进行主从切换,首先将master节点上的MySQL服务给停掉,模拟Master宕机:
[root@master ~]# systemctl stop mysqld
正常情况下,此时master节点上的网卡就不会再绑定该虚拟IP:
而是会被MHA漂移到slave-01节点的网卡上,因为此时该Slave就是新的Master:
接着进入slave-02节点上的MySQL命令行终端,确认下该Slave是否已经正常与新的Master进行同步。之前我们配置slave-02的主库是master,现在将master停掉后,可以看到slave-02的Master_Host已经被MHA切换成了slave-01的IP:经过以上测试后,可以看到我们搭建的MHA架构是能够正常运行的,已经使得Replication集群拥有了基本的高可用能力,即便Master下线后也能正常从Slave中选举新的Master并进行切换,也正确建立了其他Slave与新Master的复制链路。
切换完成后将老的主库做为新的从库加入到集群中:
1、首先登陆主库
先进入主库,进行锁表,防止数据写入
使用命令:
mysql> flush tables with read lock;
然后全量mysqldump
并查看当前master的binlog和点位
记录保存:
File: mysql_bin.000041
Position: 256912077
mysql> stop slave; -- 停止主从同步
mysql> set SQL_LOG_BIN=0; -- source时不记录日志
然后source 进去从主库全量dump的sql备份。
change master to master_host='X', master_port=3306, master_user='replicate', master_password='123456', master_auto_position=0;
change master to master_host='X', master_port=3306, master_user='repl', master_password='123456', master_log_file='mysql_bin.000041',master_log_pos=256912077;
mysql> start slave; -- 启动主从同步
查看从节点状态。
mysql> show slave status \G;
然后进行主库解锁:
1、unlock tables;
1、再次启动manager上的nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf & 启动manager服务及继续监控。