了解 etcd Leader 选举 API

Understanding etcd Leader election APIs

我正在尝试理解 etcd 选举提供的各种功能 api 以及它们在语义上的含义。

在他们的官方文档中非常简单地提到了每个功能的作用,并且没有提供示例。 例如我们有方法:

func (e *Election) Campaign(ctx context.Context, val string) error

根据我的理解,活动用于在选举中登记节点以获得领导地位,它会被阻止,直到完成或出现某些错误。

func ResumeElection(s *Session, pfx string, leaderKey string, leaderRev int64) *Election

这个我不太清楚为什么要恢复选举,假设node已经是leader了。 也许我缺乏理解是由于这里使用的语义。

既然我们必须使用共同的选举标识符,为什么单次选举还不够?

最后我的用例是运行几个节点并且只允许leader执行一些computation/updates,在什么情况下我必须创建新的选举如果单一选举不会够了。

  1. 在代码库中,ResumeElection API 仅在 electionServer) ResignelectionServer) Proclaim 中被调用。

  2. 有评论

// Resign lets a leader start a new election.
func (e *Election) Resign(ctx context.Context) (err error) {

// Proclaim lets the leader announce a new value without another election.
func (e *Election) Proclaim(ctx context.Context, val string) error {
  1. ResumeElection 的实现只是 return 一个结构。
// ResumeElection initializes an election with a known leader.
func ResumeElection(s *Session, pfx string, leaderKey string, leaderRev int64) *Election {
    return &Election{
        keyPrefix:     pfx,
        session:       s,
        leaderKey:     leaderKey,
        leaderRev:     leaderRev,
        leaderSession: s,
    }
}

所以,你的问题的答案是:ResumeElection 的反面是 NewElection,而不是 Campaign

更多的,当客户端已经有一个领导者,并且想要改变集群的状态(设置一个变量或放弃领导者)。它将调用 ResumeElection 而不是 Campaign.