MySQL MMM高可用架构的介绍与搭建

Introduction And Install of MySQL MMM High Availability Architecture

Posted by Boomballa on June 16, 2017

开场白

好久不见,最近又不知不觉的忙碌了起来,许多新项目的数据库已经投入使用了一段时间,需要整理,各种数据归档,更改数据流存储不合理的地方。接下来两篇文章来介绍下MySQL的两种高可用方案,此篇文章来介绍我目前环境中运用最多的MMM架构。

MMM高可用架构介绍及配置使用

MMM(Master-Master Replication Manager for MySQL)是一组灵活的脚本,用于执行MySQL Master-Master复制配置的监视/故障转移和管理(只有一个节点可以随时写入)。 该工具集还能够通过标准主/从架构配置任意数量的从库,达到读库负载平衡,因此您可以通过移动虚拟IP地址,来决定它们是否在复制集群中。 除此之外,它还具有数据备份,节点之间的重新同步等脚本。

MMM官网地址:传送门
MMM使用手册地址:传送门

MMM高可用架构搭建

搭建环境介绍

IP地址 节点角色 节点端口
10.10.13.20 master-1 3306
10.10.13.22 master-2 3306
10.10.13.23 monitor-slave 3306

我这边直接就把monitor搭建在slave上了,在正式线上环境中,大家可以把monitor单独搭建在一台机器上。搭建主从我就不在文章中演示了,相信大家都可以信手拈来了。这里只需要注意一点,搭建主主环境的时候,在master2上执行show master status\G,随便找一个点change过去即可。

MMM monitor与agent的安装

首先安装一下epel的yum源,在monitor-slave上安装monitoragent,在master1master2上安装agent

CentOS6

1.monitor-slave的安装

rpm -ivh http://mirror01.idc.hinet.net/EPEL/6/x86_64/epel-release-6-8.noarch.rpm
yum install mysql-mmm-monitor mysql-mmm-agent -y

2.master1/master2的安装

rpm -ivh http://mirror01.idc.hinet.net/EPEL/6/x86_64/epel-release-6-8.noarch.rpm
yum install mysql-mmm-agent -y

CentOS7

1.monitor-slave的安装

rpm -ivh http://mirror01.idc.hinet.net/EPEL/7/x86_64/e/epel-release-7-10.noarch.rpm
yum install mysql-mmm-monitor mysql-mmm-agent -y

2.master1/master2的安装

rpm -ivh http://mirror01.idc.hinet.net/EPEL/7/x86_64/e/epel-release-7-10.noarch.rpm
yum install mysql-mmm-agent -y

MMM 集群中各个机器上进行赋权

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

MMM 配置文件修改及配置

在monitor那台机器上执行过以上操作后,开始修改配置文件,MMM的配置文件默认会放置在/etc/mysql-mmm/,配置文件包含以下几个:

  • mmm_common.conf
  • mmm_agent.conf
  • mmm_mon.conf
  • mmm_mon_log.conf
mmm_common.conf

mmm_common.confmonitoragent上最主要的配置文件,不管什么角色,都要有这个配置文件,内容如下:

[shell ~]# cat /etc/mysql-mmm/mmm_common.conf 

active_master_role      writer

<host default>
    cluster_interface       bond0
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        repl
    replication_password    repl
    agent_user              mmm_agent
    agent_password          mmm_agent
</host>

<host db1>
    ip      10.10.13.20
    mode    master
    peer    db2
</host>

<host db2>
    ip      10.10.13.22
    mode    master
    peer    db1
</host>

<host db3>
    ip      10.10.13.23
    mode    slave
</host>

<role writer>
    hosts   db1, db2
    ips     10.10.13.26
    mode    exclusive
</role>

<role reader>
    hosts   db2, db3
    ips     10.10.13.27
    mode    balanced
</role>

配置文件mmm_common.conf中各项配置解读:

  • active_master_role 在线主机的角色 writer/reader,设置为writer,就是为可写的主机,reader则会被设置为read_only=1

<host default>

  • cluster_interface   集群绑定虚拟IP的网卡
  • pid_path        pid文件存放目录
  • bin_path        bin的存放目录
  • replication_user    集群复制账户名称
  • replication_password  集群复制账户密码
  • agent_user      agent用户账户名称
  • agent_password    agent用户账户密码

<host role_name>

  • ip    角色IP地址
  • mode   角色模式 master/slave
  • peer   监视主机的角色,不要指定本机,指定除了本机以外的角色

<role writer>

  • hosts  可以成为写入节点的IP地址
  • ips   写入节点的虚拟IP,只可在一台master上面出现
  • mode   写入角色的运行模式 exclusive(独占模式)/balanced(均衡模式),写入节点一般设置单点写入exclusive(独占模式)。

<role reader>

  • hosts  读节点的所有IP地址
  • ips   读角色虚拟IP地址,可以设置多个
  • mode   读角色的运行模式 exclusive(独占模式)/balanced(均衡模式),读节点一般设置轮询balanced(均衡模式)。
mmm_agent.conf

mmm_agent.conf这个文件是指定该机器的角色的,mmm_common.conf中指定该台机器是什么角色,就在次配置文件配置,该台展示配置文件服务器角色为db3,内容如下:

[shell ~]# cat /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 db3

配置文件mmm_agent.conf中配置解读,这里面只有两个有效配置:

  • include  此项为默认,保持默认即可
  • this    此处指定该机器角色即可
mmm_mon.conf

mmm_mon.conf这个文件只需要在monitor机器上面配置,主要是为了指定monitor监控进程的。

[shell ~]# cat /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            10.10.13.20,10.10.13.22,10.10.13.23
    auto_set_online     60
    mode                active

    # 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    mmm_monitor
</host>

debug 0

配置文件mmm_mon.conf中各项配置解读:

  • include mmm_common.conf,此项保持默认即可

<monitor>

  • ip         一般设置127.0.0.1,monitor本机就可以。
  • pid_path      monitor进程pid文件位置
  • bin_path      monitor进程bin文件位置
  • status_path      monitor status文件存放位置
  • ping_ips      设置集群中比较重要的数据库服务器节点IP地址即可
  • auto_set_online    判断为online状态的轮询时间
  • mode        monitor模式,active(自动)/manual(手动)/passive(被动)

<host default>

  • monitor_user monitor用户名称
  • monitor_password monitor用户密码

  • debug 是否为调试模式,0(否)/1(是)
mmm_mon_log.conf

mmm_mon_log.conf是指定monitor日志文件的配置文件,一般默认即可,需要个性化设置,可以进行配置。

[shell ~]# cat mmm_mon_log.conf 
#log4perl.logger = FATAL, MMMLog, MailFatal
log4perl.logger = FATAL, MMMLog

log4perl.appender.MMMLog = Log::Log4perl::Appender::File
log4perl.appender.MMMLog.Threshold = INFO
log4perl.appender.MMMLog.filename = /var/log/mysql-mmm/mmm_mond.log
log4perl.appender.MMMLog.recreate = 1
log4perl.appender.MMMLog.layout = PatternLayout
log4perl.appender.MMMLog.layout.ConversionPattern = %d %5p %m%n

#log4perl.appender.MailFatal = Log::Dispatch::Email::MailSender
#log4perl.appender.MailFatal.Threshold = FATAL
#log4perl.appender.MailFatal.from = [email protected]
#log4perl.appender.MailFatal.to = root
#log4perl.appender.MailFatal.buffered = 0
#log4perl.appender.MailFatal.subject = FATAL error in mysql-mmm-monitor
#log4perl.appender.MailFatal.layout = PatternLayout
#log4perl.appender.MailFatal.layout.ConversionPattern = %d %m%n

MMM Monitor和Agent启动

Agent节点上只需要配置 mmm_agent.confmmm_common.confMonitor上除了刚才那两个配置文件,还需要配置mmm_mon.confmmm_mon_log.conf。注意MonitorAgentmmm_agent.confmmm_common.conf信息要保持一致。

各个Agent节点上启动agent进程:

[shell ~]# /etc/init.d/mysql-mmm-agent  start

Monitor节点启动monitor进程:

[shell ~]# /etc/init.d/mysql-mmm-monitor  start

备注:这里需要注意一下,如果你的环境是CentOS7,那么需要先添加启动项,然后启动:

Agent节点上:

[shell ~]# systemctl enable mysql-mmm-agent
[shell ~]# systemctl start mysql-mmm-agent

Monitor节点上:

[shell ~]# systemctl enable mysql-mmm-agent
[shell ~]# systemctl start mysql-mmm-agent
[shell ~]# systemctl enable mysql-mmm-monitor
[shell ~]# systemctl start mysql-mmm-monitor

MMM 常用命令的使用和说明

mmm_control help

显示帮助信息

[shell ~]# mmm_control help  
Valid commands are:
    help                              - show this message
    ping                              - ping monitor
    show                              - show status
    checks [<host>|all [<check>|all]] - show checks status
    set_online <host>                 - set host <host> online
    set_offline <host>                - set host <host> offline
    mode                              - print current mode.
    set_active                        - switch into active mode.
    set_manual                        - switch into manual mode.
    set_passive                       - switch into passive mode.
    move_role [--force] <role> <host> - move exclusive role <role> to host <host>
                                        (Only use --force if you know what you are doing!)
    set_ip <ip> <host>                - set role with ip <ip> to host <host>
mmm_control ping

Ping monitor守护进程以检查它是否仍然存在。

[shell ~]# mmm_control ping
OK: Pinged successfully!

如果monitordown掉了,会显示:

[shell ~]# mmm_control ping
ERROR: Can't connect to monitor daemon!
mmm_control show

显示当前的群集状态。 可以查看各个不同节点的状态。

[shell ~]# mmm_control show
  db1(10.10.13.20) master/ONLINE. Roles: writer(10.10.13.26)
  db2(10.10.13.22) master/ONLINE. Roles: reader(10.10.13.27)
  db3(10.10.13.23) slave/ONLINE. Roles:
mmm_control checks

显示 被指定/所有 机器的信息。

用法: mmm_control checks host/all

[shell ~]# mmm_control checks
db2  ping         [last change: 2017/06/12 12:13:34]  OK
db2  mysql        [last change: 2017/06/12 12:13:34]  OK
db2  rep_threads  [last change: 2017/06/12 12:13:34]  OK
db2  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null
db3  ping         [last change: 2017/06/12 12:13:34]  OK
db3  mysql        [last change: 2017/06/12 12:13:34]  OK
db3  rep_threads  [last change: 2017/06/12 12:13:34]  OK;
db3  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null
db1  ping         [last change: 2017/06/12 12:13:34]  OK
db1  mysql        [last change: 2017/06/12 12:13:34]  OK
db1  rep_threads  [last change: 2017/06/12 12:13:34]  OK
db1  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null

[shell ~]# mmm_control checks db1
db1  ping         [last change: 2017/06/12 12:13:34]  OK
db1  mysql        [last change: 2017/06/12 12:13:34]  OK
db1  rep_threads  [last change: 2017/06/12 12:13:34]  OK
db1  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null

[shell ~]# mmm_control checks db1 rep_backlog
db1  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null

[shell ~]# mmm_control checks all rep_backlog 
db2  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null
db3  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null
db1  rep_backlog  [last change: 2017/06/12 12:13:34]  OK: Backlog is null
mmm_control set_online

当状态为AWAITING RECOVERY或ADMIN OFFLINE时,set_online用于从故障中恢复节点。

用法:mmm_control set_online host

在以下示例中,主机db2已重新启动。 以下是群集状态:

[shell ~]# mmm_control show
  db1(10.10.13.20) master/ONLINE. Roles: writer(10.10.13.26)
  db2(10.10.13.22) master/AWAITING_RECOVERY. Roles:
  db3(10.10.13.23) slave/ONLINE. Roles: reader(10.10.13.27)

所有角色已被移动到主机db1db3,因为db2失败。 现在已经恢复,我们应该设置它上线:

[shell ~]# mmm_control set_online db2
OK: State of 'db2' changed to ONLINE. Now you can wait some time and check its new roles!

[shell ~]# mmm_control show
  db1(10.10.13.20) master/ONLINE. Roles: writer(10.10.13.26)
  db2(10.10.13.22) master/ONLINE. Roles: reader(10.10.13.27)
  db3(10.10.13.23) slave/ONLINE. Roles: 

mmm_control set_offline

set_offline用于将节点手动下线以进行维护。 这将删除所有角色并停止复制。

用法: mmm_control set_offline host

[shell ~]# mmm_control show
  db1(10.10.13.20) master/ONLINE. Roles: writer(10.10.13.26)
  db2(10.10.13.22) master/ONLINE. Roles: reader(10.10.13.27)
  db3(10.10.13.23) slave/ONLINE. Roles: 

[shell ~]#  mmm_control set_offline db1
OK: State of 'db1' changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!

[shell ~]# mmm_control show
  db1(10.10.13.20) master/ADMIN_OFFLINE. Roles: 
  db2(10.10.13.22) master/ONLINE. Roles: writer(10.10.13.26),reader(10.10.13.27)
  db3(10.10.13.23) slave/ONLINE. Roles: 

mmm_control mode

查看当前模式,一共有三种模式,ACTIVE/PASSIVE/MANUAL

  • ACTIVE  自动模式,如果monitor判断写入节点或者读节点数据库有故障,降自动把虚拟IP和角色配置到配置文件中可用的机器上。
  • PASSIVE  被动模式,设置为被动模式,一般是为了调试。
  • MANUAL  手动模式,如果节点发生故障,需要根据需要手动把角色转移到可用的节点上去。

下面示例中为ACTIVE模式:

[shell ~]# mmm_control mode
ACTIVE

三个不同模式的切换是通过以下三个命令:

[shell ~]# mmm_control set_active
 OK: Switched into active mode.

[shell ~]# mmm_control set_passive
 OK: Switched into passive mode.

[shell ~]# mmm_control set_manual
 OK: Switched into manual mode.
mmm_control move_role

这个命令厉害了,这个命令是用于在集群节点之间移动独占角色。 此命令在PASSIVE模式下不可用。 让我们假设以下情况:

用法: mmm_control move_role role host

[shell ~]# mmm_control show
  db1(10.10.13.20) master/ONLINE. Roles: 
  db2(10.10.13.22) master/ONLINE. Roles: writer(10.10.13.26),reader(10.10.13.27)
  db3(10.10.13.23) slave/ONLINE. Roles: 

我们使用move_role将写入角色移动到主机db1

[shell ~]# mmm_control move_role writer db1
OK: Role 'writer' has been moved from 'db2' to 'db1'. Now you can wait some time and check new roles info!

[shell ~]# mmm_control show
  db1(10.10.13.20) master/ONLINE. Roles: writer(10.10.13.26)
  db2(10.10.13.22) master/ONLINE. Roles: reader(10.10.13.27)
  db3(10.10.13.23) slave/ONLINE. Roles: 

此命令还有一种霸道总裁的用法,即: mmm_control move_role --force role host,但是我不建议使用,它可以把角色强行设置到具有 REPLICATION_FAILREPLICATION_DELAY状态的在线数据库主机,请大家谨慎使用。

Tips 几个使用中的小技巧

此处注意,通过对MMM的使用,我发在几个小Tis,分享给大家。
1.配置文件不可直接上传,否则会不可用,还是麻烦点复制粘贴吧。
2.如果MMM集群中,三个实例都并不是在默认端口3306上,区别主要在配置文件mmm_common.conf上,那么此配置文件应该是酱婶的:

[shell ~]# cat mmm_common.conf 
active_master_role      writer

<host default>
    cluster_interface       bond0
    mysql_port              3307
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        repl
    replication_password    repl
    agent_user              mmm_agent
    agent_password          mmm_agent
</host>

<host db1>
    ip      10.10.13.21
    mysql_port      3307
    mode    master
    peer    db2
</host>

<host db2>
    ip      10.10.13.24
    mysql_port      3307
    mode    master
    peer    db1
</host>

<host db3>
    ip      10.10.13.25
    mysql_port      3307
    mode    slave
</host>

<role writer>
    hosts   db1, db2
    ips     10.10.13.28
    mode    exclusive
</role>

<role reader>
    hosts   db2, db3
    ips     10.10.13.29
    mode    balanced
</role>

3.重启Monitor是不需要担心Vip的问题的,就算你把Monitor关了也无所谓,Vip和已存在的连接会一直在的。
4.手工切换写入节点IP时候,尽量选在业务低峰期,不然有可能会早晨数据不一致,出现同步错误,主键冲突啊什么的。

结束语

Done,不知道大家看了之后对于MMM高可用环境有什么影响,总体感觉还是比较灵活的,进行主主写节点切换的时候代价也不是很大,在线切即可,我们目前在使用中,觉得还是比较方便的,算是个不错的高可用方案,还有一种,就是MHA了,那种后面文章我也会进行详细的介绍,不好意思,篇幅都有些长,大家挑着看即可了,有什么使用中的疑问,欢迎沟通,一起探讨。