ceph mon组件 & paxos




monitor组件的关键作用就是管理集群topo及配置(monmap、osdmap、pgmap、mgrmap、configmap、auth、log等,可以通过源文件名称看出来XXMonitor.cc/.h,这些都是PaxosService类的具体实现),包括配置在多台monitor节点上的一致性和持久化,这也是paxos共识协议要解决的问题。如果只有一台monitor,那就不需要用到paxos协议了,如果只有2台,也可以通过数据的主从复制来搞定,也不一定要用到paxos,只有节点数量不确定,并且需要多副本一致的高可用高可靠服务,才需要用到共识协议。多副本也可以起到负载均衡的作用,集群规模很大的时候,各种map的访问频次也会极大增长,少量monitor节点是服务不了这么多节点的。
paxos的原理相对简单,但是论文里推导过程和工程实现却是业界公认的难点。我们通常更喜欢raft,就是因为它更简单易于实现(更主要的是开源实现有很多,抄起来也方便)。这里不分析paxos的推导过程(可以从bing copilot ai那里问到很多相关的文章),只看paxos的原理,我简单理解如下:
  • 目的:达成分布式系统多个节点之间数据的一致性(数据可以是某个具体的值,也可以是某个操作,或者某个事务,总之就是一件事情或者叫提案),在ceph monitor里是一个事务(通过bufferlist编码,accept之后持久化到rocksdb)
  • 角色:有proposer、accepter、learner几个,在ceph中这几个角色是每个monitor服务都存在的,不同的是multi-paxos(multi是针对一组paxos角色可以反复连续决议多组数据而言,basic paxos只能决议一次,然后要重置状态才能进行下一次,效率太低)增加了leader和peon角色,leader负责发起提案,其他peon负责共同参与决议,超过半数就可以accept。ceph的monitor集群只会有一个leader,其余都是peon。启动的时候会选举leader,或者leader心跳超时之类的情况也会,租约机制来保证选举不会过于频繁。
  • 流程:src/ceph_mon.cc里main函数是入口,PaxosService负责paxos相关组件的初始化(之前还有一次选举leader过程,在src/mon/Elector.cc),之后所有的paxos操作都是在src/mon/Paxos.h/.cc里完成的,每个函数都有良好的注释,并区分了leader和peon谁会执行这些函数,执行顺序跟函数在源文件中的顺序差不多。决议完成后(所有Monitor节点)会进行数据的持久化,也就是commit到rocksdb。成员函数也有详细注释,有疑问也可以问AI。另外ceph里所有操作基本都是在dispatch函数中触发的(ceph自己实现的messenger就类似于其他rpc框架,比如grpc或者brpc等等),Monitor服务也不例外,相当于接收到其他节点的rpc请求或叫携带了操作类型的消息,就要触发相应的操作流程,跟其他rpc实现有差异,但是原理类似。
  • 异常:心跳超时通常会重新发起选举,然后再次对之前的提案进行决议(不是leader超时,并且满足quorum则不需要),还有一些租约续期之类的常规操作。uncommitted_v, uncommitted_pn,uncommitted_value这几个参数是记录当前异常挂掉之前的决议提案的,用来新leader当选后恢复上一次中断的paxos决议。
问题:
1. mon节点故障或者新增一个mon节点后的数据恢复流程是怎么样的?

在Ceph Monitor的启动过程中,probing阶段是一个关键的步骤。在这个阶段,Monitor会与集群中的其他Monitors进行通信并同步信息。具体来说,probing阶段主要做了以下几件事:

  1. 连接其他Monitors:Monitor会根据monmap(Monitor map,记录了集群中所有Monitor的信息)尝试与其他Monitors建立连接。
  2. 同步信息:Monitor会与其他Monitors交换信息,包括各自的状态、已知的最新的Paxos版本等。
  3. 决定角色:在完成信息同步后,集群会开始选举,决定每个Monitor的角色(Leader或Peon)。

这个阶段的目标是确保新启动的Monitor能够获取到集群中的最新状态,并且能够正确地加入到集群的运行中。这个阶段Monitor集群是不能提供服务的。

ceph-mon paxos实现

参考资料:
  1. 知乎专栏:理解 Paxos 协议——浅谈分布式一致性协议
  1. 知乎专栏:共识协议优质资料汇总(paxos,raft)
    • 这篇专栏整理了关于 Paxos、Multi-Paxos 和 Raft 的学习资料,包括论文、博客等。
    • 如果你想系统地学习共识协议,这里有很多有用的资源。
    • 链接在这里:共识协议优质资料汇总(paxos,raft)
  1. 知乎专栏:理解这两点,也就理解了 Paxos 协议的精髓
当涉及到 Ceph 使用 Paxos 时,它的 Monitor 组件是关键。让我为你介绍一下 Ceph 中如何使用 Paxos 以及一些学习资源:
  1. Ceph Monitor 和 Paxos:
    • 背景:Ceph 是一个分布式存储系统,它使用 Paxos 算法来实现 Monitor 的一致性。
    • Monitor:Monitors 负责维护集群状态、配置信息和映射(如 MonMap、OSDMap、PGMap 等)。
    • Paxos 作用:Paxos 用于确保所有 Monitor 之间的数据一致性,包括上述映射和其他信息。
    • 单一 Paxos 实例:Ceph 使用单一的 Paxos 实例来处理多个映射的变更。
  1. 学习资源:
    • Ceph.io 文章:Monitors and Paxos, a chat with Joao
      • 这篇对话记录了 Ceph 核心开发者 Joao Luis 和 Loïc Dachary 的交流,深入探讨了 Monitor 和 Paxos 的关系。
      • Joao 解释了 Ceph Monitor 中 Paxos 的实现细节,以及如何确保数据一致性。
      • 链接在这里:Monitors and Paxos, a chat with Joao
  1. CSDN 博客:Ceph的Paxos源码注释
    • 这篇博客详细解释了 Ceph Monitor 中 Paxos 的源码实现,适合深入研究。
    • 链接在这里:Ceph的Paxos源码注释