NOTE
4.5 分布式系统复制方式
1. 同步复制 leader要同步给所有follower才算成功 1. 客户端请求leader 2. leader写入本地数据 3. leader同步给follower 4. leader返回给客户端成功 2. 异步复制 leader写入就算成功 1. 客户端请求leader 2. leader写入
这是历史学习笔记,可能存在过时或不完整的理解。
1. 同步复制
leader要同步给所有follower才算成功
- 客户端请求leader
- leader写入本地数据
- leader同步给follower
- leader返回给客户端成功
2. 异步复制
leader写入就算成功
- 客户端请求leader
- leader写入本地数据
- leader返回给客户端成功
- leader同步给follower
2.1. 复制延迟问题
- 场景
- 读多写少的场景,一般会使用读写分离的模式:写只写leader,读从follower读,这种场景通过增加follower节点就能提高读的吞吐量,一般配置为异步复制。但是异步复制有个一致性的问题,这个不一致的时间(leader还没同步给follower)叫做复制延迟
- 问题举例
- 写后读
- 单调读
- 一致前缀读
- 解决
- 通过分布式一致性模型解决,不同的一致性模型解决了不同程度的复制延迟
- 分布式一致性模型.md
3. 半同步复制
leader至少同步给一个follower才算成功
- 客户端请求leader
- leader写入本地数据
- leader同步给follower1
- leader返回给客户端成功
- leader同步给follower2
4. 同步 vs 异步 vs 半同步
| 同步 | 异步 | 半同步 | |
|---|---|---|---|
| 一致性 | 高。从库的数据保持与主库一致 | 低。主库有的数据从库可能没有 | 中 |
| 可用性 | 低。主库必须等待从库复制完才能对外响应 | 高。 主库不用等待从库复制完就能对外响应 | 中 |
5. 举例
- MySQL支持同步、异步、半同步
- Redis支持异步
- Kafka支持同步、异步、半同步
- Zookeeper支持同步
- Elasticsearch支持同步