1. 安装三台linux虚拟机,安装好java环境,并配置好网络以及host文件,分别改好hostname为node0、node1、node2
  2. 上传下载好的zookeeper文件到node0的/usr/local目录下,解压,然后将解压后的文件复制到另外两台机器中,使用scp -r /usr/local/zookeeper-3.4.10 root@node1:/usr/local/命令
  3. 同时操作三台机器,将解压后的文件重命名为zookeeper,并进入该目中的conf文件夹,拷贝一份zoo_sample.cfg并命名为zoo.cfg,使用命令:cp zoo_sample.cfg zoo.cfg
  4. 修改zoo.cfg文件,在文档末尾添加如下内容:
  5. zookeeper默认将数据存储在/tmp/zookeeper/目录中,所以需要去到/tmp目录下建立一个zookeeper目录。使用命令mkdir /tmp/zookeeper,然后进入该目录,创建myid文件,编辑内容,三台机器的内容不一,分别为1、2、3,即上一步中配置的server的值。
  6. 进入/usr/local/zookeeper/bin目录,输入./zkServer.sh start命令,启动zookeeper服务,然后输入jps观察启动情况:
  7. 执行./zkServer.sh status观察zookeeper的运行状态,会发现,3台机器中会有一台leader和两台follower,至于哪台机器是leader,是由zookeeper自己选举出来的。但是,如果leader机器挂了,会出现什么情况?下一步来做这个实验。
  8. 在leader机器上关闭zookeeper服务,首先输入jps观察leader的pid,然后使用kill -9 pid命令杀掉它,再次使用jps观察状况。然后使用./zkServer status查看状态,会发现zookeeper会自动再选举一个leader。
  9. 下面看看zookeeper到底能做什么。再复制一台虚拟机出来,装好jdk和zookeeper,并将用户名更改为node3
  10. 进入zookeeper/bin目录下,输入./zkCli -server node0:2181进行连接。
  11. 简单操作zookeeper,zookeeper就像一个数据库,里边可以存放数据,其七字真言“一致、有头、数据树”,一致是说,在所有的节点中,数据都是一致的,无论你连接到哪一个节点上,所看到的数据都是一样的,并且,修改任意一个节点上的数据,都会同步到其他所有的节点上;有头是说这些节点会有一个leader,当leader挂掉后,会自动再选举一个leader;数据树是说每个节点中都有一个数据的目录树,树的节点上存的就是数据。zookeeper是将数据存在了内存当中,所以读取的速度会很快。
  12. zookeeper应用场
    1. 配置一致:顾名思义,如hadoop服务需要修改配置文件,但如果集群机器特别多,需要一个个修改很麻烦,可以将配置文件放到zookeeper里,这样修改一个,其他的就都可以修改过来了。
    2. HA(High Available):高可用集群
    3. pub/sub
    4. naming service
    5. load balance
    6. 分布式锁
    7. ...
  13. 使用java操作zookeeper
    1. 新建maven项目,添加zookeeper依赖

       <dependencies>
               <dependency>
                   <groupId>org.apache.zookeeper</groupId>
                   <artifactId>zookeeper</artifactId>
                   <version>3.4.10</version>
               </dependency>
       </dependencies>
    2. 编写java代码
       public class ZkClient implements Watcher {
      
           static CountDownLatch connected = new CountDownLatch(1);
           static final String CONN_STR = "192.168.217.170:2181,192.168.217.171:2181,192.168.217.172:2181";
      
           public void test() throws Exception {
               ZooKeeper zoo = null;
      
               zoo = new ZooKeeper(CONN_STR, 5000, this);
               System.out.println(zoo.getState());
      
               connected.await();
      
               if (zoo.exists("/skyer", false) != null) {
                   zoo.delete("/skyer", -1);
               }
      
               zoo.create("/skyer", "192.168.56.1:2000".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
               System.out.println("ok");
      
               byte[] data = zoo.getData("/skyer", false, null);
               System.out.println(new String(data));
      
               zoo.create("/e", "e".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
      
               Thread.sleep(10000);
               zoo.close();
           }
      
           public static void main(String[] args) throws Exception {
               new ZkClient().test();
           }
      
           public void process(WatchedEvent event) {
               System.out.println("event:" + event);
               if (event.getState() == KeeperState.SyncConnected) {
                   connected.countDown();
                   System.out.println("connected!");
               }
           }
      
       }
  14. 下面演示一个HA的过程,编写java代码
     public class TankMaster {
    
         static String status = "ACTIVE";
    
         public static void main(String[] args) throws Exception {
             String CONN_STR = "192.168.217.170:2181,192.168.217.171:2181,192.168.217.172:2181";
             ZooKeeper zk = new ZooKeeper(CONN_STR, 5000, null);
    
             String IP = "202.106.29.138";
             String port = new Random().nextInt(500) + "";
             System.out.println(port);
    
             if (zk.exists("/tankMaster", new MasterWatcher()) != null) {
                 status = "STANDBY";
             } else {
                 zk.create("/tankMaster", (IP + ":" + port).getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
                 status = "ACTIVE";
                 // 启动server
                 System.out.println("启动就是active");
             }
             Thread.sleep(Integer.MAX_VALUE);
         }
    
         static class MasterWatcher implements Watcher {
             public void process(WatchedEvent event) {
                 if (event.getType() == EventType.NodeDeleted) {
                     status = "ACTIVE";
                     System.out.println("切换为active");
                 }
             }
         }
    
     }
  15. 运行上述程序,观看控制台输出
  16. 不要停止上述程序,再次运行该程序,观察控制台输出
  17. 停止步骤15运行的程序,观察步骤16的控制台输出

zookeeper初探的更多相关文章

  1. ZooKeeper初探之安装和配置

    1. ZooKeeper简介 Zookeeper是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠的协调系统,提供的功能包括配置维护,名字服务,分布式同步,组服务等,Zookeeper是可 ...

  2. Dubbo zookeeper 初探

    先把zookeeper在本地给安装好, 安装方法参考:http://blog.csdn.net/wxwzy738/article/details/16330253 这里的话讲述了两个工程一个工程是提供 ...

  3. Zookeeper集群是如何升级到新版本的

    方案1:复用老数据方案 这是经过实践的升级方案,该方案是复用旧版本的数据,zk集群拓扑,配置文件都不变,只是启动的程序为最新的版本. 参考文章: Zookeeper集群是如何升级到新版本的 方案2:重 ...

  4. 深入了解ZooKeeper(一)

    在上篇博客ZooKeeper初探之安装和配置中已经对Zookeeper这个“服务协调者”有了初步的认识和了解,一个字“美”,接下来开始深入的交往,开始了解其内心世界! 1. 内容思维导图 2. 分布式 ...

  5. Zookeeper——分布式一致性协议及Zookeeper Leader选举原理

    文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...

  6. Kafka学习(学习过程记录)

    Apache kafka 这,仅是我学习过程中记录的笔记.确定了一个待研究的主题,对这个主题进行全方面的剖析.笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长.不止是技术. Kafka ...

  7. 搞懂分布式技术3:初探分布式协调服务zookeeper

    搞懂分布式技术3:初探分布式协调服务zookeeper 1.Zookeepr是什么 Zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅,负载均衡, ...

  8. 2、初探 ZooKeeper 技术内幕

    分布式一致性 “分布式” 是大型系统实现高性能.高可用所常用的架构手段,本章节将概述 “分布式一致性”的基本内容,以作为 ZAB 算法阐述的基础. 分布式一致性的基本概念 数据库系统的基础理论中,“事 ...

  9. 好用的zookeeper客服端----Curator初探

    maven配置: <dependency> <groupId>org.apache.curator</groupId> <artifactId>cura ...

随机推荐

  1. mysql-proxy实现读写分离

    其中Amoeba for MySQL也是实现读写分离 环境描述:操作系统:CentOS6.5 32位主服务器Master:192.168.179.146从服务器Slave:192.168.179.14 ...

  2. Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...

  3. Javascript中几个看起来简单,却不一定会做的题

    Javascript作为前端开发必须掌握的一门语言,因为语言的灵活性,有些知识点看起来简单,在真正遇到的时候,却不一定会直接做出来,今天我们就一起来看看几道题目吧 题目1 var val = 'smt ...

  4. php数组排序和查找的算法

    1.php算法 // 算法 // 1.冒泡排序 => 思路:​每次循环排列出一个最大的数 // echo '<pre>'; $arr = [ 1,43,54,62,21,66,32, ...

  5. Java日志框架:logback详解

    为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...

  6. CountDownLatch 源码解析—— await()

    上一篇文章说了一下CountDownLatch的使用方法.这篇文章就从源码层面说一下await() 的原理. 我们已经知道await 能够让当前线程处于阻塞状态,直到锁存器计数为零(或者线程中断). ...

  7. 福州大学W班-alpha冲刺评分

    作业链接 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/1159 作业要求 1.前期准备 阅读学习&l ...

  8. C语言博客作业字符数组

    一.PTA实验作业 7-12 IP地址转换 本题PTA提交列表 设计思路 3.代码截图 7-7删除字符串中的子串 本题PTA提交列表 设计思路 定义字符型数组s[81]储存主串,sub[81]储存子串 ...

  9. 201621123062《java程序设计》第十周作业总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 思维导图: 2. 书面作业 本次PTA作业题集异常 2.1. 常用异常 结合题集题目7-1回答 2.1.1 自己以前 ...

  10. Alpha集合

    项目名称:城市安全风险管控系统 小组成员: 张梨贤.林静.周静平.黄腾飞 Alpha冲刺随笔 Alpha冲刺Day1 Alpha冲刺Day2 Alpha冲刺Day3 Alpha冲刺Day4 Alpha ...