热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Zookeeper入门教程一(概述、安装和命令)

文章目录一、Zookeeper概述1.1什么是Zookeeper1.2数据模型ZNode二、Zookeeper安装与部署2.2单机安装2.2集群部署三、Zookeeper命令简介3

文章目录

  • 一、Zookeeper 概述
    • 1.1 什么是Zookeeper
    • 1.2 数据模型ZNode
  • 二、Zookeeper 安装与部署
    • 2.2 单机安装
    • 2.2 集群部署
  • 三、Zookeeper 命令简介
    • 3.1 ZNode节点命令
  • 四、总结


一、Zookeeper 概述

1.1 什么是Zookeeper

官网图标

Zookeeper官网对于“What is Zookeeper?”做出以下解释(吐槽了难以管理的应用):

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

from

ZooKeeper是一个开源的分布式应用程序协调服务,是Hadoop的一个子项目。它是集群的管理者(就是用来管理服务的);

ZooKeeper本身提供的常见服务如下(先看看,以后会用起来的) :

  • 命名服务 - 按名称标识集群中的节点。它类似于DNS,但仅对于节点。
  • 配置管理 - 加入节点的最近的和最新的系统配置信息。
  • 集群管理 - 是否有机器退出和加入、选举master。
  • 选举算法 - 选举一个节点作为协调目的的leader。
  • 分布式锁 - 在修改数据的同时锁定数据。
  • 队列管理 - 同步队列或者按照 FIFO 方式进行入队和出队操作

1.2 数据模型ZNode

Zookeeper使用了类似文件系统的数据模型,它的命名空间中的每个节点拥有它自己或者自己子节点相关的数据,ZK中必须使用绝对路径“/”开头。如图所示:

znode

ZooKeeper树中,每一个节点被称为znode,和文件系统一样,我们能够自由的添加、删除znode,唯一的不同在于znode是可以存储数据的。有两种类型的znode:

  • 持久节点(PERSISTENT):

即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下所有znode节点都是持久的。


  • 临时节点(EPHEMERAL):

客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。临时节点不允许有子节点。\


  • 顺序节点

顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /db的znode创建为顺序节点,则ZooKeeper会将路径更改为 /db0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。


二、Zookeeper 安装与部署

ZooKeeper服务器是用Java创建的,它在JVM上运行,安装zookeeper之前要先安装JVM(此步骤略过)。

ZooKeeper可以运行在多种系统平台上面,下表展示了ZooKeeper支持的系统平台。

系统开发环境生产环境
linux支持支持
windows支持不支持
MacOS支持不支持
FreeBSD支持支持
Solaris支持支持

2.2 单机安装

可以到官网下载,也可以点击百度云下载3.4.9版本 ,执行命令:

tar -zxvf zookeeper-3.4.9.tar.gz

进入解压缩后的文件,如图所示,
安装环境

解释一下目录:

bin目录中是zk可执行脚本目录,包括zk服务端、zk客户端;conf 是zk的配置文件目录;lib中是zk依赖的包;contrib 中是用于操作zk的工具包;recipes目录 :zk某些用法的代码示例;

在conf文件夹中,有一个文件zoo_sample.cfg,修改其名称为zoo.cfg;
在这里插入图片描述
编辑该配置文件:vim zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zk/datadataLogDir=/usr/local/zk/log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

了解一下这些配置参数的意思:

  1. tickTime

时长单位为毫秒,是zk使用的基本时间度量单位。默认值为2000毫秒。


  1. initLimit

指定了启动zookeeper时,zookeeper实例中的随从实例同步到领导实例的初始化连接时间限制,超出时间限制则连接失败(以tickTime为时间单位);


  1. syncLimit

指定了zookeeper正常运行时,主从节点之间同步数据的时间限制,若超过这个时间限制,那么随从实例将会被丢弃;


  1. clientPort

客户端连接使用端口,默认2181端口;


  1. dataDir

必须配置,用于配置存储快照文件。如果没有配置dataLogDir,那么事务日志也会存储在此目录。

添加日志存储路径,保存;进入bin目录下。执行 ./zkServer.sh start 启动zookeeper,显示如图信息,zookeeper启动成功;
在这里插入图片描述

启动zookeeper 客户端,连接到服务端,成功安装并开启!
在这里插入图片描述

2.2 集群部署

对于集群模式下的ZooKeeper部署,3个ZooKeeper服务进程是建议的最小进程数量(建议是奇数个,原因之后将),而且不同的服务进程建议部署在不同的物理机器上面,减少机器宕机带来的风险,以实现ZooKeeper集群的高可用。

三个zookeeper的conf/zoo.cfg 配置如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/lcoal/zk/data
dataLogDir=/usr/local/zk/log
clientPort=2181
server.1=192.168.2.149:2888:3888
server.2=192.168.2.151:2888:3888
server.3=192.168.2.152:2888:3888

每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样。myid 的值必须是 zoo.cfg中server.{数值} 的{数值}部分。其中2888是集群之间的通信端口,3888 是投票选举使用的端口;

在dataDir目录下,添加myid文件;内容如下:

149 :echo '1' > /usr/local/zk/data/myid;
151 :echo '2' > /usr/local/zk/data/myid;
152 :echo '3' > /usr/local/zk/data/myid;

最后使用单机模式的方式启动zookeeper即可,完成集群式部署;
151
151
149
通过命令./zkCli.sh -server 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181,即可连接到zookeeper集群,至于连接到哪一个上,是随机的。

[root@linux-test bin]# ./zkCli.sh -server 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181
Connecting to 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181
2018-11-26 18:01:23,551 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2018-11-26 18:01:23,554 [myid:] - INFO [main:Environment@100] - Client environment:host.name=localhost
2018-11-26 18:01:23,554 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_161
2018-11-26 18:01:23,556 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2018-11-26 18:01:23,556 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/software/jdk/jdk1.8.0_161/jre
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/software/zookeeper-3.4.9/bin/../build/classes:/software/zookeeper-3.4.9/bin/../build/lib/*.jar:/software/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/software/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/software/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/software/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/software/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/software/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/software/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/software/zookeeper-3.4.9/bin/../conf:.:/software/jdk/jdk1.8.0_161/lib/dt.jar:/software/jdk/jdk1.8.0_161/lib/tools.jar
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-358.el6.x86_64
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/software/zookeeper-3.4.9/bin
2018-11-26 18:01:23,561 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@579bb367
Welcome to ZooKeeper!
2018-11-26 18:01:23,615 [myid:] - INFO [main-SendThread(192.168.2.152:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 192.168.2.152/192.168.2.152:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2018-11-26 18:01:23,731 [myid:] - INFO [main-SendThread(192.168.2.152:2181):ClientCnxn$SendThread@876] - Socket connection established to 192.168.2.152/192.168.2.152:2181, initiating session
2018-11-26 18:01:23,766 [myid:] - INFO [main-SendThread(192.168.2.152:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 192.168.2.152/192.168.2.152:2181, sessionid = 0x3674f6dcafc0000, negotiated timeout = 30000WATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181(CONNECTED) 0]

三、Zookeeper 命令简介

ZooKeeper命名空间中的Znode,兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。

3.1 ZNode节点命令

在bin目录下,通过./zkCli.sh 连接到本地zkserver,就可以操作znode节点了,常用命令:

① help命令用于查询客户端所支持的命令

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd argsstat path [watch]set path data [version]ls path [watch]delquota [-n|-b] pathls2 path [watch]setAcl path aclsetquota -n|-b val pathhistory redo cmdnoprintwatches on|offdelete path [version]sync pathlistquota pathrmr pathget path [watch]create [-s] [-e] path data acladdauth scheme authquit getAcl pathclose connect host:port

② create 命令用于创建节点,其中-s为顺序节点,-e为临时节点

create /orm/mybatis mydata
create -s /orm/mybatis orderData
create -e /orm/mybatis temporaryData

③ set命令用于设置节点的数据,如:

(注:Zookeeper是用来协调服务的,因此znode里存储的都是小数据,而不是大容量的数据,数据容量一般在1MB范围内。)

set /orm/mybatis i_am_a_mybatis

④ get 命令用于获取节点的信息,注意节点的路径必须是以/开头的绝对路径。如get /orm/mybatis

[zk: localhost:2181(CONNECTED) 12] get /orm/mybatis
i_am_a_mybatis
cZxid = 0x200000009
ctime = Mon Nov 26 18:18:49 CST 2018
mZxid = 0x20000000a
mtime = Mon Nov 26 18:24:22 CST 2018
pZxid = 0x200000009
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 14
numChildren = 0

参数解释:

参数描述备注
cZxid节点创建时的zxid格式时间戳Zxid是一个64为的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个 新的epoch。低32位是个递增计数。
ctime节点创建时间
mZxid节点最近一次更新时的zxid格式时间戳
mtime节点最近一次更新的时间
cversion子节点数据更新次数
dataVersion本节点数据更新次数
aclVersion节点ACL(权限列表)的更新次数
ephemeralOwner如果该节点为临时节点,ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是临时节点,ephemeralOwner值为0
dataLength节点数据长度,本例中为i_am_a_mybatis的长度
numChildren子节点个数

⑤stat 命令用于查看节点的状态信息,如stat /orm/mybatis

⑥ls命令 用于获取路径下的节点信息,注意路径为绝对路径,如:ls /orm/mybatis

⑦setquota命令用于设置节点个数以及数据长度的配额,如:

setquota –n 5 /orm/mybatis //设置/orm/mybatis 子节点个数最大为5setquota –b 100 /orm/mybatis //设置/orm/mybatis 节点长度最大为100

⑧ listquota命令用于显示配额,如listquota /orm/mybatis

在这里插入图片描述

⑨delquota:该命令用于删除配额,-n为子节点个数,-b为节点数据长度,如:delquota –n 2

⑪ setAcl命令,用于设置节点ACL (注:每个znode都有一个ACL:Access Control List(访问控制列表))

⑫ getAcl命令获取节点的Acl,如getAcl /node1

zk提供了下边三种身份验证模式:world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)digest: 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authenticationip: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段super: 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)

ACL权限对应如下表:

权限描述
CREATE(c)创建权限,可以在当前node下创建child node
DELETE(d)删除权限,可以删除当前的node
READ(r)读权限,可以获取当前node的数据,可以list当前node所有的child nodes
WRITE(w)写权限,可以向当前node写数据
ADMIN(a)管理权限,可以设置当前node的permission

在设置ACL时,可以给zk客户端和服务器端的连接设置ACL,也可以在创建znode时,给znode设置ACL,在创建了znode后,如果有zk客户端来操作znode,只有满足权限要求时,才能完成相对应的操作:

⑩ addauth命令,用于节点认证,使用方式:如addauth digest username:password

⑬ sync命令

sync命令用于强制同步,由于请求在半数以上的zk server上生效就表示此请求生效,那么就会有一些zk server上的数据是旧的。sync命令就是强制同步所有的更新操作。

⑭printwatchers命令,用于设置和显示监视状态,值为on或则off

⑮ quit命令 ,退出客户端

四、总结

以上内容就是zookeper入门级别学习的开始,我们了解了什么是zookeeper,以及zookeepr的数据模型、常用命令、安装部署等;但zookeeper能帮助我们做哪些东西呢?我们为什么要学习并且使用它呢,在之后的系列文章中,我们会更多的了解并使用zookeeper。

欢迎各位留言交流。


推荐阅读
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
author-avatar
手机用户2502901591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有