初探分布式环境的指挥官ZooKeeper
目录
1. 从单机到集群,分布式环境中的挑战
1.1 集中式的特点
- 部署结构简单
- 协作相对简单,不存在分布式协作问题
- 单点故障问题
1.2 集中式的痛点
随着业务的发展和演进,将所有业务集中实现在一个应用上的做法往往满足不了公司及业务发展的需要,单一的系统已经不足以承载大量的业务。 (尤其是互联网企业)
所有业务堆在一个单一的系统,其痛点:
- 业务模块边界不清,代码耦合严重,不利于维护;
- 一个大的应用工程不利于版本迭代开发和发布。
1.3 从单体到SOA的转变
面向服务架构( service-oriented architecture, SOA )
通过系统拆分实现SOA架构的价值,沉淀出一批稳定的后台服务,通过叠加复用又可以快速响应用户的前端需求。

而面向服务体系架构能够落地的基础技术之一,就是分布式服务框架。
1.4 分布式服务总体框架
- 服务拆分后的基本技术问题: 如何实现服务之间的通信?
- RPC(RMI、HttpClinet等)
- 另一方面,如何实现服务治理?
- 一般而言包括:服务自动发现、自动下线、服务注册中心、负载均衡等功能。

1.5 分布式应用概述
分布式应用可以再给定时间(同时)在网络的多个系统上运行,通过协调它们以快速有效的完成特定任务。
分布式应用正在运行的一组系统称为集群,集群中运行的每台机器称为节点。
分布式应用有Server和Client两部分。Server是分布式的,有通用的接口,以便Client可以连接到集群中的任何服务器并获得相同的结果。

分布式应用的优点
- 可靠性 单个或几个系统的故障不会使整个系统出现故障。
- 可扩展性 可以在需要时增加性能,通过添加更多机器,在应用程序配置中进行微小的更改。
- 透明性 隐藏系统的复杂性,并将其显示为单个实体/应用程序。
分布式应用的挑战
- 竞争条件 两个或多个机器尝试执行特定任务,实际上只需在任意给定时间由单个机器完成。例如,共享资源只能在任意给定时间由单个机器修改。
- 死锁 两个或多个操作等待彼此无限期完成。
- 数据一致性 数据的部分失败。
- 网络的不稳定性
2. ZK基本概念及核心原理
2.1 ZK自我介绍
姓 名: Zookeeper “动物”管理员
履 历: 基于Google Chubby开源实现,由雅虎创建; 2010年正式成为Apache的顶级项目; 已被Hadoop、Hbase、 kafka等越来越多项目作为核心基础组件。
宗 旨: 全心全意为分布式应用提供高效且可靠的协调服务。
特 点: 开源、免费。
诞生初衷: 希望作为一个通用的无单点问题的分布式协调框架,以便让程序猿将精力集中在业务逻辑处理上。
核心特性 : 树形结构数据库 + znode watch
2.2 ZK基本概念
2.2.1. 客户端-服务器架构


2.2.2 数据模型
分布式应用中的各个进程可以通过ZooKeeper的命名空间(Namespace)来进行协调,这个命名空间是共享的、具有层次结构的,更重要的是它的结构足够简单。每个命名空间被称为Znode。每个znode由3部分组成:
- Stat: 版本、权限等信息.
- data: 关联的数据.
- Children: znode下的子节点.
znode的分类
- 持久节点: 客户端断开后仍存在,默认。
- 临时节点: 生命周期和客户端会话绑定。
- 顺序节点: 可以是持久或临时节点。/app1/s0000000001 起到锁、同步的作用。
2.2.3 Session(会话)
会话中的请求按FIFO顺序执行。
客户端连接到服务器,将建立会话并向客户端分配会话ID 。
客户端以特定的时间间隔发送心跳以保持会话有效。
服务器在SESSION_TIMEOUT时间内都没有接收到客户端心跳,会话失效,临时数据与注册的订阅者都会被移除。
2.2.4 zk工作流

2.2.5 watch机制
监视是一种简单的机制,客户端可以在读取特定znode时设置Watches。
服务器会向客户端发送znode变更(Znode的增、删、改)通知。
watch分类:
- data watches:getData和exists负责设置data watch
- child watches:getChildren负责设置孩子child watch
备注:
- Watches通知是一次性的,一旦触发后即失效,必须重复注册。
- 客户端会话失效,这个会话中创建的Watcher都会被移除。
3. ZK应用举例
3.1 应用举例
分布式应用程序可以基于它实现:
- 数据发布/订阅
- 负载均衡
- 命名服务
- 分布式协调/通知
- 集群管理
- 分布式锁和分布式队列等
例,
Hadoop:依靠ZooKeeper进行配置管理和协调。
Hbase: 通过集中式配置管理和分布式互斥机制来帮助主机和区域服务器跟踪分布式数据的状态。
…
3.2 项目中的应用

Zookeeper作为注册中心
对内网四大服务(sso、web、push和collect)相互通信的RPC接口进行管理。
- 系统启动时RPC接口在ZK中注册(create node)
- 客户端从ZK获取对应的RPC接口。进行调用。
githup上有个类似的demo参考:https://github.com/luxiaoxun/NettyRpc
交互流程示意图:

4 小结
重点回顾:ZK数据模型、watch机制。
能帮助我们实现:分布式一致性、服务治理功能等。
参考资料:
《从Paxos到Zookeeper分布式一致性原理与实践》
《分布式服务框架原理与实践》
w3cschool zookeeper教程
初探分布式环境的指挥官ZooKeeper的更多相关文章
- ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据
引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们 ...
- ASP.Net Core 中使用Zookeeper搭建分布式环境中的配置中心系列一:使用Zookeeper.Net组件演示基本的操作
前言:马上要过年了,祝大家新年快乐!在过年回家前分享一篇关于Zookeeper的文章,我们都知道现在微服务盛行,大数据.分布式系统中经常会使用到Zookeeper,它是微服务.分布式系统中必不可少的分 ...
- 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)
原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...
- ZooKeeper系列(5):管理分布式环境中的数据
引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...
- ZooKeeper管理分布式环境中的数据
Reference: http://www.cnblogs.com/wuxl360/p/5817549.html 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...
- 分布式服务框架 Zookeeper — 管理分布式环境中的数据
本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们理解. ...
- Zookeeper和分布式环境中的假死脑裂问题(转)
Zookeeper和分布式环境中的假死脑裂问题 最近和同事聊天无意间发现他们的系统也存在脑裂的问题.想想当初在我们的系统中为了解决脑裂花了非常大的功夫,现在和大家一起讨论下脑裂,假死等等这些问题和解决 ...
- 搞懂分布式技术3:初探分布式协调服务zookeeper
搞懂分布式技术3:初探分布式协调服务zookeeper 1.Zookeepr是什么 Zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅,负载均衡, ...
- ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据(转)
转载来源:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...
随机推荐
- fiddler对浏览器、app抓包及证书安装
1.fiddler对浏览器抓包 1.1 对浏览器的http的抓包 Capturing开启,进行抓包: Capturing关闭,停止抓包: 如下图: 1.2 对浏览器的https抓包 1.2.1 开启 ...
- (转)OpenFire源码学习之十一:连接管理(下)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43416523 下面是下部分 C2S 1.当有客户端进行连接时根据Mina框架的模式首先调 ...
- spring--Springmvc中@Autowired注解与@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
- 17、javaWebService,的使用
2. 实质上分三步操作: 创建一个服务器端(电力系统),和一个客户端(人员系统) 第一步:使用服务器端提供的接口,生成.wsdl文件 第二步:使用.wsdl文件,在电力系统中生成服务器端的代码 第三步 ...
- win 解除鼠标右键关联
点击「开始」→「运行」→「输入Regedit」→「确定」,打开注册表编辑器,找到子键: 「HKEY_CLASSES_ROOT\*\shellex\UltroEdit」,删除此项即可:
- 【Java多线程系列一】Java实现线程方法
Java实现线程的两种方法 继承Thread类 实现Runnable接口 它们之间的区别如下: Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用 Thr ...
- cdh5.47 上配置flume
flume 配置文件 # Define a memory channel called ch1 on agent1agent1.channels.ch1.type = memoryagent1.cha ...
- 用node-http-proxy搭建代理
程序员三大必备网站是:Google.Github.StackOverflow.如果你还在用Baidu搜索技术文章的话,我想说的是,少年你已经被鄙视很多年了,赶紧换成谷歌吧,不要再被鄙视了!Github ...
- python不同包之间调用时提示文件模块不存在的问题
python对于跨包调用函数时,经常会提示模块不存在的问题,主要是python程序执行时,搜索路径导致的,python程序执行的路径依次是: (1)程序根目录(2)环境变量(3)标准库目标(D:\Py ...
- 31-Ubuntu-用户权限-02-ls输出信息介绍
ls -l 查看文件夹下文件或目录的详细信息 1 2 3 4 5 6 7 8 9 10 d/- rwx rwx r-x 2 summmer summmer 12288 2月 25 13:34 Ente ...