如何使用Etcd来完成选举

背景

在某个项目中,需要使用选举的功能来由Leader完成一些类似任务分配的工作。在最初的版本是使用Zookeeper配合curator框架来实现的,curator的api相对来说也比较直观,文档也比较齐全,实现起来并不耗费多少力气。可是由于公司的Zookeeper集群版本相对较低,curator不得不使用低版本来兼容,运行一段时间之后碰上了一些低BUG的,添加了一些兜底的保障来完善选举流程。然而,公司的Etcd集群版本相对较新,便萌生了使用Etcd来替代Zookeeper的想法。

Etcd Election API

Election API是在V3版本才出现的,使用文档寥寥无几,若是使用jetcd的同学,那就几乎找不到什么完整的例子了。Election API一共包含了5个接口:

  • Campaign : 用于发起选举
  • Proclaim:用于Leader发布新的Value
  • Leader:返回选举的Leader
  • Observe:订阅Leader的Value值
  • Resign:释放主权

在使用Etcd Election中,是用字符串来标识一次选举的,实际上这个字符串是用作业Etcd Key的Prefix。参与选举时除了指定选举标识外,还可以指定将要发布的内容。当成功当选以后,这个发布的值会被记录在参与选举的KV中,同时发布到所有通过Observe API订阅了选举的节点上。当需要更新这个值时就可以使用Proclaim来发布新的值,同理订阅者都会收到这个值的更新。
值得一提的有两件事。
第一,每次选举都要带上一个Lease,可以简单的理解为获得主权的节点并不是永久获得主权的,Lease过期,主权自动释放,由于选举实际上就是创建一个KV,KV上关联了Lease,Lease过期,KV销毁,主权自然释放,当然可以用Keep Alive持续保持主权。
第二,未成功获取主权的节点,直到此次选举出来的主节点释放掉主权后,才能从Campaign API中获取到返回值。和Zookeeper不一样的是,Etcd一次选举只选出一个主,而Zookeeper主释放后,剩下的节点会重新竞争。表现就是Campaign函数返回结果以后,并不能直接断定自己获取到了主权,因为可能返回的LeaderKey已经失效了。

JETCD 使用

结合上面对于API的解释,我们可以很容易的写出下面的代码

 CompletableFuture<LeaseGrantResponse> grant = client.getLeaseClient().grant(properties.getElectionLeaseTTL());
                LeaseGrantResponse leaseGrantResponse = grant.get();
                CompletableFuture<CampaignResponse> campaign = client
                        .getElectionClient()
                        .campaign(electionName,
                                leaseGrantResponse.getID(),
                                ByteSequence.from("", StandardCharsets.UTF_8));
                CampaignResponse campaignResponse = campaign.get();
                confirmLeaderResponse = client.getElectionClient().leader(electionName).get(getOperationTimeout() * 5, TimeUnit.MILLISECONDS);
                if (!confirmLeaderResponse.getKv().getKey().toString(StandardCharsets.UTF_8)
                        .equals(campaignResponse.getLeader().getKey().toString(StandardCharsets
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
etcd是Kubernetes集群中的关键组件之一,它用于存储和管理集群的配置数据。下面是一个关于etcd的面试题的回答: etcd是什么? etcd是一个分布式的键值存储系统,它被设计用于可靠地存储和检索数据。在Kubernetes中,etcd用于存储集群的配置信息、状态信息和元数据。 etcd的特点有哪些? - 高可用性:etcd使用Raft一致性算法来保证数据的一致性和可用性。 - 可靠性:etcd将数据持久化到磁盘上,即使在节点故障或网络分区的情况下也能保证数据的安全性。 - 简单易用:etcd提供了简单的API接口,可以方便地进行数据的读写操作。 - 分布式:etcd可以在多个节点上运行,数据会自动进行复制和同步,以提供高可用性和容错性。 etcd在Kubernetes中的作用是什么? 在Kubernetes中,etcd用于存储和管理集群的配置数据,包括以下内容: - 集群的状态信息:etcd存储了集群中各个节点的状态信息,包括节点的健康状态、可用性等。 - Pod的配置信息:etcd存储了Pod的配置信息,包括Pod的名称、镜像、环境变量等。 - Service的配置信息:etcd存储了Service的配置信息,包括Service的名称、端口、负载均衡策略等。 - 其他元数据:etcd还存储了其他与集群相关的元数据,如Namespace、Deployment、ReplicaSet等的配置信息。 etcd的数据是如何同步和复制的? etcd使用Raft一致性算法来保证数据的一致性和可用性。Raft算法将etcd集群中的节点分为Leader、Follower和Candidate三种角色,其中Leader负责处理客户端的请求,Follower和Candidate负责复制和同步数据。 当客户端发送写请求时,Leader会将该请求复制给其他节点,并等待大多数节点的确认。一旦大多数节点确认接收到该请求并将其应用到本地存储中,Leader会向客户端返回成功响应。这样可以保证数据在多个节点之间的一致性。 当Leader节点发生故障或网络分区时,Follower和Candidate节点会通过选举过程选出新的Leader节点,以保证集群的可用性和数据的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值