MHA搭建教程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: MHA搭建教程

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软件包,安装包到如下地址进行下载:

https://github.com/yoshinorim/mha4mysql-manager/releases

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服务及继续监控。

相关文章
|
6月前
|
SQL 负载均衡 关系型数据库
mysql主从复制,从搭建到使用
mysql主从复制,从搭建到使用
76 1
|
4月前
|
存储 关系型数据库 MySQL
实战!MySQL主从复制一键搭建脚本分享
实战!MySQL主从复制一键搭建脚本分享
98 2
|
监控 关系型数据库 MySQL
MySQL高可用搭建方案之(MHA)(下)
MySQL高可用搭建方案之(MHA)(下)
|
监控 前端开发 关系型数据库
MySQL高可用搭建方案之(MHA)(上)
MySQL高可用搭建方案之(MHA)
|
SQL 关系型数据库 MySQL
MySql主从复制原理及其搭建
MySql主从复制原理及其搭建
|
存储 关系型数据库 MySQL
Mysql主从复制搭建
Mysql主从复制搭建
73 0
|
SQL 安全 关系型数据库
Mysql主从复制的搭建及原理
Mysql主从复制的搭建及原理
Mysql主从复制的搭建及原理
|
关系型数据库 MySQL
MySQL主从复制搭建
MySQL主从复制搭建
169 0
|
NoSQL Redis 数据安全/隐私保护
实战系列 docker redis集群主从复制多实例从零开始搭建
实战系列 docker redis集群主从复制多实例从零开始搭建
|
关系型数据库 MySQL 数据库
手把手教你MySQL主从复制,配置不成功你找我!(二)
之前很多小伙伴想知道MySQL主从复制的配置步骤,今天它来了。带着你可能碰到的各种异常来了。