一、MySQL-MMM概述

1、MySQL-MMM的概念

MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。

MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热

可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个 Slave 的 read 负载均衡。

2、MySQL-MMM的优缺点以及应用场景

MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。

优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证 的数据的一致性。当主服务器挂掉以后,另一个主立即接管,其他的从服务器能自动切换,不用人工干预。

缺点:monitor节点是单点,不过这个你也可以结合keepalived或者haertbeat做成高可用;至少三个节点,对主机的数量有要求,需要实现读写分离,还需要在前端编写读写分离程序。在读写非常繁忙的业务系统下表现不是很 稳定,可能会出现复制延时、切换失效等问题。MMM方案并不太适应于对数据安全性要求很高,并且读、写 繁忙的环境中。

适用场景: MMM的适用场景为数据库访问量大,并且能实现读写分离的场景。

3、MySQL-MMM工作原理

MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并能管理 MySQL Master-Master 复制的配置。

关于 MMM 高可用架构的说明如下:

●mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监控主机上运行。

●mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。

●mmm_control:一个简单的脚本,提供管理 mmm_mon 进程的命令。

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

在整个监管过程中,需要在 MySQL 中添加相关授权用户,以便让 MySQL 可以支持监控主机的维护。 授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户。

MySQL-MMM高可用集群搭建_数据库

 

 

4、MySQL-MMM部署所需资源

名称 数量 说明
主DB服务器 2 用于主备模式的主主复制配置
从DB服务器 0-N 可以配置0台或者多台,但不建议多台
监控服务器 1 用于监控MySQL复制集群
IP地址 2*(n+1) n为MySQL服务器数量(DB)
监控用户(mmm_mon) 1 用于监控数据库状态的MySQL用户
代理用户(mmm_agent) 1 用于MMM代理的MySQL用户
复制用户 1 用户MySQL复制的MySQL用户

5、高可用的概念

指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性

6、单点故障的概念

指一个系统提供相同功能的组件只有一个,如果失效,会影响整个系统的正常使用

二、搭建 MySQL MMM的操作步骤

1、环境准备

1.1 数据库分配

主机

ip

hostname

server id

所需安装

monitoring host

192.168.229.50

monitor

mysql-mmm

master 1

192.168.229.90

db1

1

mysql5.7、mysql-mmm

master 2

192.168.229.80

db2

2

mysql5.7、mysql-mmm

slave 1

192.168.229.70

db3

3

mysql5.7、mysql-mmm

slave 2

192.168.229.60

db4

4

mysql5.7、mysql-mmm

 1.2 虚拟IP

ip

role

192.168.229.100

writer

192.168.229.101

reader

192.168.229.102

reader

1.3 数据库同步需要的用户

 

function

description

privileges

monitor user

mmm监控用于对mysql服务器进程健康检查

REPLICATION  CLIENT

agent user

mmm代理用来更改只读模式,复制的主服务器等

SUPER,  REPLICATION CLIENT, PROCESS

replication user

用于复制

REPLICATION SLAVE

 

 

 

所有服务器关闭防火墙

systemctl stop firewalld 
setenforce 0

2、搭建 MySQL 多主多从模式

2.1 修改 master01 配置文件

vim /etc/my.cnf
......
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1                                               #每台 Mysql 主机的 server-id 不能相同
log-error=/usr/local/mysql/data/mysql_error.log             #错误日志
general_log=ON                                              #通用查询日志
general_log_file=/usr/local/mysql/data/mysql_general.log
slow_query_log=ON                                           #慢查询日志
slow_query_log_file=mysql_slow_query.log
long_query_time=5
binlog-ignore-db=mysql,information_schema        #不需要同步的库名
log_bin=mysql_bin                                #开启二进制日志用于主从数据复制
log_slave_updates=true                           #允许slave从master复制数据时可以写入到自己的二进制日志
sync_binlog=1                            #"双1设置",MySQL 在每写一次二进制日志时都会同步到磁盘中去    
innodb_flush_log_at_trx_commit=1         #"双1设置",每次事务提交时MySQL都会把缓存的数据写入日志文件,并且刷到磁盘中去
auto_increment_increment=2               #自增字段一次递增多少
auto_increment_offset=1                  #自增字段的起始值

2.2 把配置文件复制到其它 3 台数据库服务器上并启动服务器,注意:配置文件中的 server_id 要修改

scp /etc/my.cnf root@192.168.229.80:/etc/
scp /etc/my.cnf root@192.168.229.70:/etc/
scp /etc/my.cnf root@192.168.229.60:/etc/

systemctl restart mysqld

2.3 配置主主复制,两台主服务器相互复制

在两台主服务器上都执行授予从的权限,从服务器上不需要执行

grant replication slave on *.* to 'replication'@'192.168.229.%' identified by '12345';

2.4 在两台主服务器上查看,记录日志文件名称和同步点

show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000002 |    154   |              |                  |
+-------------------+----------+--------------+------------------+

2.5 在 master01 上配置同步

change master to master_host='192.168.229.80',master_user='replication',master_password='12345',master_log_file='mysql_bin.000002',master_log_pos=618;

start slave;

show slave status\G
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

2.6 在 master02 上配置同步

change master to master_host='192.168.229.90',master_user='replication',master_password='12345',master_log_file='mysql_bin.000002',master_log_pos=618;

start slave;

show slave status\G
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

2.7 配置主从复制,在两台从服务器上做

change master to master_host='192.168.229.90',master_user='replication',master_password='123456',master_log_file='mysql_bin.000002',master_log_pos=154;

start slave;

show slave status\G
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

2.8 测试主主、主从 同步情况

create database db_test;

3、安装配置 MySQL-MMM

3.1 在所有服务器上安装 MySQL-MMM

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install epel-release
yum -y install mysql-mmm*

3.2 在 master01 上对 MySQL-MMM 进行配置

cd /etc/mysql-mmm/
vim mmm_common.conf
……
<host default>
    cluster_interface       ens33
    ……
    replication_user        replication
    replication_password    12345
    agent_user              mmm_agent
    agent_password          12345

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

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

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

<host db4>
    ip      192.168.229.60
    mode    slave
</host>

<role writer>
    hosts   db1, db2
    ips     192.168.229.100
    mode    exclusive           #只有一个 host 可以进行写操作模式
</role>

<role reader>
    hosts   db3, db4
    ips     192.168.229.101, 192.168.229.102
    mode    balanced            #多个 slave 主机可以进行读操作模式
</role>

3.3 把配置文件复制到其它 4 台主机,所有主机该配置文件内容都是一样的  

scp mmm_common.conf root@192.168.229.80:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.229.70:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.229.60:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.229.50:/etc/mysql-mmm/

3.4 修改所有数据库服务器的代理配置文件 mmm_agent.conf  

vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1				#根据不同的主机分别修改为 db1,db2,db3,db4

3.5 在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf

vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
.....
    ping_ips        	192.168.229.90,192.168.229.80,192.168.229.70,192.168.229.50    #指定所有数据库服务器的 IP
	auto_set_online		10				#指定自动上线时间
</monitor>

<host default>
    monitor_user        mmm_monitor		#指定 mmm_monitor 的用户名
    monitor_password    12345                   #指定 mmm_monitor 的密码
</host>

3.6 在所有数据库上为 mmm_agent(代理进程)授权

grant super, replication client, process on *.* to 'mmm_agent'@'192.168.229.%' identified by '12345';

3.7 在所有数据库上为 mmm_moniter(监控进程)授权

grant replication client on *.* to 'mmm_monitor'@'192.168.229.%' identified by '12345';

flush privileges;

3.8 在所有数据库服务器上启动 mysql-mmm-agent

systemctl start mysql-mmm-agent.service
systemctl enable mysql-mmm-agent.service

3.9 在 monitor 服务器上启动 mysql-mmm-monitor

systemctl start mysql-mmm-monitor.service  

4、 在 monitor 服务器上测试群集

4.1  查看各节点的情况

mmm_control show
  db1(192.168.229.90) master/ONLINE. Roles: writer(192.168.229.100)
  db2(192.168.229.80) master/ONLINE. Roles: 
  db3(192.168.229.70) slave/ONLINE. Roles: reader(192.168.229.101)
  db4(192.168.229.60) slave/ONLINE. Roles: reader(192.168.229.102)

4.2 检测监控功能是否都完善,需要各种OK

mmm_control checks all

4.3 指定绑定 VIP 的主机

mmm_control move_role writer db2

5、故障测试

mmm_control move_role writer db1

5.1 停止 master01 确认 VIP 是否移动到 master02 上。注意:master01 主服务器恢复服务后,不会抢占

mmm_control show
  db1(192.168.229.90) master/HARD_OFFLINE. Roles:
  db2(192.168.229.80) master/ONLINE. Roles: writer(192.168.229.100)

5.2 停止一台从服务器,另一台将接管两个虚拟IP,以保证业务不停止

mmm_control show

6、客户端测试

6.1 在 master01 服务器上为 monitor 服务器地址授权登录

grant all on *.* to 'lili'@'192.168.229.88' identified by '12345';
flush privileges;

6.2 在 monitor 服务器上使用 VIP 登录

yum install -y mariadb-server mariadb
systemctl start mariadb.service

mysql -ulili -p -h 192.168.229.100

6.3 创建数据,测试同步情况

create database testdba;
三、搭建 MySQL MMM

1、环境准备,关闭所有服务器防火墙

[root@192 ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@192 ~]# setenforce 0
setenforce: SELinux is disabled

MySQL-MMM高可用集群搭建_数据库服务器_02  

2、搭建 MySQL 多主多从模式

2.1 修改 master01 配置文件

MySQL-MMM高可用集群搭建_数据库_03

MySQL-MMM高可用集群搭建_配置文件_04  

2.2 把配置文件复制到其它 3 台数据库服务器上并重启mysql,注意:配置文件中的 server_id 要修改

MySQL-MMM高可用集群搭建_数据库服务器_05  

2.3 配置主主复制,两台主服务器相互复制

在两台主服务器上都执行授予从的权限,从服务器上不需要执行

MySQL-MMM高可用集群搭建_mysql_06  

2.4 在两台主服务器上查看,记录日志文件名称和同步点

MySQL-MMM高可用集群搭建_数据库服务器_07  

2.5 在 master01 上配置同步

MySQL-MMM高可用集群搭建_服务器_08  

2.6 在 master02 上配置同步

MySQL-MMM高可用集群搭建_数据库服务器_09  

2.7 配置主从复制,在两台从服务器上做

MySQL-MMM高可用集群搭建_mysql_10  

2.8 测试主主、主从 同步情况

在master1服务器上创建数据库,测试是否同步

MySQL-MMM高可用集群搭建_配置文件_11  

3、安装配置 MySQL-MMM

3.1 在所有服务器上安装 MySQL-MMM

MySQL-MMM高可用集群搭建_配置文件_12  

3.2 在 master01 上对 MySQL-MMM 进行配置

MySQL-MMM高可用集群搭建_数据库服务器_13

MySQL-MMM高可用集群搭建_数据库服务器_14  

3.3 把配置文件复制到其它 4 台主机,所有主机该配置文件内容都是一样的 

MySQL-MMM高可用集群搭建_数据库服务器_15  

3.4 修改所有数据库服务器的代理配置文件 mmm_agent.conf

  根据不同的主机分别修改为 db1,db2,db3,db4 

[root@192 mysql-mmm]# vim /etc/mysql-mmm/mmm_agent.conf    

MySQL-MMM高可用集群搭建_数据库_16  

3.5 在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf

MySQL-MMM高可用集群搭建_服务器_17  

3.6 在所有数据库上为 mmm_agent(代理进程)授权

MySQL-MMM高可用集群搭建_数据库服务器_18  

3.7 在所有数据库上为 mmm_moniter(监控进程)授权

MySQL-MMM高可用集群搭建_配置文件_19  

3.8 在所有数据库服务器上启动 mysql-mmm-agent

MySQL-MMM高可用集群搭建_数据库_20  

3.9 在 monitor 服务器上启动 mysql-mmm-monitor

MySQL-MMM高可用集群搭建_数据库_21  

4、 在 monitor 服务器上测试群集

4.1  查看各节点的情况

MySQL-MMM高可用集群搭建_数据库_22  

4.2 检测监控功能是否都完善,需要各种OK

MySQL-MMM高可用集群搭建_服务器_23  

4.3 指定绑定 VIP 的主机

MySQL-MMM高可用集群搭建_mysql_24  

5、故障测试

MySQL-MMM高可用集群搭建_mysql_25  

5.1 停止 master01 确认 VIP 是否移动到 master02 上。注意:master01 主服务器恢复服务后,不会抢占

MySQL-MMM高可用集群搭建_配置文件_26

MySQL-MMM高可用集群搭建_配置文件_27  

5.2 停止一台从服务器,另一台将接管两个虚拟IP,以保证业务不停止

MySQL-MMM高可用集群搭建_配置文件_28  

MySQL-MMM高可用集群搭建_服务器_29  

6、客户端测试

6.1 在 master01 服务器上为 monitor 服务器地址授权登录

 MySQL-MMM高可用集群搭建_mysql_30 

6.2 在 monitor 服务器上使用 VIP 登录

MySQL-MMM高可用集群搭建_服务器_31 

6.3 创建数据,测试同步情况

 MySQL-MMM高可用集群搭建_数据库_32