NOTE

4.5 分布式系统复制方式

1. 同步复制 leader要同步给所有follower才算成功 1. 客户端请求leader 2. leader写入本地数据 3. leader同步给follower 4. leader返回给客户端成功 2. 异步复制 leader写入就算成功 1. 客户端请求leader 2. leader写入

分布式系统创建于 更新于 约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 同步复制

leader要同步给所有follower才算成功

  1. 客户端请求leader
  2. leader写入本地数据
  3. leader同步给follower
  4. leader返回给客户端成功

2. 异步复制

leader写入就算成功

  1. 客户端请求leader
  2. leader写入本地数据
  3. leader返回给客户端成功
  4. leader同步给follower

2.1. 复制延迟问题

  • 场景
    • 读多写少的场景,一般会使用读写分离的模式:写只写leader,读从follower读,这种场景通过增加follower节点就能提高读的吞吐量,一般配置为异步复制。但是异步复制有个一致性的问题,这个不一致的时间(leader还没同步给follower)叫做复制延迟
  • 问题举例
    • 写后读
    • 单调读
    • 一致前缀读
  • 解决

3. 半同步复制

leader至少同步给一个follower才算成功

  1. 客户端请求leader
  2. leader写入本地数据
  3. leader同步给follower1
  4. leader返回给客户端成功
  5. leader同步给follower2

4. 同步 vs 异步 vs 半同步

同步 异步 半同步
一致性 高。从库的数据保持与主库一致 低。主库有的数据从库可能没有 中
可用性 低。主库必须等待从库复制完才能对外响应 高。 主库不用等待从库复制完就能对外响应 中

5. 举例

  • MySQL支持同步、异步、半同步
  • Redis支持异步
  • Kafka支持同步、异步、半同步
  • Zookeeper支持同步
  • Elasticsearch支持同步

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看