前言:

      前段时间自己参考网上的文章,梳理了一下基于分布式环境部署的业务系统在解决数据一致性问题上的方案,其中有一个方案是使用ZooKeeper,加之在大数据处理中,ZooKeeper确实起到协调服务的作用,所以利用周末休息时间,自己在虚拟机上简单搭建了一个ZooKeeper集群,学习了解一下。

===============================================================长长的分割线====================================================================

正文:

  在本文中主要涉及三块内容: 第一,就是搭建虚拟机环境;第二,安装ZooKeeper、启动ZooKeeper以及使用内置命令操作ZooKeeper;第三,使用Java API完成操作,以便了解如何在实际的项目中使用。

  闲话少说,言归正传,本次的目的是利用VMware搭建一个属于自己的ZooKeeper集群。本次我们选择的是VMware10,具体的安装步骤大家可以到网上搜索,资源很多。

  第一步,确定目标:

ZooKeeperOne       192.168.224.170  CentOS

ZooKeeperTwo       192.168.224.171  CentOS

ZooKeeperThree     192.168.224.172  CentOS

我们安装的ZooKeeper是3.4.6版本,可以从这里下载zookeeper-3.4.6; JDK安装的版本是1.7版本

第二步,安装CentOS环境、JDK1.7、配置网络:

此处大家可以参考网上的文章,或者参考我之前写的一篇文章 Hadoop4  利用VMware搭建自己的hadoop集群 ,该文章中的 第一步 到 第八步 涉及了安装基本环境的步骤哦和方法。我们只需要注意一下两点:

(1). 由于我们是在VMware中搭建三个服务器,所以我们可以先搭建一台,待配置都okay后,再利用VMware的克隆功能,直接克隆出另外两台,克隆出的两台只需要注意修改 /etc/sysconfig/network-scripts/ifcfg-eth0 中HWADDR属性、IPADDR 以及 /etc/sysconfig/network 的主机名称HOSTNAME

(2). JDK的安装注意使用JDK1.7,有些ZooKeeper版本在JDK1.6下是不支持的,所以简单一点,我们就直接使用JDK1.7。

第三步,安装配置ZooKeeper:

(1). 从这里下载zookeeper-3.4.6,将文件解压缩,不用安装。以我的为例,我的ZooKeeper路径是: /myself_settings/zookeeper3.4.6/zookeeper-3.4.6,详细如下图:

(2). 需要执行 vi  ~/.bash_profile,编辑一下ZooKeeper的环境变量,编辑完毕后执行 source ~/.bash_profile 使配置生效,详细如下图:

(3). 在(1)的zookeeper目录中,有一个conf文件夹,该文件夹中有一个 zoo_sample.cfg 的文件,我们使用命令 mv zoo_sample.cfg zoo.cfg 复制出一个zoo.cfg文件,这个文件就是ZooKeeper启动是时候默认要加载的配置文件,我们可以打开zoo.cfg查看都有哪些配置,并简单了解一下配置的含义,然后我们需要将配置改成如下图中的配置:

(4). 如(3)中的图中的配置,除了我在图中用红色框圈中的属性需要你添加或者修改,其余属性可以使用默认的。对于dataDir和dataLogDir这连个配置,顾名思义,分别是ZooKeeper的数据和日志目录,这个路径可以任意配置,我自己的目录就分别为/opt/zookeeper4.3.6/data 和 /opt/zookeeper4.3.6/log; 对于配置中的最后三行,每一行的格式都形如: server.id=host:port1:port2,其中host就是你的主机名称,port1代表着从(follower)机器连接到主(leader)机器的端口,port2代表着是用来进行leader选举的端口,注意这两个端口与 clientPort=2181 这个端口的含义区别。还有server.id中的id标识的是不同的服务器,在dataDir这个配置的路径下,建立一个名为myid的文件,在文件中只包含一行内容,即所指定的自身的id值,比如服务器"1"应该在myid文件中写入"1"。

(5). 其余两台服务器,注意修改(4)中的提到的这些需要变动的配置。

(6). 经过上边的配置,我们就可以准备启动ZooKeeper了,我么通过执行 zkServer.sh start 就可以将ZooKeeper启动了,其余服务器也直接使用相同命令启动即可。我们也可以使用  zkServer.sh start 指定路径的zoo.cfg文件  这个命令来启动ZooKeeper。启动成功截图详细如下:

第四步,使用客户端命令访问客户端:

(1). 我们可以在服务器上执行 zkCli.sh -server 192.168.224.170:2181 进入客户端,我们可以看到WelCome to ZooKeeper!等文字,详细如下图:

(2). 在客户端中我们了解以下几个命令,大家可以自行在客户端执行体验一下,对于get /zk这个命令执行返回的结果中,每个属性的含义值大家可以参考这片文章初步了解一下。

a. ls /   该命令用来查看当前ZooKeeper中所包含的内容

b. create /zk myData   该命令是创建了一个新的Znode节点zk,其内容是 myData

c. get /zk   该命令是获取已创建节点的信息

d. set /zk hahaha    该命令是对zk这个节点的内容进行设置

e. delete /zk   该命令是删除某个节点

第五步,使用Java API访问ZooKeeper:

其实Java API提供的功能基本也是基于上边的客户端命令来实现的,万变不离其宗,我将我整理的网上的例子贴到下面,大家可以在本地Java工程中执行一下,即可了解调用方法。这里有一点需要注意,我们需要在本地Java工程中引入 ZooKeeper安装包根目录下的zookeeper-3.4.6.jar 和 lib目录中的jar包。

  1. import java.util.List;
  2.  
  3. import org.apache.zookeeper.CreateMode;
  4. import org.apache.zookeeper.WatchedEvent;
  5. import org.apache.zookeeper.Watcher;
  6. import org.apache.zookeeper.ZooDefs.Ids;
  7. import org.apache.zookeeper.ZooKeeper;
  8. import org.apache.zookeeper.data.Stat;
  9.  
  10. /**
  11. * @Title ZookeeperDemo0001.java
  12. * @Package
  13. * @author zhangyi03
  14. * @description 基于zookeeper3.4.6,完成第一个zookeeper程序
  15. * @date 2015-9-19 下午11:14:20
  16. * @version v1.0
  17. */
  18. public class ZookeeperDemo0001 {
  19. // 会话超时时间,设置为系统默认时间一致
  20. private static final int SESSION_TIMEOUT = 30000;
  21.  
  22. // 创建ZooKeeper实例
  23. ZooKeeper zk;
  24.  
  25. // 创建Watcher实例
  26. Watcher wh = new Watcher() {
  27. public void process(WatchedEvent event) {
  28. System.out.println(event.toString());
  29. }
  30. };
  31.  
  32. // 初始化ZooKeeper实例
  33. private void createZKInstance() throws Exception {
  34. zk = new ZooKeeper("192.168.224.170:2181", SESSION_TIMEOUT, wh);
  35. }
  36.  
  37. private void ZKOperations() throws Exception {
  38. System.out.println("\n1. 创建 ZooKeeper 节点 (znode: zoo2, 数据: myData2, " +
  39. "权限: OPEN_ACL_UNSAFE, 节点类型: Persistent)");
  40. zk.create("/zoo2", "myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  41.  
  42. System.out.println("\n2. 查看是否创建成功:");
  43. System.out.println(new String(zk.getData("/zoo2", false, null)));
  44.  
  45. System.out.println("\n3. 修改节点数据");
  46. Stat setDataStat = zk.setData("/zoo2", "zhangyi03201509192339".getBytes(), -1);
  47.  
  48. System.out.println("\n4. 查看是否修改成功:");
  49. System.out.println(new String(zk.getData("/zoo2", false, null)));
  50.  
  51. System.out.println("\n5. 添加子节点");
  52. for (int index = 0; index < 3; index++) {
  53. zk.create("/zoo2/" + "child_" + (index+1), ("child_" + (index+1)).getBytes(),
  54. Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  55. }
  56.  
  57. System.out.println("\n6. 查看所有子节点:");
  58. List<String> childList = zk.getChildren("/zoo2", false);
  59. for (String child : childList) {
  60. System.out.println("\t\t\t 子节点:" + child);
  61. }
  62.  
  63. System.out.println("\n7. 删除所有子节点");
  64. for (String child : childList) {
  65. zk.delete("/zoo2" + "/" + child, -1);
  66. }
  67.  
  68. System.out.println("\n8. 删除节点");
  69. zk.delete("/zoo2", -1);
  70.  
  71. System.out.println("\n9. 查看节点是否被删除:");
  72. System.out.println("节点状态: [" + zk.exists("/zoo2", false) + "]");
  73. }
  74.  
  75. private void ZKClose() throws Exception {
  76. zk.close();
  77. }
  78.  
  79. /**
  80. * @author zhangyi03
  81. * @date 2015-9-19 下午11:14:01
  82. * @description
  83. * @param args
  84. */
  85. public static void main(String[] args) throws Exception {
  86. ZookeeperDemo0001 demo = new ZookeeperDemo0001();
  87. demo.createZKInstance();
  88. demo.ZKOperations();
  89. demo.ZKClose();
  90. }
  91. }

经过上边的五步,我们基本上已经对如何安装ZooKeeper和使用ZooKeeper有了一定的了解,也就是ZooKeeper核心基本内容。这里需要大家再执行上班的Java代码中再主动的查询这样几个问题:

(1). ZooKeeper中的Znode、Watches的含义

(2). ZooKeeper中的永久节点和临时节点的含义和区别

(3). ZooKeeper中的ACL的含义,以及对应的Java代码中的Ids.OPEN_ACL_UNSAFE 等几个属性的含义

(4). ZooKeeper中的cZxid、mZxid等时间戳的含义;version、cversion、aversion等版本号的含义

(5). 我开头提到的如何利用ZooKeeper的节点数据版本号和Java API来实现数据锁

上述这5个问题,都是我在安装和执行测试代码过程中想过的,找到答案也很简单哦,加油!

同时,我在查看ZooKeeper安装目录下的zookeeper-3.4.6\recipes目录中的lock工程时,这是一个"写锁"的实现,基本的思想流程搞明白了,但是看的过程中对代码理解的还不是很深,大家也可以看一下。哎,今天实在是不想再看了,写完博客玩游戏去了,明天晚上再看看那个例子。

各位同仁,加油哈!!!

   

ZooKeeper1 利用虚拟机搭建自己的ZooKeeper集群的更多相关文章

  1. Kafka1 利用虚拟机搭建自己的Kafka集群

    前言:       上周末自己学习了一下Kafka,参考网上的文章,学习过程中还是比较顺利的,遇到的一些问题最终也都解决了,现在将学习的过程记录与此,供以后自己查阅,如果能帮助到其他人,自然是更好的. ...

  2. 用三台虚拟机搭建Hadoop全分布集群

    用三台虚拟机搭建Hadoop全分布集群 所有的软件都装在/home/software下 虚拟机系统:centos6.5 jdk版本:1.8.0_181 zookeeper版本:3.4.7 hadoop ...

  3. 学习Hadoop+Spark大数据巨量分析与机器学习整合开发-windows利用虚拟机实现模拟多节点集群构建

    记录学习<Hadoop+Spark大数据巨量分析与机器学习整合开发>这本书. 第五章 Hadoop Multi Node Cluster windows利用虚拟机实现模拟多节点集群构建 5 ...

  4. CentOS7搭建 Hadoop + HBase + Zookeeper集群

    摘要: 本文主要介绍搭建Hadoop.HBase.Zookeeper集群环境的搭建 一.基础环境准备 1.下载安装包(均使用当前最新的稳定版本,截止至2017年05月24日) 1)jdk-8u131 ...

  5. Hadoop4 利用VMware搭建自己的hadoop集群

    前言:       前段时间自己学习如何部署伪分布式模式的hadoop环境,之前由于工作比较忙,学习的进度停滞了一段时间,所以今天抽出时间把最近学习的成果和大家分享一下.       本文要介绍的是如 ...

  6. STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群

    第一次配置zookeeper的集群 因为想运行storm必须搭建集群在自己的电脑上拷贝了自己的ubuntu虚拟机采用的是vmware给虚拟机分配的地址三个机器的配置基本上一样除了myid这个文件看了这 ...

  7. 搭建真正的zookeeper集群

    搭建zookeeper伪分布式集群 zookeeper是Hadop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调服务, 提供的功能包括配置维护,域名服务,分布式同步和组 ...

  8. zookeeper集群环境搭建详细图文教程

    zookeeper集群环境搭建详细图文教程 zhoubang @ 2018-01-02 [文档大纲] 友情介绍 软件环境 注意点 环境安装 1. 新建用于存储安装包以及软件安装的目录 2. 下载安装z ...

  9. docker-compose搭建zookeeper集群环境 CodingCode

    docker-compose搭建zookeeper集群环境 使用docker-compose搭建zookeeper集群环境 zookeeper是一个集群环境,用来管理微服务架构下面的配置管理功能. 这 ...

随机推荐

  1. 关于这段时间学习 EntityFramework的 一点感悟

    Ado.Net,用了N多年,Entity Framework也关注了很多年. 每当项目转型的时候,就花费大巴的时间,学习一番,潮流的东西. 这个Orm很多,这个EF很火,这么多年了,我还是不敢用,虽然 ...

  2. JavaScript function函数种类

    本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. ...

  3. 比Mysqli操作数据库更简便的方式 。PDO

    下面来说一下PDO 先画一张图来了解一下 mysqli是针对mysql这个数据库扩展的一个类 PDO是为了能访问更多数据库 如果出现程序需要访问其他数据库的话就可以用PDO来做 PDO数据访问抽象层1 ...

  4. Android Button的基本使用

    title: Android Button的基本使用 tags: Button,按钮 --- Button介绍: Button(按钮)继承自TextView,在Android开发中,Button是常用 ...

  5. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...

  6. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  7. 解决IE8下不兼容rgba()的解决办法

    rgba()是css3的新属性,所以IE8及以下浏览器不兼容,这怎么办呢?终于我找到了解决办法. 解决办法 我们先来解释以下rgba rgba: rgba的含义,r代表red,g代表green,b代表 ...

  8. 电信计费业务:预后融合OCS到底应该实扣还是虚扣?

    引入OCS的初衷之一是为了让计费系统能够参与到用户的通讯控制中来,也就是所谓的实时信控.用户在没有余额时,通讯就会被停止,不会造成"天价欠费 ",一方面保障用户的利益,一方面也保障 ...

  9. iOS 自定义方法 - 不完整边框

    示例代码 ///////////////////////////OC.h////////////////////////// ////  UIView+FreeBorder.h//  BHBFreeB ...

  10. Bluemix中国版体验(二)

    从上一篇到现在大概有一个多月了.时隔一个月再登录中国版Bluemix,发现界面竟然更新了,现在的风格和国际版已经基本保持一致!这次我们来体验一下Mobile Service.不过mobile serv ...