千家信息网

mysql之MHA架构

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,角色Ip地址主机名Server id类型master192.168.1.131master11主(写)Master(candicate)192.168.1.132Master22从(读)Slave19
千家信息网最后更新 2026年11月01日mysql之MHA架构

角色

Ip地址

主机名

Server id

类型

master

192.168.1.131

master1

1

主(写)

Master(candicate)

192.168.1.132

Master2

2

从(读)

Slave

192.168.1.133

Slave1

3

从(读)

Manager

192.168.1.134

Manager


管理节点

准备基础环境:

1.在配置好 IP 地址后检查 selinux,iptables 设置,关闭 selinux ,iptables 服务以便后期主从同步不出错,时间要同步

2. 在四台机器上配置epelyum和用到perl包

[root@master1 ~]# yum -y install epel-rpm-macros.noarch

[root@master1 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles ncftp perl-Params-Validate perl-CPAN perl-Test-Mock-LWP.noarch perl-LWP-Authen-Negotiate.noarch perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

3. 配置hosts环境

[root@master1 ~]# vim /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.131 master1

192.168.1.132 master2

192.168.1.133 slave1

192.168.1.134 manager

[root@master1 ~]# for i in master2 slave1 manager; do scp /etc/hosts $i:/etc/ ;done

4. 建立ssh交互登录环境,四台都要做

[root@master1 ~]# ssh-keygen -t rsa

[root@master1 ~]# for i in master1 master2 slave1 manager ;do ssh-copy-id -i ~/.ssh/id_rsa.pub $i;done

配置mysql的半同步复制

为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置 MHA 的同时建议配置成MySQL 的半同步复制。

注:mysql 半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是 master

用的 semisync_master.so,一个是 slave 用的 semisync_slave.so,下面我们就来具体配置一下。如果不清楚 Plugin 的目录,用如下查找:

mysql> show variables like '%plugin_dir%';

+---------------+------------------------------+

| Variable_name | Value |

+---------------+------------------------------+

| plugin_dir | /usr/local/mysql/lib/plugin/ |

+---------------+------------------------------+

1 row in set (0.01 sec)

1、 分别在主从节点上安装相关的插件(master, Candicate master,slave)

在 MySQL 上安装插件需要数据库支持动态载入。检查是否支持,用如下检测

mysql> show variables like '%have_dynamic_loading%';

+----------------------+-------+

| Variable_name | Value |

+----------------------+-------+

| have_dynamic_loading | YES |

+----------------------+-------+

所有 mysql 数据库服务器,安装半同步插件(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> show plugins;

| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |

| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |

| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |

| ngram | ACTIVE | FTPARSER | NULL | GPL |

| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |

| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |

+----------------------------+----------+--------------------+--------------------+---------+

或

mysql> select * from information_schema.plugins;

查看半同步相关信息

mysql> show variables like '%rpl_semi_sync%';

+-------------------------------------------+------------+

| Variable_name | Value |

+-------------------------------------------+------------+

| rpl_semi_sync_master_enabled | OFF |

| rpl_semi_sync_master_timeout | 10000 |

| 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 | OFF |

| rpl_semi_sync_slave_trace_level | 32 |

+-------------------------------------------+------------+

2. 修改mysql配置文件,设置主从同步

[root@master1 ~]# vim /etc/my.cnf

server-id = 1

log-bin=mysql-bin

binlog_format=mixed

log-bin-index=mysql-bin.index

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000

rpl_semi_sync_slave_enabled=1

relay_log_purge=0

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

rpl_semi_sync_master_enabled=1 1 表是启用,0 表示关闭

rpl_semi_sync_master_timeout=10000:毫秒单位 ,该参数主服务器等待确认消息 10 秒后,

不再等待,变为异步方式。

[root@master2 ~]# vim /etc/my.cnf

server-id = 2

log-bin=mysql-bin

binlog_format=mixed

log-bin-index=mysql-bin.index

relay_log_purge=0

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=10000

rpl_semi_sync_slave_enabled=1

注:relay_log_purge=0,禁止 SQL 线程在执行完一个 relay log 后自动将其删除,对于 MHA

场景下,对于某些滞后从库的恢复依赖于其他从库的 relay log,因此采取禁用自动删除功能

[root@slave1 ~]# vim /etc/my.cnf

Server-id = 3

log-bin = mysql-bin

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

read_only = 1

rpl_semi_sync_slave_enabled=1

在master上查看半同步相关信息

mysql> show variables like '%rpl_semi_sync%';

查看半同步状态:

mysql> show status like '%rpl_semi_sync%';

rpl_semi_sync_master_status :显示主服务是异步复制模式还是半同步复制模式

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 :事务进入等待队列后,到网络平均等待时间

主从同步

Master1主机

mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';

mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';

mysql> show master status;

第一条 grant 命令是创建一个用于主从复制的帐号,在 master 和 candicate master 的主机上创建即可。

第二条 grant 命令是创建 MHA 管理账号,所有 mysql 服务器上都需要执行。MHA 会在配置文件里要求能远程登录到数据库,所以要进行必要的赋权。

Master2主机

mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';

mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';

mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;

mysql> start slave;

mysql> show slave slave;

Slave1主机

mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';

mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;

mysql> start slave;

mysql> show slave status\G;

查看 master1 服务器的半同步状态

mysql> show status like '%rpl_semi_sync%';

配置mysql-mha

在所有数据库节点上安装 mha4mysql-node-0.56.tar.gz

[root@master1 ~]# tar zxf mha4mysql-node-0.56.tar.gz

[root@master1 ~]# cd mha4mysql-node-0.56/

[root@master1 mha4mysql-node-0.56]# perl Makefile.PL

[root@master1 mha4mysql-node-0.56]# make &&make install

其他两个数据节点也安装 mha4mysql-node-0.56.tar.gz(过程略)

在管理节点需要两个都安装:mha4mysql-node-0.56.tar.gz 和 mha4mysql-manager-0.56.tar.gz

[root@manager ~]# tar zxf mha4mysql-node-0.56.tar.gz

[root@manager ~]# cd mha4mysql-node-0.56/

[root@manager mha4mysql-node-0.56]# perl Makefile.PL

[root@manager mha4mysql-node-0.56]# make && make install

[root@manager mha4mysql-node-0.56]# cd

[root@manager ~]# tar zxf mha4mysql-manager-0.56.tar.gz

[root@manager ~]# cd mha4mysql-manager-0.56/

[root@manager mha4mysql-manager-0.56]# perl Makefile.PL

[root@manager mha4mysql-manager-0.56]# make &&make install

[root@manager mha4mysql-manager-0.56]# mkdir /etc/masterha

[root@manager mha4mysql-manager-0.56]# mkdir -p /masterha/app1

[root@manager mha4mysql-manager-0.56]# mkdir /scripts

[root@manager mha4mysql-manager-0.56]# cp samples/conf/* /etc/masterha/

[root@manager mha4mysql-manager-0.56]# cp samples/scripts/* /scripts/

[root@manager mha4mysql-manager-0.56]# vim /etc/masterha/app1.cnf

[server default]

manager_workdir=/masterha/app1

manager_log=/masterha/app1/manager.log

user=manager

password=123

ssh_user=root

repl_user=rep

repl_password=123

ping_interval=1

[server1]

hostname=192.168.1.131

port=3306

master_binlog_dir=/usr/local/mysql/data

candidate_master=1

[server2]

hostname=192.168.1.132

port=3306

master_binlog_dir=/usr/local/mysql/data

candidate_master=1

[server3]

hostname=192.168.1.133

port=3306

master_binlog_dir=/usr/local/mysql/data

no_master=1

保存退出

[root@manager mha4mysql-manager-0.56]# > /etc/masterha/masterha_default.cnf

manager_workdir=/masterha/app1 //设置 manager 的工作目录

manager_log=/masterha/app1/manager.log //设置 manager 的日志

user=manager //设置监控用户 manager

password=123456 //监控用户 manager 的密码

ssh_user=root //ssh 连接用户

repl_user=mharep //主从复制用户

repl_password=123.abc //主从复制用户密码

ping_interval=1 //设置监控主库,发送 ping 包的时间间隔,默认是 3 秒,尝试三次没有回

应的时候自动进行 railover

master_binlog_dir=/usr/local/mysql/data //设置 master 保存 binlog 的位置,以便 MHA 可

以找到 master 的日志,我这里的也就是 mysql 的数据目录

candidate_master=1 //设置为候选 master,如果设置该参数以后,发生主从切换以后将会

将此从库提升为主库。

ssh有效性验证:

[root@manager mha4mysql-manager-0.56]# masterha_check_ssh --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf

正确显示结果没有报错

集群复制的有效性验证(mysql必须都启动):

[root@manager mha4mysql-manager-0.56]# masterha_check_repl --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf

命令执行完最后报错的地方

解决办法在所有服务器上执行:

[root@manager mha4mysql-manager-0.56]# ln -s /usr/local/mysql/bin/* /usr/local/bin/

启动manger

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /tmp/mha_mager.log &

[1] 1319

状态检查

[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

app1 (pid:1319) is running(0:PING_OK), master:192.168.1.131

故障转移验证:

1. 停掉master1

[root@master1 mha4mysql-node-0.56]# service mysqld stop

2. 查看MHA日志

[root@manager ~]# tail -f /masterha/app1/manager.log

3. 登录slave1的mysql查看slave状态

mysql> show slave status\G;

MHA Manager 端日常主要操作步骤

1)检查是否有下列文件,有则删除。

发生主从切换后,MHAmanager 服务会自动停掉,且在 manager_workdir(/masterha/app1)

目录下面生成文件 app1.failover.complete,若要启动 MHA,必须先确保无此文件)

[root@manager ~]# ll /masterha/app1/

total 24

-rw-r--r-- 1 root root 0 Aug 8 02:02 app1.failover.complete

-rw-r--r-- 1 root root 20955 Aug 8 02:02 manager.log

[root@manager ~]# rm -rf /masterha/app1/app1.failover.complete

2)检查 MHA 复制检查:(需要把 master1 设置成 candicatade 的从服务器)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='123';

mysql> start slave;

3)停止 MHA: masterha_stop --conf=/etc/masterha/app1.cnf

4)启动 MHA:

#nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &

当有 slave 节点宕掉时,默认是启动不了的,加上 --ignore_fail_on_start 即使有节点宕掉也

能启动 MHA,如下:

#nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_fail_on_start

&>/tmp/mha_manager.log &

5) 检查状态:

# masterha_check_status --conf=/etc/masterha /app1.cnf

6) 检查日志:

#tail -f /masterha/app1/manager.log

7)主从切换后续工作

重构:

重构就是你的主挂了,切换到 Candicate master 上,Candicate master 变成了主,因此重构的一种方案原主库修复成一个新的 slave主库切换后,把原主库修复成新从库,然后重新执行以上 5 步。原主库数据文件完整的情况下,可通过以下方式找出最后执行的 CHANGE MASTER 命令:

[root@manager ~]# grep "CHANGE MASTER TO MASTER" /masterha/app1/manager.log | tail -1

Wed Aug 8 02:02:40 2018 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='xxx';

定期删除中继日志

在配置主从复制中,slave 上设置了参数 relay_log_purge=0,所以 slave 节点需要定期删除中继日志,建议每个 slave 节点删除中继日志的时间错开。

corntab -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


同步 服务 配置 主从 服务器 检查 数据 节点 日志 文件 主机 时间 状态 用户 切换 命令 插件 数据库 目录 原主 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网与科技 哈尔滨大商圈互联网科技有限公司 互联网科技公司经营范围 鸠鸠互联网科技 腾讯阿里互联网科技 嘟嘟瓜互联网科技 百单互联网科技有限公司 互联网科技logo设计 镁科技互联网资讯平台 甘肃拓世互联网科技有限公司 互联网科技公司招聘 中国互联网有什么科技含量 银川新华互联网科技职业技术培训学校图片 昊天互联网科技有限公司 洛阳共同富裕互联网科技有限公司 济南有互联网科技公司吗 互联网科技包装股份有限公司上市 广东鹅鹅鹅互联网科技有限公司 好易买互联网科技 东风日产互联网科技公司叫什么 互联网高科技 金融科技创新监管互联网金融 网络科技有限互联网 万易互联网科技 南京欣网互联网科技 苏州五指互联网络科技有限 中天科技中国工业互联网 卡尔迅互联网科技有限公司 互联网界的黑科技 兰石爱特工业互联网科技分公司
0