什么是 Zookeeper

Zookeeper 是一个开放源代码的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现;

Zookeeper 是典型的分布式数据一致性的解决方案,分布式应用程序可以基于它来实现:数据发布/订阅负载均衡命名服务分布式锁等;

Zookeeper 基本概念

集群角色:

Zookeeper 中有 Leader、Follower 和 Observer 三种角色,Leader 为客户端提供读和写服务,Follower 和 Observer 只提供读服务;

其中 Observer 不参与 Leader 过程,也不参与写操作的“过半写成功”的策略,所以增加 Observer 机器可以在不影响写性能的情况下增加读性能;

Leader:

事务请求的唯一调度和处理者,保证集群事务处理的顺序性;

集群内部各服务器的调度者;

Follower:

Follower 服务器是 ZK 集群状态的跟随者。

处理客户端非事务请求,转发事务请求给 Leader 服务器;

参与事务请求 Proposal 的投票;

参与 Leader 选举投票;

Observer:

ZK 3.3.0 引入的全新服务器角色;

观察 ZK 集群的最新状态变化并将这些状态变更同步过来。

对于非事务请求可以独立处理,但事务请求会转发给 Leader 服务器;

也不参与任何形式的投票,包括事务请求 Proposal 和 Leader 选举投票;

Observer 只提供非事务服务;

作用:在不伤害写性能的情况下扩展 ZK;

数据模型

文件系统

Zookeeper 也使用文件系统组织系统中存储的资源,结构如下所示:

  • /

  • /app1/c1

  • /app1/c2

  • /app1/c3

  • /app2/...

其并没有文件和文件夹的概念,只有 Znode 概念,它既可以作为容器存储数据,也可以持有其他 Znode 形成父子关系;

ZNode(数据节点)

ZK 的视图结构和标准的 Unix 文件系统非常类似,如:/app1/c1

Znode 是 ZK 中数据的最小单元;

每个 ZNode 上都可以保存数据;

同时还可以挂载子节点,构成一个层次化的命名空间,称之为

ZXID(事务ID)

数据节点创建、删除、节点内容更新和客户端会话创建与失效等操作,都是事务操作;

每一个事务请求都会为其分配一个全局唯一的事务 ID,用 ZXID 表示,通常是 64 位数字;

ZNode 节点特性

节点类型

持久节点(persistent)

创建后一直存在于 ZK 服务器上,直到主动删除

持久顺序节点(persistent——sequential)

增加顺序的特性,每个父节点都会维护它的第一级子节点的顺序;

ZK 自动会给节点名加上一个数字后缀,后缀的上限是整型的最大值;

临时节点(ephemeral)

临时节点的生命周期和客户端的会话绑定,会话结束则节点消失;

临时节点不能有子节点,即临时节点只能作为叶子节点;

临时顺序节点(ephemeral_sequential)

增加了顺序特性;

节点状态

looking:

  • 不确定 leader 状态(选主中);

  • 对外不提供服务;

following:

  • 跟随者状态;

  • 作为系统的从节点,接收主节点的更新并写入本地日志;

leading:

  • 领导者状态;

  • 作为系统的主节点,接收客户端更新,写入本地日志,并通知从节点复制;

observing:

  • 观察者状态;

  • 表示当前角色是 Observer,与 Follower 不同是不参与投票和选举;

Zookeeper —— 初识的更多相关文章

  1. Dubbo+Zookeeper(一)Zookeeper初识

    前面花了一段时间去学习SpringCloud的相关知识,主要是理解微服务的概念并使用SpringCloud的一系列组件实现微服务落地.学习这些组件本身是简单的,跟着操作一遍基本就会了,这也得益于Spr ...

  2. zookeeper初识之原理

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper是hadoop的一个子项目 ...

  3. zookeeper初识

    ZOOKEEPER是为分布式系统提供高性能的协调工具 角色: 1.领导者(leader):负责进行投票的发起和决议,更新系统状态2.学习者(learner):包括跟随者(follower)和观察者(o ...

  4. 什么是ZooKeeper?

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 上次写了一篇 什么是消息队列?以后,本来想入门一下K ...

  5. 答应我,不会这些概念,简历不要写 “熟悉” zookeeper

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...

  6. 【分布式锁】06-Zookeeper实现分布式锁:可重入锁源码分析

    前言 前面已经讲解了Redis的客户端Redission是怎么实现分布式锁的,大多都深入到源码级别. 在分布式系统中,常见的分布式锁实现方案还有Zookeeper,接下来会深入研究Zookeeper是 ...

  7. 初识zookeeper(1)之zookeeper的安装及配置

    初识zookeeper(一)之zookeeper的安装及配置 1.简要介绍 zookeeper是一个分布式的应用程序协调服务,是Hadoop和Hbase的重要组件,是一个树型的目录服务,支持变更推送. ...

  8. 初识zookeeper以及安装和集群部署

    初识zookeeper以及安装和集群部署     一.Zookeeper单体版安装     在安装zookeeper之前要先安装jdk环境,具体在linux环境安装jdk1.8请参照linux笔记. ...

  9. 初识ZooKeeper

    最近在看Apache下的一个开源项目ZooKeeper(http://zookeeper.apache.org/doc/trunk/),用百度百科介绍的来说,Zookeeper是一个针对大型分布式系统 ...

随机推荐

  1. codeforces723----C. Polycarp at the Radio

    //AC代码...表示很晕 #include <iostream> using namespace std; ],b[]; int main() { int n,m,cnt; cin &g ...

  2. webpack 入门踩坑

    参考来源:知乎张轩 安装 先装好node和npm,因为webpack是一个基于node的项目.然后 npm install -g webpack 全局安装 还可以在当前项目里面也安装一个webpack ...

  3. BZOJ.4182.Shopping(点分治/dsu on tree 树形依赖背包 多重背包 单调队列)

    BZOJ 题目的限制即:给定一棵树,只能任选一个连通块然后做背包,且每个点上的物品至少取一个.求花费为\(m\)时最大价值. 令\(f[i][j]\)表示在点\(i\),已用体积为\(j\)的最大价值 ...

  4. Java并发编程(十三)-- 线程池

    什么是线程池? 线程池就是以一个或多个线程循环执行多个应用逻辑的线程集合. 为什么用线程池? 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 例如: 记创建线程消耗时 ...

  5. 潭州课堂25班:Ph201805201 django框架 第十三课 自定义404页面,auth系统中的User模型,auth系统权限管理 (课堂笔记)

    当 DEBUG=True 时,django 内部的404报错信息, 自带的报错信息, 要自定义404信息,要先把 DEBUG=False , 之后要自定义4040页面,有两种方法, 方法1,在创建40 ...

  6. Dell Venue 8 Pro启动盘UEFI模式32位启动,备份系统

    进入微PE工具箱官方下载页面:http://www.wepe.com.cn/download.html,选择Win8PE 32位 V1.2版下载. 或者直接百度盘下载:https://pan.baid ...

  7. Java 关键字 static

    关键字static作用如下: 1. 为某个基本数据类型或对象分配单一的存储空间. 2. 实现某个属性或方法与类关联.在类被加载后类名可以直接调用静态成员方法(下面简称静态方法)或者访问静态成员变量(下 ...

  8. linux 修改时间和时区

    linux系统时间有两个,一个是硬件时间,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时间,是linux系统Kernel时间.当Linux启动时,系统Kernel会去读取硬件时钟 ...

  9. Node_初步了解(4)小爬虫

    var http=require('http'); var cheerio=require('cheerio'); var url='http://www.cnblogs.com/Lwd-linux/ ...

  10. CSS魔法堂:display:none与visibility:hidden的恩怨情仇

    前言  还记得面试时被问起"请说说display:none和visibility:hidden的区别"吗?是不是回答完display:none不占用原来的位置,而visibilit ...