观察者:扩展ZooKeeper而不影响写性能

尽管ZK运行地很好通过客户端直接连接来投票集群的成员,这个结构使它很难扩展出很多客户端。问题是当我们加入更多的投票成员时,写性能就会下降。这是因为一个写操作需要(通常)至少集群中一半的节点同意,并且投票的花费可能明显地增加当加入更多的投票者时。

我们已经引入一个新的Zk节点类型叫作观察者,它能帮助解决这个问题并且进一步地提高ZK的扩展性。观察者是集群中不投票的成员,只监听投票的结果,而不是同意协议通往他们。除了这一个小的不同点,观察者和追随者的功能几乎一样 - 客户端可以连接到他们并且发送读和写请求给他们。观察者推送这些请求给领导者就像追随者那样,但是他们然后简单地等待投票的结果。因为这个,我们可以想增加多少就可以增加多少观察者的数量而不影响投票的数量。

观察者还有另外一个优点。因为他们不参与投票,他们不是ZK集群的关键部分。因为他们可以失效,或者和集群失联,而不影响ZK服务的可用性。对用户来说好处是观察者可以通过不怎么可靠的网络连接相连。事实上,观察者可以被用来从另一个数据中心和ZK服务对话。观察者的客户端将看到很快地读,因为所有的读是在本地被服务的,并且写导致很小的网线影响因为消息需要的投票者存在的数量更少。

怎么使用观察者

启动一个ZK集群使用观察者是非常简单的,只需要对你的配置文件做两个改变。首先,在每一个想要成为观察者节点的配置文件中,你必须加入这一行:

peerType=observer

这一行告诉ZK这个服务端想要成为观察者。第二,在每一个服务端的配置文件中,你必须在每一个观察者的服务者定义那一行加入:observer。例如:

server.:localhost:::observer

这告诉每一个其它服务端server.1是一个观察者,并且他们应该不要求它来投票。这是所有你需要增加的配置。现在你可以连接上它就好像它是一个普通的追随者。试试。通过运行下面的命令:

bin/zkCli.sh -server localhost:

这里的localhost:2181是观察者的主机名和端口号,正如在每一个配置文件中指定的那样。你应该可以看到一个命令行提示,通过它你可以发起像ls的命令来查询ZK服务。

使用案例

下面列出了两个使用安全。事实上,在你想要扩展ZK集群的客户端数量的地方,或者你想从处理客户端请求的压力隔离关键集群的关键部分。观察者是一个好的选择。

  • 作为一个数据中心桥梁:在两个数据中心之间组成一个ZK集群是一个有问题的努力,因为数据中心之间的很高的延迟可能导致假阳性的失效检测和隔离。然而如果如果集群完全运行在一个数据中心,并且第二个数据中心只运行观察者,隔离就不是集群关心的问题。观察者的客户端仍然可以看和发起建议。
  • 作为到一个信息bus的连接 - 一些公司已经表示了使用ZK作为持续性可靠的消息bus的兴趣。对于这个工作观察者将给出一个自然地整个点:一个插件机制可以被使用来附加到建议的流上一个观察者看作一个发布-订阅系统,而不加载主要的集群。

ZooKeeper观察者(十三)的更多相关文章

  1. docker环境下分析zookeeper观察者角色

    问题引入 zookeeper新引入的角色observer是不参与投票的,通过增加observer节点,可以在提高zk系统读吞吐量时,不影响写吞吐量. 那么问题来了 Zookeeper系统节点如果超过半 ...

  2. zookeeper中Watcher和Notifications

    问题导读:1.zookeeper观察者什么时候调用?2.传统远程轮询服务存在什么问题?3.zk中回调服务的机制是什么?4.zk中watcher为什么不永久注册?5.什么是znode? 在阅读之前首先明 ...

  3. Consul 启动命令

    服务端: nohup consul agent -server -bootstrap-expect 1 -config-dir /etc/consul.d/ -data-dir /var/opt/co ...

  4. ZooKeeper服务-操作(API、集合更新、观察者、ACL)

    操作 create:创建一个znode(必须要有父节点)delete:删除一个znode(该znode不能有任何子节点)exists:测试一个znode是否存在并且查询它的元数据getACL,setA ...

  5. Zookeeper系列(十三)Zookeeper的请求处理

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6179118.html尊重原创,奇文共欣赏: 一.前言 在 ...

  6. Dubbo入门到精通学习笔记(十三):ZooKeeper集群的安装、配置、高可用测试、升级、迁移

    文章目录 ZooKeeper集群的安装.配置.高可用测试 ZooKeeper 与 Dubbo 服务集群架构图 1. 修改操作系统的/etc/hosts 文件,添加 IP 与主机名映射: 2. 下载或上 ...

  7. 从观察者设计模式的角度理解Zookeeper中的Watcher

    前面关于Zookeeper提供的API中,可以观察到大部分接口参数似乎都是用了Wathcerz这个接口.这个在观察者模式中略有涉及,本文重点分析从观察者模式的角度分析该接口. 首先上该接口的UML图: ...

  8. Zookeeper那些事

    一. 什么是Zookeeper Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务 它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务, ...

  9. ZooKeeper的原理(转)

    一.ZooKeeper的角色 领导者(Leader),负责进行投票的发起和决议,更新系统状态. 学习者(Learner),包括跟随者(Follower)和观察者(Observer),Follower用 ...

随机推荐

  1. POJ 3487 The Stable Marriage Problem(稳定婚姻问题 模版题)

    Description The stable marriage problem consists of matching members of two different sets according ...

  2. 百度安卓sdk开发

    一 key问题 1 在百度地图api控制台申请key的流程主要用到了app包,开发工具的开发sha1和发布sha1值,这2个值的获取就非常关键了. 一般来说我们都是在windows上开发安卓,使用an ...

  3. Python实现FTP服务功能

    本文从以下三个方面, 阐述Python如何搭建FTP服务器 一. Python搭建FTP服务器 二. FTP函数释义 三. 查看目录结构 四. 上传下载程序 一. Python搭建FTP服务器 1. ...

  4. parse_str — 将字符串解析成多个变量

    $arr2="first=value1&second=value2&third[]=value3&third[]=value4"; parse_str($a ...

  5. 使用 Python 操作 Git 版本库 - GitPython

    GitPython 是一个用于操作 Git 版本库的 python 包, 它提供了一系列的对象模型(库 - Repo.树 - Tree.提交 - Commit等) 用于操作版本库中的相应对象. 版本库 ...

  6. 面试:谈谈你对jQuery的理解

    jQuery是一个轻量级的javascript框架,极大的简化了js的编程. 1.首先jQuery提供了强大的元素选择器.用于获取html页面中封装了html元素的jQuery对象.像常见的选择器有: ...

  7. WPF 分页控件的实现 -用户控件

    效果图:

  8. jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失

    jsp当做第二个servlet  request的生命周期   请求 响应  不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束  request的域消失

  9. Foundation框架—时间输出格式NSDateFormatter

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.下面来介绍NSDateFormatter的常用属性和API:  1.常用属性 @ ...

  10. 【bzoj1877】[SDOI2009]晨跑 费用流

    题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...