引子

云计算越来越流行的今天,单一机器处理能力已经不能满足我们的需求,不得不采用大量的服务集群。服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,这些信息如何推送到各个节点?并且保证信息的一致性和可靠性?

众所周知,分布式协调服务很难正确无误的实现,它们很容易在竞争条件和死锁上犯错误。如何在这方面节省力气?Zookeeper是一个不错的选择。 Zookeeper背后的动机就是解除分布式应用在实现协调服务上的痛苦。本文在介绍Zookeeper的基本理论基础上,用Zookeeper实现了一 个配置管理中心,利用Zookeeper将配置信息分发到各个服务节点上,并保证信息的正确性和一致性。

Zookeeper是什么?

引用官方的说法:“Zookeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更高级 的服务,比如同步,配置管理,集群管理,名空间。它被设计为易于编程,使用文件系统目录树作为数据模型。服务端跑在java上,提供java和C的客户端 API”。

Zookeeper总体结构

Zookeeper服务自身组成一个集群(2n+1个服务允许n个失效)。Zookeeper服务有两个角色,一个是leader,负责写服务和数据同步,剩下的是follower,提供读服务,leader失效后会在follower中重新选举新的leader。

Zookeeper逻辑图如下,

  1. 客户端可以连接到每个server,每个server的数据完全相同。
  2. 每个follower都和leader有连接,接受leader的数据更新操作。
  3. Server记录事务日志和快照到持久存储。
  4. 大多数server可用,整体服务就可用。

Zookeeper数据模型

Zookeeper表现为一个分层的文件系统目录树结构(不同于文件系统的是,节点可以有自己的数据,而文件系统中的目录节点只有子节点)。

数据模型结构图如下,

圆形节点可以含有子节点,多边形节点不能含有子节点。一个节点对应一个应用,节点存储的数据就是应用需要的配置信息。

Zookeeper 特点

  • 顺序一致性:按照客户端发送请求的顺序更新数据。
  • 原子性:更新要么成功,要么失败,不会出现部分更新。
  • 单一性 :无论客户端连接哪个server,都会看到同一个视图。
  • 可靠性:一旦数据更新成功,将一直保持,直到新的更新。
  • 及时性:客户端会在一个确定的时间内得到最新的数据。

Zookeeper运用场景

  • 数据发布与订阅 (我的业务用到这个特性,后面会有详细介绍)

应用配置集中到节点上,应用启动时主动获取,并在节点上注册一个watcher,每次配置更新都会通知到应用。

  • 名空间服务

分布式命名服务,创建一个节点后,节点的路径就是全局唯一的,可以作为全局名称使用。

  • 分布式通知/协调

不同的系统都监听同一个节点,一旦有了更新,另一个系统能够收到通知。

  • 分布式锁

Zookeeper能保证数据的强一致性,用户任何时候都可以相信集群中每个节点的数据都是相同的。一个用户创建一个节点作为锁,另一个用户检测该节点,如果存在,代表别的用户已经锁住,如果不存在,则可以创建一个节点,代表拥有一个锁。

  • 集群管理

每个加入集群的机器都创建一个节点,写入自己的状态。监控父节点的用户会受到通知,进行相应的处理。离开时删除节点,监控父节点的用户同样会收到通知。

Zookeeper在我们业务逻辑上的运用

我们公司做极光推送,Push 业务平台有大量的逻辑服务器,按业务类型分组。逻辑服务的运行依赖于配置,并且配置会在线调整,需要一个集中的配置项管理中心。Zookeeper的发布 与订阅特性以及发送更新通知的机制很好的满足了我们的需求。Zookeeper的容灾特性也免去了我们相关的大量管理工作。

下面我主要和大家分享一下Zookeeper在我们内部服务中的应用。

a. 我们的逻辑服务器包含两类配置。

一种为Acl(访问控制列表),用户的消息消费后,按照列表中的条件走向下一个逻辑服务器。另一种只是单独的算法逻辑的外提,称为Agl(访问算法列表),但是其中某些判断条件会经常变化。这两类配置被收集到了配置管理中心(即Zookeeper)。

逻辑图如下,

用户编辑好策略配置信息(xml格式),通过客户端加载到Zookeeper。Zookeeper立即通知其下的逻辑服务器(BLx),逻辑服务器 下载最新的配置策略,并应用新的策略。新的策略有可能改变某一段id范围内用户的数据流向,或越过原来的逻辑服务器,或指向新加入的逻辑服务器。

b. 数据模型设计

同一类型的逻辑服务在Zookeeper上创建一个节点,共享相同的配置信息。
该节点下面为策略配置项,分为Acl和Agl两类,如下图:(以代理逻辑服务为例)

Acl1, Acl2, Acl3, Agl1, Agl2分别存有策略配置信息。变化后会通知监听Proxy节点的逻辑服务器,Proxy逻辑服务器下载最新策略,并应用该策略。新节点的加入和退出也会通知到Proxy逻辑服务器。

c. 业务处理流程如下图

  1. 逻辑服务监听自己类型节点(本例如前图Proxy节点)
  2. 编辑新策略,加载策略到Zookeeper(策略保存在Proxy/Acls/Acl[1..n],或Proxy/Agls/Agl1[1..n])
  3. Zookeeper通知各逻辑节点
  4. 各逻辑节点下载新策略到本地,并应用新策略

原文地址http://blog.jpush.cn/index.php/push_zookeeper_study_usage/

转载于:https://www.cnblogs.com/405845829qq/p/4478027.html

Zookeeper 的学习与运用相关推荐

  1. springboot+dubbo+mybatis(注册中心使用的是zookeeper)学习

    1.dubbo简单介绍(废话节点) Dubbo开始于电商系统,是一款分布式服务框架,拥有高性能和透明化的RPC远程服务调用方案以及SOA服务治理方案.她每天为2千多个服务提供大于30亿次访问量支持,并 ...

  2. Zookeeper 入门学习

    往期博客目录 1. 详解Linux(基础篇) 2. 详解Linux(进阶篇) 3. Git&GitHub(基础) 4. Git&GitHub(进阶) 5. java多线程 6. Jav ...

  3. ZooKeeper基础学习

    简介: ZooKeeper:为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名服务.配置管理和分布式锁等分布式的基础服务. Zookeeper介绍: 是一个开放源代码的分布式协调服务,设 ...

  4. Zookeeper知识学习

    一.什么是Zookeeper? ZooKeeper 是一个开源Apache项目,提供集中式服务,用于在分布式系统中的大型集群上提供集中服务,用于维护命名和配置数据,并在分布式系统中提供灵活,强大的同步 ...

  5. ZooKeeper私人学习笔记

    俗话说"好记性不如烂笔头",编程的海洋如此的浩大,养成做笔记的习惯是成功的一步! 此笔记主要是ZooKeeper3.4.9版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误 ...

  6. 《从paxos到zookeeper》学习笔记(一)

    1.概述 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件 ...

  7. Zookeeper API 学习与使用

    Zookeeper API ZooKeeper有一个绑定Java和C的官方API.Zookeeper社区为大多数语言(.NET,python等)提供非官方API.使用ZooKeeper API,应用程 ...

  8. zookeeper入门学习之java api会话建立《四》

    在上一篇zk中简单玩了下api的连接创建会话,也总是留下了很多坑,就是那些引申开来,搞不明白的问题.有时候想追究起来,问题总是那么无穷无尽,有时候问题比答案更有力度吧,到最后都是些哲学问题吗?存在的这 ...

  9. zookeeper入门学习《一》

    Zookeeper的安装就不介绍了,mac上用 brew install zookeeper就行了,可以看到已经启动着. 下面是   zoo.cfg的主要配置 tickTime=2000    zoo ...

最新文章

  1. 机器学习三要素之数据、模型、算法
  2. dell服务器网卡em1改成eth0
  3. javascript中实现跨域的方式总结
  4. SAP Hybris Commerce里的数据库表
  5. 用js做分页,点击下一页时,直接跳到了最后一页——Number()的妙用
  6. java基础经典面试题10道
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的校园餐厅系统
  8. 【caffe】caffe采用multistep,绘制loss曲线出错
  9. Bailian3728 Blah数集【数学+set】
  10. keras TimeDistributed 描述
  11. 转:Oracle中的rownum不能使用大于的问题
  12. 地图选择器怎么用_简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用....
  13. 360的网络流量监测
  14. My Thirty-eighth - 验证二叉树搜索树 - By Nicolas
  15. 01Linux之计算机硬件软件介绍
  16. 东数西算(24H限时下载)
  17. 通过光盘安装Ubuntu18.04教程
  18. commit分拆多个 git_Git拆分commit提交
  19. 深度学习(二十九)Batch Normalization 学习笔记
  20. 代码粘贴到word文档的美化网站

热门文章

  1. python 字符匹配_python 中如何匹配字符串
  2. python【力扣LeetCode算法题库】1103- 分糖果 II
  3. python【蓝桥杯vip练习题库】ALGO-82 输出米字形
  4. com.google.gson.Gson 使用详解
  5. scikit_image
  6. c语言中的文件类型只有文本文件一种,C语言中的文件类型只有哪两种_后端开发...
  7. 网页打开慢与服务器有关吗,网站打开好慢! 原来是这些原因造成的
  8. 让指针指向初始位置c语言,初始C语言中的指针(翁凯男神MOOC)
  9. 在合并单元格中数组公式无效_Excel中合并单元格困扰多年的难题,终于被我搞定了...
  10. python跟php如何共用mysql_Python 3 多个函数共用一个mysql连接