要想学习分布式应用,ZooKeeper是一个绕不过去的基础系统。它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

今天先介绍系统的安装和基本使用,后续会推一些基本的Java使用代码。

1 安装配置ZooKeeper

https://www.apache.org/dyn/closer.cgi/zookeeper/,下载最新的ZooKeeper程序,当前最新版本是3.5.5,要求JDK在1.8以上。

1.1      基本安装

将下载的apache-zookeeper-3.5.5-bin.tar.gz文件使用命令tar -xzvf 解压到 /usr/java 目录,并将原目录名修改为zookeeper-3.5.5。

进入zookeeper-3.5.5目录并创建两个子目录 data 和logs。

# mkdir data logs

# echo 创建一个唯一的zookeeper实例号,我是用IP最后一个字节

# cd data

# vim myid  // 输入 128 后保存退出

128

# echo 复制 zoo_sample.cfg 为 zoo.cfg

# cp zoo_sample.cfg zoo.cfg

# 修改参数 dataDir

# vim zoo.cfg

dataDir=/var/lib/zookeeper

然后修改 /etc/profile,增加修改相应的环境变量

# vim /etc/profile

export PGDATA=/usr/java/postgres/data

ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5

PATH=$ZOOKEEPER_HOME/bin:$PATH

export ZOOKEEPER_HOME PATH

# zkServer.sh start  //启动服务

# zkServer.sh status //查看服务状态

# zkServer.sh stop  //停止服务

Zookeeper使用的默认端口是2181,可以在conf/zoo.cfg中修改这个端口号。安装完成后,需要在防火墙开启端口

# firewall-cmd --zone=public --add-port=2181/tcp –permanent

# firewall-cmd –reload

1.2      ZooKeeper安装为服务

创建自动启动的脚本

# cd /etc/rc.d/init.d

# touch zookeeper

# chmod +x zookeeper

# vim zookeeper

#!/bin/bash

#chkconfig:2345 10 90

#description:service zookeeper

#set java environment

JAVA_HOME=/usr/java/jdk8u222-b10

JRE_HOME=/usr/java/jdk8u222-b10/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH

export PGDATA=/usr/java/postgres/data

ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5

PATH=$ZOOKEEPER_HOME/bin:$PATH

export PATH ZOOKEEPER_HOME

su root ${ZOOKEEPER_HOME}/bin/zkServer.sh "$1"

// 添加到启动脚本

# chkconfig --add zookeeper

// 手工启动

# service start zookeeper

1.3      控制台使用zookeeper

命令行连接到zookeeper

# zhCli.sh -server 127.0.0.1:2181

尝试输入help查看可用的命令,列出了命令,发现其实没有help命令。

输入ls,查看根目录下有哪些节点

尝试创建一个新的节点,并设置一个字符串,然后使用命令get查看已经创建的节点。

尝试为/hello重新赋值

赋值命令执行后,控制台收到了一条通知事件:/hello值已经被修改。重新查看这个值,发现它的版本(dataVersion)已经从0变为1。

再执行删除命令,删掉这个节点

1.4      Windows客户端程序

在Windows上,可以安装zkui这个ZooKeeper的客户端,下载网址:https://github.com/echoma/zkui/wiki/Download

下载解压后,直接运行 zkui.exe,弹出来连接页面。

在Host部分输入ZooKeeper的地址和端口,点击Login按钮后,左边窗口列出Root下的所有zNode。使用比较简单,自己摸索几分钟就都会了。

1.5      ZooKeeper复制模式

在评估、开发、测试环境,使用一台ZooKeeper就可以了,但在生产环境应该配置为多点复制模式。同一个应用多台服务器复制部署的情况,术语叫 quorum,所有的服务器使用相同的配置文件。

复制模式部署,最少需要三台服务器,并且服务器的总数最好是奇数。复制模式部署,配置文件 conf/zoo.cfg同单点模式差不多,有一些不同,如:

dataDir=/var/lib/zookeeper

clientPort=2181

tickTime=2000

initLimit=5

syncLimit=2

server.128=zoo1:2888:3888

server.129=zoo2:2888:3888

server.130=zoo3:2888:3888

在配置文件中,initLimit是集群中ZooKeeper Server连接到leader的超时时间;syncLimit是服务器的超时时间。这两个参数,使用的时间单位都是tickTime,initLimit值为5,最终代表的是10秒;syncLimit值为2,最终代表的是4秒。

列表server.X构成了整个ZooKeeper服务,当服务启动的时候,会读取data/myid文件,获取自己的编号。

在server后面有两个端口号:"2888"和"3888"。ZooKeeper服务器之间使用这两个端口进行通信。如果使用同一台机器安装多个ZooKeeper实例搭建集群,每个实例应该使用不同的端口,如:2888:3888/2889:3889/2890:3890;另外,每个实例的dataDir和clientPort也应该不同。

2 编程使用ZooKeeper

2.1      数据模型

ZooKeeper使用层级命名空间,类似一个分布式文件系统。区别在于目录节点也可以绑定数据,类似于一个文件系统,一个文件同时也是一个目录。ZooKeeper不支持相对路径。Unicode字符都可以出现在名称中,除了下面的一些特例:

  • 不能使用null字符(\u0000)
  • 下面的字符不能正常显示,也不能使用:\u0001-\u001F和\u007F和\u009F
  • 下面的字符不允许:\ud800 - uF8FF, \uFFF0 – uFFFF
  • .可以是名称的一部分,但不能独立使用 . 和 ..,下面的名称不合法:"/a/b/./c"或"/a/b/../c"
  • "zookeeper" 是保留字

2.2      ZNodes

在ZooKeeper树中,每一个节点就是一个znode。Znode包括一个stat结构,含数据修改的版本号,以及acl版本号,时间戳。每次一个znode节点的数据发生变化,版本号都会增加。当客户端读取数据时,也会把数据的版本号一并取回去。当客户端尝试修改或删除一个znode时,需要提供尝试修改节点的版本号。如果提供的版本号同系统中当前的版本号不一致,更新失败。(类似于数据库的乐观锁实现)

ZNodes是程序访问的实体,有几个需要了解的特性:

  • Watches:客户端可以在znode上设置监听。znode数据发生变化时会触发watch,然后清除watch。当watch触发时,ZooKeeper会向客户端发送一个通知。
  • 数据访问:znode上的数据,读写都是原子性的。读,是将整个znode的所有数据都读出来;写,会替换znode的所有数据。每个znode有访问控制列表(Access Control List-ACL),用于限制谁可以访问。ZooKeeper不是设计用于保存普通数据或大数据存储,一般用于保存配置文件、状态信息等。数据通常比较小,一般以KB为单位。ZooKeeper的客户端也限制数据不能超过1M。如果业务需要保存打数据,可以将数据保存到大的存储系统如NFS/HDFS等,并将其指针保存到ZooKeeper中。
  • 临时节点:ZooKeeper可以保存一些短生命周期的节点,比如会话信息,当会话失效时这些节点会被删除。因为这个特性,临时节点不允许有子节点。
  • 顺序节点(唯一命名):创建一个节点时,可以要求ZooKeeper在路径后面添加自增的数字。格式为%010d,是10个数字,如0000000001。最大数值是2147483647,超过后会溢出,变成-2147483648。
  • 容器节点(3.5.3增加):用于一些特定的场景如leader、lock。当容器中的最后一个节点被删除后,容器变成候补(candidate)状态,服务器会择机自行删除。当你在容器节点中创建子节点时,可能会得到KeeperException.NoNodeException;因此创建子节点时应该catch这个异常,如果发生了则重新创建容器节点。
  • TTL节点(3.5.3增加):创建PERSISTENT或PERSISTENT_SEQUENTIAL节点时,可以以毫秒为单位设置TTL时间,如果在TTL时间之内没有修改数据,也没有创建子节点,服务器会在超时后择机删除这个节点。注意:这个参数缺省是关闭的,需要在系统参数中启用。

2.3      ZooKeeper中的时间

通过多种方式跟踪时间

  • Zxid:ZooKeeper的每次修改,都会收到zxid格式的时间戳。这表示在ZooKeeper上修改的顺序。如果zxid1<zxid2,说明zxid2后发生。
  • 版本号(Version numbers):一个节点的每次修改,该节点的版本号都会增加。有三个版本号:version (节点数据的修改次数), cversion (子节点数据的修改次数), aversion (节点ACL修改的次数).
  • Ticks:使用ZooKeeper复制模式时,服务器使用ticks来定义事件的时间如:上载状态、会话超时时间、服务器之间的连接超时时间等。
  • Real time:ZooKeeper不使用真实时间。

2.4      ZooKeeper Stat结构

节点的Stat结构有如下属性

  • czxid:节点创建时的zxid
  • mzxid:节点最后一次修改时的zxid
  • pzxid:子节点最后一次修改时的zxid
  • ctime:节点创建时的时间戳,毫秒
  • mtime:节点最后一次修改时的时间戳,毫秒
  • version:节点数据的修改次数
  • cversion:子节点数据的修改次数
  • aversion:节点ACL的修改次数
  • ephemeralOwner:如果这是临时节点,保存节点拥有者的session id;否则为0
  • dataLength:节点数据长度
  • numChildren:子节点个数

2.5      ZooKeeper Watches

ZooKeeper的所有读操作getData()、getChildren()和exists()都有一个备选参数:设置watch。ZooKeeper Watch的定义:是一次性的触发器,当数据发生变化时,向设置了watch的客户端发送消息。有三个关键点:

  • 一次性触发器:当数据变化时,向客户端发送watch事件。例如:使用命令 getData(“/hello”, true)读取数据,当/hello被修改或删除时,客户端都会收到事件。当数据再次发生变化时,客户端就不会收到事件了。
  • 推送到客户端:ZooKeeper设计用于保证客户端能够按照特定的顺序收到推送事件。
  • Watch的数据对象:有两种类型的watch,数据watch和子节点watch。getData()和exists()设置数据warch;getChildren()设置子节点watch。

2.6      ZooKeeper访问控制

ZooKeeper使用ACL控制节点的读写权限。父子节点的读写权限是独立的,不递归。

ZooKeeper支持的几种权限:

  • CREATE: 可以创建子节点
  • READ: 可以读取节点数据并列出子节点
  • WRITE: 可以修改节点数据
  • DELETE: 可以删除子节点
  • ADMIN: 可以设置权限

ZooKeeper内置的授权对象

  • world:所有用户
  • auth:当前用户
  • digest:使用 username:password指定的用户,密码会做MD5摘要
  • ip:使用客户端IP地址,格式是 addr/bits
  • x509:使用X500认证信息,用户名

安装配置ZooKeeper及基本用法的更多相关文章

  1. Ubuntu 16下单机安装配置zookeeper和kafka

    网上其他的没有一个能直接照做完成的,我这个也是看了些帖子,整出来的怕以后忘记 建议连接工具:Bitvise SSH Client 一.安装配置zookeeper 下载zookeeper 3.4.13: ...

  2. window安装配置 zookeeper 单机模式

    1.zookeeper简单介绍 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,我所了解到的主要的使用场景有两个 (1).微服务注册中心(Dubbo较常用Zookeeper做注册中 ...

  3. Hadoop集群搭建-02安装配置Zookeeper

    Hadoop集群搭建-05安装配置YARN Hadoop集群搭建-04安装配置HDFS  Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hado ...

  4. [Linux] linux下安装配置 zookeeper/redis/solr/tomcat/IK分词器 详细实例.

    今天 不知自己装的centos 出现了什么问题, 一直卡在 启动界面, 找了半天没找见原因(最后时刻还是发现原因, 只因自己手欠一怒之下将centos删除了, 而且选择的是在本地磁盘也删除. ..让我 ...

  5. linux 安装配置zookeeper

    1.什么是zookeeper ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用 ...

  6. centos7 安装配置zookeeper

    https://blog.csdn.net/AaronLin6/article/details/78438877 https://www.cnblogs.com/sxdcgaq8080/p/74924 ...

  7. linux 安装配置zookeeper脚本

    #!/bin/bash # automatic install zookeeper echo "========= Start to install zookeeper ========== ...

  8. zookeeper工作原理、安装配置、工具命令简介

    1.Zookeeper简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. 2.zo ...

  9. [转载] zookeeper工作原理、安装配置、工具命令简介

    转载自http://www.cnblogs.com/kunpengit/p/4045334.html 1 Zookeeper简介Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到 ...

随机推荐

  1. js 替换字符串中的双引号

    text.replace(/\"/g, ''); 可根据此方法去掉字符串中的双引号

  2. Python图像处理库Pillow常用使用方法

    PIL(Python Imaging Library)是Python一个强大方便的图像处理库,只支持到Python2.7.Pillow是PIL的一个派生分支,在Python3中用Pillow代替PIL ...

  3. python的几个实例程序员节日快乐

    python的几个小实例 有参函数 def login(username, password): name = input("请输入您的姓名").strip() pwd = inp ...

  4. fiddler---Fiddler工具栏功能介绍

    前几篇简单的介绍了Fiddler的功能,对于工具栏的操作只是简单了解,今天写一篇工具栏功能介绍和操作. 工具栏功能介绍 工具栏内容 工具栏依次是:会话保存,数据重放(Replay),转到(GO),数据 ...

  5. if, elif, else及if嵌套

    if 要判断的条件: 条件成立时,要做的事 ..... 注意:if语句以及缩进部分是看成一个完整的代码块,例如上述例子,不管age条件满不满足,最后一句打印欢迎光临始终会执行   else语法格式 i ...

  6. jdk的一条命令查看运行参数

    jps 查看运行的java进程; jinfo <pid> 查看 jvm 配置参数

  7. VMWare虚拟机提示:锁定文件失败,打不开磁盘...模块"Disk"启动失败的解决办法

    我出现该问题的原因: 昨天电脑一下子卡死,于是我就重启了电脑,重启之后我没有打开VMware虚拟机,结果第二天一上班打开VMware就发现出现了“锁定文件失败,打不开磁盘......模块"D ...

  8. C++ trais技术 模板特化的应用

    // traits 的应用 /////////////////////////////////////////// // traits template <typename T> clas ...

  9. C++ 模板特化、偏特化测试程序

    #include <iostream> // 偏特化的模板不会自己添加构造函数 ctor 和 析构函数 dtor #if 1 // P1 template <typename T1, ...

  10. 【声明式事务】Spring事务特性(二)

    spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口. 其中TransactionDefin ...