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

半同步复制

主要是解决主从数据一致性问题

  1. 主库执行新的事务,commit时,更新 show master status \G ,触发一个信号

  2. binlog dump 接收到主库的 show master status \G信息,通知从库日志更新了

  3. 从库IO线程请求新的二进制日志事件

  4. 主库会通过dump线程传送新的日志事件,给从库IO线程

  5. 从库IO线程接收到binlog日志,当日志写入到磁盘上的relaylog文件时,给主库ACK_receiver线程

  6. ACK_receiver线程触发一个事件,告诉主库commit可以成功了

  7. 如果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就行。

Mysql主从进阶
http://www.jcwit.com/article/22/
作者
Carlos
发布于
2019年6月14日
许可协议