3

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

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

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

根据我的理解,活动用于在选举中注册节点以担任领导,并且在实现这一目标或发生某些错误之前会被阻止。

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

这个我不确定为什么我们需要恢复选举,假设节点已经是领导者。也许我缺乏理解是由于这里使用的语义。

既然我们必须使用一个通用的选举标识符,为什么单次选举就不够了?

最后,我的用例是运行多个节点,只允许领导者进行一些计算/更新,在什么情况下,如果单次选举不够,我必须创建新的选举。

4

1 回答 1

3
  1. 在代码库中,ResumeElectionAPI 仅在electionServer) Resign和中调用electionServer) 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只是返回一个结构。
// 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,
    }
}

因此,您的问题的答案是: 的对面ResumeElectionNewElection,而不是Campaign

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

于 2022-01-29T07:41:46.060 回答