唠唠Zookeeper的观察者

阅读本文之前,推荐阅读:

基于zookeeper leader选举方式一

Kafka源码系列之源码分析zookeeper在kafka的作用

观察者简介

回顾一下Zookeeper的运行时的角色。

观察者的设计是希望能动态扩展zookeeper集群又不会降低写性能。

虽然通过让客户端直接连接到集群的投票成员,ZooKeeper也表现得非常好,但是这种架构使得很难扩展到有大量的客户端情况。问题是,随着我们添加更多投票成员,写入性能也会随着下降。这是因为写操作需要(通常)需要集群中至少一半的节点投票达成一致,因此随着更多投票者的加入,投票的成本会显著增加。

这里引入一种新zookeeper节点类型,叫做观察者,观察者的引入帮助解决了上面的问题同时大大增加了zookeeper的动态扩展能力。观察者不参与投票,只听取投票结果。除了这个简单的区别,Observers的功能与Followers完全相同 - 客户端可以连接到它们并向它们发送读写请求。Observer会像follower一样将消息转发给leader,但是Observer只会听取投票结果,不参与投票。由于这点,我们可以增加任意数量的Observer,同时不会影响我们集群的性能。

Observer还有其它优点。因为他们不投票,所以他们不是ZooKeeper集群的重要组成部分。 因此,它们可以失败,或者与集群断开连接,而不会损害ZooKeeper服务的可用性。对用户的好处是Observer相比Follower来说更能通过不太可靠的网络链接进行连接。实际上,Observers可用于与另一个数据中心的ZooKeeper服务器通信。Observers的客户端可以快速读取,因为所有读取都在本地提供,并且写入消耗最小的网络流量,因为在没有投票协议的情况下所需的消息数量较少。

如何使用观

察者

在zookeeper集群中使用观察者是非常简单的,仅仅需要修改配置文件里的两个配置即可。

在所有将会配置为zookeeper观察者的节点,添加下面一行:

peerType=observer

这行配置告诉zookeeper这台服务器将会成为一个Observers。

其次,在所有的服务器节点,在server定义处需要在末尾增加:observer。例如:

server.1:localhost:2181:3181:observer

这会告诉其它服务server.1是一个observer,不会参与投票。

运行下面的命令即可链接到集群:

bin/zkCli.sh -server localhost:2181

使用案例

关于observer下面举两个使用案例。实际上,无论您希望扩展ZooKeeper集群的客户端数量,还是希望将集群的关键部分与处理客户端请求的负载隔离开来,Observers都是一个很好的架构选择。

1, 作为一个数据中心桥梁(datacenterbridge):为两个数据中心构建同一套zookeeper集群是会费很大劲的,因为数据中心之间网络延迟的高度变化可能会导致故障检测的误报和集群分区。但是如果集群完全部署到一个数据中心,另一个数据中心用Observers,则分区问题不会出现了。Client依然可以看到和发布提案。

2,作为消息总线的链接:一些公司表示有兴趣将ZK用作持久可靠消息总线的组件。 观察者将为这项工作提供一个自然的集成点:插件机制可用于将观察者看到的提案流附加到发布 - 订阅系统,同样不加载核心集群。

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2018-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

淘宝大秒系统设计详解

1. 一些数据2. 热点隔离3. 动静分离4. 基于时间分片削峰5. 数据分层校验6. 实时热点发现7. 关键技术优化点7.1 Java处理大并发动态请求优化7...

12120
来自专栏Java架构沉思录

淘宝大秒系统设计详解

大家还记得2013年的小米秒杀吗?三款小米手机各11万台开卖,走的都是大秒系统,3分钟后成为双十一第一家也是最快破亿的旗舰店。经过日志统计,前端系统双11峰值有...

14020
来自专栏菜鸟致敬

免主机搭建动态博客WordPress

之前有说到了如何利用GitHub Pages来搭建自己的静态博客hexo,今天我来说一下如何免主机搭建自己的动态博客WordPress。

21850
来自专栏java一日一条

内存不足:杀死进程还是牺牲子进程

早上6点,我不得不开始处理“叫醒”我的一些问题。因为当这些问题发生的时候,我的手机铃声响了。昏睡中的我非常不情愿地拿起了手机,检查我是否疯狂到将叫醒闹钟设在了早...

13610
来自专栏架构师之路

MQ,互联网架构解耦神器

一个架构常识:当调用方需要关心执行结果,通常使用RPC调用。 ? ret = PassportService::userAuth(name, pass); sw...

64590
来自专栏IT笔记

微服务化的基石——持续集成

在很多微服务化的文章中,很少会把持续集成放在第一篇,因为大多数的文章都会将如何拆的问题,例如拆的粒度,拆的时机,拆的方式。

60590
来自专栏美团技术团队

前端工程化开发方案app-proto

什么是前端工程化?根据具体的业务特点,将前端的开发流程、技术、工具、经验等规范化、标准化就是前端工程化。它的目的是让前端开发能够“自成体系”,最大程度地提高前端...

65030
来自专栏杨建荣的学习笔记

明天,实现几个还不错的功能点

明天,计划实现几个还不错的功能,算是个自己这段时间的运维里程碑划上一个句号。里程碑是自己制定的,目的是督促自己做事情有一个预期目标,在糟糕的实现中不断迭...

12020
来自专栏腾讯研究院的专栏

常见的几种数据层容灾架构比较分享

陈守志 腾讯公司平台运营开发组 一、关于容灾   关于容灾主题,这里罗列对比了几种常见的容灾案例: ?   相对接入层、应用层容灾而言,数据层的容灾相对...

58550
来自专栏進无尽的文章

iOS组件化设计与开发

首先我觉得”组件”在这里不太合适,因为按我理解组件是指比较小的功能块,这些组件不需要多少组件间通信,没什么依赖,也就不需要做什么其他处理,面向对象就能搞定。而这...

33150

扫码关注云+社区

领取腾讯云代金券