架构

旧表拆分为分库分表过程:

  1. 双写读老阶段:通过中间件,对write sql同时进行两次转发,也就是双写,保持新数据一致,同时开始历史数据拷贝。本阶段建议施行一周;
  2. 双写双读阶段:采用灰度策略,一部分流量读老表,一部分流量读新表,读新表的部分在一开始,还可以同时多读一次老表数据,进行比对检查,观察无误后,随着时间慢慢切量到新表。本阶段建议施行至少两周;
  3. 双写读新阶段:此时基本已经稳定,可以只读新表,为了安全保证,建议还是多双写一段时间,防止有问题遗漏。本阶段建议周期一个月;
  4. 写新读新阶段:此时已经完成了分表的迁移,老表数据可以做个冷备

MySQL主从复制

MySQL的主从是由从节点主动去读主节点的binlog,然后保存到自己的中转日志处Relay Log,并在本地执行。此时不管Slave是否已接收binlog, Slave写relay log失败、重新执行SQL语句失败等异常情况并不会被Master感知,所以数据一致性无法得到有效保障

MySQL 5.5版本提供了半同步复制模式:Master在提交事务前,会等待Slave接收binlog, 当至少有一个Slave确认接收了binlog后,Master才提交事务。具体来说,Slave在收到binlog并将其写入relay log后,会向Master发送ACK响应;Master在收到ACK响应后, 认为响应发送方Slave已经在relay log中保存了事务,这时才进行事务的提交

Master会因为向过多的Slave复制数据而压力倍增,这个问题被称为“复制风暴”。所 以实际的主从模式架构可能是一些Slave向Slave复制数据,以减轻Master的复制压力,

一主多从,从挂从