MySQL高可用——MMM

MMM 即 Multi-Master Replication Manager for MySQL:mysql 多主复制管理器,基于 perl 实现,关于 mysql 主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),MMM 也能对从服务器进行读负载均衡,所以可以用它来在一组用于复制的服务器启动虚拟 ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。MySQL 本身没有提供 replication failover 的解决方案,通过 MMM 方案能实现服务器的故障转移,从而实现 mysql 的高可用。MMM 不仅能提供浮动 IP 的功能,如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置。这个方案是目前比较成熟的解决方案。

MMM主要功能由下面三个脚本提供:

mmm_mond 负责所有的监控工作的监控守护进程,决定节点的移除(mmm_mond 进程定时心跳检测,失败则将 write ip 浮动到另外一台 master)等等

mmm_agentd 运行在 mysql 服务器上的代理守护进程,通过简单远程服务集提供给监控节点

mmm_control 通过命令行管理 mmm_mond 进程

在整个监管过程中,需要在 mysql 中添加相关授权用户,授权的用户包括一个 mmm_monitor用户和一个 mmm_agent 用户,如果想使用 mmm 的备份工具则还要添加一个 mmm_tools用户。

一、MMM的部署实施

1、基本环境

OS:centos7.2(64 位) 数据库系统:mysql5.7.13

关闭 selinux

配置 ntp,同步时间

2、在所有主机上配置/etc/hosts 文件,添加如下内容:

在 所 有 主 机 上 安 装 perl perl-devel perl-CPAN libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64 包

#yum -y install perl-* libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64

注:使用 centos7 在线 yum 源安装

安装 perl 的相关库

#cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl Mail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP

3、在 master1、master2、slave1、slave2 主机上安装 mysql5.7 和配置复制

master1 和 master2 互为主从,slave1、slave2 为 master1 的从

(1)在每个 mysql 的配置文件/etc/my.cnf 中加入以下内容, 注意 server-id 不能重复。

master1 主机:

master2 主机:

slave1 主机:

slave2 主机:

注:在完成了对 my.cnf 的修改后,通过 systemctl restart mysqld 重新启动 mysql 服务。4 台数据库主机若要开启防火墙,要么关闭防火墙或者创建访问规则。

(2)主从配置(master1 和 master2 配置成主主,slave1 和 slave2 配置成 master1 的从):

在 master1 上授权:

在 master2 上授权:

(3)把 master2、slave1 和 slave2 配置成 master1 的从库:

在 master1 上执行 show master status; 获取 binlog 文件和 Position 点

在 master2、slave1 和 slave2 执行:

验证主从复制:

master2 主机:

slave1 主机:

slave2 主机:

如果 Slave_IO_Running 和 Slave_SQL_Running 都为 yes,那么主从就已经配置 OK 了

(4)把 master1 配置成 master2 的从库:

在 master2 上执行 show master status ;获取 binlog 文件和 Position 点

在 master1 上执行:

验证主从复制:

master1 主机:

如果 Slave_IO_Running 和 Slave_SQL_Running 都为 yes,那么主从就已经配置 OK 了

4、mysql-mmm 配置:

在 4 台 mysql 节点上创建用户:

注 :因为之前的主从复制,以及主从已经是 ok 的,所以我在 master1 服务器执行就 ok 了。

检查 master2 和 slave1、slave2 三台 db 上是否都存在监控和代理账号

注 :

mmm_monitor 用户:mmm 监控用于对 mysql 服务器进程健康检查

mmm_agent 用户:mmm 代理用来更改只读模式,复制的主服务器等

5、mysql-mmm 安装

在 monitor 主机(192.168.31.106) 上安装监控程序

在数据库服务器(master1、master2、slave1、slave2)上安装代理

6、配置 mmm

编写配置文件,五台主机必须一致:

完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件 mmm_common.conf,

active_master_rolewriter#积极的 master 角色的标示,所有的 db 服务器要开启 read_only 参数,对于 writer 服务器监控代理会自动将 read_only 属性关闭。

同时将这个文件拷贝到其它的服务器,配置不变

#for host in master1 master2 slave1 slave2 ; do scp /etc/mysql-mmm/mmm_common.conf $host:/etc/mysql-mmm/ ; done

代理文件配置

编辑 4 台 mysql 节点机上的/etc/mysql-mmm/mmm_agent.conf

注:这个配置只配置 db 服务器,监控服务器不需要配置,this 后面的 host 名改成当前服务器的主机名。

启动代理进程

在 /etc/init.d/mysql-mmm-agent 的脚本文件的#!/bin/sh 下面,加入如下内容

source /root/.bash_profile

添加成系统服务并设置为自启动

注:添加 source /root/.bash_profile 目的是为了 mysql-mmm-agent 服务能启机自启。自动启动和手动启动的唯一区别,就是激活一个 console 。那么说明在作为服务启动的时候,可能是由于缺少环境变量

服务启动失败,报错信息如下

解决方法:

配置防火墙

编辑 monitor 主机上的/etc/mysql-mmm/mmm_mon.conf

debug 0#debug 0 正常模式,1 为 debug 模式

启动监控进程:

在 /etc/init.d/mysql-mmm-agent 的脚本文件的#!/bin/sh 下面,加入如下内容

source /root/.bash_profile

添加成系统服务并设置为自启动

启动报错:

解决方法:安装下列 perl 的库

注 :无论是在 db 端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。MMM 启动顺序:先启动 monitor,再启动 agent

检查集群状态:

如果服务器状态不是 ONLINE,可以用如下命令将服务器上线,例如:

#mmm_controlset_online 主机名

例如:[root@monitor1 ~]#mmm_controlset_onlinemaster1

从上面的显示可以看到,写请求的 VIP 在 master1 上,所有从节点也都把 master1 当做主节点。

查看是否启用 vip

在 master2,slave1,slave2 主机上查看主 mysql 的指向

二、MMM 高可用性测试:

服务器读写采有 VIP 地址进行读写,出现故障时 VIP 会漂移到其它节点,由其它节点提供服务。

首先查看整个集群的状态,

模拟 master1 宕机,手动停止 mysql 服务,观察 monitor 日志,master1 的日志如下:

查看群集的最新状态

从显示结果可以看出 master1 的状态有 ONLINE 转换为 HARD_OFFLINE,写 VIP 转移到了master2 主机上。

检查所有的 db 服务器群集状态

从上面可以看到 master1 能 ping 通,说明只是服务死掉了。

查看 master2 主机的 ip 地址:

启动 master1 主机的 mysql 服务,观察 monitor 日志,master1 的日志如下:

从上面可以看到 master1 的状态由 hard_offline 改变为 awaiting_recovery 状态

用如下命令将服务器上线:

可以看到主库启动不会接管主,只到现有的主再次宕机。

总结:

优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。当主服务器挂掉以后,另一个主立即接管,其他的从服务器能自动切换,不用人工干预。

缺点:monitor 节点是单点,不过这个你也可以结合 keepalived 或者 haertbeat 做成高可用;至少三个节点,对主机的数量有要求,需要实现读写分离,还需要在前端编写读写分离程序。在读写非常繁忙的业务系统下表现不是很稳定,可能会出现复制延时、切换失效等问题。MMM 方案并不太适应于对数据安全性要求很高,并且读、写繁忙的环境中。

适用场景:

MMM 的适用场景为数据库访问量大,并且能实现读写分离的场景

(1)master2 备选主节点宕机不影响集群的状态,就是移除了 master2 备选节点的读状态。

(2)master1 主节点宕机,由 master2 备选主节点接管写角色,slave1,slave2 指向新 master2主库进行复制,slave1,slave2 会自动 change master 到 master2.

(3)如果 master1 主库宕机,master2 复制应用又落后于 master1 时就变成了主可写状态,这时的数据主无法保证一致性。

如果 master2,slave1,slave2 延迟于 master1 主,这个时 master1 宕机,slave1,slave2 将会

等待数据追上 db1 后,再重新指向新的主 node2 进行复制操作,这时的数据也无法保证同步的一致性。

(4)如果采用 MMM 高可用架构,主,主备选节点机器配置一样,而且开启半同步进一步提高安全性或采用 MariaDB/mysql5.7 进行多线程从复制,提高复制的性能。

原文发布于微信公众号 - L宝宝聊IT(gh_b0e552aa80db)

原文发表时间:2018-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

分布式之数据库和缓存双写一致性方案解析

首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。

1222
来自专栏IT技术精选文摘

一文了解Zookeeper

相信大家对 ZooKeeper 应该不算陌生。但是你真的了解 ZooKeeper 是个什么东西吗?如果别人/面试官让你给他讲讲 ZooKeeper 是个什么东西...

1753
来自专栏程序员宝库

每个系统管理员都要知道的 30 个 Linux 系统监控工具

? 您需要监控 Linux 服务器的性能吗?试试用这些内置命令和附加工具吧!大多数 Linux 发行版都附带了大量的监控工具。这些工具提供了获取系统活动的相关...

5359
来自专栏云计算

Kubernetes的服务网格(第4部分):通过流量切换持续部署

除了服务发现,重要指标和TLS之外,linkerd还具有强大的路由语言,称为dtabs,可以用来改变请求的方式 - 甚至是单个请求 - 流经应用程序拓扑。在本文...

4637
来自专栏腾讯移动品质中心TMQ的专栏

接口测试理论与实践 ——PiTest + GT双管齐下,专治各种接口测试

最近做接口测试比较多,这里做一个小小的总结,也可以帮助接口测试的同学快速上手。 首先,在做接口测试前,我们来想一想: 接口测试是什么?——含义 接口测试测什么...

2587
来自专栏前端杂货铺

提升node.js中使用redis的性能

某基于node.js开发的业务系统向外提供了一个dubbo服务,提供向第三方缓存查询、设置多项业务数据并聚合操作结果。在QPS达到800时(两台虚拟机,每台机器...

2742
来自专栏Java架构沉思录

缓存的正确使用方式,你都会了吗?

首先,缓存由于其适应高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。

1391
来自专栏java技术学习之道

分布式之数据库和缓存双写一致性方案解析

3323
来自专栏王清培的专栏

ElasticSearch大数据分布式弹性搜索引擎使用

阅读目录: 背景 安装 查找、下载rpm包 、执行rpm包安装 配置elasticsearch专属账户和组 设置elasticsearch文件所有者 切换到el...

79410
来自专栏Ksher

Kubernetes的服务网格(第4部分):通过流量切换持续部署

翻译人:Ksher,该成员来自云+社区翻译社

3958

扫码关注云+社区

领取腾讯云代金券