返回顶部
首页 > 资讯 > 数据库 >如何搭建MMM架构?MMM架构的优缺点是什么
  • 529
分享到

如何搭建MMM架构?MMM架构的优缺点是什么

2024-04-02 19:04:59 529人浏览 泡泡鱼
摘要

这篇文章的知识点包括:MMM架构的简介、MMM架构的搭建部署以及MMM架构的优缺点介绍,阅读完整文相信大家对MMM架构有了一定的认识。MMM介绍MMM是Multi-Master Replication Ma

这篇文章的知识点包括:MMM架构的简介、MMM架构的搭建部署以及MMM架构的优缺点介绍,阅读完整文相信大家对MMM架构有了一定的认识。

MMM介绍

MMM是Multi-Master Replication Manager for Mysql的缩写,它是mysql提供的一个多主复制管理器,其核心是使用perl语言编写的一组脚本。实际上MMM是比较早期甚至有点老的一种用于构建高可用Mysql架构的方式,但因其还有一定的应用场景。

MMM 由两个组件组成:

  • monitor监控集群数据库的状态,在出现异常时发布切换命令,一般和数据库分开部署
  • agent:运行在每个 MySQL 服务器上的代理进程,monitor 命令的执行者,完成监控的探针工作和具体服务设置,例如设置 VIP、指向新同步节点

MMM的主要作用:

  • 监控和管理MySQL的主主复制拓扑,并在当前的主服务器发生故障时,进行主和主备服务器之间的主从切换和故障转移等工作

MMM提供了什么功能:

  • MMM可以监控MySQL主从复制健康情况,包括mysql服务器的状态、从库拷贝活动的状态等
  • 可以在主库出现宕机时进行故障转移,并自动配置其他从库对新主库的复制
  • 为主库提供了一个写虚拟IP,在主从服务器出现问题时可以自动迁移虚拟IP
  • 当配置多个从库时,可配置多个虚拟读IP,配合第三方负载均衡软件(如LVS),实现负载均衡功能

MMM对于主备切换后如何让从库同步日志点:

  • MMM对于这方面的处理并不安全,只是简单粗暴地让从库同步新主库的当前日志点,所以在一个繁忙的系统中使用MMM很有可能会对数据造成丢失的情况

搭建MMM架构

本文要搭建的MMM架构如下:
如何搭建MMM架构?MMM架构的优缺点是什么

以上述架构为例,描述一下故障转移的流程,现在假设 Master1 宕机:

  1. Monitor 检测到 Master1 连接失败
  2. Monitor 发送 set_offline 指令到 Master1 的 Agent
  3. Master1 Agent 如果存活,下线写 VIP,尝试把 Master1 设置为 read_only=1
  4. MoNIOtr 发送 set_online 指令到 Master2
  5. Master2 Agent 接收到指令,执行 select master_pos_wait() 等待同步完毕
  6. Master2 Agent 上线写 VIP,把 Master2 节点设为 read_only=0
  7. Monitor 发送更改同步对象的指令到各个 Slave 节点的 Agent
  8. 各个 Slave 节点向新 Master 同步数据

从整个流程可以看到,如果主节点出现故障,MMM 会自动实现切换,不需要人工干预,同时我们也能看出一些问题,就是数据库挂掉后,只是做了切换,不会主动补齐丢失的数据,所以 MMM 会有数据不一致性的风险。

搭建MMM架构所需的资源说明:

名称数量说明
Master服务器2用于主备模式的主主复制配置
Slave服务器0-N可以配置0台或多台从服务器,但不建议太多
监控服务器1安装MMM用于监控MySQL复制集群
IP地址2*(n+1)n为MySQL服务器的数量
监控用户1用于监控数据库状态的MySQL用户(至少拥有replication client权限)
代理用户1用于MMM代理的MySQL用户(至少拥有superreplication clientprocess权限)
复制用户1用于配置MySQL主从复制的用户(至少拥有replication slave权限)

本文中所使用的机器说明:

名称IP角色
master-01192.168.190.146主库
master-02192.168.190.148备库
slave-01192.168.190.149从库
manager192.168.190.147集群管理器(MMM)

环境版本说明:

另外的说明:

  • 会来了解MMM架构的小伙伴们想必都已经掌握了MySQL的安装方式,而且介绍MySQL的安装也有很多文章,所以本文为了减少不必要的篇幅就不演示MySQL的安装了,文中所用到的机器都已经提前安装好了MySQL。

配置主主复制及主从同步集群

1、在master-01master-02上使用如下语句分别创建用于主主复制的MySQL用户:

create user 'repl'@'%' identified with mysql_native_passWord by 'Abc_123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
  • Tips:创建好账户后,最好使用该账户在两个节点互相登录一下,以确保账户是可用的

2、修改master-01上的MySQL配置文件:

[root@master-01 ~]# vim /etc/my.cnf
[mysqld]
# 设置节点的id
server_id=101
# 开启binlog,并指定binlog文件的名称
log_bin=mysql_bin
# 开启relay_log,并指定relay_log文件的名称
relay_log=relay_bin
# 将relaylog的同步内容记录到binlog中
log_slave_updates=on

master-02的配置文件中也是添加一样配置,只不过server_id不一样:

[root@master-02 ~]# vim /etc/my.cnf
[mysqld]
server_id=102
log_bin=mysql_bin
relay_log=relay_bin
log_slave_updates=on

接着是配置slave-01,由于该节点不是作为备库存在,而只是单独的从库角色,所以不需要开启log_slave_updates参数:

[root@slave-01 ~]# vim /etc/my.cnf
[mysqld]
server_id=103
log_bin=mysql_bin
relay_log=relay_bin

完成以上配置文件的修改后,分别重启这三个节点上的MySQL服务:

[root@master-01 ~]# systemctl restart mysqld
[root@master-02 ~]# systemctl restart mysqld
[root@slave-01 ~]# systemctl restart mysqld

配置master-02master-01的主从关系

进入master-01的MySQL命令行终端,通过如下语句查询master-01当前正在使用的二进制日志及当前执行二进制日志位置:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 |      155 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

记录其中的FilePosition的值,然后进入master-02的MySQL命令行终端,分别执行如下语句:

mysql> stop slave;  -- 停止主从同步
mysql> change master to master_host='192.168.190.146', master_port=3306, master_user='repl', master_password='Abc_123456', master_log_file='mysql_bin.000001', master_log_pos=155;  -- 配置master-01节点的连接信息,以及从哪个binlog文件的哪个位置开始复制
mysql> start slave;  -- 启动主从同步

配置完主从关系后,使用show slave status\G;语句查看主从同步状态,Slave_IO_RunningSlave_SQL_Running的值均为Yes才能表示主从同步状态是正常的:
如何搭建MMM架构?MMM架构的优缺点是什么


配置master-01master-02的主从关系

为了实现主主复制,master-01master-02需要互为主从关系,所以还需要配置master-01master-02的主从关系。进入master-02的MySQL命令行终端,通过如下语句查询master-02当前正在使用的二进制日志及当前执行二进制日志位置:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 |      155 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

记录其中的FilePosition的值,然后进入master-01的MySQL命令行终端,分别执行如下语句:

mysql> stop slave;
mysql> change master to master_host='192.168.190.148', master_port=3306, master_user='repl', master_password='Abc_123456', master_log_file='mysql_bin.000001', master_log_pos=155;
mysql> start slave;

同样配置完成后,使用show slave status\G;语句查看主从同步状态,Slave_IO_RunningSlave_SQL_Running的值均为Yes才能表示主从同步状态是正常的:
如何搭建MMM架构?MMM架构的优缺点是什么


配置slave-01master-01的主从关系

接着就是配置从库对主库的主从关系了,这里与master-02是一样的,除非期间对master-01上的数据做了修改才需要重新获取日志点:

mysql> stop slave;
mysql> change master to master_host='192.168.190.146', master_port=3306, master_user='repl', master_password='Abc_123456', master_log_file='mysql_bin.000001', master_log_pos=155;
mysql> start slave;

搭建MMM服务

1、在所有的机器上安装 epel 源:

yum install -y epel-release

2、在所有的主从节点上安装MMM代理客户端:

yum install -y mysql-mmm-agent

3、在 manager节点上安装所有的MMM包:

yum install -y mysql-mmm*

4、然后在master-01上创建用于监控和代理的MySQL用户:

-- 监控用户
create user 'mmm_monitor'@'%' identified with mysql_native_password by 'Abc_123456';
grant replication client on *.* to 'mmm_monitor'@'%';

-- 代理用户
create user 'mmm_agent'@'%' identified with mysql_native_password by 'Abc_123456';
grant super, replication client, process on *.* to 'mmm_agent'@'%';
flush privileges;

由于配置了主从的原因,此时其他两个数据库节点也会同步这些新建的用户。在另外两个节点执行如下语句就可以查询到:

mysql> use mysql;
mysql> select host,user,plugin from user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| %         | mmm_agent        | mysql_native_password |
| %         | mmm_monitor      | mysql_native_password |
| %         | repl             | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | caching_sha2_password |
+-----------+------------------+-----------------------+

5、编辑所有节点包括监控节点上的mmm_common.conf配置文件,主要是配置当前节点和集群中其他节点的信息。这里以master-01节点为例,其配置内容如下:

[root@master-01 ~]# vim /etc/mysql-mmm/mmm_common.conf
active_master_role      writer

<host default>
    cluster_interface       ens32  # 当前节点的网卡名称,用于绑定虚拟IP,可以ip addr命令查询
    pid_path                /run/mysql-mmm-agent.pid  # pid文件存放的路径
    bin_path                /usr/libexec/mysql-mmm/  # 可执行文件存放的路径
    replication_user        repl  # 用于复制的MySQL用户
    replication_password    Abc_123456  # repl用户的密码
    agent_user              mmm_agent   # 用于代理的MySQL用户
    agent_password          Abc_123456  # mmm_agent用户的密码
</host>

# 配置master-01的ip地址和角色
<host db1>
    ip      192.168.190.146
    mode    master
    peer    db2
</host>

# 配置master-02的ip地址和角色
<host db2>
    ip      192.168.190.148
    mode    master
    peer    db1
</host>

# 配置slave-01的ip地址和角色
<host db3>
    ip      192.168.190.149
    mode    slave
</host>

# 配置负责写操作的库
<role writer>
    hosts   db1, db2  # 指定可写的库,这里是上面host标签中定义的名称
    ips     192.168.190.90  # 配置写虚拟IP,可以有多个使用逗号分隔
    mode    exclusive   # 表示同一时刻只有一个主库提供服务
</role>

# 配置负责读操作的库
<role reader>
    hosts   db1, db2, db3  # 指定可读的库
    ips     192.168.190.91,192.168.190.92,192.168.190.93  # 配置读虚拟IP
    mode    balanced  # 表示将读请求负载均衡到以上所配置的db上
</role>

其他三个节点也按照相同的方式进行配置即可,除了网卡名称可能会不同外,其它的参数都应该是一致的。

6、然后配置各个节点的mmm_agent.conf文件,声明当前节点在host标签中所定义的名称。master-01节点的配置如下:

[root@master-01 ~]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1

master-02节点的配置如下:

[root@master-02 ~]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1

slave-01节点的配置如下:

[root@slave-01 ~]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db3

7、接着配置监控节点上的mmm_mon.conf文件,配置内容如下:

[root@manager ~]# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf

<monitor>
    ip                  127.0.0.1
    pid_path            /run/mysql-mmm-monitor.pid
    bin_path            /usr/libexec/mysql-mmm
    status_path         /var/lib/mysql-mmm/mmm_mond.status
    ping_ips            192.168.190.146,192.168.190.148,192.168.190.149  # 配置集群中各个节点的IP
    auto_set_online     60  # 设置当节点宕机恢复后自动上线的时间,单位为秒

    # The kill_host_bin does not exist by default, though the monitor will
    # throw a warning about it missing.  See the section 5.10 "Kill Host
    # Functionality" in the pdf documentation.
    #
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
    #
</monitor>

<host default>
    # 配置用于监控的MySQL用户和密码
    monitor_user        mmm_monitor
    monitor_password    Abc_123456
</host>

debug 0

8、启动所有主从节点的MMM代理服务:

[root@master-01 ~]# systemctl start mysql-mmm-agent
[root@master-02 ~]# systemctl start mysql-mmm-agent
[root@slave-01 ~]# systemctl start mysql-mmm-agent

agent服务默认会监听9989端口,如果开启了防火墙则需要开放该端口:

firewall-cmd --zone=public --add-port=9989/tcp --permanent
firewall-cmd --reload

9、启动监控节点上的监控服务:

[root@manager ~]# systemctl start mysql-mmm-monitor

10、完成以上所有步骤后,在监控节点上使用mmm_control show命令就可以查看到集群中各个节点的状态及其分配的虚拟IP,如下示例:

[root@manager ~]# mmm_control show
  db1(192.168.190.146) master/ONLINE. Roles: reader(192.168.190.91), writer(192.168.190.90)
  db2(192.168.190.148) master/ONLINE. Roles: reader(192.168.190.93)
  db3(192.168.190.149) slave/ONLINE. Roles: reader(192.168.190.92)

[root@manager ~]#

测试

到此为止,我们就已经完成了MMM高可用架构的搭建,接下来我们对其进行一些简单的测试。例如,测试下是否能正常ping通虚拟IP,毕竟应用端访问数据库时连接的是虚拟IP,所以首先得确保虚拟IP是能够被访问的。如下:
如何搭建MMM架构?MMM架构的优缺点是什么

ping通之后,使用Navicat等远程连接工具测试下能否正常连接上:
如何搭建MMM架构?MMM架构的优缺点是什么

确定了各个虚拟IP都能正常访问后,测试下MMM是否能正常进行故障转移,首先将master-01上的MySQL服务给停掉:

[root@master-01 ~]# systemctl stop mysqld

正常情况下,此时到监控节点上使用mmm_control show命令可以看到master-01节点已经处于脱机状态,而用于写的虚拟IP正常的切换到了master-02节点上:

[root@manager ~]# mmm_control show
  db1(192.168.190.146) master/HARD_OFFLINE. Roles: 
  db2(192.168.190.148) master/ONLINE. Roles: reader(192.168.190.93), writer(192.168.190.90)
  db3(192.168.190.149) slave/ONLINE. Roles: reader(192.168.190.91), reader(192.168.190.92)

[root@manager ~]# 

接着进入slave-01节点上的MySQL终端。之前我们配置slave-01的主库是master-01,现在已经将master-01停掉后,可以看到slave-01的主库被MMM切换成了master-02
如何搭建MMM架构?MMM架构的优缺点是什么

经过以上测试后,可以看到我们搭建的MMM架构是能够正常运行的,已经使得Replication集群拥有了基本的高可用能力,即便主库下线后也能正常切换到备库上,也正确建立了从库与新主库的关系。


MMM架构的优缺点

优点:

  • 使用Perl脚本语言开发并且完全开源,开发者可以根据自己的需求进行二次开发
  • 提供了从服务器的延迟监控以及读写VIP(虚拟IP),使服务器角色的变更对前端应用透明。并且在从库出现大量的主从延迟或主从复制链路中断时,可以把这台从库上的读虚拟IP,漂移到集群中其他正常的可读节点上
  • 提供了当主库故障转移后,从库对新主库的重新同步功能,所以很容易对发生故障的主库重新上线,让Replication集群具备高可用性

缺点:

  • MMM属于一个比较老的工具了,其最后发布的版本也是好几年前了,所以会存在一些小bug,并且不支持MySQL 5.6+版本中新增的基于GTID的复制,只支持基于日志点的复制
  • 没有提供读负载均衡的功能,需要额外引入LVS等工具来实现
  • 在进行主从切换时,容易造成数据丢失或事务的重复提交。因为MMM不会对比多个从库的日志点,而是直接选择备库进行切换。由于Replication集群是异步复制的,当备库的同步延迟比较大时,可能会出现从库的日志点比备库的要更新。所以当主库意外下线时,MMM强制切换成备库就有可能会导致数据的丢失或从库重复提交事务
  • MMM没有提供相关的高可用功能,所以监控节点自身存在单点故障,而Replication集群的高可用依赖于监控节点,当监控节点挂掉Replication集群也就不再具备高可用性了。但我们可以引入第三方工具来对监控节点做双机热备,例如Keepalived

综合优缺点可以得知:MMM仅适用于对数据一致性要求不高,允许丢失少量数据的场景下,例如评论、资讯类等数据

看完上述内容,你们对MMM架构有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读。

您可能感兴趣的文档:

--结束END--

本文标题: 如何搭建MMM架构?MMM架构的优缺点是什么

本文链接: https://lsjlt.com/news/36197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何搭建MMM架构?MMM架构的优缺点是什么
    这篇文章的知识点包括:MMM架构的简介、MMM架构的搭建部署以及MMM架构的优缺点介绍,阅读完整文相信大家对MMM架构有了一定的认识。MMM介绍MMM是Multi-Master Replication Ma...
    99+
    2024-04-02
  • MySQL基操---高可用架构MMM搭建与容灾测试
    MMM介绍MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理My...
    99+
    2024-04-02
  • 微服务架构的优缺点
    一、微服务架构的优点 灵活性高:它将应用程序分解为小型服务(松散耦合),使其开发、维护更快,更易于理解,可以提供更高的灵活性; 独立扩展:它使每个服务能够独立扩展,将系统中的不同功能模块拆分成多个不同的服务,这些服务进行独立地...
    99+
    2023-10-29
    优缺点 架构
  • LAMP架构的优缺点有哪些
    LAMP架构是一种常用的Web应用程序架构,由Linux操作系统、Apache服务器、MySQL数据库和PHP编程语言组成。它具有以...
    99+
    2023-09-13
    LAMP
  • openstack架构搭建的步骤是什么
    搭建OpenStack架构的步骤如下: 准备环境:安装操作系统和必要软件,配置网络和存储等基础环境。 安装Keystone:...
    99+
    2024-04-02
  • 探索 JavaScript MVVM 架构的优点和缺点
    MVVM 架构的优点 数据绑定: MVVM 架构允许视图与模型中的数据自动绑定,从而简化了数据操作。这意味着当模型中的数据更改时,视图会自动更新,反之亦然。 响应式: MVVM 架构使用响应式系统,可自动检测模型中的更改并触发视图更新...
    99+
    2024-03-03
    MVVM、JavaScript、数据绑定、响应式、性能
  • 浅谈一下单体架构的缺点是什么
    随着互联网技术的发展,传统的应用架构已满足不了实际需求,微服务架构就随之产生。那么传统应用架构到底出了什么问题呢又如何解决接下来我们将从传统单体架构的问题开始,对为什么需要微服务架构...
    99+
    2023-05-17
    java 架构 java 单体架构缺点
  • MariaDB Codership Galera Cluster的特性和架构优缺点分别是什么
    MariaDB Codership Galera Cluster的特性和架构优缺点分别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 ...
    99+
    2024-04-02
  • div与css网页标准布局架构优缺点是什么
    今天小编给大家分享一下div与css网页标准布局架构优缺点是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2024-04-02
  • 如何搭建vue3.0项目架构
    小编给大家分享一下如何搭建vue3.0项目架构,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、用 vue-cli 创建项目npm uninstall&...
    99+
    2023-06-25
  • Lavarel框架的优缺点是什么
    这篇文章给大家分享的是有关Lavarel框架的优缺点是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Lavarel 框架  优点:  Laravel 的设计思想是很先进的,非...
    99+
    2024-04-02
  • django框架的优缺点是什么
    Django框架是一个开发Web应用程序的高级Python Web框架,具有以下优缺点: 优点: 快速开发:Django提供了许多...
    99+
    2024-04-02
  • beego框架的优点和缺点是什么
    beego框架的优点: 高性能:beego框架基于Go语言开发,具有出色的性能表现,能够处理大量的并发请求。 简单易用:be...
    99+
    2024-03-14
    beego
  • jsp框架的优点和缺点是什么
    JSP(Java Server Pages)是一种用于开发动态网页的Java技术。JSP框架的优点和缺点如下: 优点: 简单易学:...
    99+
    2024-04-02
  • cobit框架的优点和缺点是什么
    COBIT框架的优点: 综合性:COBIT框架提供了一个综合性的IT管理指南,涵盖了不同方面的IT管理,包括战略规划、风险管理、...
    99+
    2024-04-02
  • PHP MVC架构的优缺点及最佳实践
    MVC架构由三部分组成: 模型(Model):模型负责应用程序的业务逻辑。它包含应用程序的数据和业务规则。 视图(View):视图负责应用程序的表示层。它将模型中的数据呈现给用户。 控制器(Controller):控制器负责协调模型和...
    99+
    2024-02-05
    PHP MVC 架构 优点 缺点 最佳实践
  • Redis高可用架构如何搭建
    今天小编给大家分享一下Redis高可用架构如何搭建的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2022-12-05
    redis
  • redis的主从式架构有什么优点
    redis中主从式架构的优点:一个Master可以同步多个Slaves。Master-Slave同步期间,客户端仍然可以提交查询或修改请求。Slave服务器为客户端提供只读操作的服务,写服务由Master完成。因此提高了系统的伸缩性。支持主...
    99+
    2024-04-02
  • Python中tornado框架的优缺点是什么
    Tornado框架是一个异步的Python web框架,其优缺点如下: 优点: 异步IO:Tornado使用异步IO来处理请求,可...
    99+
    2024-03-01
    Python tornado
  • Brainstorm框架的优点和缺点分别是什么
    Brainstorm框架的优点: 创造性:Brainstorm框架能够激发团队成员的创造性思维,帮助他们产生更多新颖的想法和解决方...
    99+
    2024-03-08
    Brainstorm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作