MySQL主从复制要调整哪些参数?

科技   2024-08-13 17:21   上海  

之前整理过一篇: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。

MySQL数据库联盟
关注后,回复“高可用”,可获取8篇MySQL高可用文章
 最新文章