架构图
10.1.1.207 mysql master + keepalived
10.1.1.206 mysql slave ( backup master ) + keepalived
10.1.1.208 mysql slave
10.1.1.210 mysqlfailover ( monitor )
10.1.1.211 VIP
mysql-failover
配置基于GTIDs的主从
本实验在GTIDs主从的基础上进行,GTIDs配置步骤省略。但不懂的可以参考如下步骤配置 比较简单
1. 修改Master配置文件
vim /etc/my.cnf
添加以下内容
gtid-mode=on -- 启动gtid模式
enforce_gtid_consistency -- 强制gtid一致性 5.6.9之前的版本为disable-gtid-unsafe-statement
log-bin -- master和slave都必须启用binlog
log-slave-updates -- 必须使用
1
2
3
4
5
6
vim /etc/my.cnf
添加以下内容
gtid-mode=on -- 启动gtid模式
enforce_gtid_consistency -- 强制gtid一致性 5.6.9之前的版本为disable-gtid-unsafe-statement
log-bin -- master和slave都必须启用binlog
log-slave-updates -- 必须使用
2. 启动所有MySQL
-- 先启动Master 再启动slave
service mysql start
3.配置slave
-- slave下执行
change master to
master_host='master_ip',
master_port=3306,
master_user='repl',
master_password='redhat',
master_auto_position=1; -- 表示基于GTIDs的主从 MySQL自动判断从哪开始同步 基于GTIDs的主从已经不需要手动指定编号了
start slave; -- 启动slave;
1
2
3
4
5
6
7
8
change master to
master_host='master_ip',
master_port=3306,
master_user='repl',
master_password='redhat',
master_auto_position=1; -- 表示基于GTIDs的主从 MySQL自动判断从哪开始同步 基于GTIDs的主从已经不需要手动指定编号了
start slave; -- 启动slave;
开启master与备用master之间的主从半同步
-- 情景
大家都知道,mysql5.7以前的主从经常会发生延迟(据说5.7彻底解决了主从延迟),试想一下,如果master故障了,要升slave(备用master)为master,但此slave的数据严重延迟于master,甚至是连binlog都还没读过来的那种。那么此时如果数据往这个新master上写,数据肯定会出现混乱。这可是悲剧大事。解决方法如下
-- MySQL半同步复制
开启半同步后,在master提交一个写事务之后,master会block这个事务,直到备用master确认已经接受到了该复制事件,这时master才向应用程序确认提交成功。否则超时中断半同步,直到重新满足条件开启。
在master提交事务之后,而slave未来得及接收复制事件,这时候master crash的话,应用程序会切换到slave上,并重新发起事务,这正好是我们所需要的,满足高可用的初衷。但是这里存在一个缺陷,那就是在master恢复之后,原来的事务已经提交,这时候复制会出现问题。
解决办法:在原来的master恢复之后数据重做(推荐),或者跳过重复数据错误。
-- 模块默认在MYSQL_INSTALL_PATH/lib/plugin/semisync*.so
1. 在master与备用master上开启半同步
-- 安装半同步模块和临时开启半同步 -- 在master与备用master上操作
mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
1
2
mysql>install plugin rpl_semi_sync_masterSONAME 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 在master上启用半同步
mysql> set global rpl_semi_sync_master_enabled = 1; -- 开启为master角色
mysql> set global rpl_semi_sync_master_timeout = 1000; -- 配置
1
2
mysql>set global rpl_semi_sync_master_enabled = 1; --开启为master角色
mysql> set global rpl_semi_sync_master_timeout = 1000; -- 配置
(rpl_semi_sync_master_timeout=1000)表示主库在某次事务中,如果等待时间超过1000毫秒,那么则降级为普通模式,不再等待备库。如果主库再次探测到,备库恢复了,则会自动再次回到Semi-sync状态。建议把半同步跑在高速网络环境中
-- 在备用master上启用半同步
mysql> stop slave; -- 先停止主从 不然即使执行开启半同步命令也没效果
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; -- 开启为slave角色
mysql> start slave;
1
2
3
mysql> stop slave; --先停止主从不然即使执行开启半同步命令也没效果
mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1; --开启为slave角色
mysql> start slave;
-- 修改 master与备用master 配置文件 下次启动生效
vim /etc/my.cnf
添加一下内容
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
1
2
3
4
5
vim/etc/my.cnf
添加一下内容
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
-- 查看半同步状态
show status like '%semi_sync%';
master上
Rpl_semi_sync_master_clients | 1 -- 有一个slave(备用master)开启半同步
Rpl_semi_sync_master_status | ON -- 已开启成功
备用master上
Rpl_semi_sync_slave_status | ON -- 已开启成功
1
2
3
4
5
6
7
8
show status like '%semi_sync%';
master上
Rpl_semi_sync_master_clients | 1 --有一个slave(备用master)开启半同步
Rpl_semi_sync_master_status | ON --已开启成功
备用master上
Rpl_semi_sync_slave_status | ON --已开启成功
安装配置MySQLfailover
在monitor监控机上
-- 安装 使用mysql官方yum源安装
yum install -y mysql-utilities.noarch -- 安装mysqlfailover
yum install -y mysql -- 安装mysql客户端
-- 在所有mysql上给mysqlfailover监控机授权 -- 在master上操作即可 因为会自动同步
mysal> grant create,insert,drop,select,super,replication slave,reload on *.* to 'replm'@'10.1.1.210' identified by 'replm' with grant option;
1
mysal>grant create,insert,drop,select,super,replication slave,reload on *.* to 'replm'@'10.1.1.210' identified by 'replm' with grant option;
-- 修改所有mysql配置
vim /etc/my.cnf
添加以下配置
report_host=10.1.1.210 -- 只读参数 指定报告主机为10.1.1.210(mysqlfailover monitor)
master_info_repository=TABLE -- 把master.info的信息 保存到数据库里面 mysqlfailover必须 原本默认保存到文件
relay_log_info_repository=TABLE -- 把relay_log信息保存到数据库里面 mysqlfailover必须 原本默认保存到文件
1
2
3
4
5
vim/etc/my.cnf
添加以下配置
report_host=10.1.1.210 --只读参数指定报告主机为10.1.1.210(m