Jump to Navigation

开发支持election选主集群项目的几种不同实现方式

开发支持election选主集群项目的几种不同实现方式

election选主目前应用日趋广泛,但其算法复杂相对复杂,自已实现需要经历大量测试保证选举算法的正确与集群的稳定。

常用的选主算法有paxos, raft等。分别对应实现 zookeeper,etcd。

另外还有几个项目的实现了election选主并提供了相应的API,后面根据研究进展不断补充。

基于 etcd v2 版本实现,较通用的实现

这其实是一种依赖全局锁的实现方式,其实现的可靠性依赖与全局锁的实现。

比如,使用redis也可以实现这种,但是由于redis的非一致性集群特性,可能在极端情况下产生错误的状态。(虽然实际上redis很稳定)

unfair version

步骤,

1、以原子方式检查key不存在并且添加一个key。

2、如果操作成功能,则成为leader。

3、如果操作不成功,则watch该key的变化,过期或者被删除后再次执行leader选举功能。

源代码实现与测试需要200多行代码不再贴出来了,加个链接。 源代码链接:https://gist.github.com/kitech/5504c084b179362b8bcbaea11d645df3

fair version

步骤:需要采用一致性队列机制。

1、POST 创建一个自动增长队列。并返回一个元素

2、获取队列所有元素

3、如果返回的元素小于队列所有元素,则成为master

4、如果不是,则watch 该队列,直到#3成立。

这个的公平性在于,队列中的每个元素轮流成为master,不再是无规则的抢占式选举。

源代码实现与测试需要200多行代码不再贴出来了,加个链接。 源代码链接:https://gist.github.com/kitech/814e6ff6cfc68aeb4dbda31ffe326785

这两种试都依赖ttl机制,因此在选择新master中间可能有时间间隔。

还需要更精确的机制实现准无间隙的master,比如第三方进程崩溃检测,或者etcd3的精确的租借机制。

基于 etcd v3版本实现

coming soon...

v3.1估计会发一个带election功能的etcdctl命令,但v3.0还没有带(虽然有部分代码,可能不成熟)。

集群实现中的几个概念

fairness

etcd的election相关资源

http://dockone.io/article/801 https://github.com/coreos/etcd/blob/master/etcdctl/README.md

两个原语,fairness, unfair 两种模式, https://github.com/coreos/etcd/issues/225

过早时候的实现,废弃的但可以帮助理解的,https://coreos.com/etcd/docs/0.4.7/etcd-modules/

基于其他项目的实现,http://www.openskill.cn/article/384

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut