欢迎查看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配置文件里配置)
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命令运行
./zkServer.sh start conf/zoo1.cfg
启动成功后,这时使用命令查看状态
./zkServer.sh start conf/zoo1.cfg
应该是提示有错误,可能没有运行成功的
那是因为集群里只有一台机器无法选举(因为zk是中心化的,必须有一个协调者),不用管继续启动剩下的机器
./zkServer.sh start conf/zoo2.cfg
这时查看状态会发现两台机器都启动成功了
并且一台成为了follower一台成为leader
zookeeper集群下的机器有三种角色,leader、follower和observer
leader负责事务请求(增删改),任意节点都可处理查询请求,follower参与选举,observer不参与选举只做数据同步
接着启动最后一台
./zkServer.sh start conf/zoo3.cfg
开启会话
使用zkCli命令
sh bin/zkCli.sh -server host:port
host为zkServer的ip或者域名,port为配置的client端口
结束会话
quit
创建节点
持久节点
有序节点
创建时添加参数 -s 指定,所有有序节点会在节点,排序从0开始,每次创建有序节点会使序号加一
有序节点会在输入名称后加上序号作为节点名称创建节点
create -s sortNode aaa
普通节点
create node bbb
没有指定为临时节点的节点默认都是持久节点
临时节点。
临时节点在会话结束时就会被删除,通过创建时添加参数 -e 指定
create -e tmpNode tmp
临时节点也可以是有序节点
create -s -e sortTmpNode sortTmp
ls命令
ls命令与linux类似,展示给定路径的所有子节点
根路径为/
ls /
ls -w /
-w参数代表开启该路径的一次watch,下一次且仅一次该路径下的子节点的增删事件会被监听到
修改节点值
absPath—节点的绝对路径值,root为/
set [absPath] value [version]
version值可不传,用于并发控制,代表要求的为dataversion,即该节点被修改过几次,如果不符合,本次修改失败
获取节点值
absPath—节点的绝对路径值,root为/
get -w [absPath]
get -s [absPath]
-w参数代表开启一次watch,下一次且仅一次对该节点的set事件将会被监听到
-s参数代表获取节点值并展示包括版本号、子节点个数等信息
-s输出格式如下
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为/
delete [absPath]
更多文章,请搜索公众号歪歪梯Club