开发者社区> 科技小能手> 正文

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

简介:
+关注继续查看

前言

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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
13896 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18709 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25094 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20434 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
13543 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
9731 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
13952 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14718 0
23705
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载