ZooKeeper1 利用虚拟机搭建自己的ZooKeeper集群

前言:

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

 

      经过上边的五步,我们基本上已经对如何安装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工程时,这是一个"写锁"的实现,基本的思想流程搞明白了,但是看的过程中对代码理解的还不是很深,大家也可以看一下。哎,今天实在是不想再看了,写完博客玩游戏去了,明天晚上再看看那个例子。

      各位同仁,加油哈!!!

      

   

转载于:https://www.cnblogs.com/PurpleDream/p/4823724.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决SublimeCodeIntel回车换行误打代码

SublimeCodeIntel会自动匹配并联想词汇, 这在换行的时候非常麻烦, 每次点Enter 都会误打出代码, 解决办法分两步:第一步是在Perferences/setting User 中加入 "auto_complete_commit_on_tab": true, 然后看Perferences/KeyBindings Default中 { "keys": [&…

Html5响应式设计与实现广场

由于提出的想法响应式设计&#xff0c;越来越多的网站使用这样的思想。各类大型网站如雨后春笋般涌了出来。例如&#xff1a;小米商城。天猫等。 至于响应式设计的概念等大家能够去百度百度&#xff0c;我这里就不相信解说了。直接为大家带来源代码。用Html5实现响应式的九宫格…

工作问题日志

1. 获取用户请求的路径&#xff1a;HttpServletRequest request (HttpServletRequest) req;String servletPath request.getServletPath(); 2. 相对通用的读文件流的方法&#xff08;Windows 和 Linux上都可以用&#xff09;&#xff1a;拿到流&#xff0c;然后再去读流中的内…

【j360-boot】Spring-boot系列三(崩溃模式,不是你崩就是电脑崩)

2019独角兽企业重金招聘Python工程师标准>>> j360-boot spring-boot入门工程之j360-boot&#xff1a;&#xff08;欢迎star、fork&#xff09; https://github.com/xuminwlt/j360-boot spring-boot官方地址 http://projects.spring.io/spring-boot/ 【j360-boot】Sp…

裸眼3D全攻略3:拍摄3D—瞳距、镜距、视角偏转与空间感

http://sd89.blog.163.com/blog/static/356041322014112532958728/ 3D图片的拍摄&#xff0c;与平面有着全新的不同要求&#xff0c;那就是空间感的表现。 简单来说&#xff0c;空间感是由两条视线分别从左右不同的视角&#xff0c;各自获取物体左右两面的不同信息交汇而产生的…

【教学类-42-02】20231224 X-Y 之间加法题判断题2.0(按2:8比例抽取正确题和错误题)

作品展示&#xff1a; 0-5&#xff1a; 21题&#xff0c;正确21题&#xff0c;错误21题42题 。小于44格子&#xff0c;都写上&#xff0c;哪怕输入2:8&#xff0c;实际也是5:5 0-10 66题&#xff0c;正确66题&#xff0c;错误66题132题 大于44格子&#xff0c;正确66题抽取44*…

Webpack使用指南

Webpack 是当下最热门的前端资源模块化管理和打包工具。 什么是webpack Webpack 是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔&#xff0c;等到实际需要的时候再异…

JS--数组和字典

JS--数组和字典 定义数组 var my_array new Array(); 一、JS数组 JavaScript中的数组类似于Python的列表   https://www.cnblogs.com/bigberg/p/9237856.html 1 a [11,22,33,44] 常见功能&#xff1a;  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 obj.length 数…

vue-cli创建项目

vue学习资料 Vue.js官网&#xff08;https://vuejs.org.cn/&#xff09; Vue-cli (https://github.com/vuejs/vue-cli) Vue-rescource (https//github.com/vuejs/vue-rescource) Vue-router (https://github.com/vuejs/vue-router) better-scroll (https://github.com/ustbhuan…

通过webbrowser实现js与winform的相互调用

为什么80%的码农都做不了架构师&#xff1f;>>> 1客户端页面 <!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"> <head><meta charset"utf-8" /><title></title> </head> <body>&l…

Visual Studio 2012中使用GitHub

前言 一直以来都想使用Git来管理自己平时积累的小代码&#xff0c;就是除了工作之外的代码了。有时候自己搞个小代码&#xff0c;在公司写了&#xff0c;就要通过U盘或者网盘等等 一系列工具进行Copy&#xff0c;然后回家才能继续在原来的基础上作业。Copy来Copy去的麻烦不说&a…

NOIP2015 D1 解题报告

T1 神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵&#xff1a;它由数字1,2,3,……,N*N构成&#xff0c;且每行、每列及两条对角线上的数字之和都相同。 当N为奇数时&#xff0c;我们可以通过以下方法构建一个幻方&#xff1a; 首先将1写在第一行的中间。 之后&#xff0c;按如…

spring容器扩展功能之一:spring加载ApplicationContext.xml的四种方式

容器加载Bean的常见两个类ApplicationContext和BeanFactory&#xff0c; 一、首先&#xff0c;看看spring中加载配置在xml中的Bean对象到容器 spring 中加载xml配置文件的方式,好像有4种, xml是最常见的spring 应用系统配置源。Spring中的几种容器都支持使用xml装配bean&#x…

软工随堂练 找出和值最大的子矩阵 尹亚男 赵静娜

题目&#xff1a;从m*n矩阵中找出元素和最大的子矩阵。 分析&#xff1a;此题是可看做节课求和值最大子数组的一种延伸。但如果按之前的枚举法显然太过麻烦&#xff0c;复杂度为O&#xff08;n^4&#xff09;。那么有没有更好的方法呢&#xff1f; 我们拿出上一道题做了进一步的…

wordpress进阶教程(十九):创建自定义的找回密码页面

http://www.ashuwp.com/courses/highgrade/338.html 文章参考自&#xff1a;http://www.tutorialstag.com/wordpress-custom-password-reset-page-template.html#codesyntax_2 密码重置是一个比稍微复杂的过程&#xff0c;因为这个过程需要更多的数据。 在这篇文章之前&#…

七大排序的个人总结(二) 归并排序(Merge

七大排序的个人总结&#xff08;二&#xff09; 归并排序&#xff08;Merge 归并排序&#xff08;Merge Sort&#xff09;: 归并排序是一个相当“稳定”的算法对于其它排序算法&#xff0c;比如希尔排序&#xff0c;快速排序和堆排序而言&#xff0c;这些算法有所谓的最好与最…

从Eclipse转移到IntelliJ IDEA一点心得

本人使用IntelliJ IDEA其实并不太久&#xff0c;用了这段时间以后&#xff0c;觉得的确很是好用。刚刚从Eclipse转过来的很多人开始可能不适应&#xff0c;我就把使用过程中的一些经验和常用功能分享下&#xff0c;当然在看这篇之前推荐你先看完IntelliJ IDEA 的 20 个代码自动…

【转】教你何时开启水果机上的HDR拍照

原址&#xff1a;http://news.mydrivers.com/1/175/175922.htm 苹果在iOS 4.1操作系统中为iPhone 4增加了一项有趣的新功能&#xff1a;HDR拍照。虽然目前市场上支持HDR功能的数码相机已经不在少数&#xff0c;但能够让普通消费者注意到这一功能&#xff0c;iPhone 4依然居功至…

Python快速学习03:运算 缩进和选择

前言 系列文章&#xff1a;[传送门] 这篇昨晚本来要出的&#xff0c;去搭了帐篷&#xff0c;在学校的屋顶上。 运算 运算&#xff0c;不得不说的是运算符。 数学 , -, *, /, **, %,// 判断 , !, >, >, <, <, in 逻辑 and, or, not 数学运算符 例子 print (19) …

冯洛伊曼体系结构

布尔代数 是一种关于0 和 1 的代数系统&#xff0c;用基础的逻辑符号系统描叙物体和概念&#xff0c;是现代电子计算机的数学和逻辑基础 布尔量&#xff1a; 0 1   True, False 与&#xff1a; a, b ab a*b and 或&#xff1a; ab …