2020-04-20

分布式存储名词解析 – 一致性

Views: 7432 | 5 Comments

一致性分为访问一致性和数据一致性. 访问一致性, 是指从观察者的角度, 其访问结果是可预期的. 数据一致性是指从上帝视角看, 多个副本的数据是完全相同的.

Paxos 协议, 这里指的是原始(Basic) Paxos, 其本质是解决访问一致性, 并不解决数据一致性, 它不保证多个副本数据现在是(或者将来是)完全相同的, 它只是在可能不一致的多个副本上提供可预期(一致性)的服务. 这个说法不代表不能使用 Paxos 来保证数据一致性, 而是说, Paxos 的设计目的不在于此.

Raft 同时解决访问一致性和数据一致性. 使用了 Raft 协议的分布式存储系统, 既能提供可预期的数据访问服务, 也能在时间维度上保证多副本数据一致性. 例如, 在系统隔断外部输入的情况下(不再接受写请求), 经过一定的时间(一般从几毫秒到数秒)之后, 使用了 Raft 协议的集群内的多个副本的数据将是完全相同的.

Paxos 协议本身并不能保证系统级的数据的最终一致性, 因为它是基于外界触发的消极全量数据拷贝协议. 如果没有外界输入触发, Paxos 就不拷贝数据, 所以它是消极的. 当需要拷贝时, 它拷贝的是全量的数据, 如果你需要保证整个数据库在多台机器上相同, 你应该拷贝整个数据库, 这显然没有实际意义. 另外, 当拷贝结束时, Paxos 并不保证数据被拷贝到所有节点, 这是第二个消极. 所以, 仅仅使用 Paxos 协议的系统, 在隔断外部输入的情况下, 如果数据不一致, 那么过一百年, 多个副本的数据仍然不一致.

相对比, Raft 的数据拷贝是自动的, 不仅仅依赖外界输入触发, 还依赖时间触发, 所以, Raft 是积极的. 同时, 拷贝结束时, Raft 保证数据被拷贝到了所有节点, 从而实现所有副本是完全相同, 如果达不到这个目的, Raft 就不会停止(不达目的绝不罢休), 这是第二个积极.

前面说过, 你一定要区分就充分和必要. 所以, 我不是说用了 Paxos 就必须是消极的, 而是 Paxos 本身是消极的, 如果你用了 Paxos, 你自己要积极起来, 不能只依赖 Paxos. 例如, 你必须引入日志复制状态机模型, 避免全量拷贝. 另外, 你还必须引入超时重传机制, 主动积极拷贝. 为了优化, 避免读请求也要走完整的 Paxos 流程, 你还要引入 Leader. 天啊, 你在重新发明 Raft!

Related posts:

  1. 为什么极少有开源的Paxos库?
  2. Paxos vs Raft 的争论
  3. Paxos和Raft读优化 – Quorum Read 和 Read Index
  4. Paxos 与分布式强一致性
  5. 为什么 Leader Based 的分布式协议 Raft 是更好的
Posted by ideawu at 2020-04-20 22:50:48 Tags: ,

5 Responses to "分布式存储名词解析 – 一致性"

  • 感觉答主并没真正懂paxos。paxos只是一个共识算法,共识和一致性是两个不同的问题,如何实现一致性要用其他方式,"不能用paxos来保证一致性"这话本身有问题。至于paxos如何拷贝数据,是积极还是消极,实现者可以用不同策略。另外,raft只能按顺序复制数据,不能跳空接收数据,这未必不是一个缺点。猜测答主之所以贬paxos,抬raft, 可能是因为raft提供了一套开封即用的方法,简单可以拿来即用。我在谷歌工作过,谷歌自己实现的paxos就非常强大 Reply
    @just: 你说的没错, paxos(basic paxos)只是共识算法, 但工程上需要的是一致性协议(规则, 如何实现), 所以说, paxos 距离现实需求太远. 至于谷歌自己实现的 paxos, 没开源我不知道, 但 paxos 的边界就那么窄, basic paxos 的作用就那么点东西, 没什么实现不实现的, 实现出来的东西, paxos 的作用比例占不到1%, 估计谷歌的人都不好意思再挂以"paxos"之名. 所以, 不仅谷歌, 业界极少有开源的 paxos 库, 因为这东西根本就不存在, paxos 的作用非常小, 封装出来的东西已经不算 "paxos" 了. Reply
    @ideawu: 封装出来的东西, 长得都跟 raft 一个样子, 全是这些东西: 日志复制状态机, 选主, 成员管理. 哪一项是 paxos? 一个库如果包含这 3 项, 即使它实现了 basic paxos 以对每一条日志达成共识, 也不好意思(不应该)再附庸 "paxos" 之名. Reply
    @just: 关于所谓的"跳空"问题, 包括很多人所说的"乱序apply"问题, 完全是一叶障目. 在复制(网络传输)的时候, 完全可以并发传, 对端缓冲后排队按顺序确认, 就跟 TCP 滑动窗口一样, 没什么所谓的"必须按顺序复制". 至于乱序 apply, 能否乱序, 由上层决定, 全交给上层决定当然灵活, 如果你认为是优点的话, 确实是优点. Reply
    @just: raft 总结了实现系统的一些要点, 几乎所有实现 paxos 的系统, 都实现了 raft 所总结的那些要点. 当然, 他们可能实现得比 raft 的出现要早, 但 raft 确实事后总结了. 所以, 我常说:"所有的 paxos 实现, 都会实现成 raft 的样子." 再补充一下, "raft 的样子, 就是所有 paxos 实现的总结". Reply

Leave a Comment