欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ZooKeeper 安装与配置 zk

程序员文章站 2022-07-13 22:25:46
...
ZooKeeper

1
安装
   Standalone 安装
/zk/
/zk/conf/zoo.conf
   Replicated 安装(Fast Paxos 算法:必须是奇数节点)

/zk/
/zk/cluster/localhost_2888_3888/conf/zoo.conf
/zk/cluster/localhost_2889_3889/conf/zoo.conf
/zk/cluster/localhost_2890_3890/conf/zoo.conf

PS: 生产节点必须安装在不同机器上.

2
配置
conf/zoo.cfg
tickTime=2000 # 时间片
dataDir=/var/lib/zookeeper # 每个节点使用不同路径, 保存myid文件.
clientPort=2181 # 每个节点使用不同路径
dataLogDir=
initLimit=5 # 连接Leader时间, 5个时间片=10000ms.
syncLimit=2 # 同步Leader时间
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890

288x: 节点数据同步端口
388x: 选举端口


3
启动
bin/zkServer.sh start

4
使用
bin/zkCli.sh -server localhost:2181

5.
API
help 命令查看命令行指令集

6.
znode 模型
使用Unix文件系统路径来命名znode, znode名称中禁止使用.或..来标识命名.
znode可以存储数据,数据内置变更版本号,时间戳,ACL信息. 当多个客户端更新数据时使用变更版本号与服务器数据的变更版本号匹配的客户端更新才会成功, 相当于乐观锁.这个行为可以定制.

znode 支持变更通知客户端, 使用watch机制.
znode 读写是原子的, 基于原子广播协议.只能写主,读任意.
znode 不支持大数据量存储,因为基于内存数据库.一个znode大小限制为1M.

Ephemeral Nodes 临时节点, 会话结束后删除. 不能有子节点.
PERSISTENT 持久化节点.
PERSISTENT_SEQUENTIAL 持久化顺序节点
Sequence Nodes 顺序节点, 内置int计数器: -2147483647-2147483647.
Container Nodes 新节点, 容器节点, 当最后一个子节点删除时解决容器节点自动删除.当添加子节点时,需要捕获NoNodeException并重建容器节点.
TTL Nodes 只能持久化节点, 当客户端超过TTL没有访问节点,节点会自动删除.

7
节点内置统计信息
Zxid ZooKeeper 事务ID, 基于时间顺序, 全局惟一.
czxid 创建事务ID
mzxid 修改事务ID
pzxid 子节点修改事务ID

Version numbers 有三种:
version znode变更版本号
cversion znode子节点变更版本号
aversion znode ACL变更版本号

ctime 创建时间
mtime 修改时间

ephemeralOwner znode 属主的会话ID(64位数字), 非临时节点值为0.
dataLength 数据长度
numChildren 子节点数量

8
会话ID
会话状态
START
CONNECTING
CONNECTED
CLOSED
END

9
Watch znode监听机制
数据监听
子节点监听

watch是一次性的,想要持续监听时需要重新添加watch.
watch是异步的, zk只保证watch事件发生的时序.
watch event不一定都会触发. 当ZK崩溃时,你有可能收不到watch event,或者ZK重连时, 会话已经失效. 需要用户保证业务的连续性.

10
ACL 权限:
CREATE
READ
WRITE
DELETE
ADMIN

认证协议:
world 基于ID
auth scheme:expression:perms
digest username:password(BASE64+SHA1)
ip IP地址
x509 X500指纹

定制ZK认证:
AuthenticationProvider


public interface AuthenticationProvider {
    String getScheme();
    KeeperException.Code handleAuthentication(ServerCnxn cnxn, byte authData[]);
    boolean isValid(String id);
    boolean matches(String id, String aclExpr);
    boolean isAuthenticated();
}

















相关标签: zk