MMM是mysql管理主主复制架构的工具.主要作用是:监控管理主主复制,当主服务失效,MMM会进行主服务和主备服务之间主从切换,故障转移.在MMM中只会有一台主库对外提供服务.另一台只能进行查询,当运作的主服务出现宕机,将主库迁移到备用的主上,从库会对新的主库进行新的主从配置,类似于Redis的哨兵模式.不支持GTID.

image-20200107165017131.png

主从复制

##############################   Master    ##############################
# 创建用于复制账号 
MySQL > create user qvbilam_copy@'192.168.128.%' identified by 'qvbilam';
# 给qvbilam_copy_slave的指定ip段salve权限
MySQL > grant replication slave on *.* to 'qvbilam_copy'@'192.168.128.%';
# 重新加载权限
MySQL > FLUSH PRIVILEGES;
# 备份(不支持GTID复制) master-data=1:日志点复制信息,2:GTID复制信息
mysqldump --single-transaction --master-data=1 -A -uroot -p > /data/backup/mmm.sql
# 回去mmm.sql日志点信息
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000034', MASTER_LOG_POS=827;
# 传输
scp /data/backup/mmm.sql 192.168.128.132:/data
scp /data/backup/mmm.sql 192.168.128.134:/data
##############################   Slave.     ##############################
mysql -uroot -p < /data/mmm.sql
# 关闭slave,重制slave | 如果之前没配置过slave可以跳过这步
Mysql > stop slave;
Mysql > reset slave;
# 指定master
Mysql > change master to
                master_host='192.168.128.131',
                master_user='qvbilam_copy',
                master_password='qvbilam',
                master_log_file='mysql-bin.000034',
                master_log_pos=827;
# 启动slave
Mysql > start slave;
# 验证Slave_IO_Running 和 Slave_SQL_Running 是否为yes
Mysql > show slave status \G;

主主复制

  简单理解就是互为主从,需要注意的是:在主库称为主备库的从服务器的时候,需要获取到主备的日志偏移量,而不是自己的偏移量.

##############################   Master backup   ##############################
mysql -uroot -p < /data/mmm.sql
# 获取134主备的偏移量信息
Mysql > show master status \G;
*************************** 1. row ***************************
                 File: mysql-bin.000007
         Position: 863417
# 主备 成为 主的从库
Mysql > change master to
                master_host='192.168.128.131',
                master_user='qvbilam_copy',
                master_password='qvbilam',
                master_log_file='mysql-bin.000034',
                master_log_pos=827;
Mysql > start slave;
###### 注意
-- 这里注意一下,一定要改配置中的server-id,不能和其他server-id重复!
-- 导致Slave_IO_Running 为NO,解决办法改好后重启mysql,stop slave; start slave;
##############################      Master       ##############################
# 主 成为 主备的从库
Mysql > change master to
                master_host='192.168.128.134',
                master_user='qvbilam_copy',
                master_password='qvbilam',
                master_log_file='mysql-bin.000007',
                master_log_pos=863417;
Mysql > start slave;
##############################       TEST        ##############################
# 主库插入数据
insert into qvbilam values(5,'我是主库');
# 主备插入数据
insert into qvbilam values(6,'我是主备库');
# 三台查看结果是否一致
select * from qvbilam;

依赖包安装

  只有使用了yum的epel源才能下载到mysql-mmm的依赖包.

#######################    注意    ########################
# epel-release版本一定要注意!
# centos7 安装 epel-release7
# centos6 安装 epel-release6 | 这个不确定,我centos7安装6报错:perl(:MODULE_COMPAT_5.10.1)
# 如果/etc/yum.repos.d/epel.repo 为空
yum remove epel-release -y
# 这个安装的不用再改下面的配置了~非常方便
yum install epel-release -y
yum clean all && yum makecache
#######################   分割线   ########################
# 下载yum拓展源
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
# 安装
rpm -ivh epel-release-6-8.noarch.rpm
vim /etc/yum.repos.d/epel.repo
# 修改配置
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
# 修改内容: 注释baseurl, 去掉mirrorlist的注释.
yum search mmm
# 返回内容包含下面说明成功配置好epel源
mysql-mmm-agent.noarch : MMM Database Server Agent Daemon and Libraries # 代理守护进程库需要每个服务器都安装
mysql-mmm-monitor.noarch : MMM Monitor Server Daemon and Libraries
mysql-mmm-tools.noarch : MMM Control Scripts and Libraries
mysql-mmm.noarch : Multi-Master Replication Manager for MySQL
# 安装mysql-mmm-agent.noarch
yum install -y mysql-mmm-agent.noarch
#######################    流畅操作    ########################
# 一台安装的坑踩完了,直接复制粘贴下面命令,一行命令复制粘贴Amazing!!!
yum remove -y epel-release && yum install epel-release -y && yum clean all && yum makecache && yum install -y mysql-mmm-agent.noarch
# 监控服务器
yum install -y mysql-mmm*

配置

#######################    用户创建    ########################
# 创建监听服务账号 - 只需要在主库创建,其他会自动同步
MySQL > create user qvbilam_monitor@'192.168.128.%' identified by 'qvbilam';
# 给qvbilam_copy_slave的指定ip段replication client权限
MySQL > grant replication client on *.* to 'qvbilam_monitor'@'192.168.128.%';
# 创建执行故障转移主备切换的代理用户
MySQL > create user qvbilam_agent@'192.168.128.%' identified by 'qvbilam';
# 给qvbilam_copy_slave的指定ip段replication client权限
MySQL > grant super,replication client,process on *.* to 'qvbilam_agent'@'192.168.128.%';
# 重新加载权限
MySQL > FLUSH PRIVILEGES;

#######################    修改通用配置    ########################
# 查看网卡配置
ifconfig
# 部分信息:获得网卡是ens33.检查每个服务器是否一致
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.128.131  netmask 255.255.255.0  broadcast 192.168.128.255
# 修改common配置
vim /etc/mysql-mmm/mmm_common.conf
-- 配置如下 ### 为我添加的注释说明
active_master_role      writer    ### 活动中的主规则是 写 ,不用改

<host default>
    cluster_interface       ens33    ### 对应的网卡,默认eth0,我的是ens33.
    pid_path                /run/mysql-mmm-agent.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        qvbilam_copy_slave    ### 复制用户账号
    replication_password    '123!@#qwe'    ### 复制用户密码   
    agent_user              qvbilam_agent_slave    ### 代理用户账号   
    agent_password          '123!@#qwe'    ### 代理用户密码
</host>

<host db1>    ### 主服务器,修改ip
    ip      192.168.128.131
    mode    master
    peer    db2
</host>

<host db2>    ### 主备服务器,修改ip
    ip      192.168.128.134
    mode    master
    peer    db1
</host>

<host db3>    ### 从服务器,修改ip
    ip      192.168.128.132
    mode    slave
</host>

<role writer>    ### 写的数据库为db1,db2.分配虚拟ip
    hosts   db1, db2
    ips     192.168.128.30
    mode    exclusive
</role>

<role reader>    ### 读的数据库虚拟ip.主库也可以进行读.随个人意愿
    hosts   db1, db2, db3
    ips     192.168.128.31,192.168.128.32,192.168.128.33
    mode    balanced
</role>
-- 配置结束
# 将配置拷贝到所有服务器上,如果服务器的网卡都不相同记得修改cluster_interface
scp /etc/mysql-mmm/mmm_common.conf root@192.168.128.132:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf root@192.168.128.134:/etc/mysql-mmm/
# 此外还需要修改agent配置
vim /etc/mysql-mmm/mmm_agent.conf
# 将每台服务下的这条配置改成commen中对应的db名.
this db1

#######################    修改监听配置    ########################
# 进入监听服务器修改配置
vim /etc/mysql-mmm/mmm_mon.conf
# 修改内容
    ### 监听的ip地址
    ping_ips            192.168.128.131,192.168.128.132,192.168.128.134
    ### 宕机恢复后自动在线时间60
    auto_set_online     60
    #监控用户账号密码
    monitor_user        qvbilam_monitor_slave
    monitor_password    '123!@#qwe'
# 修改内容以上

启动

# 所有服务器启动代理
systemctl start mysql-mmm-agent.service 或
service mysql-mmm-agent start
# 启动监控
systemctl start mysql-mmm-monitor.service 或
service mysql-mmm-monitor start
# 查看状态...连接不上
mmm_control show
# Warning: agent on host db1 is not reachable
# Warning: agent on host db2 is not reachable
# Warning: agent on host db3 is not reachable
  db1(192.168.128.131) master/HARD_OFFLINE. Roles:
  db2(192.168.128.134) master/HARD_OFFLINE. Roles:
  db3(192.168.128.132) slave/HARD_OFFLINE. Roles:
# 检查节点问题
mmm_control checks all
# 出现错误
UNKNOWN: Error occurred: install_driver(mysql) failed: Can't load '/usr/lib64/perl5/vendor_perl/auto/DBD/mysql/mysql.so for module DBD::mysql: libmysqlclient.so.18: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 190, <STDIN> line 1.
# 缺少libmysqlclient.so.18,建立软连接
ln -s /usr/lib64/mysql/libmysqlclient.so.18.0.0 /usr/lib/libmysqlclient.so.18
# 再次查看状态
mmm_control show
  db1(192.168.128.131) master/ONLINE. Roles: reader(192.168.128.33), writer(192.168.128.131)
  db2(192.168.128.134) master/ONLINE. Roles: reader(192.168.128.32)
  db3(192.168.128.132) slave/ONLINE. Roles: reader(192.168.128.31)
# 可以看到每台服务器都有一个读的虚拟ip,都是自动配置上的.

测试

  关闭db1(主库)的mysql服务后查看mmm状态发现,db2已从主备库变成了主库.而db3分配到了两个读的ip(我前面在配置conf文件时候虚拟ip没有分配好导致的..理解万岁).

# 关闭db1的mysql服务后查看mmm状态
mmm_control show
# Warning: agent on host db1 is not reachable
  db1(192.168.128.131) master/AWAITING_RECOVERY. Roles:
  db2(192.168.128.134) master/ONLINE. Roles: reader(192.168.128.32), writer(192.168.128.131)
  db3(192.168.128.132) slave/ONLINE. Roles: reader(192.168.128.31), reader(192.168.128.33)

  当主库db1存在的时候,db3只复制db1的数据.而不会复制db2的数据,这个可以自行测试.我测试过.现在就来试试当db1宕机后db3是否会复制db2的数据

#######################    db2 主    ########################
select * from mmm;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    103606
Current database: mmm

+----+---------+
| id | name    |
+----+---------+
|  1 | qvbilam |
+----+---------+
# 插入测试数据
insert into mmm (id,name) value (2,'db2test');
#######################    db3 从    ########################
select * from mmm; # 结果是有数据的.
# 查看主从关系 发现已经从131 切换到了 134
show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.128.134

  恢复db1后发现db2仍然是write,需要手动将db1设置成write

mmm_control show
# 可以看到当恢复db1后的状态
  db1(192.168.128.131) master/ONLINE. Roles: reader(192.168.128.33)
  db2(192.168.128.134) master/ONLINE. Roles: reader(192.168.128.32), writer(192.168.128.131)
  db3(192.168.128.132) slave/ONLINE. Roles: reader(192.168.128.31)
# 执行恢复db1主的权限
mmm_control move_role writer db1
# 验证
mmm_control show
  db1(192.168.128.131) master/ONLINE. Roles: reader(192.168.128.33), writer(192.168.128.131)
  db2(192.168.128.134) master/REPLICATION_FAIL. Roles:
  db3(192.168.128.132) slave/ONLINE. Roles: reader(192.168.128.31)

总结

  当主(db1)宕机后,mmm会将write指向主备(db2),当主(db1)恢复后并不会自动切换.可以让主备(db2)宕机或者手动指定才可以恢复到之前的架构模式.

为了让大家关注更好的MHA架构,这里指总结MMM的缺点.

  1. 可能会出现数据不一致的情况(丢失或重复).
  2. 只基于日志点复制,不支持GTID复制.
  3. 不支持5.6版本以后出现多线程复制功能.
  4. 读数据库没有做负载均衡的功能,单点故障(可结合LVS,keepalive).
Last modification:February 26th, 2020 at 09:30 pm