当前位置:   article > 正文

zookeeper安装以及使用

zookeeper

1、zookeeper简介

zookeeper(以下简称ZK)是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop、Hbase、Kafka、Jstorm等开源软件的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等ZK的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

2、zk集群安装(集群安装是奇数台)

ZK既可单节点运行,也可以多节点集群运行。生产环境都采用集群的方式,避免单节点故障。ZK需要java环境,要确保系统有jdk 1.7或更高版本。安装JDK这里就不演示了,我自己在虚拟机上安装,就安装了3个节点

https://zookeeper.apache.org/releases.html

我安装的版本是zookeeper-3.4.10,我解压到/app/soft目录下了

3、配置

zookeeper conf目录下有zoo_sample.cfg实例配置文件,复制这个文件,重命名为zoo.cfg,开始配置zoo.cfg的内容:

cp zoo_sample.cfg zoo.cfg

vi zoo.cfg

  1. tickTime=2000 ##Client-Server通信心跳时间,单位是毫秒
  2. initLimit=10 ##集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
  3. syncLimit=5 ##集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数
  4. clientPort=2181 ## 监听端口
  5. maxClientCnxns=100 ## 最大连接数
  6. dataDir=/app/soft/zookeeper-3.4.10/data ## 数据目录
  7. dataLogDir=/app/soft/zookeeper-3.4.10/log ## 日志目录
  8. server.1=192.168.34.128:2888:3888 ## zk节点1
  9. server.2=192.168.34.129:2888:3888 ## zk节点2
  10. server.3=192.168.34.130:2888:3888 ## zk节点3

在/app/soft/zookeeper-3.4.10/下创建两个文件夹,分别是data和log

然后分别在zk节点,/app/soft/zookeeper-3.4.10/data目录下,创建文本myid,内容分别是1、2、3序号

192.168.34.128 对应的是1

192.168.34.129 对应的是2

192.168.34.130 对应的是3

4、启动zk

启动之前,jdk7以上的版本一定要安装合适,然后在环境变量里配置ZK_HOME

然后在SecureCRT里同时打开三个节点

执行命令:zkServer.sh  start,这里的zkServer.sh是zookeeper bin目录下的脚本

看到这个结果不一定启动成功了,然后执行zkServer.sh  status 查看各个zk节点的状态,如果看到一个leader,其它两个节点都是follower说明启动成功了。

还可以通过查看jps命令去查看是否启动了zk

zkServer.sh stop是停掉zk节点服务的,到这里zk的启动就没有问题了!!!

5、zk选举leader

前面说到搭建zk集群节点是奇数台,因为只有是奇数它,它才能选举出谁是leader,谁是follwer,是通过前面配置的myid决定的,三个节点依次配置了1、2、3,服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是等待状态, 服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它,所以服务器1,2还是继续保持等待状态,服务器3启动,根据前面的理论分析,服务器3成为服务器1,2,3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的leader。

6、zk使用

启动zk之后,在任意一台服务上,运行:zkCli.sh进入zk的命令行模式

zk创建的节点叫znode,znode四种节点类型:持久节点、持久序列节点、暂时节点、暂时序列节点。

create   -e /app   111  创建一个暂时的znode节点

create   -s /app/test1  222  创建一个持久的,带有序列号的znode节点

get  /app/test  得到创建的节点中的数据

执行ls  /可以看到根节点下面所有子节点

ls /app/test watch  监听这个节点下的变化,我在另一个服务器下也打开了zk的命令行,

然后我在其它服务上,在这个节点下做创建节点的操作

会发现监听的服务器上会弹出下面消息,是对这个节点做出改变的通知

7、通过java代码来创建节点、修改节点内容、监听等

创建一个maven项目

pom.xml引入zk的jar包

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>zookeeperDemo</groupId>
  7. <artifactId>zookeeperDemo</artifactId>
  8. <version>1.0</version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.apache.zookeeper</groupId>
  12. <artifactId>zookeeper</artifactId>
  13. <version>3.4.10</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>junit</groupId>
  17. <artifactId>junit</artifactId>
  18. <version>4.12</version>
  19. </dependency>
  20. </dependencies>
  21. </project>

然后创建一个类

  1. package cn.dl.zookeeper;
  2. import org.apache.zookeeper.WatchedEvent;
  3. import org.apache.zookeeper.Watcher;
  4. import org.apache.zookeeper.ZooKeeper;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. /**
  8. * Created by Tiger on 2018/7/5.
  9. */
  10. public class ZookeeperClient {
  11. //连接的zk服务
  12. private static final String CONNECTION_HOSTS = "192.168.34.128:2181,192.168.34.128:2181,192.168.34.128:2181";
  13. //超时连接的时间
  14. private static final int SESSION_TIMEOUT = 2000;
  15. private static ZooKeeper zooKeeper = null;
  16. //servers根目录
  17. private volatile static String serviceRootNode = "/services";
  18. //服务器列表
  19. /**使用volatile的意义
  20. * 1、通过在总线加LOCK#锁的方式
  21. * 2、通过缓存一致性协议
  22. * 1.volatile关键字的两层语义
  23. 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
  24. 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
  25. 2)禁止进行指令重排序。
  26. * */
  27. private static volatile List<String> serviceList = new ArrayList<String>();
  28. static {
  29. try {
  30. zooKeeper = new ZooKeeper(CONNECTION_HOSTS, SESSION_TIMEOUT, new Watcher() {
  31. /**
  32. * 监听服务器列表的变化
  33. * */
  34. public void process(WatchedEvent watchedEvent) {
  35. try {
  36. getServerList();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. });
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. /**
  47. * 获取服务器列表
  48. * */
  49. public static void getServerList() throws Exception {
  50. List<String> nodes = zooKeeper.getChildren(serviceRootNode,true);
  51. //清空服务器列表信息list集合
  52. serviceList.clear();
  53. for(String node : nodes){
  54. /**
  55. * 这里的第二个参数:false,意思是已经获到了连接,不需要重新获取连接
  56. * */
  57. byte[] data = zooKeeper.getData(serviceRootNode + "/"+ node,false,null);
  58. serviceList.add(new String(data));
  59. }
  60. System.out.println(serviceList);
  61. }
  62. public static void main(String[] args) throws Exception {
  63. ZookeeperClient zookeeperClient = new ZookeeperClient();
  64. zookeeperClient.getServerList();
  65. Thread.sleep(Long.MAX_VALUE);
  66. }
  67. }
  1. package cn.dl.zookeeper;
  2. import org.apache.zookeeper.*;
  3. import org.apache.zookeeper.data.ACL;
  4. import org.apache.zookeeper.data.Stat;
  5. import org.junit.Test;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. /**
  9. * Created by Tiger on 2018/6/30.
  10. */
  11. public class ZookeeperDemo {
  12. //连接的zk服务
  13. private static final String CONNECTION_HOSTS = "192.168.34.128:2181,192.168.34.128:2181,192.168.34.128:2181";
  14. //超时连接的时间
  15. private static final int SESSION_TIMEOUT = 2000;
  16. private static ZooKeeper zooKeeper = null;
  17. static {
  18. try {
  19. zooKeeper = new ZooKeeper(CONNECTION_HOSTS, SESSION_TIMEOUT, new Watcher() {
  20. public void process(WatchedEvent watchedEvent) {
  21. System.out.println(watchedEvent.getPath()+";"+watchedEvent.getState());
  22. try {
  23. //获取对根目录节点数据的监控
  24. zooKeeper.getChildren("/",true);
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. });
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. /*
  35. 判断当前节点是否存在
  36. */
  37. public Stat isExistZnode(String path) throws Exception{
  38. Stat stat = zooKeeper.exists(path,true);
  39. return stat;
  40. }
  41. /*
  42. 创建节点
  43. */
  44. @Test
  45. public String createZnode(String path, Object object, ArrayList<ACL> zooDefs, CreateMode createMode) throws Exception {
  46. return zooKeeper.create(path,object.toString().getBytes(),zooDefs,createMode);
  47. }
  48. /*
  49. 修改节点
  50. */
  51. @Test
  52. public Stat updateZnode(String path, Object object, int version) throws Exception {
  53. return zooKeeper.setData(path,object.toString().getBytes(),version);
  54. }
  55. /*
  56. 删除节点
  57. */
  58. @Test
  59. public void deleteZnode(String path,int version) throws Exception {
  60. zooKeeper.delete(path,version);
  61. }
  62. @Test
  63. public static void main(String[] args) throws Exception{
  64. ZookeeperDemo zookeeperDemo = new ZookeeperDemo();
  65. //创建节点
  66. if(zookeeperDemo.isExistZnode("/Tiger") == null){
  67. zookeeperDemo.createZnode("/Tiger","oh,my sky", ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
  68. }else {
  69. System.out.println("znode exist!!!");
  70. }
  71. //更新节点内容
  72. Stat stat = zookeeperDemo.isExistZnode("/Tiger");
  73. if(stat != null){
  74. System.out.println(stat.getVersion());
  75. zookeeperDemo.updateZnode("/Tiger","oh,my sky",stat.getVersion());
  76. }else{
  77. System.out.println("znode not exist !!!");
  78. }
  79. //删除节点
  80. Stat deleteStat = zookeeperDemo.isExistZnode("/Tiger1");
  81. if(deleteStat != null){
  82. zookeeperDemo.deleteZnode("/Tiger1",deleteStat.getVersion());
  83. }
  84. //获取根节点下所有子节点,遍历获取对应节点的数据
  85. List<String> znodes = zooKeeper.getChildren("/",true);
  86. for(String path : znodes){
  87. System.out.println(path+">>>"+new String(zooKeeper.getData("/"+path,true,new Stat())));
  88. }
  89. }
  90. }

zk的安装、简单使用就这些了,这是本人自己的理解,有什么不对的地方欢迎来吐槽!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/440047
推荐阅读
相关标签
  

闽ICP备14008679号