介绍
实现原理
MMM(Master-Master Replication Manager for MySQL)MySQL主主复制管理器。MMM是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)
MMM的监管端是会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,会将VIP迁移至其他mysql
实验一般来是2主2从,可以实现:
写高可用
当一台主宕机,写VIP立刻飘移到另外一台主库,从库指向另一台主库
读高可用
当一台读宕机,立刻将读VIP漂移到其他服务器上。
概念:
mmm_mond:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。因此脚本需要在监管机上运行
mmm_agentd:运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
mmm_control:一个简单的脚本,提供管理mmm_mond进程的命令。
架构图
MMM实现MySQL高可用案例实验
实验准备:
mysql-1 主:192.168.1.10
mysql-2 主:192.168.1.11
mysql-3 从:192.168.1.12
mysql-4 从:192.168.1.13
mysql-monitor:192.168.1.14
write-VIP:192.168.1.100
read-VIP:192.168.1.200 192.168.1.201
实验流程
这里我直接使用mariadb实现
首先配置双主+两从
四台mysql服务器下载maridb
yum -y install mariadb mariadb-server
修改配置文件
vim /etc/my.cnf
log-bin=mysql-bin
server-id=1
其他三台server-id分别为2、3、4
开启mariadb
systemctl start mariadb
生产环境中增加从库要先将主库上的数据锁表备份到从库中
锁的知识:
lock table read | write
共享锁又称:读锁。当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。
排它锁又称:写锁。当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。包括写锁。
操作:
主库锁表:
mysql
flush tables with read lock;
主库导出数据(10):
mysqldump -uroot --all-databases --opt > mysql_all.$(date +%F).sql
scp mysql_all.当前日期.sql 192.168.1.11:/root
从库导入(11):
mysql -uroot < mysql_all.当前日期.sql
主库解锁
unlock tables;
相互授权,互为主从
主1(10):
mysql
flush master;
show master status;
授权
grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123';flush privileges;
接受授权
change master to master_host='192.168.1.11',master_user='slave',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=245;
开启从模式
show slave status\G
主2(11):
show master status;
授权
grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123';flush privileges;
接受授权
change master to master_host='192.168.1.10',master_user='slave',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=245;
开启从模式
start slave;
查看从库状态
show slave status\G
两个从库(12、13)指定到10为主库
mysql
change master to master_host='192.168.1.10',master_user='slave',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=245;
start slave;
show slave status\G
测试同步复制,10端创建一个库,查看其它三个库是否存在
10:
create database abc;
11、12、13:
show databases;
配置MMM
所有主机都使用阿里网络源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
配置mmm-agent(10-13)
在四台MySQL服务上安装mysql-mmm-agent,先在10端配置
yum -y install mysql-mmm-agent
先在14上安装mysql-mmm-monitor,之后再配置(这一步提前便于直接scp)
yum -y install mysql-mmm-monitor
cd /etc/mysql-mmm/
cp -p mmm_common.conf mmm_common.conf.bak
vim /etc/mysql-mmm/mmm_common.conf
active_master_role writer
<host default>
cluster_interface ens33
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user slave
replication_password 123
agent_user mmm_agent
agent_password 123
</host>
<host db1>
ip 192.168.1.10
mode master
peer db2
</host>
<host db2>
ip 192.168.1.11
mode master
peer db1
</host>
<host db3>
ip 192.168.1.12
mode slave
</host>
<host db4>
ip 192.168.1.13
mode slave
</host>
<role writer>
hosts db1,db2
ips 192.168.1.100
mode exclusive
</role>
<role reader>
hosts db3,db4
ips 192.168.1.200,192.168.1.201
mode balanced
</role>
传给其他主机
scp mmm_common.conf 192.168.1.11:/etc/mysql-mmm/
scp mmm_common.conf 192.168.1.12:/etc/mysql-mmm/
scp mmm_common.conf 192.168.1.13:/etc/mysql-mmm/
scp mmm_common.conf 192.168.1.14:/etc/mysql-mmm/
修改10、11、12、13 /etc/mysql-mmm/mmm_agent.conf为db1、db2、db3、db4
vim /etc/mysql-mmm/mmm_agent.conf
四台数据库给mmm_agent授权
mysql
grant super,replication client,process on *.* to 'mmm_agent'@'192.168.1.%' identified by '123';flush privileges;
exit
四台mysql启动agent服务:
systemctl start mysql-mmm-agent
配置mmm-monitor(14)
vim /etc/mysql-mmm/mmm_mon.conf
开启监控
systemctl start mysql-mmm-monitor.service
查看监控状态
mmm_control show
测试
测试写入高可用:
关闭10的服务,写VIP飘到了11上,在12、13上查看从服务状态主服务器是11端,重启10端mysql关闭11端mysql可以发现VIP又飘了回去
10端:
11端:
此时13、14的库状态自动切换为11为主:
15端:
关闭11库,开启10库飘回去
12、13重新换主库目标
测试读取高可用:关闭mysql3的mysql服务,发现读VIP飘到了mysql4上
首先
关掉12的mysql服务
12端
13端
14端
发布者:LJH,转发请注明出处:https://www.ljh.cool/6576.html