MySQL 5.6通过MMM实现读写分离的高可用架构

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

上一篇博文我们使用keepalived+主从同步搭建了一个简单的MySQL高可用架构(详见http://blog.51cto.com/jiangjianlong/1981994),今天再分享下通过MMM搭建的实现MySQL读写分离的高可用群集。MMM (Master-Master Replication Manager for MySQL)是使用perl开发的MySQL主主复制管理器,可实现读写分离的高可用架构,对主库实现写请求的高可用,对从库实现读请求的负载均衡。本文的架构示意图如下:

MM架构图-1.png

一、部署环境

部署环境.png

二、环境准备

1、配置好IP地址、主机名,关闭防火墙和selinux

2、分别为mysql-master01、mysql-master02、mysql-slave01、mysql-slave02安装MySQL 5.6,安装方法请参见本文之前的博文《MySQL 5.6.38在RedHat 6.5上通过RPM包安装需要注意的是要安装Mysql-devel的rpm包。

3、为5台服务器配置好hosts解析:

192.168.10.81 mysql-master01

192.168.10.82 mysql-master02

192.168.10.83 mysql-slave01

192.168.10.84 mysql-slave02

192.168.10.85 mysql-monitor

4、将RedHat 6.5的介质配置成本地yum源


三、配置两台master互为主从

1、编辑mysql-master01和mysql-master02的/etc/my.cnf文件并重启mysql服务:

mysql-master01:

1
2
3
4
5
6
7
8
9
10
11
[mysqld] 
server- id =1               #每台设置不同
log-bin=mysql-bin
[mysqld_safe]
auto_increment_increment=2   #字段一次递增多少 
auto_increment_offset=1     #自增字段的起始值,master02需设置为2 
replicate- do -db=all         #同步的数据库,多个用逗号隔开 
log-slave_updates         #当一个主故障,另一个立即接管 
sync -binlog=1             #每条自动更新,安全性高,默认是0 
log-error =  /var/log/mysqld .log
read_only = 1

mysql-master02:

1
2
3
4
5
6
7
8
9
10
11
[mysqld] 
server- id =2               #每台设置不同 
log-bin=mysql-bin 
[mysqld_safe]
auto_increment_increment=2   #字段一次递增多少
auto_increment_offset=2     #自增字段的起始值,master02需设置为2
replicate- do -db=all         #同步的数据库,多个用逗号隔开
log-slave_updates        #当一个主故障,另一个立即接管
sync -binlog=1             #每条自动更新,安全性高,默认是0
log-error =  /var/log/mysqld .log
read_only = 1


2、在mysql-master01上创建用于同步的账户repl,密码为123456,并查询master状态,记下file名称和posttion数值

mysql> GRANT REPLICATION SLAVE ON *.* to 'repl'@'%' identified by '123456';

mysql> show master status;

02.png


3、在mysql-master02上登录mysql,执行以下语句开启从服务器

mysql> change master to master_host='192.168.10.81',master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=318;

mysql> start slave;

mysql> show slave status\G

03.png

04.png

4、然后在mysql-master02上也创建用于同步的账户repl,密码为123456,并查询master状态,记下file名称和posttion数值

mysql> GRANT REPLICATION SLAVE ON *.* to 'repl'@'%' identified by '123456';

mysql> show master status;

05.png

5、在mysql-master01上登录mysql执行以下语句开启从服务器,注意这里master_host要填写mysql-master02的IP

mysql> change master to master_host='192.168.10.82',master_user='repl',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=318;  

mysql> start slave;

mysql> show slave status\G

06.png

07.png


6、这样两台master的互为主从就配置好了,下面我们来测试一下,先做mysql-master01上执行以下语句创建一个数据库、一个表并插入一行数据

mysql> create database names_test;

mysql> use names_test;

mysql> create table names(id int(5),name char(15));

mysql> insert into names values (01,'jiangjianlong');

mysql> select * from names;

08.png

7、然后到mysql-master02上查询一下,发现已经同步完成了,说明mysql-master02作为mysql-master01的从库复制正常

09.png

8、在mysql-master02上也创建一个数据库、一个表并插入一行数据

mysql> create database blogs_test;

mysql> use blogs_test;

mysql> create table blogs(id int(5),name char(35));

mysql> insert into blogs values (01,'jiangjianlong.blog.51cto.com');

mysql> select * from names;

10.png

9、在mysql-master01上查询一下,发现数据也已经同步过来,说明mysql-master01作为mysql-master02的从库也是复制正常

11.png


四、配置两台slave作为master01的从库

1、mysql-slave01和mysql-slave02分别使用以下my.cnf

mysql-slave01:

1
2
3
4
5
6
7
8
[mysqld]
server- id =3               #每台设置不同
log-bin=mysql-bin
  
[mysqld_safe]
replicate- do -db=all         
log-error =  /var/log/mysqld .log
read_only = 1

mysql-slave02:

1
2
3
4
5
6
7
8
[mysqld]
server- id =4              #每台设置不同
log-bin=mysql-bin
  
[mysqld_safe]
replicate- do -db=all         
log-error =  /var/log/mysqld .log
read_only = 1

2、根据在mysql-master01上执行show master status查出来的结果,在mysql-slave01和mysql-slave02上分别执行以下sql语句,开启从服务器:

mysql> change master to master_host='192.168.10.81',master_user='repl',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=120;

mysql> start slave;

mysql> show slave status\G

12.png

13.png


五、安装MMM要求的Perl模块

1、MMM对所有MySQL节点所要求的Perl模块如下:

01.png

2、以下以mysql-master01为例进行perl模块的安装,另外3台MySQL服务器同理。首先查看一下这些perl模块还有哪些没装:

perldoc -l Algorithm::Diff  DBI  DBD::mysql File::Basename File::stat Log::Dispatch Log::Log4perl Mail::Send Net::ARP Proc::Daemon Time::HiRes

14.png

3、部分缺失的perl模块在Redhat6.5的介质中有,可以通过本地yum源的方式安装

[root@mysql-master01 ~]# yum install perl-DBI perl-DBD-mysql perl-MailTools perl-Time-HiRes perl-CPAN -y

4、使用以下命令再查看一下安装结果

perldoc -l Algorithm::Diff  DBI  DBD::mysql File::Basename File::stat Log::Dispatch Log::Log4perl Mail::Send Net::ARP Proc::Daemon Time::HiRes

15.png

5、剩下的几个perl模块安装起来稍微麻烦一点,可以使用源码包编译安装,也可以使用cpan在线自动下载安装,并能处理各模块间的依赖关系。我一开始是尝试去下载源码包后手动进行编译安装,然而我在编译到Log::Dispatch时我直接放弃这种方式了,因为它依赖于很多个其它的perl模块,而这些模块可能又依赖于别的多个模块!如下图:

16.png

6、所以我决定使用cpan在线自动安装的方式,但需要服务器能连外网。由于使用cpan安装Algorithm::Diff时会告警提示YAML没有安装,因此我先使用cpan安装YAML,而安装YAML时会把它所依赖的Algorithm::Diff给装上

17.png

18.png

7、接着执行cpan Log::Dispatch安装Log::Dispatch,没想到在自动下载安装了50多个依赖模块后还是报错提示有多个依赖的模块缺失,如下图:

19.png

8、解决办法:依次使用cpan安装上图所示的缺少的模块,然后再执行cpan Log::Dispatch就能成功安装上,如果cpan安装Params::ValidationCompiler时报错,就单独下载这个模块的源码包进行编译安装

20.png

9、执行cpan Log::Log4perl安装Log::Log4perl模块、执行cpan Net::ARP安装Net::ARP模块、执行cpan Proc::Daemon安装Proc::Daemon模块

21.png

22.png

23.png

10、再来查看下所需perl模块的安装结果,这下已经全部都装好了

24.png

11、monitor服务器也对perl模块有要求,如下图:

25.png

12、同样是使用cpan安装这些模块,在此不再赘述。4台mysql服务器和monitor服务器的perl模块都安装完成后,我们就可以来安装配置MMM了


六、MySQL-MMM安装配置

1、MMM对MySQL用户的要求如下:

26.png

2、由于本文未使用到MMM tools,因此只需创建前3个用户,由于前面已经做好了主从同步,因此只需要在mysql-master01上创建即可同步到另外3台MySQL服务器

GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.10.%' IDENTIFIED BY 'monitor'; 

GRANT SUPER,REPLICATION CLIENT,PROCESS ON *.* TO 'mmm_agent'@'192.168.10.%' IDENTIFIED BY'agent';

GRANT REPLICATION SLAVE ON *.* TO 'mmm_repl'@'192.168.10.%' IDENTIFIED BY'repl';

注:其实用户mmm_repl可以不用建,因为前面我们配置主从同步时已经建了一个repl用户可供使用

27.png

3、使用以下语句检查另外3台MySQL服务器是否已同步了这3个用户,可以看到都已经有了

select user,host from mysql.user where user in ('mmm_monitor','mmm_agent','mmm_repl');

28.png

29.png

30.png

4、在4台MySQL服务器和monitor服务器上编译安装MMM,下面以mysql-master01为例

[root@mysql-master01 ~]# tar -zxf mysql-mmm-2.2.1.tar.gz -C /usr/

[root@mysql-master01 ~]# cd /usr/mysql-mmm-2.2.1/

[root@mysql-master01 mysql-mmm-2.2.1]# make install

31.png

5、安装完成后,所有的配置文件都放到了/etc/mysql-mmm/下面。monitor服务器和MySQL服务器上都要包含一个共同的文件mmm_common.conf,内容如下:

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
43
44
45
46
47
48
49
50
[root@mysql-master01 mysql-mmm-2.2.1] # cat /etc/mysql-mmm/mmm_common.conf
active_master_role        writer
   
<host default>
cluster_interface                eth0
  
pid_path                                 /var/run/mmm_agentd .pid
bin_path                                 /usr/lib/mysql-mmm/
  
     replication_user        mmm_repl
     replication_password    repl
  
agent_user                            mmm_agent
agent_password                        agent
< /host >
  
<host mysql-master01>
ip                                          192.168.10.81
mode                                        master
peer                                        mysql-master02
< /host >
  
<host mysql-master02>
ip                                          192.168.10.82
mode                                        master
peer                                        mysql-master01
< /host >
  
<host mysql-slave01>
ip                                          192.168.10.83
mode                                        slave
< /host >
  
<host mysql-slave02>
         ip                                   192.168.10.84
         mode                                 slave
< /host >
  
<role writer>
hosts                                        mysql-master01, mysql-master02
ips                                          192.168.10.91
mode                                        exclusive
< /role >
  
<role reader>
hosts                                        mysql-slave01, mysql-slave02
ips                                          192.168.10.93, 192.168.10.94
mode                                        balanced
< /role >
[root@mysql-master01 mysql-mmm-2.2.1] #

6、在mysql-master01上编辑好该文件后,通过scp传输到另外4台服务器

32.png

7、4台MySQL服务器还有一个mmm_agent.conf文件需要修改主机名

33.png

8、在4台MySQL服务器的 /etc/init.d/mysql-mmm-agent的脚本文件的#!/bin/sh下面,加入如下内容 

source /root/.bash_profile,下面以mysql-master01为例

34.png

9、分别将4台MySQL服务器的mmm_agent启动脚本添加成系统服务并设置为自启动,下面以mysql-master01为例

#chkconfig --add mysql-mmm-agent

#chkconfig mysql-mmm-agent on

35.png

10、分别将4台MySQL服务器的mmm_agent启动,如果前面的Perl模块没有装好,可能会报错启动不了

/etc/init.d/mysql-mmm-agent start或service mysql-mmm-agent start

36.png

37.png

38.png

39.png

11、配置monitor服务器上的mmm_mon.conf文件

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
[root@mysql-monitor mysql-mmm] # cat/etc/mysql-mmm/mmm_mon.conf 
include
mmm_common.conf
  
<monitor>
         ip                  127.0.0.1
         pid_path                /var/run/mmm_mond .pid
         bin_path                /usr/lib/mysql-mmm/
         status_path               /var/lib/misc/mmm_mond .status
         ping_ips               192.168.10.81,192.168.10.82,192.168.10.83,192.168.10.84
< /monitor >
  
<host default>
         monitor_user                  mmm_monitor
         monitor_password                monitor
< /host >
  
<check default>
        check_period   5
        trap_period   10
        timeout       3
        max_backlog   86400
< /check >
  
debug 0


40.png

12、在monitor服务器的 /etc/init.d/mysql-mmm-monitor的脚本文件的#!/bin/sh下面,加入如下内容 

source /root/.bash_profile

41.png

13、将mysql-mmm-monitor添加成系统服务并设置为自启动

#chkconfig --add mysql-mmm-monitor

#chkconfigmysql-mmm-monitor on

14、启动monitor服务器的mysql-mmm-monitor服务

42.png

15、在monitor服务器执行命令列出客户端状态,发现都是AWAITING状态

image.png

16、在monitor服务器执行命令mmm_control set_online mysql-master01,将mysql-master01上线,过一会再看它就变成online状态了

image.png

17、这时观察mysql-master01的IP发现已经成功添加了Write VIP

45.png

18、依次将mysql-master02和mysql-slave01以及mysql-slave02设置为online,查看slave的IP也发现Read VIP也加上了。MMM到此已配置完成,下面将进行高可用测试

46.png

image.png

image.png


七、MySQL-MMM主库高可用测试

1、将mysql-master01的mysql服务停止,模拟主库宕机,再查看IP会发现Write VIP已被自动移除

image.png

2、观察monitor服务器上的日志可以发现MMM检测到mysql-maste01故障并将Write VIP切换到了mysql-master02上

48.png

3、查看mysql-master02的IP,发现Write VIP确实已添加上了

image.png

4、这时两台slave之前配置的主库已经宕机并且主库已切换,那它们是否会自动将Master Host也切换为mysql-master02呢?查看下它们的slave状态,发现已自动切换

49.png

50.png

5、在monitor服务器上查看下客户端的状态,mysql-master01确实已离线,并且是能Ping通而mysql连接失败

image.png

image.png

6、再次启动master01mysql服务,并设置为online,可以看到Write VIP并不会回切(除非当前的主库再次宕机)

image.png

7、观察到monitor服务器的日志如下:

image.png

8、再检查下客户端,已恢复正常

image.png


八、MySQL-MMM从库高可用测试

1、将mysql-slave01的mysql服务停止,模拟从库宕机,再查看IP会发现其上的Read VIP已被自动移除

image.png

image.png

2、观察到monitor服务器上的日志发现mysql-slave01的Read VIP已被切换到mysql-slave02上:

51.png

3、在monitor服务器上查看客户端状态,发现mysql-slave02确实绑定了2个Read VIP

image.png

4、检查mysql-slave02的IP,确实如此

52.png

5、将mysql-slave01的mysql服务恢复启动,并在monitor服务器将其设置为online,可以看到切换回去的Read VIP并不是最开始的那个VIP,Read VIP并非固定不变

image.png

6、观察monitor服务器的日志内容如下:

image.png

7、两个slave的IP信息现在如下:

image.png

image.png

至此,MySQL-MMM读写分离的高可用架构经简单测试均OK!以下是小结:

1、若master01主节点宕机,由master02备选主节点接管写角色,slave1,slave2指向新master2主库进行复制,slave01,slave02会自动change master到master02。

2、若master01主节点宕机,而master02同步又落后于master01时就变成了主可写状态,则这时的数据主无法保证一致性。

3、若master02,slave01,slave02延迟于master01主,而这个时master01宕机,slave01,slave02将会等待数据追上master01后,再重新指向新的主master02进行复制操作,这时的数据也无法保证同步的一致性。

4、对外提供读写的虚拟IP是由monitor程序控制。如果monitor没有启动那么db服务器不会被分配虚拟ip,但是如果已经分配好了虚拟ip,当monitor程序关闭了,则原先分配的虚拟ip不会关闭,只要不重启网络,外部程序还可以连接访问,这样能对monitor的可靠性要求降低一些,但是如果这时其中的某一个db服务器故障了就无法处理切换。因为agent程序受monitor程序的控制,处理主库切换、从库切换等操作。如果monitor进程关闭了那么agent进程就起不到什么作用,它本身不能处理故障。

5、monitor程序负责监控db服务器的状态,包括Mysql数据库、服务器是否运行、复制线程是否正常、主从延时等,以及控制agent程序处理故障。因此monitor是这个高可用架构中的核心角色,同时也是单点故障的风险点,应该能通过keepalived等方式将monitor也做成高可用,等以后有时间我再进行测试。

6、monitor监控端的配置文件参数“auto_set_online”可以让从故障中恢复的节点自动online,待有空测试下。群集中节点服务器的状态有三种分别是:HARD_OFFLINEAWAITING_RECOVERYonline

7、默认monitor会控制mmm_agent会将writer db服务器read_only修改为OFF,其它的db服务器read_only修改为ON,所以为了严谨可以在所有的服务器的my.cnf文件中加入read_only=1,由monitor控制writer和read,root用户和复制用户不受read_only参数的影响。

本文出自江健龙的技术博客,转载请注明出处 http://blog.51cto.com/jiangjianlong/2073744


本文转自Mr大表哥jianlong1990 博客,原文链接:  http://blog.51cto.com/jiangjianlong/2073744     如需转载请自行联系原作者



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
1月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
163 3
Mysql高可用架构方案
|
2月前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
143 1
|
3月前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
2月前
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
178 0
|
1月前
|
SQL 存储 缓存
【赵渝强老师】MySQL的体系架构
本文介绍了MySQL的体系架构,包括Server层的7个主要组件(Connectors、Connection Pool、Management Service & Utilities、SQL Interface、Parser、Optimizer、Query Caches & Buffers)及其作用,以及存储引擎层的支持情况,重点介绍了InnoDB存储引擎。文中还提供了相关图片和视频讲解。
【赵渝强老师】MySQL的体系架构
|
23天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
3月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
19 3

推荐镜像

更多