关于Zookeeper需要了解的核心概念及常用命令
在分布式系统构建的集群中,每台机器都有自己的角色定位,其中最为典型的就是Master/Slave模式
Master:提供写操作服务
Slave:通过异步复制的机制获取新数据并提供读服务
Zookeeper中引入了三种角色:Leader、Follower、Observer
Zookeeper通过选举选定一台机器为Leader,这台机器为客户提供读写服务
Session会话机制
当客户端与服务器端成功建立连接后,session会话会随之建立,同时这个时候会生成一个全局的SessionID。在Zookeeper中,一个客户端连接指的是客户端和服务器之间的一个TCP长连接。
Zookeeper对外服务端口默认是2181,当客户端启动时,新建立的TCP连接也将第一次启动,它可以通过心跳检测与服务器保持有效会话,同时它还会向Zookeeper发送请求并接收响应,另外还可以接收来自服务器的Watch事件通知。
Session中的SessionTimeout值用来设置客户端的超时时间,当出现故障又想保持之间创建的会话,则需要在SessionTimeout规定的超时时间范围内重新连接到集群上的任意一台服务器
Zookeeper中数据节点
Zookeeper中的节点指的是数据模型中数据单元,也叫做数据节点。
数据模型是以树的格式进行存储的,并通过/来进行路径的分割,分割后的每一个Znode都会保存自己的数据内容,同时也会保存一系列的属性值
Zookeeper中的每一个Znode都会对应一个叫做Stat的数据结构。Stat记录了三个数据版本(version[当前Znode版本]、cversion[子节点版本]、aversion[ACL版本])
当用户在Zookeeper中注册了一些Watcher(时间监听器)后,在一些特定的事件触发的情况下,Zookeeper会把事件通知发送到感兴趣的客户端上
Zookeeper的权限控制策略:
采用了ACL(Access Control Lists)策略
定义了5种权限
-
CREATE:创建子节点的权限
-
READ:获取节点数据和子节点的权限
-
WRITE:更新节点数据的权限
-
DELETE:删除子节点的权限
-
ADMIN:设置节点ACL的权限
关于Zookeeper的配置文件说明:zoo.cfg
tickTime:指定了ZooKeeper中的基本时间单元
dataDir:指定存储持久数据的本地位置
ClientPort:监听客户端连接的端口
initLimit:设定所有跟随者与节点进行连接并同步的时间范围,当在设定的时间段内半数以上的跟随者未完成同步,则会进行一次Leader选举
SyncLimit:设定允许Flower与Leader进行同步的时间
server.1……:分别代表了节点的IP地址(如果配置了hosts可以使用置的名称)
Zookeeper环境变量的配置
环境变量在.bash_profile中进行配置
先确定Zookeeper的安装路径(如:/root/software/zookeeper-3.4.14)
export ZOOKEEPER_HOME=/root/software/zookeeper-3.4.14
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
更新完.bash_profile后执行命令 source .bash_profile 使配置的环境生效
使用命令:zkServer.sh status 可以查看当前机器下的状态
Zookeeper中常用命令
-
zkServer.sh start 启动ZooKeeper服务
-
zkServer.sh status 查看Zookeeper服务状态
-
zkServer.sh stop 停止Zookeeper服务
-
zkServer.sh restart 重启Zookeeper服务
客户端连接Zookeeper的相关操作
客户端需要连接ZooKeeper可以使用zkCli.sh命令
命令格式:zkCli.sh -server IP:port
如:zkCli.sh -server node1:2181
查看ZooKeeper常用命令:当连接上去后可以输入help查看有哪些命令
connect命令:连接ZooKeeper服务器端,如:connect node2:2181
ls命令:列出对应目录下的文件,是必须以/开头的
create命令:创建节点 如:create /mynode1 content1
get命令:获取数据与信息,如:get /mynode1
set命令:修改节点的内容,如:set /mynode1 content2 (注意:修改完数据后它的内容中有一个dataVersion会自增1)
delete命令:删除节点,如:delete /mynode(注意:如果节点下存在子节点则需要先删除子节点)