【发布时间】:2016-05-14 02:22:58
【问题描述】:
在 raft 的论文文档第 6.4 章中,它给出了绕过 Raft 日志进行只读查询并仍然保持线性化的步骤:
- 如果领导者尚未将其当前任期内的条目标记为已提交,它会一直等待,直到这样做。领导者完整性 属性保证领导者拥有所有已提交的条目,但在 在其任期开始时,它可能不知道那些是哪些。要了解, 它需要从其任期内提交一个条目。 Raft 通过具有 每个领导者在开始时向日志中提交一个空白的 no-op 条目 它的任期。一旦这个 no-op entry 被提交,leader 的 提交索引将至少与任何其他服务器一样大 它的期限。
- 领导者将其当前提交索引保存在局部变量 readIndex 中。这将用作版本的下限 声明查询操作的对象。
- 领导者需要确保它没有被它不知道的新领导者取代。它发出新一轮的心跳和 等待大多数集群的确认。一次 收到这些确认后,领导者知道可以 在发送 心跳。因此,当时 readIndex 是最大的提交 集群中的任何服务器都见过的索引。
- 领导者等待其状态机至少前进到 readIndex;这足以满足线性化。
- 最后,领导者针对其状态机发出查询,并将结果回复给客户端。
我的问题:
a) 对于第 1 步,是否仅适用于刚刚选举出领导者时的情况?因为只有新领导者没有为当前任期提交条目。并且由于 no-op 条目对于找出当前提交的条目是必要的,那么实际上这一步在选举完成时总是需要的,但不仅限于只读查询吗?换句话说,通常,当领导者活动一段时间时,它必须在其任期内提交条目(包括无操作条目)。
b) 对于第 3 步,这是否意味着只要领导者需要提供只读查询,就会发送一个额外的心跳,而不管当前未完成的心跳(已发送但尚未收到主要响应)或下一个计划的心跳?
c) 对于第 4 步,它是否仅适用于追随者(对于追随者帮助卸载只读查询处理的情况)?因为在leader上,committed index已经意味着它被应用到本地状态机了。
总而言之,一般情况下,leader(活跃一段时间)只需要做第3步和第5步,对吧?
【问题讨论】:
标签: raft