我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Zookeeper原理架构与搭建

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Zookeeper原理架构与搭建

学一个东西,不搞明白他是什么东西,哪还有心情学啊!! 
首先,Zookeeper是Apache的一个java项目,属于Hadoop系统,扮演管理员的角色。 
然后看到官网那些专有名词,实在理解不了。

在Zookeeper的官网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

那么我们来仔细研究一下这个东西吧!

1341090-20181129120226999-716042544.png


2.1 配置管理

 这个好理解。分布式系统都有好多机器,比如我在搭建hadoop的HDFS的时候,需要在一个主机器上(Master节点)配置好HDFS需要的各种配置文件,然后通过scp命令把这些配置文件拷贝到其他节点上,这样各个机器拿到的配置信息是一致的,才能成功运行起来HDFS服务。Zookeeper提供了这样的一种服务:一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。这样就省去手动拷贝配置了,还保证了可靠和一致性.

1341090-20181129120500464-226132073.jpg

2.2 名字服务

这个可以简单理解为一个电话薄,电话号码不好记,但是人名好记,要打谁的电话,直接查人名就好了。 
分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务; 

  • 类似于域名与ip之间对应关系,域名容易记住; 

  • 通过名称来获取资源或服务的地址,提供者等信息

2.3 分布式锁

碰到分布二字貌似就难理解了,其实很简单。单机程序的各个进程需要对互斥资源进行访问时需要加锁,那分布式程序分布在各个主机上的进程对互斥资源进行访问时也需要加锁。很多分布式系统有多个可服务的窗口,但是在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。举个通俗点的例子,比如银行取钱,有多个窗口,但是呢对你来说,只能有一个窗口对你服务,如果正在对你服务的窗口的柜员突然有急事走了,那咋办?找大堂经理(zookeeper)!大堂经理指定另外的一个窗口继续为你服务!

2.4 集群管理

在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中有些机器(比如Master节点)需要感知到这种变化,然后根据这种变化做出对应的决策。我已经知道HDFS中namenode是通过datanode的心跳机制来实现上述感知的,那么我们可以先假设Zookeeper其实也是实现了类似心跳机制的功能吧!

  1 最终一致性:为客户端展示同一视图,这是zookeeper最重要的功能。 
  2 可靠性:如果消息被到一台服务器接受,那么它将被所有的服务器接受。 
  3 实时性:Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。 
  4 等待无关(wait-free):慢的或者失效的client不干预快速的client的请求。 
  5 原子性:更新只能成功或者失败,没有中间状态。 
  6 顺序性:所有Server,同一消息发布顺序一致。

用到Zookeeper的系统

HDFS中的HA方案 
YARN的HA方案 
HBase:必须依赖Zookeeper,保存了Regionserver的心跳信息,和其他的一些关键信息。 
Flume:负载均衡,单点故障

1341090-20181129140605757-1148599083.jpg

1 每个Server在内存中存储了一份数据; 
2 Zookeeper启动时,将从实例中选举一个leader(Paxos协议); 
3 Leader负责处理数据更新等操作(Zab协议); 
4 一个更新操作成功,当且仅当大多数Server在内存中成功修改数据

1341090-20181129140634233-384981295.jpg

4.1 Zookpeeper Server 节点的数目

Zookeeper Server数目一般为奇数 
Leader选举算法采用了Paxos协议;Paxos核心思想:当多数Server写成功,则任务数据写 
成功。也就是说: 
如果有3个Server,则两个写成功即可; 
如果有4或5个Server,则三个写成功即可。 
Server数目一般为奇数(3、5、7) 
如果有3个Server,则最多允许1个Server挂掉; 
如果有4个Server,则同样最多允许1个Server挂掉 
既然如此,为啥要用4个Server?

4.2 Observer节点

3.3.0 以后 版本新增角色Observer 

增加原因: 
Zookeeper需保证高可用和强一致性; 
当集群节点数目逐渐增大为了支持更多的客户端,需要增加更多Server,然而Server增多,投票阶段延迟增大,影响性能。为了权衡伸缩性和高吞吐率,引入Observer: 

Observer不参与投票; 
Observers接受客户端的连接,并将写请求转发给leader节点; 
加入更多Observer节点,提高伸缩性,同时不影响吞吐率。

1341090-20181129140711734-703805358.jpg

客户端首先和一个Server或者Observe(可以认为是一个Server的代理)通信,发起写请求,然后Server将写请求转发给Leader,Leader再将写请求转发给其他Server,Server在接收到写请求后写入数据并相应Leader,Leader在接收到大多数写成功回应后,认为数据写成功,相应Client。

 

1341090-20181129140828516-2062458742.jpg

 

组织结构

  zookeeper采用层次化的目录结构,命名符合常规文件系统规范; 
  每个目录在zookeeper中叫做znode,并且其有一个唯一的路径标识; 

Znode
  Znode可以包含数据和子znode(ephemeral类型的节点不能有子znode); 
  Znode中的数据可以有多个版本,比如某一个znode下存有多个数据版本,那么查询这个路径下的数据需带上版本; 
  客户端应用可以在znode上设置监视器(Watcher) 
  znode不支持部分读写,而是一次性完整读写 

Znode类型
  Znode有两种类型,短暂的(ephemeral)和持久的(persistent); 
  Znode的类型在创建时确定并且之后不能再修改; 
  ephemeral znode的客户端会话结束时,zookeeper会将该ephemeral znode删除,ephemeralzn ode不可以有子节点; 
  persistent znode不依赖于客户端会话,只有当客户端明确要删除该persistent znode时才会被删除; 
  Znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、PHEMERAL_SEQUENTIAL。

 

Zookeeper安装方式有三种,单机模式集群模式以及伪集群模式

  • 单机模式:Zookeeper只运行在一台服务器上,适合测试环境;

  • 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例;

  • 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble)

Zookeeper通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务继续。为什么一定要超过半数呢?这跟Zookeeper的复制策略有关:zookeeper确保对znode 树的每一个修改都会被复制到集合体中超过半数的机器上。

单机模式

打开zookeeper的官方下载地址:

https://archive.apache.org/dist/zookeeper/

 

目前最新版本为3.4.13,下载对应的包即可!

基于docker方式安装

本文所使用的操作系统是 ubuntu-16.04.5-server-amd64,docker镜像采用的是ubuntu:16.04

 

创建一个空目录

mkdir /opt/zookeeper

 

dockerfile

内容如下:

FROM ubuntu:16.04
# 修改更新源为阿里云
ADD sources.list /etc/apt/sources.list
ADD zookeeper-3.4.13.tar.gz /
ADD zoo.cfg / 
# 安装jdk
RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && \ 
    cd /zookeeper-3.4.13 && \
    mkdir data log && \
    mv /zoo.cfg conf
EXPOSE 2181
# 添加启动脚本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

 

注意:zookeeper依赖java环境。如果不安装,会导致2181端口无法开启!

ADD 文件名,如果这个是文件是tgz或者tar.gz,docker会自动解压,并自动删除压缩包。

所以在dockerfile中,需要写解压命令以及删除压缩文件

 

run.sh

内容如下:


#!/bin/bash

cd /zookeeper-3.4.13/bin/zkServer.sh starttail -f NOTICE.txt


 

注意:由于docker启动时,要保证run.sh执行之后,要能够hold住,所以最后使用tail -f NOTICE.txt。

这样docker后台执行时,才不会终止掉!

 

sources.list

内容如下:

deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

 

zoo.cfg

内容如下:

tickTime=2000dataDir=/zookeeper-3.4.13/data
dataLogDir=/zookeeper-3.4.13/log
clientPort=2181

 

这个是zookeeper的配置文件,主要配置这几项就可了!

参数解释:

 

tickTime:Client-Server通信心跳时间

Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。

dataDir:数据文件目录

Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。

clientPort:客户端连接端口

客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

dataLogDir:存放顺序日志(WAL)

dataLogDir如果没提供的话使用的则是dataDir。zookeeper的持久化都存储在这两个目录里。

为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性。

 

此时 /opt/zookeeper 目录结构如下:

./├── dockerfile
├── run.sh├── sources.list
├── zoo.cfg
└── zookeeper-3.4.13.tar.gz


 

创建镜像

docker build -t zookeeper /opt/zookeeper

 

运行zookeeper

docker run -d -it -p 2181:2181 zookeeper

 

查看端口是否启动


root@jqb-node128:/opt/zookeeper# netstat -anptActive Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      9197/sshd       
tcp        0      0 192.168.91.128:22       192.168.91.1:50402      ESTABLISHED 1466/0          tcp6       0      0 :::22                   :::*                    LISTEN      9197/sshd       
tcp6       0      0 :::2181                 :::*                    LISTEN      37198/docker-proxy


 

查看docker 进程

root@jqb-node128:/opt/zookeeper# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES6ab3e463aebb        zookeeper           "/run.sh"           3 minutes ago       Up 3 minutes        0.0.0.0:2181->2181/tcp   hardcore_booth

 

进入 docker 容器

root@jqb-node128:/opt/zookeeper# docker exec -it 6ab3e463aebb /bin/bash

 

执行 zookeeper的cli脚本,使用ls / 查看所有节点

root@6ab3e463aebb:/# cd /zookeeper-3.4.13/bin/root@6ab3e463aebb:/zookeeper-3.4.13/bin# ./zkCli.sh[zk: localhost:2181(CONNECTED) 0] ls /[zookeeper]

 

默认只有一个zookeeper 节点

 

查看节点

[zk: localhost:2181(CONNECTED) 1] ls /zookeeper [quota]

 

获取节点数据


[zk: localhost:2181(CONNECTED) 2] get /zookeeper cZxid = 0x0ctime = Thu Jan 01 00:00:00 UTC 1970mZxid = 0x0mtime = Thu Jan 01 00:00:00 UTC 1970pZxid = 0x0cversion = -1dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 0numChildren = 1


 

关于 Zookeeper 的基础命令操作,请参考链接:

https://blog.csdn.net/dandandeshangni/article/details/80558383

 

关于 Zookeeper 另外2中默认搭建,请参考链接:

http://www.cnblogs.com/wuxl360/p/5817489.html

 

 

本文参考链接:
http://www.cnblogs.com/arjenlee/articles/9224366.html


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Zookeeper原理架构与搭建

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Zookeeper原理架构与搭建

学一个东西,不搞明白他是什么东西,哪还有心情学啊!!首先,Zookeeper是Apache的一个java项目,属于Hadoop系统,扮演管理员的角色。然后看到官网那些专有名词,实在理解不了。在Zookeeper的官网上有这么一句话:ZooK
2023-01-31

搭建JEESZ分布式架构7--Zookeeper注册中心安装

ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization).命名服务(Naming Service).集群维护(Group M
2023-06-03

DHCP服务的原理与搭建

本篇内容介绍了“DHCP服务的原理与搭建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、DHCP实现原理1. DHCP是什么DHCP(Dy
2023-06-05

学习CSS的基本框架构建原理与实现方法

随着互联网的快速发展,网页的设计越来越受到重视。而CSS作为网页设计的重要部分之一,其制作网页基本框架的原理和实现方法也就备受关注了。本文将通过具体代码示例讲解CSS制作网页基本框架的原理与实现方法。一、HTML和CSS基本语法在了解C
学习CSS的基本框架构建原理与实现方法
2024-01-16

如何进行Zookeeper分析与集群搭建

本篇文章为大家展示了如何进行Zookeeper分析与集群搭建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Zookeeper简介Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理、命
2023-06-02

java三层架构原理与作用小结

三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。概念简介1、表现层(UI)
2023-05-31

python 服务器的架构搭建

今天我将给大家介绍一种简单的python服务器的架构搭建:nginx + gunicron+supervisor + DjangoDjango 虽然自带了http相应服务,但不稳定,响应个数也很少,不能满足生产环境的需求,所以我们让ngin
2023-01-31

Asp.Net三层架构怎么搭建

搭建Asp.Net三层架构可以按照以下步骤进行:1. 创建项目:在Visual Studio中创建一个新的Asp.Net项目。2. 添加分层文件夹:在项目中创建三个文件夹,分别用于存放表示层、业务逻辑层和数据访问层的文件。3. 创建表示层:
2023-09-08

如何搭建vue3.0项目架构

小编给大家分享一下如何搭建vue3.0项目架构,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、用 vue-cli 创建项目npm uninstall vue-c
2023-06-25

DHCP原理是什么与如何搭建

这篇文章主要讲解了“DHCP原理是什么与如何搭建”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DHCP原理是什么与如何搭建”吧!DHCP(Dynamic Host Configuration
2023-06-27

Redis高可用架构如何搭建

今天小编给大家分享一下Redis高可用架构如何搭建的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。持久化机制在理解集群架构前,
2022-12-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录