MMM是mysql管理主主复制架构的工具.主要作用是:监控管理主主复制,当主服务失效,MMM会进行主服务和主备服务之间主从切换,故障转移.在MMM中只会有一台主库对外提供服务.另一台只能进行查询,当运作的主服务出现宕机,将主库迁移到备用的主上,从库会对新的主库进行新的主从配置,类似于Redis的哨兵模式.不支持GTID
.
主从复制
############################## 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的缺点.
- 可能会出现数据不一致的情况(丢失或重复).
- 只基于日志点复制,不支持GTID复制.
- 不支持5.6版本以后出现多线程复制功能.
- 读数据库没有做负载均衡的功能,单点故障(可结合LVS,keepalive).