Zookeeper02—安装、命令与集群搭建

二、安装与命令

[2.0 Zookeeper 安装配置 | 菜鸟教程 (runoob.com)](https://www.runoob.com/w3cnote/Zookeeper -setup.html)

2.1 安装

2.1.1 安装 jdk
  • 安装jdk。创建目录 /usr/local/java ,将 jdk 安装包移入并解压至该目录。

  • 配置jdk环境变量。

    • 编辑 /etc/profile

      JAVA_HOME=/usr/local/java/jdk1.8.0_231
      CLASSPATH=JAVA_HOME/lib/
      PATH=PATH:$JAVA_HOME/bin
      export PATH JAVA_HOME CLASSPATH	
      
    • 使配置文件生效:source /etc/profile

    • 检查 java 环境变量是否生效:java -version | javac

2.1.2 安装 Zookeeper
  • 安装 wget 下载工具。yum install -y wget
  • 进入 Zookeeper 官网。复制相应版本的下载链接。

image-20210510154626469

  • 创建并进入目录 /usr/local/Zookeeper
  • 下载并安装 Zookeeper :wget https://mirrors.bfsu.edu.cn/apache/Zookeeper /Zookeeper -3.5.9/apache-Zookeeper -3.5.9-bin.tar.gz
  • 解压至目录 /usr/local/Zookeeper :tar -zxvf apache-Zookeeper -3.5.9-bin.tar.gz -C ./
  • 修改配置文件名:cp zoo_sample.cfg zoo.cfg

image-20210510155101779

  • 启动 Zookeeper 客户端与服务端。进入 /usr/local/Zookeeper /bin

    • 启动服务端:./zkServer.sh start

    image-20210510155209097

    • 关闭服务端:./zkServer.sh stop

      image-20210510155832053

    • 启动客户端并自动进入:./zkCli.sh

    image-20210510155629834

    • 退出客户端:quit

      image-20210510155721791

2.2 配置文件

Zookeeper的配置文件:zoo.cfg

  • 心跳间隔【tickTime】
  • 初始化同步时间【initLimit】
  • 运行时同步时间【syncLimit】
  • 数据持久化路径【dataDir】
  • 客户端连接服务端的端口【clientPort】
  • 集群配置文件【server.id】
  • 观察者角色【peerType】
# The number of milliseconds of each tick
tickTime=2000		# 心跳间隔
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10		# 集群启动时,Leader与Follower之间通信的最大时长【10个心跳时间】。若超出,则说明两者通信断开
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5			# 集群启动后,Leader与Follower之间通信的最大时长【5个心跳时间】。若超出,则说明两者通信断开
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/tmp/Zookeeper 	# 数据文件目录+数据持久化路径
# 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

# 观察者角色
# peerType=observer
# 并在集群中所有server的配置文件中,在配置成observer模式的server配置信息后追加:observer
# server.3=192.168.225.136:2289:3389:observer

# 集群配置信息
	# server.A=B:C:D
	# A:是一个数字,表示服务器的编号
	# B:当前服务器的ip地址
	# C:当前服务器与Zookeeper 集群中其他服务器进行通信的端口
	# D:集群中选举Leader时的端口
# server.1=192.168.225.136:2287:3387
# server.2=192.168.225.136:2288:3388
# server.3=192.168.225.136:2289:3389

2.3 常用Shell命令

2.3.1 新增结点

create [-s] [-e] path data # 其中 -s 为有序结点,-e 临时结点(默认是持久结点)

create /zdp "123456"  # 默认创建持久化结点。此时,如果quit退出后再./ZkCient.sh 登入
                         # 再用输入 get /hadoop 获取,结点依然存在(永久结点)
				       
create -s /a "a"         # 创建一个持久化有序结点,创建的时候可以观察到返回的数据带上了一个id       
create -s /b "b"         # 返回的值,id递增了

create -s -e /aa "aa"    # 依然还会返回自增的id,quit后再进来,继续创建,id依然是往后推的

create /aa/xx            # 继续创建结点,可以看到pZxid变化了
  • 默认创建方式【持久结点】:

image-20210511151935990

  • 创建持久有序结点【在结点名后添加自增ID】:

image-20210511152441835

  • 创建临时结点:

image-20210511153221521

  • 创建临时有序结点:

image-20210511153734459

注意:在 Zookeeper 中只有一个序号计数器,统一管理着持久结点与临时结点的序号ID,以保证序号为一直递增状态。

2.3.2 修改结点

set path "newValue" [version] # version 版本号

set /hadoop "345"        # 修改结点值

set /hadoop "hadoop-x" 1 # 也可以基于版本号进行更改,类似于乐观锁,当传入版本号(dataVersion)
                         # 和当前结点的数据版本号不一致时,Zookeeper 会拒绝本次修改

image-20210511154702613

结点的值可以被修改,但是结点的类型不允许被修改。

2.3.3 删除结点
  • 删除单个结点

delete path [version]set 方法相似,也可以传入版本号,版本号不一致时,将会禁止删除

delete /hadoop           # 删除结点
delete /hadoop 1         # 乐观锁机制,与set 方法一致
  • 删除当前结点及其后代结点

使用递归删除,命令为 deleteall path

2.3.4 查看结点状态

stat path

image-20210515211936216

2.3.5 返回结点列表

ls path

ls /                     # 根结点
ls /hadoop               # 可以查看结点的列表
ls -s /hadoop            # 可以查看结点的列表以及目标结点的信息

image-20210511160746160

2.3.6 监听器

需要注意的是Zookeeper的触发器是一次性的(One-time trigger),即触发一次后就会立即失效。

(1)get 监听

使用get path [watch] 注册的监听器能够在结点内容发生改变的时候,向客户端发出通知。

get /hadoop watch        # get 的时候添加监听器,当值改变的时候,监听器返回消息
set /hadoop 45678        # 测试
(2)ls 监听

使用 ls path [watch] 或 ls2 path [watch]注册的监听器能够监听该结点下所有子结点增加删除操作。

ls /hadoop watch         	# 添加监听器
set /hadoop/node "node"		# 更新结点
delete /hadoop/node			# 删除结点
2.3.7 权限控制

Zookeeper类似文件系统,client可以创建结点、更新结点、删除结点,可以通过Zookeeperaccess control list 访问控制列表实现对结点权限的控制。

acl权限控制,使用scheme:id:permission来标识,主要涵盖3个方面:

  • 权限模式(scheme):授权的策略
  • 授权对象(id):授权对象的id
  • 权限(permission):授予的权限

其特性如下:

  • Zookeeper的权限控制是基于每个znode结点的,需要对每个结点设置权限

  • 每个znode支持多种权限控制方案和多个权限

  • 子结点不会继承父结点的权限,客户端无权访问某结点,但可以访问它的子结点

// 将 IP 为:192.168.133.133 的客户端的结点权限设置为可以对结点进行增删改查和管理的权限
setAcl /test2 ip:192.168.133.133:crwda  
(1)权限模式

权限模式scheme:采用何种方式授权

方案描述
world只有一个用户:anyone,代表登录Zookeeper所有人(默认)
ip对客户端使用IP地址认证
auth使用已添加认证的用户认证【密码为明文形式】
digest使用"用户名:密码"方式认证【密码为密文形式】
(2)授权对象

授权对象id:权限被赋予的实体

方案描述
world只有一个用户:anyone,代表登录Zookeeper所有人(默认)
ip对客户端使用IP地址认证
auth使用已添加认证的用户认证【密码为明文形式】
digest使用"用户名:密码"方式认证【密码为密文形式】
(3)权限类型

create、delete、read、writer、admin也就是 增、删、查、改、管理权限,这5种权限简写为 c d r w a,注意:这五种权限中,有的权限并不是对结点自身操作的例如:delete是指对子结点的删除权限。可以试图删除父结点,但是子结点必须删除干净,所以delete的权限也是很有用的。

权限ACL简写描述
createc可以创建子结点
deleted可以删除子结点(仅下一级结点)
readr可以读取结点数据以及显示子结点列表
writew可以设置结点数据
admina可以设置结点访问控制权限列表
(4)相关命令
命令使用方式描述
getAclgetAcl path读取ACL权限
setAclsetAcl path acl设置ACL权限
addauthaddauth scheme auth添加认证用户

2.4 ZK JavaAPI

Znode 是 Zookeeper 的核心组件,Zookeeper API 提供了一组方法使用 Zookeeper 来操纵 Znode 的所有细节。客户端应该遵循以下步骤,与 Zookeeper 服务端进行交互。

  • 连接到 Zookeeper 服务器。Zookeeper 服务器为客户端为客户端分配会话 ID
  • 定期向服务器发送心跳。否则,Zookeeper 服务器将为过期会话 ID,客户端需要重新连接
  • 只要会话 ID 处于活动状态,就可以获取/设置 Znode
  • 所有任务完成后,断开与 Zookeeper 服务器的连接。如果客户端长时间不活动,则 Zookeeper 服务器将自动断开客户端
2.4.1 连接至 ZK 服务器
public static void main(String[] args) throws IOException, InterruptedException {
    // 计数器对象
    CountDownLatch countDownLatch = new CountDownLatch(1);
	// 服务器IP与端口号
    // 客户端与服务器之间的会话超时时间,以毫秒为单位
    // 监视器对象:监听客户端与服务端之间的连接状态
    ZooKeeper zookeeper = new ZooKeeper("192.168.225.136:2181", 5000, (WatchedEvent x) -> {
        if (x.getState() == Watcher.Event.KeeperState.SyncConnected) {
            System.out.println("连接成功");
            // 主线程结束阻塞状态
            countDownLatch.countDown();
        }
    });
    // 主线程阻塞等待连接对象的创建成功——通过监听器对象实现
    countDownLatch.await();
    System.out.println(zookeeper.getSessionId());
    zookeeper.close();
}

ZooKeeper 创建连接时是异步进行的,所以此时需要借助一个对象来讲主线程进行阻塞,从而能够监听到客户端与服务端之间的连接是否已经建立成功。本段代码中使用的是计数器对象来进行线程的阻塞,并通过 ZooKeeper 的 Watcher 监听机制来监听客户端与服务端之间的连接状态。

2.4.2 新增结点
// 同步
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
// 异步
create(String path, byte[] data, List<ACL> acl, CreateMode createMode,
      AsynCallback.StringCallback callBack, Object ctx)
  • path:结点路径
  • data:服务器IP:端口号PORT
2.4.3 修改结点
2.4.4 删除结点
2.4.5 查看结点
2.4.6 检查结点是否存在

三、集群搭建

单机环境下,jdk/Zookeeper 安装完毕,基于一台虚拟机,进行 Zookeeper 伪集群的搭建,Zookeeper 集群中包含3个结点,结点对外提供服务的端口是2181、2182、2183。首先需要在解压缩的文件中创建一个用于存储快照文件的文件夹:

image-20210510210523599

  1. 基于原 Zookeeper 安装包的解压缩文件,复制三份创建对应的服务器文件,分别对应 Zookeeper 2181、Zookeeper 2182、Zookeeper 2183

image-20210510204123773

  1. 分别修改三份的配置文件。如2181的zoo2181.cfg
# 数据快照文件所在路径
dataDir=/usr/local/Zookeeper /Zookeeper 2181/zkData
# 服务器对应端口号
clientPort=2181
# 集群配置信息
	# server.A=B:C:D
	# A:是一个数字,表示服务器的编号
	# B:当前服务器的ip地址
	# C:当前服务器与Zookeeper 集群中其他服务器进行通信的端口
	# D:集群中选举Leader时的端口
server.1=192.168.225.136:2287:3387
server.2=192.168.225.136:2288:3388
server.3=192.168.225.136:2289:3389
  1. 在存储快照文件的文件夹 zkData 中,执行 echo “1” > myid 创建 myid 文件,在其中添加配置文件中设置的服务器ID。

image-20210510210755161

  1. 首先启动集群中的第一个 server。启动2181:

image-20210510211427959

当集群中只启动了一个 server 时,该启动的 server 不会变为 Leader ,即在未建立连接之前,选举机制不会生效

image-20210512201601169

  1. 启动集群中的其他 server 并查看各服务器的工作状态:./zkServer.sh status【因为集群中设置了3个服务器,所以默认第2个为Leader】

image-20210510211826699

只有当连接建立后,选举机制才会生效。

  1. 通过客户端登录集群中的服务器:./zkCli.sh -server [服务器IP]:[服务器端口号]
./zkCli.sh -server 192.168.225.136:2181
./zkCli.sh -server 192.168.225.136:2182
./zkCli.sh -server 192.168.225.136:2183

image-20210510212529164

  1. 集群同步。集群中的某一个服务器进行了更新操作,该更新都会更新到集群中的其他服务器中

image-20210510221956786

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我姓弓长那个张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值