7edafc531e6e8fb43cb3603853ba5677.png

Zookeeper分布式服务框架是Apache Hadoop的一个子项目,主要为分布式系统提供协调服务以及一些数据管理问题,如命名服务、集群管理、分布式应用配置等。zookeeper可以将简单易用的接口和高效稳定的系统提供给用户。

在大型网站中,zookeeper一直占据着重要地位,主要功能如下:

zookeeper是为别的分布式程序服务的

Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)

Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务

虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:

为用户程序提供数据节点监听服务;

管理(存储,读取)用户程序提交的数据;

一、zookeeper集群安装

由于zookeeper的集群投票选主机制(下面会介绍),超过半数的节点投票才能完成选主。并且必须超过半数的节点存活才能提供服务。所以集群中节点数最好为奇数台,但不少于3台。我们将我们的zookeeper集群安装到三台虚拟机上。

1.1 环境准备

三台虚拟机

192.168.66.101

192.168.66.102

192.168.66.103

JDK安装包(jdk-7u71-linux-i586.tar.gz)

zookeeper安装包(zookeeper-3.4.5.tar.gz)

1.2 创建zk用户

登录三台虚拟机,添加zookeeper的管理用户,执行如下命令添加一个新用户,注意必须使用root用户权限来添加新用户,需要在三台虚拟机上都要创建一个新用户。

groupadd zkg #添加一个组

useradd zk -g zkg # 添加一个用户,并制定该用户属于zkg组

passwd # 给用户设置密码,下面提示输入密码,以及确认密码

ef8dc1c3f6ae2c105279f1d8d7bb1858.png

1.3 安装

三台虚拟机的用户创建完成之后,在一台虚拟机上来安装zookeeper,切换到刚创建的用户下执行如下命令

su zk #切换到zk用户cd ~ # 进入zk用户的home目录

使用ftp工具将jdk安装包和zookeeper安装包上传至任一台虚拟机中zk用户home目录下,并解压至apps目录下

mkdir appstar -zxvf jdk-7u71-linux-i586.tar.gz -C apps/tar -zxvf zookeeper-3.4.5.tar.gz -C apps/

按照下面的步骤,配置环境变量,JDK安装完毕,注意三台机器都需要配置

su # 切换到root用户

vi /etc/profile # 编辑系统配置文件,将下面三行内容粘贴至文件末尾

export JAVA_HOME=/home/zk/apps/jdk-7u71-linux-i586export ZOOKEEPER_HOME=/home/zk/apps/zookeeper-3.4.5export PATH=$PATH:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin

source /etc/profile # 使修改后配置文件生效

su zk # 切换为zk用户

检查jdk的安装是否成功,只检查已有加压文件的机器

java -version # 查看jdk版本信息

修改zookeeper的配置文件

cd ~/apps/zookeeper-3.4.5/conf # 进入到zookeeper的配置文件存放目录

cp zoo_sample.cfg zoo.cfg # 将zoo_sample.cfg复制一份,并更名为zoo.cfg

vi zoo.cfg # 编辑zoo.cfg并将下面内容添加到文件末尾

server.1=192.168.66.101:2888:3888 # (主机名, 心跳端口、数据端口)server.2=192.168.66.102:2888:3888server.3=192.168.66.103:2888:3888

修改dataDir和dataLogDir的值

dataDir=/home/zk/apps/zookeeper-3.4.5/datadataLogDir=/home/zk/apps/zookeeper-3.4.5/log

:wq #保存并退出

创建data和log目录,用于存放数据和日志信息

cd /home/zk/apps/zookeeper-3.4.5/mkdir -m 755 datamkdir -m 755 log

在data文件夹下新建myid文件,myid的文件内容为1

cd data/

echo 1 > myid #新建myid文件,并输入内容为1

将配置好的文件目录发至其他机器上

scp -r /home/zk/apps zk@192.168.66.102:/home/zk/ # 通过scp将apps目录发至其他机器,需要输入密码

scp -r /home/zk/apps zk@192.168.66.103:/home/zk/

修改其他机器上的myid

到192.168.66.102上:修改myid为:2

到192.168.66.103上:修改myid为:3

启动每台机器上的zookeeper

zkServer.sh start

查看集群状态

jps # 查看进程

zkServer.sh status #查看集群状态,主从信息

二、zookeeper的结构和命令

2.1 zookeeper特性

Zookeeper:一个leader,多个follower组成的集群

全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的

分布式读写,更新请求转发,由leader实施

更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行

数据更新原子性,一次数据更新要么成功,要么失败

实时性,在一定时间范围内,client能读到最新数据

2.2 zookeeper数据结构

层次化的目录结构,命名符合常规文件系统规范(见下图)

每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识

节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点,下一页详细讲解)

客户端应用可以在节点上设置监视器(后续详细讲解)

55cc4098c098eff1c6e0e5b1e02f9dbb.png

2.3 节点类型

Znode有两种类型

短暂(ephemeral)(断开连接自己删除)

持久(persistent)(断开连接不删除)

Znode有四种形式的目录节点(默认是persistent )

PERSISTENT

PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )

EPHEMERAL

EPHEMERAL_SEQUENTIAL

创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

2.4 zookeeper命令行操作

运行 zkCli.sh –server 进入命令行工具

zkCli.sh –server 192.168.66.101

ls / #查看当前 ZooKeeper 中所包含的内容

create /zk "myData" # 创建一个新的 znode ,使用 create /zk myData 。这个命令创建了一个新的 znode 节点“ zk ”以及与它关联的字符串

get /zk # 我们运行 get 命令来确认 znode 是否包含我们所创建的字符串

get /zk watch

#监听这个节点的变化,当另外一个客户端改变/zk时,它会打出下面的

#WATCHER::

#WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk

set /zk "zsl" #通过 set 命令来对 zk 所关联的字符串进行设置

delete /zk # 删除一个节点

rmr /zk # 删除一个节点

2.5 zookeeper Java api的使用

2.5.1 基本使用

org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话

它提供了表 1 所示几类主要方法

功能

描述

create

在本地目录树中创建一个节点

delete

删除一个节点

exists

测试本地是否存在目标节点

get/set data

从目标节点上读取 / 写数据

get/set ACL

获取 / 设置目标节点访问控制列表信息

get children

检索一个子节点上的列表

sync

等待要被传送的数据

2.5.2 是用Java API实现简单的增删改查

public class SimpleDemo {// 会话超时时间,设置为与系统默认时间一致private static final int SESSION_TIMEOUT = 30000;// 创建 ZooKeeper 实例ZooKeeper zk;// 创建 Watcher 实例Watcher wh = new Watcher() {public void process(org.apache.zookeeper.WatchedEvent event){System.out.println(event.toString());}};// 初始化 ZooKeeper 实例private void createZKInstance() throws IOException{zk = new ZooKeeper("weekend01:2181
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐