by shihang.mai
1. 主从复制简述
![](https://img.haomeiwen.com/i16110947/e1b25efaedb9c226.png)
- master库修改记录,写到binlog,然后dump线程拉取binlog,然后通过网络发给salve
- salve写到relay-log中,然后sql thread重演binlog
2. 主从数据间延迟解决方案
-
业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力
-
单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库
-
服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力
-
不同业务的mysql物理上放在不同机器,分散压力
-
使用更加强劲的硬件设备
![](https://img.haomeiwen.com/i16110947/aea06d8d0a3ebd1c.png)
3. MTS
MTS,叫并行复制机制,解决sql Thread并行
.而能否并行,关键在于多事务之间是否有锁冲突
版本 | MTS机制 | 实现原理 |
---|---|---|
5.6 | Database | 基于库级的并行复制 |
5.7 | COMMIT_ORDER | 基于组提交的并行复制 |
5.7.22 | WRITESET/ WRITESET_SESSION | 基于WRITESET的并行复制 |
3.1 Database
基于Database级别的并行复制效果并不特别好,因为大多数生产的架构依然习惯于单库多表的架构,这种情况下MTS依然还是单线程的效果。但Database级别并行复制的好处是可以兼容任何二进制日志,从机都可以进行库级别的并行回放
3.2 COMMIT_ORDER
基于Commit_Order的并行复制是在主数据库实例事务提交时,写入一些额外信息,从而在从机回放时,可以根据这些信息判断是否可以进行并行的回放。
原理:同一组提交的事务之间是不冲突的,因此可以并行回放
3.2.1 Commit-Parent-Based模式
slave-parallel-type=LOGICAL_CLOCK : Commit-Parent-Based模式
同一组的事务[last-commit相同],没有锁冲突.
![](https://img.haomeiwen.com/i16110947/c12c2ba3705fd726.png)
3.2.2 Lock-Based模式
slave-parallel-type=LOGICAL_CLOCK : Lock-Based模式
即便不是同一组的事务,只要事务之间没有锁冲突[prepare阶段],就可以并发。 不在同一组,只要N个事务prepare阶段可以重叠,说明没有锁冲突
![](https://img.haomeiwen.com/i16110947/c1a732b1b862516c.png)
3.3 WriteSet
原理:不同事务的不同记录不重叠,则都可在从机上并行回放,并行的力度从组提交细化为记录级
WriteSet对象就是每条记录hash后的值
WriteSet=hash(index_name | db_name | db_name_length | table_name | table_name_length | value | value_length)
产生值后,放入WriteSet哈希表,保存每条记录的WriteSet值和对应的sequence_number。
当事务每次提交时,会计算修改的每个行记录的WriteSet值,然后查找哈希表中是否已经存在有同样的WriteSet
- 若无,证明该的不是同一个记录可以并行回放。,WriteSet插入到哈希表,写入二进制日志的last_committed值不变。
- 若有,证明该的同一个记录,不可回放,并将last_committed值更新为sequnce_number
网友评论