在 raft 论文中提到集群配置是使用复制日志中的特殊条目存储和通信的。
[1] 这里的特殊条目是什么意思?每台服务器的条目中是否都有关于集群中其他服务器总数的信息?如果不是,那么候选人如何确定它收到了多数票?
[2] 还有谁通知领导者配置变化?集群中添加的新服务器是否通过这些特殊条目进行通信?如果新服务器这样做,我的理解是正确的:“当新服务器添加为非投票成员时,它会了解当前配置并增加其日志条目中的服务器计数并向领导者发送请求以更改其配置?”
在 raft 论文中提到集群配置是使用复制日志中的特殊条目存储和通信的。
[1] 这里的特殊条目是什么意思?每台服务器的条目中是否都有关于集群中其他服务器总数的信息?如果不是,那么候选人如何确定它收到了多数票?
[2] 还有谁通知领导者配置变化?集群中添加的新服务器是否通过这些特殊条目进行通信?如果新服务器这样做,我的理解是正确的:“当新服务器添加为非投票成员时,它会了解当前配置并增加其日志条目中的服务器计数并向领导者发送请求以更改其配置?”
特殊条目意味着日志条目在应用时不会对状态机进行更改,而是一种特殊结构,其中包含有关集群配置的信息。如果您的状态机是一个简单的键值存储,这个新条目看起来不会像其他条目(set x = 5
),而是包含集群配置(通常是地址和端口),类似于[1 = {1.2.3.4, 10000}, 2 = {1.2.3.5, 10001}, ...]
. 是的,每台服务器的日志中都有完整的集群配置,并且它们总是使用最新的。
在博士论文第 4.4 章中,
例如,图 4.1 中的 AddServer 和 RemoveServer RPC 可以由管理员直接调用,也可以由使用一系列单服务器步骤以任意方式更改配置的脚本调用。
会说管理员需要有一种方法来向 Raft 集群发出 RPC 调用。这意味着您需要一种方法将该 RPC 发送到所有服务器,并且通过这样做,您还可以通知当前领导者。
如何将 RPC 发送到所有服务器是一个实现细节,您可以将其作为一个单独的“客户端”来执行,或者使用一些命令行标志来通知新服务器它还需要将AddServer
RPC 发送到所有服务器在启动时。
你的理解对我来说很好,除了它将新配置发送给领导者的部分。它应该广播AddServer
RPC。然后,当前领导者将使用包含新服务器的配置创建一个新的日志条目并开始复制它。