MySQL/MariaDB基于MMM实现读写分离及高可用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

前言

MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)。

MMM

优缺点

优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。

缺点:Monitor节点是单点,可以结合Keepalived实现高可用。

工作原理

mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用服务器之上,当某一台服务器宕机时,监管会将VIP迁移至其他服务器。

实现过程

实验拓扑

wKioL1WI7XeSwpE7AAFbsf5YYTc394.jpg

1
2
3
4
#注:系统环境CentOS6.6
#VIP172.16.10.30为可写VIP,其他三组为可读VIP
#可写VIP只能在Master之间切换,可读VIP可在Master和Slave之间切换
#前端应用可连接任意可读VIP进行数据读取,连接可写VIP进行数据写入

双主一从配置

DB1配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1 ~] # vim /etc/mysql/my.cnf 
 
datadir =  /mydata/data
log-bin= /mydata/binlogs/master-bin        #二进制文件位置
relay-log= /mydata/relaylogs/relay-bin     #中继日志位置
binlog_format=mixed
server- id        = 1
auto_increment_offset=1         #双主复制中自增长字段的起始值
auto_increment_increment=2      #双主复制中自增长字段的步长
log_slave_updates = 1           #开启从库更新操作写入二进制日志功能
sync_binlog = 1                 #可保证事务日志及时写入磁盘文件
skip-name-resolve               #禁用DNS反向解析,如不写此项,则需要在各节点基于主机名通信
read_only       = 1  
 
[root@node1 ~] # service mysqld start

授权可用复制用户记录二进制日志位置

wKiom1WHvdKCD3JSAAGApMycIjo175.jpg

DB2配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node2 ~] # vim /etc/mysql/my.cnf 
 
datadir =  /mydata/data
log-bin= /mydata/binlogs/master-bin       
relay-log= /mydata/relaylogs/relay-bin    
binlog_format=mixed
server- id        = 11
auto_increment_offset=2          
auto_increment_increment=2      
log_slave_updates = 1            
sync_binlog = 1  
skip-name-resolve
read_only       = 1
 
[root@node2 ~] # service mysqld start

授权可用复制用户记录二进制日志位置

wKiom1WHv86h7NWfAAGApMycIjo536.jpg

1
#因为实验之前都做了完整初始化,这里二进制文件位置一致

DB3配置

1
2
3
4
5
6
7
8
9
[root@scholar ~] # vim /etc/mysql/my.cnf 
 
datadir =  /mydata/data
relay-log= /mydata/relaylogs/relay-bin
server- id        = 111
read_only       = 1
skip-name-resolve
 
[root@scholar ~] # service mysqld start

连接各服务器

DB1连接DB2

wKioL1WH4BmSvZCCAAIvhSxxE70529.jpg

DB2连接DB1

wKioL1WH4DODxovDAAItwXooMVE622.jpg

DB3连接DB1

wKiom1WH32nCVL7ZAAIsnj8NGCk293.jpg

主从测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#DB1创建数据库
MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.14 sec)
 
#DB2创建表
MariaDB [(none)]> create table testdb.tb1(name char(20) not null);
Query OK, 0 rows affected (0.19 sec)
 
#DB3查看数据
MariaDB [(none)]> show tables  in  testdb;
+------------------+
| Tables_in_testdb |
+------------------+
| tb1              |
+------------------+
1 row  in  set  (0.13 sec)

数据一致,主从复制部分完成

MMM配置

安装所需程序包

1
2
3
[root@node1 ~] # yum install mysql-mmm* -y
 
#在所有节点安装mysql-mmm包组

授权监控及代理用户

wKioL1WIAaezt1-sAAErcnD6lcM503.jpg

1
#DB节点全部需要授权,在一个节点授权即可

Monitor配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@scholar ~] # vim /etc/mysql-mmm/mmm_common.conf 
 
active_master_role      writer
 
<host default>
     cluster_interface       eth0
     pid_path                 /var/run/mysql-mmm/mmm_agentd .pid
     bin_path                 /usr/libexec/mysql-mmm/
     replication_user        repluser         #复制用户
     replication_password    replpass         #复制用户密码
     agent_user              mmm_agent        #代理用户
     agent_password          agent_passw      #代理用户密码
< /host >
 
<host db1>
     ip      172.16.10.123
     mode    master
     peer    db2
< /host >
 
<host db2>
     ip      172.16.10.124
     mode    master
     peer    db1
< /host >
 
<host db3>
     ip      172.16.10.125
     mode    slave
< /host >
 
<role writer>            #可写节点
     hosts   db1, db2
     ips     172.16.10.30
     mode    exclusive    #互斥角色只有一个ip,同一时间只能分配给一个主机
< /role >
 
<role reader>            #可读节点
     hosts   db1, db2, db3
     ips     172.16.10.31,172.16.10.32,172.16.10.33
     mode    balanced     #负载均衡角色可以有多个IP,这些IP被均衡的分配给多个主机
< /role >
1
2
3
4
5
6
7
#将以上文件同步到DB1-DB3节点
[root@scholar ~] # scp /etc/mysql-mmm/mmm_common.conf 172.16.10.123:/etc/mysql-mmm/
mmm_common.conf                                          100%  776     0.8KB /s    00:00 
[root@scholar ~] # scp /etc/mysql-mmm/mmm_common.conf 172.16.10.124:/etc/mysql-mmm/
mmm_common.conf                                          100%  776     0.8KB /s    00:00 
[root@scholar ~] # scp /etc/mysql-mmm/mmm_common.conf 172.16.10.125:/etc/mysql-mmm/
mmm_common.conf                                          100%  776     0.8KB /s    00:00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@scholar ~] # vim /etc/mysql-mmm/mmm_mon.conf
 
include mmm_common.conf
 
<monitor>
     ip                  127.0.0.1
     pid_path             /var/run/mysql-mmm/mmm_mond .pid
     bin_path             /usr/libexec/mysql-mmm
     status_path          /var/lib/mysql-mmm/mmm_mond .status
     ping_ips            172.16.10.123,172.16.10.124,172.16.10.125  #监控主机
     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>
     monitor_user        mmm_monitor     #监控用户
     monitor_password    monitor_pass    #监控密码
< /host >
 
debug 0

DB1-DB3配置

1
2
3
4
5
6
7
8
9
10
[root@node1 ~] # vim /etc/mysql-mmm/mmm_agent.conf
 
include mmm_common.conf
 
# The 'this' variable refers to this server.  Proper operation requires 
# that 'this' server (db1 by default), as well as all other servers, have the 
# proper IP addresses set in mmm_common.conf.
this db1
 
#DB1-DB3根据自身实际角色修改此配置文件(db1,db2,db3)

启动服务

1
2
3
4
5
6
#在各监控节点启动mmm-agent服务
[root@node1 ~] # service mysql-mmm-agent start
Starting MMM Agent Daemon:                                 [  OK  ]
#在Monitor上启动mmm-monitor服务
[root@scholar ~] # service mysql-mmm-monitor start
Starting MMM Monitor Daemon:                               [  OK  ]

查看当前状态

wKiom1WI6Wqj-5EnAACzM2x0XS8838.jpg

查看各节点VIP状态

1
#以db1为例

wKiom1WJAHrCfN1HAAHS3xzhmes734.jpg

高可用测试

模拟db1故障,查看节点状态

wKiom1WJARyTjEYQAAErGw_U4LQ539.jpg

再看db1的VIP状态

wKiom1WJAZ3gZebzAAGdNtYlFew337.jpg

VIP已被转移到其他节点,其他方面有兴趣请自行测试,这里就不一一展示了

The end

MySQL/MariaDB基于MMM实现读写分离及高可用实验就先说到这里了,有兴趣的朋友可以继续探究基于Keepalived实现Monitor的高可用,这里就不做深究了,实验过程中遇到问题可留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~



本文转自 北城书生  51CTO博客,原文链接:http://blog.51cto.com/scholar/1664551


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
215 3
Mysql高可用架构方案
|
3月前
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
234 0
|
4月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
5月前
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
262 8
|
5月前
|
运维 容灾 关系型数据库
MySQL高可用方案--Xenon全解
MySQL高可用方案--Xenon全解
|
5月前
|
SQL 关系型数据库 MySQL
orchestrator搭建mysql高可用
orchestrator搭建mysql高可用
65 0
|
5月前
|
缓存 关系型数据库 MySQL
如何实现mysql高可用集群
如何实现mysql高可用集群
65 0
|
5月前
|
SQL 关系型数据库 MySQL
mysql读写分离,主从同步
本文介绍了如何在Laravel项目中配置数据库读写分离,并实现MySQL主从同步。主要步骤包括:在`config/database.php`中设置读写分离配置;为主机授予从机访问权限;配置各MySQL服务器的`/etc/my.cnf`文件以确保唯一的`server-id`;以及通过SQL命令设置主从关系并启动从服务。文章还针对一些常见错误提供了排查方法。最后通过验证确认主从同步是否成功。[原文链接](https://juejin.cn/post/6901581801458958344)。版权所有者为作者佤邦帮主,转载请遵循相关规定。
|
5月前
|
安全 关系型数据库 MySQL
【MySQL】Orchestrator最简单的 mysql 高可用方案最细细细细~
【MySQL】Orchestrator最简单的 mysql 高可用方案最细细细细~
|
5月前
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
673 0