Zookeeper快速入门

x33g5p2x  于2022-03-14 转载在 Zookeeper  
字(7.2k)|赞(0)|评价(0)|浏览(553)

Zookeeper

一、zk简介

Zookeeper(动物园管理者)简称ZK,一个分布式的,开发源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组装件。Zookeeper使用Java所编写,但是支持 Java 和 C 两种编程语言。

二、数据模型

2.1、模型结构

2.2、模型的特点

  • 每个子目录如 /node1 都被称作一个 znode(节点)。这个znode是它所在的路径唯一标识
  • znode可以有子节点目录,并且每个znode可以存储数据
  • znode 是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
  • znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端

2.3、节点的分类

2.3.1、持久节点(PERSISTENT)

是指在节点创建后,就一直存在,直到有删除操作来主动删除这个节点——不会因为创建该节点的客户端失效而消失。

2.3.2、持久顺序节点(PERSISTENT_SEQUENTIAL)

该类节点的基本特征和上面的结点类型是一致的。额外的特性是,在zk中 ,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置个属性,那么在创建节点过程中,ZK会自动为给定接节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。

2.3.3、临时节点(EPHEMERAL)

和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这一提到的是会话失效,而非连接断开。另外,咋临时节点下面不能创建子节点。

2.3.4、临时顺序节点(EPHEMERAL_SEQUENTIAL)

具有临时节点特点,额外的特性是,每个父节点会为他的第一级子节点维护一份时序。这点和刚才提到的持久顺序节点类似。

三、安装

3.1、linux系统安装

  1. # 1.安装jdk并配置环境变量 & 下载 zk安装包
  2. - https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
  3. # 2.下载安装包上传到linux中,并解压缩
  4. - tar -zxvf zookeeper-3.6.3.tar.gz
  5. # 3.重命名安装目录
  6. - mv zookeeper-3.6.3 zk
  7. # 4.配置zoo.cfg配置文件
  8. - 1.修改zkconf目录下的zoo_sample.cfg,修改完后,重命名为zoo.cfg
  9. tickTime=2000
  10. initLimit=10
  11. syncLimit=4
  12. dataDir=/usr/zookeeper/zkdata
  13. clientPort=2181
  14. # 5.启动zk
  15. - zkbin目录下,运行zkServer.sh
  16. ./bin/zkServer.sh start /usr/zookeepe/conf/zoo.cfg
  17. # 6.使用jsp查看启动是否成功
  18. # 7.启动客户端连接到zk
  19. - ./bin/zkCli.sh -server 192.168.0.220:2181
  20. 注意:可以通过 ./bin/zkCli.sh help 查看客户端所有可以执行的命令

3.2、docker安装zookeeper

  1. # 1.获取zk镜像
  2. - docker pull zookeeper:3.4.14
  3. # 2.启动zk服务
  4. - docker run --name zk -p 2181:2181 -d zookeeper:3.4.14

3.3、配置文件详解

  1. # The number of milliseconds of each tick 心跳停止的最长时间2s
  2. tickTime=2000
  3. # The number of ticks that the initial
  4. # synchronization phase can take
  5. initLimit=10 # 初始化集群时集群节点同步超时时间
  6. # The number of ticks that can pass between
  7. # sending a request and getting an acknowledgement
  8. syncLimit=5 # 集群在运行过程中同步数据超时时间
  9. # the directory where the snapshot is stored.
  10. # do not use /tmp for storage, /tmp here is just
  11. # example sakes.
  12. dataDir=/tmp/zookeeper # 默认数据存储位置
  13. # the port at which the clients will connect
  14. clientPort=2181 # 服务监听端口号
  15. # the maximum number of client connections.
  16. # increase this if you need to handle more clients
  17. #maxClientCnxns=60 # 线程池数量
  18. # Be sure to read the maintenance section of the
  19. # administrator guide before turning on autopurge.
  20. #
  21. # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
  22. #
  23. # The number of snapshots to retain in dataDir
  24. #autopurge.snapRetainCount=3 # 这个参数和下面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
  25. # Purge task interval in hours
  26. # Set to "0" to disable auto purge feature
  27. #autopurge.purgeInterval=1 # 3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。

四、客户端基本指令

  1. # 1. ls path 查看特定节点下面的子节点
  2. # 2. create path data 创建一个节点,并给节点绑定数据(默认是持久性节点)
  3. - create path data 创建持久节点(默认是持久节点)
  4. - create -s path data 创建持久顺序节点
  5. - create -e path data 创建临时性节点(注意:临时节点不能含有任何子节点)
  6. - create -e -s path data 创建临时顺序节点(注意:临时节点不能含有任何子节点)
  7. # 3. stat path 查看节点状态
  8. # 4. set path data 修改节点数据
  9. # 5. ls2 path 查看节点下孩子和当前节点的状态
  10. # 6. history 查看操作历史
  11. # 7. get path 获得节点上绑定的数据信息
  12. # 8. delete path 删除节点(注意:删除节点不能含有子节点)
  13. # 9. rmr path 递归删除节点(注意:会将当前节点下所有节点删除)
  14. # 10. quit 退出当前会话(会话失败)

五、节点监听机制 watch

客户端可以检测znode节3点的变化。Znode节点的变化触发相应的事件,然后清除对该节点的监测。当检测一个znode节点时候,Zookeeper会发送通知给监测节点。一个Watch事件是一个一次性的触发器,当被设置了Watch的数据和目录发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端以便通知他们。

  1. # 1. ls /path true 监听节点目录的变化
  2. # 2. get /path true 监听节点数据的变化

六、java 操作 ZK

引入依赖

  1. <dependency>
  2. <groupId>com.101tec</groupId>
  3. <artifactId>zkclient</artifactId>
  4. <version>0.10</version>
  5. </dependency>

常见API操作

  1. public class TestZKClient {
  2. private ZkClient zkClient;
  3. @Before()
  4. public void before() {
  5. zkClient = new ZkClient("10.15.0.5:2181", 6000 * 30, 6000, new SerializableSerializer());
  6. }
  7. @Test
  8. public void createNode() throws IOException {
  9. // 1.创建节点
  10. // 1. 持久性节点
  11. zkClient.create("/node1", "zhangsan", CreateMode.PERSISTENT);
  12. // 2. 持久顺序节点
  13. zkClient.create("/node2", "lisi", CreateMode.PERSISTENT_SEQUENTIAL);
  14. // 3. 临时性节点
  15. zkClient.create("/node3", "wangwu", CreateMode.EPHEMERAL);
  16. // 4. 临时顺序节点
  17. zkClient.create("node4", "xiaochen", CreateMode.EPHEMERAL_SEQUENTIAL);
  18. // 2.删除没有子节点的节点
  19. boolean delete = zkClient.delete("/node1");
  20. // 3.递归删除节点信息
  21. boolean recursive = zkClient.deleteRecursive("/node1");
  22. System.out.println(recursive);
  23. // 4.查询当前节点下的所有子节点
  24. List<String> children = zkClient.getChildren("/node1");
  25. for (String child : children) {
  26. System.out.println(child);
  27. }
  28. // 5.查看某个节点数据 注意:通过java客户端操作需要保证节点存储的数据和获取数据的序列化方式一致
  29. Object readData = zkClient.readData("/node1");
  30. System.out.println(readData);
  31. // 6.查看节点状态信息
  32. Stat stat = new Stat();
  33. Object readData1 = zkClient.readData("/node1", stat);
  34. System.out.println(readData1);
  35. System.out.println(stat.getVersion());
  36. System.out.println(stat.getCtime());
  37. System.out.println(stat.getCzxid());
  38. // 7.修改节点数据
  39. User user = new User();
  40. user.setId(1);
  41. user.setName("xiaochen");
  42. user.setAge(23);
  43. user.setBir(new Date());
  44. zkClient.writeData("/node1", user);
  45. User o = zkClient.readData("/node1");
  46. System.out.println(o.getId() + " " + o.getName() + " " + o.getAge() + " " + o.getBir() + " ");
  47. // 8.监听节点数据变化
  48. zkClient.subscribeDataChanges("/node1", new IZkDataListener() {
  49. // 当前节点数据变化时触发对应这个方法
  50. @Override
  51. public void handleDataChange(String s, Object o) throws Exception {
  52. System.out.println("当前节点路径:" + s);
  53. System.out.println("当前节点变化后数据:" + o);
  54. }
  55. // 当前节点删除时触发这个方法
  56. @Override
  57. public void handleDataDeleted(String s) throws Exception {
  58. System.out.println("当前节点路径:" + s);
  59. }
  60. });
  61. System.in.read();
  62. // 9.监听节点目录变化
  63. zkClient.subscribeChildChanges("/node1", new IZkChildListener() {
  64. // 当节点发生变化时,会自动调用这个方法
  65. @Override
  66. public void handleChildChange(String s, List<String> list) throws Exception {
  67. System.out.println("父节点名称:" + s);
  68. System.out.println("发生变更后字节孩子结点名称:");
  69. for (String name : list) {
  70. System.out.println(name);
  71. }
  72. }
  73. });
  74. System.in.read();
  75. }
  76. @After()
  77. public void after() {
  78. zkClient.close();
  79. }
  80. }

七、zk的集群

7.1、集群

  1. # 1.集群
  2. - 集合同一软件服务的多个结点同时提供服务
  3. # 2.集群解决问题
  4. - 单节点的并发访问的压力问题
  5. - 单节点故障问题(如硬件老化,自然灾害等)

7.2、集群架构

7.3、集群搭建

  1. # 1.创建三个dataDir
  2. - mkdir zkData1 zkData2 zkData3
  3. # 2.分别在三个dataDir目录下面创建myid文件
  4. - touch zkData1/myid zkData2/myid zkData3/myid
  5. # 3.在myid文件下分别写入 1|2|3
  6. - echo "1" >> zkData1/myid
  7. - echo "2" >> zkData2/myid
  8. - echo "3" >> zkData3/myid
  9. # 4.分别在/conf目录下创建zk配置文件zoo.cfg
  10. - zoo1.cfg
  11. tickTimetickTime=2000
  12. initLimit=10
  13. syncLimit=5
  14. dataDir=/tmp/zookeeper/zkData1
  15. clientPort=3001
  16. server.1=192.168.10.3:3002:3003
  17. server.2=192.168.10.3:4002:4003
  18. server.3=192.168.10.3:5002:5003
  19. - zoo2.cfg
  20. tickTimetickTime=2000
  21. initLimit=10
  22. syncLimit=5
  23. dataDir=/tmp/zookeeper/zkData2
  24. clientPort=3002
  25. server.1=192.168.10.3:3002:3003
  26. server.2=192.168.10.3:4002:4003
  27. server.3=192.168.10.3:5002:5003
  28. - zoo3.cfg
  29. tickTimetickTime=2000
  30. initLimit=10
  31. syncLimit=5
  32. dataDir=/tmp/zookeeper/zkData3
  33. clientPort=3003
  34. server.1=192.168.10.3:3002:3003
  35. server.2=192.168.10.3:4002:4003
  36. server.3=192.168.10.3:5002:5003
  37. 解释:
  38. 1.server.x x为服务器的唯一标识
  39. 2.192.168.10.3 服务器所在的ip地址
  40. 3.3002 数据同步使用的端口号
  41. 4.3003 选举使用的端口号
  42. # 4.分别启动各个zk服务器
  43. - ./bin/zkServer.sh start /tmp/zookeeper/conf/zoo1.cfg
  44. - ./bin/zkServer.sh start /tmp/zookeeper/conf/zoo2.cfg
  45. - ./bin/zkServer.sh start /tmp/zookeeper/conf/zoo3.cfg
  46. # 5.查看各个zk服务器的角色信息
  47. - ./bin/zkServer.sh status /user/zookeeper/conf/zoo1.cfg
  48. # 6.客户端连接任意zk服务器进行节点操作
  49. - ./bin/zkCli.sh -server 192.168.0.220:3001
  50. # 7.停止特定zk服务器
  51. - ./bin/zkServer.sh stop /usr/zookeeper/conf/zoo1.cfg

7.4、操作zk集群

  1. @Before()
  2. public void before() {
  3. zkClient = new ZkClient("10.15.0.5:3001,10.15.0.5:3002,10.15.0.5:3003", 6000 * 30, 6000, new SerializableSerializer());
  4. }

相关文章