分布式架构有以下几点普适性的共性需求:

1. 提供集群的集中化的配置管理功能,可以不重启就让新的配置参数生效,类似与配置中心

     2. 简单可靠的集群节点动态发现机制,便于动态发现服务,动态扩展节点

     3. 简单可靠的leader选举机制

     4. 提供分布式锁

zookeeper的数据结构整体上可以看作一颗目录树,其中每个节点被称作ZNode,每个Znode都可以通过其路径(Path)唯一标识,如/services/helloworld。每个ZNode都可以绑定一个二进制存储数据(Data),用来存储少量数据,默认最大1MB。不建议在ZNode中存储大量的数据,因为数据多份复制,会带来宽带压力,降低性能。

ZNode有一个ACL访问权限列表,用来决定当前操作API 的用户是否有操作此节点的权限。ZNode还提供了实时通知的接口--Watch,应用可以选择任意ZNode进行监听,如果被监听的ZNode或者其Child发生变化,则应用可以实时收到通知,这样一来,很多场景和需求都能通过ZooKeeper来实现了。

此外,ZNode是有生命周期的,这取决于节点的类型,节点的类型分为以下几类:

 1. 持久节点:节点创建后就一直存在,直到有删除操作来主动删除该节点

2. 临时节点:临时节点的生命周期和创建该节点的客户端会话绑定,即如果客户端会话失效(客户端宕机或下线),这个节点自动删除

3. 时序节点:创建节点是可以设置这个属性,ZooKeeper会自动为给定的节点加上一个数字后缀,作为新的节点名。数字后缀的范围是整型的最大值

4. 临时性时序节点:同时具备临时节点与时序节点的特性,主要用于分布式锁的实现

从上面的分析来看,持久节点主要用于保存持久化数据,如集群的配置信息,结合Watch特性,实现配置的实时生效。

临时节点可以实现复杂的动态服务发现和服务路由功能。通常的做法是,分布式集群不同服务器上的服务注册到同一个ZooKeeper上,并在某个指定的路径下创建各自对应的临时节点,如/serviceA/node1, /serviceA/node2,客户端则监听/service目录。当有新的节点加入集群时,ZooKeeper会把变化实时通知到所有客户端,客户端就可以及时更新自己的服务路由转发表,实现全自动透明的服务发现和服务路由功能。

时序类型的节点,在创建时,每个节点名都会被追加一个递增的序号,类似于数据库自增主键,每个ZNode都有唯一序号,而且不会冲突。以此可以实现简单的Master(Leader)选举机制。即把一组service实例都注册为临时性时序节点ZNode,每次选取Master时,选取序号最小的为Master,而当Master宕机时,相应的ZNode会消失,新的服务器列表会推送至客户端,继续选举下一任Master,这样就做到了动态选举Master。

ZooKeeper主要用于以下场景:

1. 实现配置管理(配置中心)

2. 服务注册中心

3. 集群通信与控制子系统

作为服务注册中心时:

首先服务提供者将自身的服务信息注册到注册中心。通常注册信息包含如下内容:

1. 服务的类型

2. 隶属于哪个系统

3. 服务的IP/端口

4. 服务的请求URL

5. 服务的权重

其次注册中心要将所有服务信息存储,同时负责将注册信息的更新推送到所有的消费者(通过Watch机制实现)。

最后,服务消费者只有在初始化及服务变更时会依赖注册中心,而在整个服务调用过程中与服务提供方直接通信,不依赖于任何第三方,包括注册中心。

欢迎关注我的微信公众号(Sunnick,请扫码关注),随时留言交流~

ZooKeeper系列(1)--分布式系统的基石的更多相关文章

  1. zookeeper系列(五)zookeeper在大型分布式系统中的应用

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6063694.html 尊重原创感谢博主公开这么好的博文, ...

  2. Zookeeper系列六:服务器角色、序列化与通信协议、数据存储、zookeeper总结

    一.服务器角色 1. Leader 1)事务请求的唯一调度者和处理者.保证事务处理的顺序性 事务请求:导致数据一致性的请求(数据发生改变).如删除一个节点.创建一个节点.设置节点数据,设置节点权限就是 ...

  3. Zookeeper 系列(三)Zookeeper API

    Zookeeper 系列(三)Zookeeper API 本节首先介绍 Zookeeper 的 Shell 命令,再对 Java 操作 Zookeeper 的三种方式进行讲解,本节先介绍 Zookee ...

  4. Zookeeper 系列(一)基本概念

    Zookeeper 系列(一)基本概念 https://www.cnblogs.com/wuxl360/p/5817471.html 一.分布式协调技术 在给大家介绍 ZooKeeper 之前先来给大 ...

  5. 【分布式】Zookeeper在大型分布式系统中的应用

    一.前言 上一篇博文讲解了Zookeeper的典型应用场景,在大数据时代,各种分布式系统层出不穷,其中,有很多系统都直接或间接使用了Zookeeper,用来解决诸如配置管理.分布式通知/协调.集群管理 ...

  6. zookeeper系列之六—zookeeper之应用

    http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3113923.html Zookeeper是hadoop的一个子项目,虽然源自hadoop ...

  7. ZooKeeper系列(1):安装搭建ZooKeeper环境

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk ZooKeeper有三种安装模式:单机安装(standalone ...

  8. ZooKeeper系列(2):ZooKeeper命令行工具zkCli.sh

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.简介 ZooKeeper提供了一个非常简单的命令行客户端zk ...

  9. ZooKeeper系列(3):znode说明和znode状态

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.znode znode的官方说明:http://zookee ...

  10. ZooKeeper系列(4):ZooKeeper的配置文件详解

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk zkServer.sh读取的默认配置文件是$ZOOKEEPER_ ...

随机推荐

  1. 《Java并发编程实战》读书笔记(一)----- 简介

    简史 早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源.随着计算机发展,操作系统的出现,使得计算机可以同时运行多个程序,并且每程序都在单独的进程内运行.为什么要 ...

  2. PAT 1033. To Fill or Not to Fill

    #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> ...

  3. 【转】Dom节点操作常用方法

    1.访问/获取节点 document.getElementById(id); //返回对拥有指定id的第一个对象进行访问 document.getElementsByName(name); //返回带 ...

  4. 新手必需用!大道至简的前端编辑器Sublime Text

    很多人在进入学习前端的时候(包括我自己),除了选择学习合适的技术,还需要一个得(自)心(己)应(喜)手(欢)的开发工具,一个得心应手的开发工具除了可以令你的效率大大提高,也可以令你在写代码的时候,心情 ...

  5. 006服务监控看板Hystrix Dashboard

    1.POM配置 和普通Spring Boot工程相比,仅仅添加了Hystrix Dashboard和Spring Boot Starter Actuator依赖 <dependencies> ...

  6. windows定位dll的搜索顺序

    原文:http://blog.csdn.net/zzxian/article/details/6429293 Visual C++ Windows 用来定位 DLL 的搜索路径 通过隐式和显式链接,W ...

  7. spring----面试题

    1.什么是Spring beans? Spring beans 是那些形成Spring应用的主干的java对象.它们被Spring IOC容器初始化,装配,和管理.这些beans通过容器中配置的元数据 ...

  8. SQL Server ->> Computed Column(计算列)

    Computed Column(计算列)是自SQL Server 2005开始就有的特性.计算列的定义是一个表达式.表达式可以是非计算列,常量,函数间的组合.但是不可以是子查询. 计算列数据固化 默认 ...

  9. mongodb数据库集合操作

    1:更新update update() 方法用于更新已存在的文档.语法格式如下: db.collection.update( <query>, <update>, { upse ...

  10. webpack从零开始第1课:安装webpack和webpack-dev-server

    原文地址:https://segmentfault.com/a/1190000012536871 webpack目录 第1课: 安装webpack和webpack-dev-server 第2课: 配置 ...