Mysql主从进阶
延时从库
配置
SQL线程延时:数据已经写入relaylog中了,SQL线程”慢点”运行
一般企业建议3-6小时,具体看公司运维人员对于故障的反应时间
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 300;
mysql>start slave;
mysql> show slave status \G
SQL_Delay: 300
SQL_Remaining_Delay: NULL
延时从库故障案例
如主库发生故障,我们需要从从库恢复数据 具体操作如下:
停止从库sql线程
stop slave sql_thread;
截取relaylog的起点和终点
起点
查看从库relay-log.info文件
cat relay-log.info
终点
查看误操作之前的ID
show relaylog events in ‘db01-relay-bin.000002’
截取
mysqlbinlog –start-position=482 –stop-position=1077 /data/3308/data/db01-relay-bin.000002>/tmp/relay.sql
从库恢复relaylog
source /tmp/relay.sql
解除从库的身份
db01 [relay]>stop slave;
db01 [relay]>reset slave all
半同步复制
主要是解决主从数据一致性问题
主库执行新的事务,commit时,更新 show master status \G ,触发一个信号
binlog dump 接收到主库的 show master status \G信息,通知从库日志更新了
从库IO线程请求新的二进制日志事件
主库会通过dump线程传送新的日志事件,给从库IO线程
从库IO线程接收到binlog日志,当日志写入到磁盘上的relaylog文件时,给主库ACK_receiver线程
ACK_receiver线程触发一个事件,告诉主库commit可以成功了
如果ACK达到了我们预设值的超时时间,半同步复制会切换为原始的异步复制.
配置
加载插件
主:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
从:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看是否加载成功:
show plugins;
启动:
主:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
重启从库上的IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
查看是否在运行
主:
show status like 'Rpl_semi_sync_master_status';
从:
show status like 'Rpl_semi_sync_slave_status';
过滤复制
从库只复制指定的库
具体配置
主库相关参数,不建议配置主库
show master status;
Binlog_Do_DB 白名单
Binlog_Ignore_DB 黑名单
从库配置参数,建议配置
show slave status \G
Replicate_Do_DB: 白名单
Replicate_Ignore_DB: 黑名单
实现过程
从库配置文件添加以下内容,表示从主库只同步db1和db2两个库
/etc/my.cnf
replicate_do_db=db1
replicate_do_db=db2
GTID复制
配置参数
gtid-mode=on --启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true --强制GTID的一致性
log-slave-updates=1 --slave更新是否记入日志
GTID复制和普通复制的区别
(0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
(1)额外功能参数(3个)
(2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;
(3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
(4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式
SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。