之前整理过一篇:MySQL 8.0 配置文件模板。
但是没细讲一些参数的作用。
这一篇文章,来讲一下MySQL主从复制需要重点关注哪些参数,以及这些参数的作用。
1 复制相关的日志参数
log_bin
主从复制,主库必须开启Binlog,因为是通过把主库Binlog传到从库的relay log,再通过SQL线程把relay log中的内容回放到从库,来完成数据同步的。
binlog_format
这个参数是设置Binlog日志格式的。
这个参数对复制影响还是比较大的:
如果设置成statement,使用一些不确定的函数,可能导致主从数据不一致。
对数据一致性要求较高的场景,建议把binlog_format设置成row。
log_slave_updates
表示从库从主库同步的数据是否在从库也记录Binlog。
比如级联复制:
A -> B -> C
B是必须开启这个参数的,否则C获取不到数据。
2 GTID相关参数
gtid_mode
有四个值:
off:新的事物和复制的事物,都是没有GTID值的,没有GTID的事务,可以称为匿名事务
off_permissive:新的事物是匿名事务,复制中的事务可以是匿名事务,也可以是GTID事务
on_permissive:新的事务是GITD事务,复制中的事务可以是匿名事务,也可以是GTID事务
on:新事务和复制事务都是GTID事务。
并且只能是相邻的两个参数才能修改,比如要把gtid_mode从off改为on需要先改为off_permissive,再改为on_permissive,最后再改成on。
enforce_gtid_consistency
有三个值:
OFF:所有事务都允许违反GTID一致性
ON:不允许事务违反GTID一致性
WARN:所有事务都允许违反GTID一致性,但是会给出警告,并且会打印在错误日志里。
当我们需要在线开启GTID时,建议先把这个参数调整为WARN,观察一段时间,看是否有业务执行了违反GTID一致性的SQL,如果有,就调整代码,不然直接设置为ON,可能会导致业务中断。
3 主从差异配置
server_id
在同一个复制拓扑中,server_id一定不能重复。
否则就会报server_id重复的错。
read_only
通常主从架构中,从库建议设置成只读,防止在从库做了变更,没同步到主库,导致主从数据不一致的场景。
4 双主相关配置
auto_increment_increment
这个参数可以使用在双主场景,控制自增主键的间隔。
auto_increment_offset
控制自增列的初始值。
5 复制过滤
replicate_do_db
只同步某个库。
replicate_ignore_db
忽略同步某个库。
replicate_do_table
只同步某些表。
replicate_ignore_table
忽略同步某些表。
replicate_wild_do_table
指定同步某些表,支持正则。
replicate_wild_ignore_table
忽略同步某一些表,支持正则。
binlog_do_db
只记录指定数据库的Binlog,不过不建议使用,因为Binlog不单单用于复制,还能用于数据恢复。
即使只想复制指定库,也建议使用replicate_do_db。
binlog_ignore_db
不记录指定数据库的Binlog,不建议使用。
6 多线程复制相关配置
slave_parallel_workers
控制复制的线程数。
slave_parallel_type
控制并行复制的策略。
如果是database,表示使用的是MySQL 5.6的按库并行策略;
如果是lagical_clock,表示采用的是5.7新的并行复制逻辑。
binlog_transaction_dependency_tracking
5.7.22新增的参数,可配置成3个值。
COMMIT_ORDER,根据同时进入 prepare 和 commit 来判断是否可以并行的策略。
WRITESET,表示的是对于事务涉及更新的每一行,计算出这一行的哈希值,组成集合 writeset。如果两个事务没有操作相同的行,也就是说它们的 writeset 没有交集,就可以并行。
关于哈希值 哈希值使用唯一索引+库名+表名等信息,调用一个哈希函数得到的。 如果表中有多个唯一索引,那每个唯一索引都有一个哈希值。
WRITESET_SESSION,是在 WRITESET 的基础上多了一个约束,即在主库上同一个线程先后执行的两个事务,在备库执行的时候,要保证相同的先后顺序。
7 半同步复制相关配置
rpl_semi_sync_master_enabled
主库开启半同步复制
rpl_semi_sync_slave_enabled
从库开启半同步复制
rpl_semi_sync_master_wait_point
增强半同步复制
增强半同步复制(也叫无损复制)是在半同步复制基础上做了微调,即主库写数据到 binlog 后,就开始等待从库的应答 ACK,直到至少一个从库写入 Relay log 并进行数据落盘后,才返回给主库消息,通知主库可以执行 commit 操作了,然后主库开始提交到事务引擎层。
由参数rpl_semi_sync_master_wait_point控制。
默认值是AFTER_SYNC。
表示采用前面所讲的半同步复制策略。主库将每个事务写入Binlog和从库,并将Binlog同步到磁盘,同步后,主库等待事务接收的副本确认,收到确认后,主库将事务提交到存储引擎并将结果返回给客户端,然后客户端可以继续。
如果设置成AFTER_COMMIT
表示主库将每个事务写入其二进制日志和从库,同步二进制日志,并将事务提交到存储引擎。提交后,主库等待事务接收的从库确认。收到确认后,主库将结果返回给客户端,然后客户端可以继续。
好的,和复制相关的一些参数就聊到这里。
另外,我的DBA体系课主从复制的这一章,整章是开放试看的。
对复制感兴趣的欢迎观看:
https://www.imooc.com/learn/1397
关注公众号
回复“恢复”,可获取各种场景下的数据恢复方式;
回复“高可用”,可获取9篇MySQL高可用文章;
回复“DBA面试题”,可获取一份DBA面试题PDF。