Zookeeper 3.2.0 起,添加了一个新特性—— chroot 。该特性类似于 linuxchroot 命令,主要用来改变程序执行时参考的根目录位置
若设定 chroot/app/codeleven ,那在该会话上对 zookeeper 的操作,都是基于 /app/codeleven 。假设创建了一个节点 /a ,看着是创建到ZooKeeper的根目录,但实际是创建到 /app/codeleven 下,即 /app/codeleven/a

chroot的使用

使用 chroot 只需要在 connectString 后面追加路径即可。

  1. // 看connectString,在路径后面追加 一个要参考的根目录位置
  2. ZooKeeper zookeeper = new ZooKeeper("172.17.0.2:2181/app/testChrootApp", ...);

我们测试一下节点创建,看看创建出来的新节点是否在 /app/testChrootApp 下:

  1. String realPath = zookeeper.create("/a", "test chroot feature".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  2. System.out.println("实际创建节点路径: " + realPath);
  3. ----------client console------------
  4. 连接成功
  5. 实际创建节点路径: /a
  6. ----------server zkCli.sh-----------
  7. [zk: localhost:2181(CONNECTED) 6] ls -R /
  8. /
  9. /app
  10. /zookeeper
  11. /app/testChrootApp
  12. /app/testChrootApp/a
  13. /zookeeper/config
  14. /zookeeper/quota

总结

总而言之, chroot 适用于多用户服务端场景下,每个用户都有各自的根目录。这让重用变得很简单,每个用户只需要以 / 作为根目录即可,不需要有替换~