在 Zookeeper 3.2.0
起,添加了一个新特性—— chroot
。该特性类似于 linux
的 chroot
命令,主要用来改变程序执行时参考的根目录位置。
若设定 chroot
为 /app/codeleven
,那在该会话上对 zookeeper
的操作,都是基于 /app/codeleven
。假设创建了一个节点 /a
,看着是创建到ZooKeeper的根目录,但实际是创建到 /app/codeleven
下,即 /app/codeleven/a
。
chroot的使用
使用 chroot
只需要在 connectString
后面追加路径即可。
// 看connectString,在路径后面追加 一个要参考的根目录位置
ZooKeeper zookeeper = new ZooKeeper("172.17.0.2:2181/app/testChrootApp", ...);
我们测试一下节点创建,看看创建出来的新节点是否在 /app/testChrootApp
下:
String realPath = zookeeper.create("/a", "test chroot feature".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("实际创建节点路径: " + realPath);
----------client console------------
连接成功
实际创建节点路径: /a
----------server zkCli.sh-----------
[zk: localhost:2181(CONNECTED) 6] ls -R /
/
/app
/zookeeper
/app/testChrootApp
/app/testChrootApp/a
/zookeeper/config
/zookeeper/quota
总结
总而言之, chroot
适用于多用户服务端场景下,每个用户都有各自的根目录。这让重用变得很简单,每个用户只需要以 /
作为根目录即可,不需要有替换~