Database Design
database复制
主从复制与主主复制
Replication 是一种在多个冗余资源(比如多套 database)之间同步信息的过程,用来提升 reliability、fault-tolerance 或 accessibility。
Master-Slave Replication
Master 负责 reads 和 writes,把 writes 复制到一个或多个 slave;slaves 只负责 reads。slaves 还可以继续复制给下一级 slave,形成 tree-like 的拓扑。若 master 下线,系统可以以只读模式继续工作,直到某个 slave 被提升为 master 或新的 master 被 provision。

优点
- 备份整库对 master 的影响较小。
- 应用可以从 slave(s) 读取,不影响 master。
- 可以把 slave 临时下线再同步回 master,不需要 downtime。
缺点
- 复制需要更多硬件和额外复杂度。
- master 宕机会带来 downtime,甚至数据丢失。
- 在 master-slave 架构里,所有 writes 都必须到 master。
- read slaves 越多,replication 量越大,replication lag 越明显。
Master-Master Replication
两个 master 都可以提供 reads/writes,并相互协调。如果其中一个 master 挂了,系统仍能继续处理 reads 和 writes。

优点
- 应用可以从两个 masters 读取。
- 写入负载分摊到两个 master nodes。
- failover 更简单、自动且迅速。
缺点
- 部署与配置比 master-slave 更复杂。
- 要么是最终一致,要么要付出更高 write latency 来同步。
- 写节点越多、latency 越大,conflict resolution 越复杂。
Synchronous vs Asynchronous replication
同步 replication 的特点是:数据写入 primary storage 的同时也写入 replica,因此 primary 与 replica 应该一直保持 synchronized。
异步 replication 则是:数据先写入 primary storage,之后再复制到 replica。虽然复制可能接近实时,但更常见的是按 schedule 执行,而且成本更低。