使用 Consul 实现分布式环境下的 Leader 选举(补档)

想象这样一种业务场景:你在一个分布式环境中部署了一个任务通知系统,或者一个定时任务系统,为了做高可用,每一个节点你都部署了一整套完整的服务。

很快你就会发现,用户会收到重复的通知信息,或者相同的任务也会被执行了多遍。显然这是不行的。

为了让我们的系统能够正常运行,并且又能实现高可用形式的部署,我们需要在这几个节点中选出一个Leader,做为最终执行任务的唯一节点。这篇文章将探讨如何实现这样一种需求,并且介绍如何使用consul来选举出我们的Leader。

一致性问题
我们的问题属于分布式一致性问题的范畴,即在分布式环境下,结点/服务之间如何做到类似单机的运行环境。这个问题有多重要呢,基本上只要是一个正常的分布式系统,一致性都会是一个必须要考虑的问题。这有点像你在打LOL或者吃鸡,你和队友们得保持战术的一致才能控制得住局面。从某个程度上讲,你和队友就组成了一个分布式系统。

解决分布式一致性的算法很多,但在工业界大规模使用的只有两个:Paxos和Raft。Paxos的典型代表有Google的Chubby,还有Apache基金会的Zookeeper,这个Java的同学应该有听说过。Raft的代表有Etcd和TiKV,前者已经成为许多系统不可或缺的一部分,包括Kubernetes,而后者已经在成为NewSQL的代表作上一路狂奔着。不过这里得提一句,不管是Google还是Pingcap(TiKV的开发商),都对Paxos和Raft应用到工业软件上做了优化。

要正确得实现了Paxos和Raft算法都不是一件特别容易的事,尤其是Paxos,Raft还好些。但如果想每一个服务都嵌入一个Paxos或者Raft,这对于维护将是一场灾难。Google的做法是使用Chubby作为一致性的基础服务提供者,在这之上提供分布式锁和Leader选举的服务(是不是有点PaaS的味道)。而这篇文章将要使用的,是一个能提供类似服务的开源软件:Consul

使用Consul
回到这篇文章的主题,要解决文章最开始提到的那个问题,我们可以在几个服务之间选择一个Leader出来,具体的任务交给Leader,其他结点在Leader出现问题的时候再补上去成为一个新的Leader。我们将Leader的选举交给Consul帮我们解决,Consul只要为我们做一件事就行:给我们一把分布式的锁,哪个服务能拿到这个锁,谁就是Leader。

Consul在我们公司被用来做域名服务和建康检查,而它刚好提供了一个基于Raft算法的Kv store(Kv store可以作为分布式锁的实现基础)的功能。我们可以在这个kv store里面写入一对kv, key是一个固定的值,而value则是能够唯一代表节点/服务的ID,通过Value我们就可以知道谁是Leader。

Consul提供了一个Session机制,用它来代表服务与Consul节点之间的会话关系,并且能提供一个代表这个会话的Session ID,这个ID将作为上面提到的Value写入kv中。

整个流程经过几次调整,最后设计出来是这样的:

服务启动时,向Consul注册一个Session,得到一个Session ID。

将Session ID作为Value,字符串leader(自由定义)作为key,写入到KV中。

若写入成功,则当选为Leader.若写入失败,则表示竞选失败。

每个Session都会有一个TTL(我们公司定的是Consul的最小值10s),当选为Leader的服务需要定时延长改TTL。比如每隔5s延长一次。

竞选失败的节点,则在后台轮询,不断尝试成为Leader。

业务活动发起时,先检查当前所在节点是否是Leader,如果是才能真正发起业务,如果不是,则丢弃。

这样我们就可以解决文章开始时提到的那个问题了。

感觉文章写飘了,说到的东西有点多,Consul的这个点反而没有什么好讲的。其实重点是一致性算法和分布式锁的实现,有兴趣的同学可以看下相关的论文,Google搜一下就有了。笔者最近也在阅读和翻译谷歌实现Chubby的那篇论文,翻译的内容挂在Github上,不过还没有翻译完成,有兴趣的同学欢迎一起翻译,在Github搜”Chubby中文”就能找到项目了,或者点击原文链接也行。

https://mp.weixin.qq.com/s/gkA1qDx8e3XrNXXnxLyHfQ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259