Zookeeper Quick Start
分布式理论
相关 CAP 理论
CAP 理论指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性:在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性,等同于所有节点访问同一份最新的数据副本。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。
- 可用性:每次请求都能获取到正确的响应,但是不保证获取的数据为最新数据。
- 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
BASE 理论
BASE 是 Basically Available(基本可用)、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。
- 基本可用:在分布式系统出现故障,允许损失部分可用性(服务降级、页面降级)。
- 软状态:允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。这里的中间状态是指不同的 data replication(数据备份节点)之间的数据更新可以出现延时的最终一致性。
- 最终一致性:data replications 经过一段时间达到一致性。
ZooKeeper安装
#利用wget命令下载压缩包,注意源代码与运行文件的区别
wget url
# 解压
tar -zxvf 名字
#加入环境变量
cd /etc/profile.d
vim zooKeeper.sh
#加入以下两句话,然后保存退出
export ZOOKEEPER_HOME=/www/server/zookeeper-3.6.2/
export PATH=$ZOOKEEPER_HOME/bin:$PATH
# 刷新
source /etc/profile
#之所以不直接改profile文件,是为了以后维护方便,有改动时直接维护特定的sh文件就行了
ZooKeeper命令使用
全部命令
zkServer
# 启动服务端
zkServer.sh start
# 如果启动错误就用这个命令看看出现了什么问题,
zkServer.sh start-foreground
# 端口被占用可以在zoo.cfg添加这句话
admin.serverPort=xxxx
# 查看状态
zkServer.sh status
zkCli
# 启动客户端
zkCli.sh
# 查看某个路径下的目录(不是内容)
ls /path
#查看详细信息,老版是ls2
ls -s /path
# 查看某个路径下的内容
get /path
#查看详细信息
get -s /path
#查看节点状态
stat /path
# 创建节点,-s是创建顺序结点,-e是创建临时结点
create [-s] [-e] path data acl
# 修改
set /path data [version]
# 删除
delete /path [version]
四字命令
Java使用ZooKeeper
maven依赖引入
注意,如果一直报一下错误
Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for
可以从一下几个方面排查
- 服务器上客户端是否运行
- 端口防火墙是否打开
- 网络是否顺畅
- sessionTimeOut要大于tickTime
- 注意引入的依赖有没有版本冲突
<!-- 原生jar包-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.3-beta</version>
</dependency>
<!-- 工具jar包-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.0.0</version>
</dependency>
原生使用
连接
ZooKeeper keeper = new ZooKeeper("192.168.32.1:2181", 4000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
System.out.println("连接成功");
}
}
});
使用
简单的使用调用ZooKeeper这个类的对象的方法就行了
框架使用
连接
CuratorFramework curatorFramework= CuratorFrameworkFactory.
builder().connectString("testlove.cn:2181").
sessionTimeoutMs(4000).retryPolicy(new
ExponentialBackoffRetry(1000,3)).
namespace("").build();
curatorFramework.start();
使用
存储结构
为树状结构,以Key:value的形式存储数据,也被叫做znode,下表是一些节点属性
cZxid | 创建节点时的事务ID |
---|---|
ctime | 创建节点时的时间 |
mZxid | 最后修改节点时的事务ID |
mtime | 最后修改节点时的时间 |
pZxid | 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid) |
cversion | 子节点版本号,子节点每次修改版本号加1 |
dataversion | 数据版本号,数据每次修改该版本号加1 |
aclversion | 权限版本号,权限每次修改该版本号加1 |
ephemeralOwner | 创建该临时节点的会话的sessionID。(*如果该节点是持久节点,那么这个属性值为0)* |
dataLength | 该节点的数据长度 |
numChildren | 该节点拥有子节点的数量(只统计直接子节点的数量) |
节点特性
- 同一级key名字唯一
- 创建结点时要用全路径
- 可以自动创建顺序结点
- session关闭,临时结点清除
权限控制
getAcl 命令:获取某个节点的 acl 权限信息。
setAcl 命令:设置某个节点的 acl 权限信息。
addauth 命令:输入认证授权信息,注册时输入明文密码,加密形式保存。
通过 [scheme:id:permissions] 来构成权限列表。
1、scheme:代表采用的某种权限机制,包括 world、auth、digest、ip、super 几种。
2、id:代表允许访问的用户。
3、permissions:权限组合字符串,由 cdrwa 组成,其中每个字母代表支持不同权限, 创建权限 create(c)、删除权限 delete(d)、读权限 read(r)、写权限 write(w)、管理权限admin(a)。