传统复制:
image.png
多线程模型:
image.png
分发事务疑问
1、事务能不能按照轮询的方式分发给各个 worker,也就是第一个事务分给 worker_1,第二个事务发给 worker_2 ?
事务被分发给 worker 以后,不同的 worker 就独立执行了。但是,由于 CPU 的调度策略,很可能第二个事务最终比第一个事务先执行。而如果这时候刚好这两个事务更新的是同一行,也就意味着同一行上的两个事务,在主库和备库上的执行顺序相反,会导致主备不一致的问题。
2、同一个事务的多个更新语句,能不能分给不同的 worker 来执行呢?
一个事务更新了表 t1 和表 t2 中的各一行,如果这两条更新语句被分到不同 worker 的话,虽然最终的结果是主备一致的,但如果表 t1 执行完成的瞬间,备库上有一个查询,就会看到这个事务“更新了一半的结果”,破坏了事务逻辑的隔离性。
事务分发基本要求
1、不能造成更新覆盖,这就要求更新同一行的两个事务,必须被分发到同一个 worker 中。
2、同一个事务不能被拆开,必须放到同一个 worker 中。
MySQL 各版本并行复制策略
5.6
官方 MySQL5.6 版本,支持了并行复制,只是支持的粒度是按库并行。这个策略的并行效果,取决于压力模型。如果在主库上有多个 DB,并且各个 DB 的压力均衡,使用这个策略的效果会很好。
5.7
网友评论