为了解决主从复制延迟问题,在MySQL 5.7中,引入了基于组提交的并行复制(Enhanced Multi-threaded Slaves)
主要由以下参数控制,
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
slave_preserve_commit_order=on
master_info_repository=TABLE
sync-master-info=1
relay_log_info_repository=TABLE
sync-relay-log=1
sync-relay-log-info=1
relay_log_recovery=ON
slave-parallel-workers
设置用于并行执行复制事务的应用程序线程数。将此变量设置为大于0的数字将创建具有此应用线程数量的多线程slave。设置为0(默认值)时,并行执行被禁用,并且slave使用单个应用程序线程。设置 slave-parallel-workers没有立即生效。变量的状态适用于所有后续start slave语句。
多线程副本通过使用协调器线程和此变量配置的应用程序线程数来提供并行执行。事务在应用程序线程之间的分配方式由slave_parallel_type配置。slave并行应用的事务可能会无序提交,除非slave_preserve_commit_order=1。因此,检查最近执行的事务并不能保证源中所有以前的事务都已在slave上执行。这对使用多线程slave时的日志记录和恢复有影响。
slave-parallel-type
当使用多线程副本(slave_parallel_workers大于0)时,此变量指定用于决定允许哪些事务在副本上并行执行的策略。该变量对未启用多线程的副本无效。可能的值为:
LOGICAL_CLOCK:属于同一二进制日志组的事务在源上落实,将并行应用在副本上。根据事务的时间戳跟踪事务之间的依赖关系,以在可能的情况下提供附加的并行化。
DATABASE:并行应用更新不同数据库的事务。仅当将数据分区到多个数据库中并在源上同时并发地对其进行更新时,此值才适用。不得存在跨数据库的约束,因为这样的约束可能会在副本数据库上违反。
当 slave_preserve_commit_order=1 设置,只能使用LOGICAL_CLOCK。
slave_preserve_commit_order
对于多线程副本,此变量的设置1确保事务在副本上的外部化顺序与SLAVE中继日志中出现的顺序相同,并防止已从中继日志执行的事务序列出现间隙。此变量对未启用多线程的副本无效。请注意, slave_preserve_commit_order=1 这不会保留非事务性DML更新的顺序,因此,这些更新可能会在中继日志中在其之前的事务之前提交,这可能会导致差距。
slave_preserve_commit_order=1要求在SLAVE上启用--log bin和--log slave更新,slave_parallel_type设置为LOGICAL_CLOCK。在更改此变量之前,必须停止所有复制线程(如果使用多个复制通道,则为所有复制通道)。
在启用slave_preserve_commit_order的情况下,执行线程将等待,直到提交之前的所有事务。当线程等待其他工作线程提交其事务时,它将其状态报告为等待前一个事务提交。(在MySQL 5.7.8之前,它显示为Waiting for its turn to commit。
)在多线程SLAVE上启用此模式可确保它永远不会进入源不处于的状态。这支持将复制用于读取横向扩展。
如果slave_preserve_commit_order=0,则SLAVE并行应用的事务可能会无序提交。因此,检查最近执行的事务并不能保证源中所有以前的事务都已在SLAVE上执行。从SLAVE的中继日志中执行的事务序列中可能会有间隙。这对使用多线程SLAVE时的日志记录和恢复有影响。设置 slave_preserve_commit_order=1可防止出现间隙,但不能防止源二进制日志位置滞后(其中Exec_master_log_pos
落后于已执行交易的位置)。所以建议master_info_repository,relay_log_info_repository设置为TABLE。