前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Curator在大数据集群可靠性中的应用以及改进

Curator在大数据集群可靠性中的应用以及改进

作者头像
java达人
发布2019-09-10 20:04:31
7120
发布2019-09-10 20:04:31
举报
文章被收录于专栏:java达人java达人

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/doggie_wangtao/article/details/70667203

Curator简介

大家都知道,ZooKeeper是当前大数据领域内常用的分布式协调组件。几乎在所有的大数据、分布式处理组件中都能见到它的应用。但由于ZooKeeper提供的原始API并不是很易用,在其基础上封装一些高级应用(服务发现、分布式锁、Master选举等)需要处理到很多细节,是一件很复杂的事情。

Curator在此场景下应运而生,由Netflix贡献到Apache社区,至今已经成了各大厂商使用ZooKeeper服务的标配第三方库。它提供了Framework模块对ZooKeeper客户端进行了高级封装,并且对外包装了连接状态的处理以及重试逻辑,另外提供了Recipes模块封装一些针对ZooKeeper应用场景开发出来的高级特性(Elections、Locks、Barriers、Counters等等)。这次我们要介绍的就是Recipes模块中的leader(Elections)子特性。

LeaderLatch与Master选举

LeaderLatch是Curator中Elections特性中的主要接口,它封装了一个CuratorFramework和一个用于选举的ZooKeeper ZNode路径。用于在多个实例中随机选取一个作为Master实例,其他作为Standby实例备用;当Master实例发生故障或者退服后,再选举其中一个Standby实例升主,继续对外提供不间断的服务。

LeaderLatch是怎么参与Maser选举的呢?流程是这样的:在启动时,在指定的latch path(由用户指定)下建立一个前缀为latch-的ZNode,Create Mode选定为EPHEMERAL_SEQUENTIAL,EPHEMERAL指创建的节点为临时节点,在session关闭后会被服务端删除,SEQUENTIAL意味着在同一个path下创建的节点是递增有序的。ZNode建立完毕后,会调用一个回调函数,在这个回调函数里处理Master竞选的逻辑。

其实竞选逻辑也很简单,每个实例都会在指定的latch path下创建一个latch-前缀的ZNode,而在服务端这些请求是被顺序处理的,且每个ZNode后缀是递增有序的。那么实例创建ZNode完成后,只需要将latch path下的所有ZNode取到,做一个排序,若本实例创建的ZNode在有序序列的第一个,则为leader;否则为standby实例,继续监控排在本实例ZNode之前的实例节点(此处很妙,监控前一个ZNode而不是leader ZNode,是为了防止羊群效应)。当监控的节点被删除时,重新触发竞选过程。

表示成图如下:

LeaderLatch对ZooKeeper connection的敏感度及优化

以上说的是正常情况下的选举逻辑,实际上LeaderLatch除了处理服务端ZNode节点的变化外,还要处理与ZooKeeper集群的连接状态。当连接状态发生变化时,LeaderLatch的竞选逻辑也要做相应的改变。

我们先从LeaderLatch的组成部分开始:

LeaderLatch中有一个listener,会在启动的时候加入到ConnStateManager的listner列表中,而CuratorFramework处理每次事件时,都会检查Event的状态,将ZooKeeper的状态转换为Curator内部状态码后,交由ConnStateManager处理,而ConnStateManager处理的最关键步骤就是作为总线将这些状态传递注册的listener。ZooKeeper连接状态到Curator内部状态码的对应关系如下:

而LeaderLatch中注册的listener是处理conn state的,处理的流程图如下:

可以看到,出现LOST或者SUSPENDED时,LeaderLatch都做降备处理,而对应的ZooKeeper状态确实Disconnected,这是一种很常见的状态。当ZooKeeper客户端和服务端暂时断开连接时,ZooKeeper客户端收到的状态就是Disconnected。

这样就意味着在网络情况较差,或者ZooKeeper集群中的实例发生故障时,一定会导致LeaderLatch降备行为的发生。我们知道在大规模集群下,网络情况偶尔闪断、集群节点下电、进程故障等情况发生的概率还是很大的。决不能容忍这些情况下LeaderLatch降备从而导致服务的主备切换,增加服务的不可用时间。

针对这种情况,我们做了如下优化:

即在发生SUSPENDED事件后,会在降备之前等待一个connection timeout的时间,如果在此时间内ZooKeeper客户端尝试重连集群成功,则忽略这次断连时间。否则按照之前的处理逻辑,降备处理。

通过增加这一个缓冲区域,我们有效的降低了LeaderLatch(以及依赖其提供HA的上层服务)的可用性,大大减少了服务发生主备切换的频率,效果提升明显。

java达人语:

网上系统讲述Curator原理的技术文章是不多的,这是其中一篇, 想要了解通过Curator构建分布式锁可以阅读ZooKeeper构建分布式锁(选译),关于Curator session超时和连接超时的内容,参考如下:

https://www.cnblogs.com/qingyunzong/p/8666288.html

https://www.cnblogs.com/tiancai/p/9921572.html

http://blog.itpub.net/29254281/viewspace-2120610/

从源代码层面理解LeaderLatch可以阅读这篇:

http://jiaoqsh.github.io/apache-curator-leaderselector-leaderlatch.html

java达人

ID:drjava

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Curator简介
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档