配置从库
- 设置并启动并行复制。
- 登录从库。
1
/usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock
- 停止从库,设置并行复制。
1 2 3 4 5 6
stop slave; set global binlog_transaction_dependency_tracking=COMMIT_ORDER; set global transaction_write_set_extraction=XXHASH64; set global binlog_transaction_dependency_tracking=WRITESET; set global slave_parallel_type='LOGICAL_CLOCK'; set global slave_parallel_workers=96;
表1 并行复制参数 参数项
说明
备注
transaction_write_set_extraction
如果使用WriteSet进行并行复制,需设置该参数,该参数用于控制检测事务依赖关系时采用的hash算法。
有三个取值OFF|XXHASH64|MURMUR32
MySQL 5.7版本需要设置,MySQL 8.0版本默认是XXHASH64可以不用设置,而且设置该参数之前需要先设置binlog_transaction_dependency_tracking= COMMIT_ORDER
binlog_transaction_dependency_tracking
用于控制如何决定事务的依赖关系。
有三个取值:
- 默认的COMMIT_ORDER表示继续使用5.7中的基于组提交的方式决定事务的依赖关系;
- WRITESET表示使用写集合来决定事务的依赖关系;
- WRITESET_SESSION表示使用WriteSet来决定事务的依赖关系,但是同一个Session内的事务不会有相同的last_committed值。
slave_parallel_type
该参数控制是否开启并行复制。
默认值DATABASE将会采用MySQL 5.6版本中SCHEMA级别的并行回放(基于库的并行复制),设置为LOGICAL_LOCK则会采用基于GroupCommit的并行回放(基于组提交的并行复制),同一个Group内的事务将会在Slave上并行回放。
slave_parallel_workers
用于控制SQL线程的并行度。
- 如果从库不承担任何业务压力,建议该参数设置成CPU核数(本文服务器有2个鲲鹏920 5250处理器,共计96个核)。
- 如果从库承担业务压力,建议在不影响业务压力的前提下进行调整,可以通过执行SELECT GTID_SUBSET(LAST_SEEN_TRANSACTION,@@GLOBAL.GTID_EXECUTED) from performance_schema.replication_applier_status_by_worker;的结果调整该值。
- 如果等于0,说明当前还有事务未处理完成,可以增加slave_parallel_workers的数值。
- 如果不等于0,说明所有事务已经回放完毕。
- 启动并行复制。
关闭并行复制,先关闭主库的并行复制,然后关闭从库的并行复制。
- 关闭主库的并行复制。
- 关闭主库的并行复制。
1 2 3 4
set global binlog_transaction_dependency_tracking=COMMIT_ORDER; set global transaction_write_set_extraction=XXHASH64; set global slave_parallel_type='DATABASE'; set global slave_parallel_workers=0;
- 确认并行复制关闭成功。
1 2 3 4
show variables like '%transaction_write_set_extraction%'; show variables like '%binlog_transaction_dependency_tracking%'; show variables like '%slave_parallel_type%'; show variables like '%slave_parallel_workers%';
以上命令查询数值依次为XXHASH64、COMMIT_ORDER、DATABASE和0即成功关闭并行复制。
- 关闭主库的并行复制。
- 关闭从库的并行复制。
- 执行如下命令,关闭从库的并行复制。
1 2 3 4 5 6
stop slave; set global binlog_transaction_dependency_tracking=COMMIT_ORDER; set global transaction_write_set_extraction=XXHASH64; set global slave_parallel_type='DATABASE'; set global slave_parallel_workers=0; start slave;
或者
1 2 3
stop slave; set global slave_parallel_type='DATABASE'; start slave;
- 确认并行复制关闭成功。
1 2 3 4
show variables like '%transaction_write_set_extraction%'; show variables like '%binlog_transaction_dependency_tracking%'; show variables like '%slave_parallel_type%'; show variables like '%slave_parallel_workers%';
以上命令查询数值依次为XXHASH64、COMMIT_ORDER、DATABASE和0,即成功关闭并行复制。
查看所有线程(IO线程和SQL线程),
1
show processlist;
只有1个IO线程和1个SQL线程,Id35的是IO线程(接收主库的binlog日志),Id36是SQL线程(解析二进制日志并执行SQL语句)。
- 执行如下命令,关闭从库的并行复制。
- 登录从库。
- 确认并行复制启动成功。
- 确认并行复制是否生效。
1 2 3 4
show variables like '%transaction_write_set_extraction%'; show variables like '%binlog_transaction_dependency_tracking%'; show variables like '%slave_parallel_type%'; show variables like '%slave_parallel_workers%';
以上命令查询数值依次为XXHASH64、WRITESET、LOGICAL_CLOCK和96则说明生效。
如果发现某些值不生效,需要退出重新登录数据库,再次查看才会生效。
- 查看线程。
SQL协调线程:把二进制日志解析后分发给SQL线程执行。
- 确认并行复制是否生效。
- 查看从库状态。
- 执行以下命令。
1
show slave status\G;
下面两项值均为Yes,表示从库启动成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果Last_IO_Error报错“The slave I/O thread stops because master and slave have equal MySQL server UUIDs......”,参考查看MySQL主从复制状态时提示The slave IO thread stops的解决方法解决后,重新查看从库状态。
- 退出从库。
1
exit
- 执行以下命令。