文档章节

Zookeeper Introduction

Yulong_
 Yulong_
发布于 2017/08/09 12:28
字数 1802
阅读 22
收藏 0

问题思考

对于 hadoop 生态系统来说,有几个问题需要通过分布式协调服务来解决:

  1. 高可用性的主节点选举。对于集群各服务,如 HDFS、YARN、HBASE、SPARK 等如何保证同一时间只有一个主节点对外提供服务。
  2. YARN 中 ResourceManager 失败后如何恢复执行任务的必要信息:Application 状态信息,Application 对应的 ApplicationAttempt 信息,以及一些相关的安全令牌信息。
  3. Hive 数据仓库中 SQL 查询的并发锁问题。

因此,诞生了一个针对分布式系统的可靠协调系统,即 Zookeeper。

 

简介


Zookeeper 是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。

ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。相关例子包括:分布式队列、分布式锁和一些节点的“领导者选举”。

 

数据结构


Zookeeper 维护一种树状层次结构,树中的节点被称为 znode,znode 用来存储数据。一种是短暂 znode,一种是持久 znode。

短暂 node 是根据会话连接存在,会话消失或超时,则消失。

持久 znode 只有客户端明确要删除该持久 znode 时才被删除。


Zookeeper 使用这样一个类似文件系统的树结构,数据可以挂在某个节点上,可以对这个节点进行删改。由于 zookeeper 集群作为一个整体对提供服务,所以对于任何节点上的修改都是对集群整体进行修改,也可以说是对集群内所有的节点同时进行修改。

Znode 的大小存在限制,默认是 1MB。可以通过参数调整,但是 Zookeeper 设计的初衷并不是存储大数据量,而是对关键数据对外提供高效稳定的服务。

合理的使用 znode,不仅提高 Zookeeper 服务的性能,也能保证 Zookeeper 服务的稳定性。


选举


Zookeeper 服务有两种运行模式:Standalone 模式和 Replicated 模式。当只有一个服务器来作为 Zookeeper 服务器时,是 Standalone 模式,可以用于开发测试环境。

生产环境下,Zookeeper 通常使用 Replicated 模式,来保证高可用性和可恢复性,Replicated模式下集群内部只要有半数以上的服务器处于可用状态,它就能够提供服务。


Replicated 模式下集群内的所有机器通过一个选择过程选出一台称为”领导者(leader)”,其他机器称为“跟随者(follower)”。一旦半数以上(或指定数量)的跟随者已经将其状态与领导者同步,则选举过程结束。如果 Leader 挂了,zk 集群会重新选举,在毫秒级别就会重新选举出一个 Leaer。Leader 提供写入请求,所有机器提供读取请求,观察者我们这里不谈。所有的写请求都会发送给领导者,再有领导者将更新广播给所有的跟随者。当半数以上的跟随者已经将修改持久化之后,领导者才会提交这个更新。然后客户端会受到一个更新成功的响应。这个用来达成共识的协议被设计成具有原子性,因此每个修改要么成功要么失败。这类似于数据库中的两段式提交协议。


为了保证客户端查看 Zookeeper 各机器数据的及时性,客户端对 znode 的数据读取会自动调用 sync 操作。Sync 操作会强制此服务器的 znode 同步到 leader 的状态。

通常情况下,生产环境使用 replicated 模式,集群通常包含奇数台机器。一般 3 或 5台。例如,在一个有 5 节点的集群内部,只允许最多 2 台机器出现故障,只要有 3 台或者 3台以上的机器存活,那么集群就可以对外提供服务器。注意,对于 6 台机器的集群,也只允许最多 2 台机器出现故障,当出现 3 台机器故障时,集群同样不能对外提供服务。


设计特点


Zookeeper 的设计中有如下特点:
 

  • 顺序一致性

全局唯一的 ID,称为 zxid(”ZooKeeper Transaction ID”).ZooKeeper 要求的更新都是按照编
号并排序,决定了分布式系统的执行顺序。对某一个 znode 的更新,比如操作 a 执行先于操
作 b,那么所有的客户端只会出现先看到 a 再看到 b;反之不能。
 

  • 原子性

一个更新作为一个原子事务,要么成功要么失败。如果失败,任何客户端不会看到更新的结
果。
 

  • 单一系统映像

任何客户端在连接到任何 zookeeper 服务器时,看到都是同样的视图。按顺序连接到不同的
zookeeper 服务器,只会看到更新结果。比如,ClientA 先后登录 ServerA 和 ServerB,那么在
ClientA 在 ServerB 上看到的视图总是比 ServerA 看到的更新。

 

  • 持久性

一个更新一旦成功,结果就会永久写入,并不能被撤销。
 

  • 及时性

任何客户端看到的系统视图都可能滞后的,但是滞后时间不能太长。如果一个服务器的系统
视图过久,那还不如关闭此服务器,连接到一个系统视图较新的服务器。

 


注意事项

 

  • 机器列表

客户端链接 Zookeeper 的机器列表、每个 Zookeeper 服务器的机器列表必须保持一致。
如果客户端包含列表少与服务端,虽然工作还是正常的,但是损失了 Zookeeper 服务部分的高可用性。
如果客户端的列表里包含不同 Zookeeper 集群的服务器,那么有些工作可能将变得异常。当然同一集群内的各个 Zookeeper 服务器的配置应该保持一致。

 

  • 内存设置

你应该特别留心设置 Zookeeper 服务的 Java max heap size。
Zookeeper 中的 znode 数据都会存放在内存中,同时内存数据的快照会定期保存在磁盘上。
Zookeeper 需要足够的内存,确保 zookeeper 不会使用 swap,确保 Zookeeper 分配的最大 heap size 不大于真正可用的内存。

 

  • 日志磁盘

Zookeeper 中影响性能最关键的部分在于 transaction log。Zookeeper 在做出响应之前会把事务日志同步到存储介质上。

一个独立的日志磁盘是维持优秀性能的关键。如果将日志写入一个繁忙的磁盘将导致恶劣的性能表现。

© 著作权归作者所有

Yulong_
粉丝 10
博文 145
码字总数 253510
作品 0
朝阳
部门经理
私信 提问
OpenStack 上搭建 Kafka 集群

最近在 OpenStack 环境下需要部署消息队列集群,包括 RabbitMQ 和 Kafka,这篇记述一下 Kafka 集群的部署过程。 本文所用的环境包括: 软件版本 OpenStack 版本: Pike release Kafka 版本:2...

blackpiglet
2018/10/15
0
0
ZooKeeper教程资源收集(简介/原理/示例/解决方案)

菩提树下的杨过: ZooKeeper 笔记(1) 安装部署及hello world ZooKeeper 笔记(2) 监听数据变化 ZooKeeper 笔记(3) 实战应用之【统一配置管理】 ZooKeeper 笔记(4) 实战应用之【消除单点故障】...

easonjim
2017/09/05
0
0
Java之品优购部署_day01(3)

2.2 搭建 Zookeeper 集群 2.2.1 搭建要求 真实的集群是需要部署在不同的服务器上的,但是在我们测试时同时启动十几个虚拟机 内存会吃不消,所以我们通常会搭建伪集群,也就是把所有的服务都搭...

我是小谷粒
2018/07/06
0
0
CentOS6 上安装 zookeeper-3.4.10 服务

参考两篇文章: zookeeper-3.4.10的安装配置: https://www.jianshu.com/p/5a4d7390bbfd Zookeeper3.4.10详解和安装: https://blog.csdn.net/qq_32642039/article/details/80887823 SpringBoot......

文文1
2018/10/26
39
0
Apache ZooKeeper 3.3.6 发布

Apache ZooKeeper 3.3.6 发布了,ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标...

oschina
2012/08/04
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
5分钟前
2
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
7分钟前
1
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
34分钟前
2
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
5
0
前端技术之:webpack热模块替换(HMR)

第一步:安装HMR中间件: npm install --save-dev webpack-hot-middleware 第二步:webpack配置中引入webpack对象 const webpack = require('webpack’); 第三步:增加devServer配置项: ho......

popgis
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部