全网最详细的在centos7搭建MYSQL57半同步并行复制高可用MHA

1、 MHA主要的特征

MHA(Master High Availability)是一套比较成熟的 MySQL 高可用方案,也是一款优秀的故障切换和
主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在30秒之内自动完成数据库的故障切
换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的
高可用。MHA还支持在线快速将Master切换到其他主机,通常只需0.5-2秒。

  • 自动故障转移快
  • 主库崩溃不存在数据一致性问题
  • 性能优秀,支持半同步复制和异步复制
  • 一个Manager监控节点可以监控多个集群

2、环境准备

OSIP地址主机名&角色类型
Centos7192.168.255.128node08主master(写操作)
Centos7192.168.255.129node09主备库slave
Centos7192.168.255.130node10从库slave
Centos7192.168.255.131node11manager

在上述环境中,master对外提供写服务,slave提供读操作,一旦master宕机,将会把其中一台slave(我这里将指定的是备主)提升为新的master,slave同时也指向新的master,manager作为管理服务器。
实现了一主二从一管理
1、 配置hosts文件,主机之间可互相解析

操作一个节点就可以了
#编写host文件
[root@master ~]# cat >> /etc/hosts << EOF
> 192.168.20.2    master
> 192.168.20.3    slave1
> 192.168.20.4    slave2
> 192.168.20.5    manager
> EOF
> #将编写好的hosts文件分发到其他节点
[root@master ~]# for i in master slave1 slave2 manager;do scp /etc/hosts $i:/etc/;done

2、配置ssh免密登录
下面只是对一台进行免登录举例,将以下命令在所有节点上执行一次,即可完成主机间的免密登录。

# 创建密钥对
[root@master ~]# ssh-keygen -t rsa
#将公钥分发到其他节点
[root@master ~]#ssh-copy-id node09
#验证是否免密登录成功 ,如果返回主机名则成功
[root@master ~]# ssh node09 hostname

3、centos7安装mysql5.7

本文用yum方式安装mysql 对于node08,node09,node10节点都需要如下操作:
(1)删除centos7中默认安装的maridb数据库

#检查是否存在
[root@node08 ~]# rpm -qa|grep mariadb
mariadb-libs-5.5.65-1.el7.x86_64
#删除maridb
[root@node08 ~]#yum remove mariadb mariadb-libs-5.5.65-1.el7.x86_64

(2)yum下载网址为:https://dev.mysql.com/downloads/repo/yum/
找到Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package,单击后面的Download,
在新的页面中单击最下面的No thanks, just start my download.就可以下载到yum源了。

(3)安装MySQL YUM资源库
[root@node08 ~]# yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
(4) 安装MySQL 5.7

[root@node08 ~]# yum install -y mysql-community-server

(5)密码问题
由于MySQL从5.7开始不允许首次安装后使用空密码进行登录!为了加强安全性,系统会随机生成一个密码以供管理员首次登录使用,
这个密码记录在/var/log/mysqld.log文件中,使用下面的命令可以查看此密码:

[root@node08 ~]# cat /var/log/mysqld.log|grep 'A temporary password'
2021-01-15T02:57:58.238562Z 1 [Note] A temporary password is generated for root@localhost: .Jg#8-rqsobo
#使用.Jg#8-rqsobo密码登录
[root@node08 ~]# mysql -uroot -p.Jg#8-rqsobo
#设置密码(这里注意可能提示密码设置简单,自行百度解决)
mysql> set password=password("admin123");

注意 :第三步骤,需要在node08,node09,node10节点都进行安装

4、搭建半同步并行mysql主从复制

以下步骤需要在node08,node09,node10节点都依次进行
(1)安装semi插件

#查找插件所在目录(每台DB服务器可能不一样)
mysql> show variables like '%plugin_dir%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
 #检查是否支持动态检测
 
mysql> show variables like '%have_dynamic%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
#确定插件的目录下有以下两个文件(默认安装数据库后就有这些的)
[root@node08 ~]# ls /usr/local/mysql/lib/plugin/ | egrep 'master|slave'

(2) 安装和检查插件

# semisync_master.so和semisync_slave.so为上面查询到的插件名字
mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
#检查Plugin是否已正确安装:
mysql> select plugin_name  from information_schema.plugins where information_schema.plugins.plugin_name like "%semi%" ;
+----------------------+
| plugin_name          |
+----------------------+
| rpl_semi_sync_master |
| rpl_semi_sync_slave  |
+----------------------+

(3)配置文件

  • node08节点配置文件
[root@node08 ~]# vim /etc/my.cnf  
[mysqld]
#二进制文件打开并且设置为mysqlbin
log_bin=mysql-bin
#服务id
server-id=1
##同步binlog
#sync-binlog=1 
#同步模式 mixed:混合了statement和row模式
binlog_format=row
#忽略同步库
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
#开启并命名中继日记
relay_log=mysql-relay-bin
#开启master同步复制
rpl_semi_sync_master_enabled=1
#同步复制超时时间,毫秒单位 ,该参数主服务器等待确认消息10秒后,不再等待,变为异步方式。
rpl_semi_sync_master_timeout=1000
#开启slave并行复制
rpl_semi_sync_slave_enabled=1
#组并行复制最大事务数
binlog_group_commit_sync_no_delay_count=100
#组提交的延时时间
binlog_group_commit_sync_delay =1000

#relay-log损坏,新从master上获取日志
relay_log_recovery=1
# 设置以组的方式并行
slave_parallel_type =LOGICAL_CLOCK
#设置并行组线程
slave_parallel_workers=8
#并行复制开启后对于元master.info性能
master_info_repository=TABLE
#开启并行复制线程数
slave-parallel-workers=16
#开启最大线程缓存
slave_pending_jobs_size_max = 2147483648
#开启并行复制有序性
slave_preserve_commit_order=1
relay_log_info_repository=TABLE
#开启relay
relay_log_recovery=ON
#设置为ON
log_slave_updates=ON
#禁止SQL 线程在执行完一个 relay log 后自动将其>删除
relay_log_purge=0

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

  • node09 配置文件
[root@node08 ~]# vim /etc/my.cnf  


[mysqld]
#开启并命名二进制文件
log_bin=mysql-bin
#二进制文件复制模式mixed:混合了statement和row复制模式
binlog_format=row
#编号id
server-id=2
relay_log=mysql-relay-bin
# sync-binlog=1
#忽略同步库
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
#relay-log 日志名
relay-log=mysql-relay-bin
#开启master同步复制
rpl_semi_sync_master_enabled=1
##同步复制超时时间,毫秒单位 ,>该参数主服务器等待确认消息10秒
#后,不再等待,变为异步方式。
rpl_semi_sync_master_timeout=1000
#开启slave并行复制
rpl_semi_sync_slave_enabled=1
#组并行复制最大事务数
binlog_group_commit_sync_no_delay_count=100
##组提交的延时时间
binlog_group_commit_sync_delay =1000
#relay-log损坏,新从master上获取日志
relay_log_recovery=1
# 设置以组的方式并行
slave_parallel_type =LOGICAL_CLOCK
#设置并行组线程
slave_parallel_workers=8
#并行复制开启后对于元master.info性能
master_info_repository=TABLE
#开启并行复制线程数
slave-parallel-workers=16
#开启最大线程缓存
slave_pending_jobs_size_max = 2147483648
#开启并行复制有序性
slave_preserve_commit_order=1
relay_log_info_repository=TABLE
#开启relay
relay_log_recovery=ON
#设置为ON
log_slave_updates=ON
#禁止SQL 线程在执行完一个 relay log 后自动将其>删除
relay_log_purge=0

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

  • node10 配置文件
[root@node08 ~]# vim /etc/my.cnf  

[mysqld]
[mysqld]
log_bin=mysql-bin
#编号id
server-id=3 #id
relay_log=mysql-relay-bin
#开启只读模式
read_only=1
##复制格式
binlog-format=ROW
#
log_slave_updates=ON
#忽略同步库
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
#relay-log 日志名
relay-log=mysql-relay-bin
#开启master同步复制
rpl_semi_sync_master_enabled=1
#同步复制超时时间,毫秒单位 ,>该参数主服务器等待确认消息10秒
#后,不再等待,变为异步方式。
rpl_semi_sync_master_timeout=1000
##开启slave并行复制
rpl_semi_sync_slave_enabled=1
##组并行复制最大事务数
binlog_group_commit_sync_no_delay_count=100
##组提交的延时时间
binlog_group_commit_sync_delay =1000
#relay-log损坏,新从master上获取日志
relay_log_recovery=1
# 设置以组的方式并行
slave_parallel_type =LOGICAL_CLOCK
#设置并行组线程
slave_parallel_workers=8
#并行复制开启后对于元master.info性能
master_info_repository=TABLE
#开启并行复制线程数
slave-parallel-workers=16
#开启最大线程缓存
slave_pending_jobs_size_max = 2147483648
#开启并行复制有序性
slave_preserve_commit_order=1
#
relay_log_info_repository=TABLE
#开启relay
relay_log_recovery=ON
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

在配置主从复制中,由于主和备主这两台主机上设置了参数relay_log_purge=0(表示不自动清除中继日志),所以slave节点需要定期删除中继日志,建议每个slave节点删除中继日志的时间错开。

crontab -e
0 5 * * * /usr/local/bin/purge_relay_logs - -user=root --password=pwd123 --port=3306 --disable_relay_log_purge >> /var/log/purge_relay.log 2>&1

#更改配置文件后,需要执行以下命令进行重启MySQL。
[root@node08 ~]# systemctl restart mysqld

(5)创建相关用户

  • master节点(node08)
# 创建用于同步的用户
mysql> grant replication slave on *.* to replication@'192.168.255.%' identified by 'admin123';
Query OK, 0 rows affected, 1 warning (1.00 sec)
# 创建用户的manager监控的用户
mysql> grant all on *.* to manager@'192.168.255.%' identified by 'admin123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
  • node09节点(主备从机节点)
# 创建用于同步的用户
mysql> grant replication slave on *.* to replication@'192.168.255.%' identified by 'admin123';
Query OK, 0 rows affected, 1 warning (1.00 sec)
# 创建用户的manager监控的用户
mysql> grant all on *.* to manager@'192.168.255.%' identified by 'admin123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
  • node10节点(从节点)
    由于slave2无需做备主,所以不用创建用于同步数据的账户
#创建manager监控账号
mysql> grant all on *.* to manager@'192.168.255.%' identified by 'admin123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

(6)配置主从
在slave节点(node09,node10)进行如下操作

#指定master主机的相关信息
mysql> change master to
    -> master_host='192.168.255.128',
    -> master_port=3306,
    -> master_user='replication',
    -> master_password='admin123',
    -> master_log_file = 'mysql-bin.000001',     #这是在master主机上查看到的二进制日志名(show master status \G;)
    -> master_log_pos=744;     #同上,这是查看到的二进制日志的position
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;      #启动slave
Query OK, 0 rows affected (0.00 sec)

(7)查看半同步状态,确认已开启:

  • master节点(node08)
 #master节点查看半同步是否开启
 mysql>  show variables like '%rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
mysql> show status like '%rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
#关于上个命令查看到的信息,有几个状态值得关注,将在下面写下来。
rpl_semi_sync_master_status :显示主服务是异步复制模式还是半同步复制模式,ON为半同步;
rpl_semi_sync_master_clients :显示有多少个从服务器配置为半同步复制模式;
rpl_semi_sync_master_yes_tx :显示从服务器确认成功提交的数量
rpl_semi_sync_master_no_tx :显示从服务器确认不成功提交的数量
rpl_semi_sync_master_tx_avg_wait_time :事务因开启 semi_sync ,平均需要额外等待的时间
rpl_semi_sync_master_net_avg_wait_time :事务进入等待队列后,到网络平均等待时间
  • slave节点状态查看(node09,node10)
mysql>show slave status;
#以下两个指标正常的话,表示配置成功
#Slave-IO_Running:yes
#Slave_SQL_Running:yes

5、安装MHA-node

注:需要MHA-node需要在所有节点安装,manager主机节点(node08,node09,node10,node11)

#下载epel
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#安装epel
rpm -ivh epel-release-latest-7.noarch.rpm
#安装MHA的依赖组件
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
#下载MHA的node包
wget --no-check-certificate https://qiniu.wsfnk.com/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#安装MHA的node包
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

6、安装MHA-manager

仅仅在manager节点(node11)上操作

#下载manager包
wget --no-check-certificate https://qiniu.wsfnk.com/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
#安装
[root@node11 src]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
准备中...                          ################################# [100%]
	软件包 mha4mysql-manager-0.58-0.el7.centos.noarch 已经安装

7、创建MHA配置文件

  • 创建全局配置文件
[root@node11 ~]# > /etc/masterha/masterha_default.cnf
  • 创建子配置文件
[root@node11 ~]# vim /root/data/masterha_custom.cnf

[server default]
#指定工作目录
manager_workdir=/masterha/app1
#指定日志文件
manager_log=/masterha/app1/manager.log
#指定manager管理数据库节点所使用的用户名
user=manager
#对应的是上面用户的密码
password=admin123
#指定配置了ssh免密登录的系统用户
ssh_user=root 
#指定用于同步数据的用户名
repl_user=replication
#对应的是上面同步用户的 密码
repl_password=admin123
#设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应时自动进行切换
ping_interval=1  
[server1]
hostname=node08
port=3306
#指定master保存二进制日志的路径,以便MHA可以找到master的日志
master_binlog_dir=/var/lib/mysql/
#设置为候选master,设置该参数后,发生主从切换以后将会将此库提升为主库
candidate_master=1  
[server2]
hostname=node09
port=3306
master_binlog_dir=/var/lib/mysql/
#设置为候选master
candidate_master=1 
[server3]
hostname=node10
port=3306
master_binlog_dir=/var/lib/mysql/
#设置的不为备选主库
no_master=1

8、MHA常见操作

(1) 检查ssh配置:

masterha_check_ssh --conf=/root/data/masterha_custom.cnf

在这里插入图片描述

(2)检查主从复制情况:

masterha_check_repl  --conf=/root/data/masterha_custom.cnf

在这里插入图片描述

(3)在MHA的manager节点上启动MHA管理进程

nohup masterha_manager --conf=/root/data/masterha_custom.cnf --ignore_last_failover /opt/soft/mha/app1/manager.log 2>&1 &

命令参数:
--remove_dead_master_conf       该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
--manger_log                    日志存放位置
--ignore_last_failover          在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面设置的manager_workdir目录中产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。

在这里插入图片描述

(4)查看MHA状态

masterha_check_status --conf=/root/data/masterha_custom.cnf

(5)停止MHA管理进程

masterha_stop  --conf=/root/data/masterha_custom.cnf

(6)手动进行主备切换(在进行手动切换前要先停值manager进程)

masterha_master_switch --conf=/opt/soft/mha/app1/app1.cnf --master_state=alive --new_master_host=s143 --orig_master_is_new_slave --running_updates_limit=10000 --interactive=0

命令参数:
--master_state=dead
强制参数. 可选有: "dead" or "alive". 如果设置为 alive,将执行在线切主操作。
--dead_master_host=(hostname)
强制参数,--dead_master_ip 和 --dead_master_port 可选。
--interactive=(0|1)
1为交互模式(默认),会输入几个yes;0为非交互。
--ssh_reachable=(0|1|2)
否通过SSH可达。0表示不可达;2表示未知(默认)。
--skip_change_master
跳过CHANGE MASTER TO 操作
--skip_disable_read_only
跳过在新主上 SET GLOBAL read_only=0的操作。以便稍后手动操作。
--last_failover_minute=(minutes)
最近故障转移时间间隔(默认480),如果之前的故障转移是最近完成的(默认情况下是8小时),MHA Manager不会执行故障转移,因为问题很可能无法通过执行故障转移来解决。此参数的目的是避免乒乓故障转移问题。您可以通过更改此参数来更改时间标准
--ignore_last_failover
如果前面的故障转移失败,MHA不会启动故障转移,因为问题可能会再次发生。启动故障转移的正常步骤是手动删除在(manager_workdir)/(app_name).failover下创建的故障转移错误文件。如果设置该参数,将忽略这个错误文件,直接进行故障转移。
--remove_dead_master_conf
设置此选项后,如果故障转移成功完成,MHA Manager将自动从配置文件中删除失效主服务器的部分。
--wait_until_gtid_in_sync(0|1)
适用于GTID模式,设置为1表示MHA将等待所有slave追上新master的GTID,默认;0表示不等。
--orig_master_is_new_slave
如果原主库alive,设置该参数,将会使原master作为新主库的slave

(7)模拟故障转移

  • manager(node11)开启MHA
[root@node11 ~]# nohup masterha_manager --conf=/root/data/masterha_custom.cnf  &>/tmp/mha_manager.log &
[1] 1289
  • 查看node08节点宕机之前的,node09,和node10的slave状态
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.255.128
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000008
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-relay-bin.000012
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

  • 模拟master节点(node08)宕机
[root@node08 ~]#service mysql stop
  • 查看宕机,node10的slave状态
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.255.129
                  Master_User: replication
                  Master_Port: 3306

从中Master_Host从192.168.255.128,自动转为192.168.255.129

(8)故障转移后,用命令恢复原来的master

  • 安(7)中的案例继续操作,在在旧master上执行如下操作
#模拟宕机之后恢复的旧master
[root@node08 ~]#service mysql start //数据库启动
[root@node08 ~]#mysql -uroot -padmin
mysql> reset master;
#加入到node09中
mysql> change master to master_host='192.168.255.129', master_port=3306, master_user='replication', master_password='admin123', master_log_file='mysql-bin.00008', master_log_pos=154;
# #暂时先把旧master变为slave
mysql> start slave;  
  • 然后在manager(node11)节点上:
[root@node11 ~]# masterha_master_switch --master_state=alive --conf=/root/data/masterha_custom.cnf 
#然后后面提示一直按yes

在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值