zookeeper集群搭建

欢迎查看Eetal的第二十三篇博客–zookeeper集群搭建

zookeeper简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
一开始是用于分布式系统下资源的同步访问
在分布式事务场景下也多作为 协调者
是一个中心化管理的分布式同步技术
zk上的数据和redis类似,存在于内存,保存快照、数据日志等文件

安装zookeeper

需要安装jdk环境——jdk1.8的u211以上版本
下载zookeeper压缩包并解压——3.5.5

复制zoo.cfg.sample为zoo1.cfg作为第一台的配置文件
复制多个配置文件作为多台zk启动的不同配置
编辑不同配置文件,使用不同客户端连接端口、数据同步端口和选举端口
server.1=127.0.0.1:2881:3881——第一个端口代表数据同步端口,第二个代表选举端口
dataDir配置到不同目录,不同服务器存放数据的快照文件到不同文件夹,还要存放不同的myid文件
myid文件中只保存一个数字代表当前服务器的id
dataLogDir配置到不同目录,使得数据的日志分开存储(不包括运行时的日志,运行时日志在log4j配置文件里配置)

1
2
3
4
5
dataDir=/tmp/zookeeper01
clientPort=2181
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

使用mvn打包

3.5.5版本的zookeeper需要最少jdk1.8 u211版本,并且默认是没有编译class文件的
需要进入zookeeper-server目录,使用maven命令
mvn package -Dmaventestskip=true
跳过测试程序并打包编译

运行zk集群

我们配置有三台zk,假设第一个的配置文件为conf目录下的zoo1.cfg,依次类推
运行过程为
使用zk的bin下的zkServer.sh命令运行

1
./zkServer.sh start conf/zoo1.cfg

启动成功后,这时使用命令查看状态

1
./zkServer.sh start conf/zoo1.cfg

应该是提示有错误,可能没有运行成功的
那是因为集群里只有一台机器无法选举(因为zk是中心化的,必须有一个协调者),不用管继续启动剩下的机器

1
./zkServer.sh start conf/zoo2.cfg

这时查看状态会发现两台机器都启动成功了
并且一台成为了follower一台成为leader
zookeeper集群下的机器有三种角色,leader、follower和observer
leader负责事务请求(增删改),任意节点都可处理查询请求,follower参与选举,observer不参与选举只做数据同步
接着启动最后一台

1
./zkServer.sh start conf/zoo3.cfg

开启会话

使用zkCli命令

1
sh bin/zkCli.sh -server host:port

host为zkServer的ip或者域名,port为配置的client端口

结束会话

1
quit

创建节点

持久节点

有序节点

创建时添加参数 -s 指定,所有有序节点会在节点,排序从0开始,每次创建有序节点会使序号加一
有序节点会在输入名称后加上序号作为节点名称创建节点

1
create -s sortNode aaa

普通节点

1
create node bbb

没有指定为临时节点的节点默认都是持久节点

临时节点。

临时节点在会话结束时就会被删除,通过创建时添加参数 -e 指定
临时节点不能存在子节点

1
create -e tmpNode tmp

临时节点也可以是有序节点

1
create -s -e sortTmpNode sortTmp

ls命令

ls命令与linux类似,展示给定路径的所有子节点
根路径为/

1
2
ls /
ls -w /

-w参数代表开启该路径的一次watch,下一次且仅一次该路径下的子节点的增删事件会被监听到

修改节点值

absPath—节点的绝对路径值,root为/

1
set [absPath] value [version]

version值可不传,用于并发控制,代表要求的为dataversion,即该节点被修改过几次,如果不符合,本次修改失败

获取节点值

absPath—节点的绝对路径值,root为/

1
2
get -w [absPath]
get -s [absPath]

-w参数代表开启一次watch,下一次且仅一次对该节点的set事件将会被监听到
-s参数代表获取节点值并展示包括版本号、子节点个数等信息
-s输出格式如下

1
2
3
4
5
6
7
8
9
10
11
cZxid = 0x10000001d	//create node时分配的id
ctime = Tue Jul 16 07:22:54 PDT 2019// 创建时间
mZxid = 0x10000001f //set修改过以后变更的id
mtime = Wed Jul 17 08:43:33 PDT 2019 //最后一次修改时间
pZxid = 0x10000001d //一开始为cZxid,子节点修改时变更
cversion = 0 //子节点版本号,一开始为0,子节点修改时变更
dataVersion = 2 //数据版本号,一开始为0,每修改一次+1
aclVersion = 0 //acl权限版本号,一开始为0[create,read,write,delete,admin]
ephemeralOwner = 0x0 //临时节点才会有,持有者会话id
dataLength = 1 //数据的字符串长度
numChildren = 0 //子节点个数

删除节点

absPath—节点的绝对路径值,root为/

1
delete [absPath]

更多精彩内容

请移步

个人主页: yangyitao.top