Zookeeper的安装及共享锁的应用

1.zookeeper的安装

1.1  下载安装包

Wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

1.2 .解压缩安装包 tar -zxvf zookeeper-3.4.6.tar.gz 这里我们的操作都是在一个新建目录/opt/zookeeper 文件夹下完成的,自己可以根据实际需要创建文件夹

1.3 进入/opt/zookeeper/zookeeper-3.4.6/conf文件夹,将zoo_sample.cfg 文件重命名为 zoo.cfg ,命令:mv  zoo_sample.cfg  zoo.cfg

1.4 修改zoo.cfg配置文件 命令vi zoo.cfg ,将dataDir,dataLogDar参数进行配置,文件夹可以自己定义,在这里我配置成如下:

 dataDir=/opt/zookeeper/dataAndLog

   dataLogDir=/opt/zookeeper/dataAndLog

1.5 进入/opt/zookeeper/zookeeper-3.4.6/bin目录,启动zookeeper,命令为: ./zkServer.sh start

1.6 查看zookeeper 运行状态 ./zkServer.sh status,或者输入ps aux|grep zookeeper ,这里我们发现zookeeper 并没有正常启动,这里我们可以输入cat zookeeper.out 来查看启动信息

这里我们发现没有安装jdk

1.7 安装jdk

通过yum 安装openjdk1.7 yum -y install java-1.7.0-openjdk* ,jdk安装完成后输入 java -version  来查看jdk安装情况

1.8 再次启动zookeeper

输入 ./zkServer.sh start 重新启动zookeeper ,然后再次通过 ./zkServer.sh status  cat zookeeper.out  ps aux|grep zookeeper  来查看启动状态启动完成.

1.9 配置防火墙端口

Zookeeper 需要用到3个端口  2181 ,2888 ,3888 ,第一个是客户端连接的端口,后两个是做zookeeper集群时所用的端口。

修改防火墙配置文件  vi /etc/sysconfig/iptables 加入下面内容

-A INPUT -p tcp -m tcp --dport 2181 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 2888 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 3888 -j ACCEPT

然后 重启防火墙

/etc/init.d/iptables restart

2.0 集群的配置

在生产环境中,要配置成分布式模式,才能发挥威力。

ZooKeeper集群一般被称为ZooKeeper ensemble,或者 quorum.

准备3台机器

假设有三台机器,hostname和ip对应关系是:

192.168.1.101 hadoop101

192.168.1.102 hadoop102

192.168.1.103 hadoop103

ZooKeeper不存在明显的master/slave关系,各个节点都是服务器,leader挂了,会立马从follower中选举一个出来作为leader.

由于没有主从关系,也不用配置SSH无密码登录了,各个zk服务器是自己启动的,互相之间通过TCP端口来交换数据。

修改hadoop101的配置文件conf/zoo.cfg

....

....

clientPort=2181

server.1=hadoop101:2888:3888 /server.1=192.168.1.101:2888:3888

server.2=hadoop102:2888:3888/server.1=192.168.1.102:2888:3888

server.3=hadoop103:2888:3888/server.1=192.168.1.103:2888:3888

修改完后拷贝到 hadoop102,以及 hadoop103上.

然后启动每台机器,因为3个节点的启动是有顺序的,所以在陆续启动三个节点的时候,前面先启动的节点连接未启动的节点的时候会报出一些错误。可以忽略。

可以使用java客户端连接ZooKeeper集群中的任意一台服务器了。

2.分布式共享锁的应用

2.1  这里讲解一下使用java客户端来获取共享锁

这里有一个客户端类 DistributedLock.java 代码如下:

  1. package com.daat.front.activity.web.actions.tools;
  2.  
  3. import java.io.IOException;
  4.  
  5. import java.util.ArrayList;
  6.  
  7. import java.util.Collections;
  8.  
  9. import java.util.List;
  10.  
  11. import java.util.concurrent.CountDownLatch;
  12.  
  13. import java.util.concurrent.TimeUnit;
  14.  
  15. import java.util.concurrent.locks.Condition;
  16.  
  17. import java.util.concurrent.locks.Lock;
  18.  
  19. import org.apache.log4j.Logger;
  20.  
  21. import org.apache.zookeeper.CreateMode;
  22.  
  23. import org.apache.zookeeper.KeeperException;
  24.  
  25. import org.apache.zookeeper.WatchedEvent;
  26.  
  27. import org.apache.zookeeper.Watcher;
  28.  
  29. import org.apache.zookeeper.ZooDefs;
  30.  
  31. import org.apache.zookeeper.ZooKeeper;
  32.  
  33. import org.apache.zookeeper.data.Stat;
  34.  
  35. import com.daat.front.activity.service.bo.impl.BoActivity;
  36.  
  37. /**
  38.  
  39. * 基于zoopkeeper的分布式共享锁
  40.  
  41. * @author yank
  42.  
  43. *
  44.  
  45. */
  46.  
  47. public class DistributedLock implements Lock, Watcher {
  48.  
  49. private ZooKeeper zk;
  50.  
  51. private String root = "/locks";
  52.  
  53. private String lockName;
  54.  
  55. private String waitNode;
  56.  
  57. private String myZnode;
  58.  
  59. private CountDownLatch latch;
  60.  
  61. private int sessionTimeout = ;
  62.  
  63. private List<Exception> exception = new ArrayList<Exception>();
  64.  
  65. private static Logger log = Logger.getLogger(DistributedLock.class);
  66.  
  67. public DistributedLock(String config, String lockName) {
  68.  
  69. this.lockName = lockName;
  70.  
  71. try {
  72.  
  73. zk = new ZooKeeper(config, sessionTimeout, this);
  74.  
  75. Stat stat = zk.exists(root, false);
  76.  
  77. if (stat == null) {
  78.  
  79. zk.create(root, new byte[], ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
  80.  
  81. }
  82.  
  83. } catch (IOException e) {
  84.  
  85. e.printStackTrace();
  86.  
  87. exception.add(e);
  88.  
  89. } catch (KeeperException e) {
  90.  
  91. e.printStackTrace();
  92.  
  93. exception.add(e);
  94.  
  95. } catch (InterruptedException e) {
  96.  
  97. e.printStackTrace();
  98.  
  99. exception.add(e);
  100.  
  101. }
  102.  
  103. }
  104.  
  105. public void process(WatchedEvent event) {
  106.  
  107. if (this.latch != null) {
  108.  
  109. this.latch.countDown();
  110.  
  111. }
  112.  
  113. }
  114.  
  115. public void lock() {
  116.  
  117. if (exception.size() > ) {
  118.  
  119. throw new LockException(exception.get());
  120.  
  121. }
  122.  
  123. try {
  124.  
  125. if (this.tryLock()) {
  126.  
  127. System.out.println("Thread " + Thread.currentThread().getId()+ " " + myZnode + " get lock true");
  128.  
  129. return;
  130.  
  131. } else {
  132.  
  133. waitForLock(waitNode, sessionTimeout);
  134.  
  135. }
  136.  
  137. } catch (KeeperException e) {
  138.  
  139. e.printStackTrace();
  140.  
  141. throw new LockException(e);
  142.  
  143. } catch (InterruptedException e) {
  144.  
  145. e.printStackTrace();
  146.  
  147. throw new LockException(e);
  148.  
  149. }
  150.  
  151. }
  152.  
  153. public boolean tryLock() {
  154.  
  155. try {
  156.  
  157. String splitStr = "_lock_";
  158.  
  159. if (lockName.contains(splitStr))
  160.  
  161. throw new LockException("lockName can not contains \\u000B");
  162.  
  163. myZnode = zk.create(root + "/" + lockName + splitStr, new byte[],ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
  164.  
  165. System.out.println(myZnode + " is created ");
  166.  
  167. List<String> subNodes = zk.getChildren(root, false);
  168.  
  169. List<String> lockObjNodes = new ArrayList<String>();
  170.  
  171. for (String node : subNodes) {
  172.  
  173. String _node = node.split(splitStr)[];
  174.  
  175. if (_node.equals(lockName)) {
  176.  
  177. lockObjNodes.add(node);
  178.  
  179. }
  180.  
  181. }
  182.  
  183. Collections.sort(lockObjNodes);
  184.  
  185. System.out.println(myZnode + "==" + lockObjNodes.get());
  186.  
  187. if (myZnode.equals(root + "/" + lockObjNodes.get())) {
  188.  
  189. return true;
  190.  
  191. }
  192.  
  193. String subMyZnode = myZnode.substring(myZnode.lastIndexOf("/") + );
  194.  
  195. waitNode = lockObjNodes.get(Collections.binarySearch(lockObjNodes,subMyZnode) - );
  196.  
  197. } catch (KeeperException e) {
  198.  
  199. e.printStackTrace();
  200.  
  201. throw new LockException(e);
  202.  
  203. } catch (InterruptedException e) {
  204.  
  205. e.printStackTrace();
  206.  
  207. throw new LockException(e);
  208.  
  209. }
  210.  
  211. return false;
  212.  
  213. }
  214.  
  215. public boolean tryLock(long time, TimeUnit unit) {
  216.  
  217. try {
  218.  
  219. if (this.tryLock()) {
  220.  
  221. return true;
  222.  
  223. }
  224.  
  225. return waitForLock(waitNode, time);
  226.  
  227. } catch (Exception e) {
  228.  
  229. e.printStackTrace();
  230.  
  231. }
  232.  
  233. return false;
  234.  
  235. }
  236.  
  237. private boolean waitForLock(String lower, long waitTime)
  238.  
  239. throws InterruptedException, KeeperException {
  240.  
  241. Stat stat = zk.exists(root + "/" + lower, true);
  242.  
  243. if (stat != null) {
  244.  
  245. System.out.println("Thread " + Thread.currentThread().getId()+ " waiting for " + root + "/" + lower);
  246.  
  247. this.latch = new CountDownLatch();
  248.  
  249. this.latch.await(waitTime, TimeUnit.MILLISECONDS);
  250.  
  251. this.latch = null;
  252.  
  253. }
  254.  
  255. return true;
  256.  
  257. }
  258.  
  259. public void unlock() {
  260.  
  261. try {
  262.  
  263. System.out.println("unlock " + myZnode);
  264.  
  265. zk.delete(myZnode, -);
  266.  
  267. myZnode = null;
  268.  
  269. zk.close();
  270.  
  271. } catch (InterruptedException e) {
  272.  
  273. e.printStackTrace();
  274.  
  275. } catch (KeeperException e) {
  276.  
  277. e.printStackTrace();
  278.  
  279. }
  280.  
  281. }
  282.  
  283. public void lockInterruptibly() throws InterruptedException {
  284.  
  285. this.lock();
  286.  
  287. }
  288.  
  289. public Condition newCondition() {
  290.  
  291. return null;
  292.  
  293. }
  294.  
  295. public class LockException extends RuntimeException {
  296.  
  297. private static final long serialVersionUID = 1L;
  298.  
  299. public LockException(String e) {
  300.  
  301. super(e);
  302.  
  303. }
  304.  
  305. public LockException(Exception e) {
  306.  
  307. super(e);
  308.  
  309. }
  310.  
  311. }
  312.  
  313. }

2.2 再写一个测试类 TestLock.java 代码如下:

  1. package com.daat.front.base.web.tools;
  2.  
  3. import java.util.Date;
  4.  
  5. public class TestLock implements Runnable{
  6.  
  7. public static void main(String[] args) {
  8.  
  9. for(int i=;i<;i++){
  10.  
  11. Thread ad=new Thread(new TestLock());
  12.  
  13. ad.start();
  14.  
  15. }
  16.  
  17. }
  18.  
  19. @Override
  20.  
  21. public void run() {
  22.  
  23. DistributedLock lock = null;
  24.  
  25. try {
  26.  
  27. System.out.println("线程开启:"+Thread.currentThread().getId());
  28.  
  29. //多个锁用“,” 分隔开
  30.  
  31. //lock = new DistributedLock("10.168.128.113:2181,10.168.173.159:2181", "amount");
  32.  
  33. Thread.sleep();
  34.  
  35. lock = new DistributedLock("192.168.122.129:2181", "testLock");
  36.  
  37. lock.lock();
  38.  
  39. System.out.println("线程:"+Thread.currentThread().getId()+"在"+new Date().getTime()+"时间获得锁");
  40.  
  41. Thread.sleep();
  42.  
  43. System.out.println("===Thread "+ Thread.currentThread().getId() + " running");
  44.  
  45. } catch (Exception e) {
  46.  
  47. e.printStackTrace();
  48.  
  49. }finally{
  50.  
  51. if (lock != null){
  52.  
  53. System.out.println("线程:"+Thread.currentThread().getId()+"在"+new Date().getTime()+"释放锁");
  54.  
  55. lock.unlock();
  56.  
  57. }
  58.  
  59. }
  60.  
  61. }
  62.  
  63. }

测试类是开启10个线程同时去做锁竞争操作,看看是否可以控制

获取锁---->释放锁  的操作,测试结果如下:

第一次测试:

线程开启:9

线程开启:11

线程开启:10

线程开启:12

线程开启:15

线程开启:14

线程开启:13

线程开启:16

线程开启:17

线程开启:18

线程:11在1478591252342时间获得锁

线程:11在1478591257342释放锁

线程:14在1478591257348时间获得锁

线程:14在1478591262349释放锁

线程:15在1478591262352时间获得锁

线程:15在1478591267352释放锁

线程:10在1478591267360时间获得锁

线程:10在1478591272360释放锁

线程:12在1478591272364时间获得锁

线程:12在1478591277364释放锁

线程:16在1478591277367时间获得锁

线程:16在1478591282368释放锁

线程:9在1478591282371时间获得锁

线程:9在1478591287371释放锁

线程:18在1478591285302时间获得锁

线程:18在1478591290302释放锁

线程:13在1478591285302时间获得锁

线程:13在1478591290302释放锁

线程:17在1478591285303时间获得锁

线程:17在1478591290303释放锁

第二次测试:

线程开启:9

线程开启:11

线程开启:12

线程开启:10

线程开启:13

线程开启:14

线程开启:15

线程开启:16

线程开启:18

线程开启:17

线程:17在1478591690760时间获得锁

线程:17在1478591694760释放锁

线程:18在1478591694767时间获得锁

线程:18在1478591698767释放锁

线程:14在1478591698770时间获得锁

线程:14在1478591702771释放锁

线程:15在1478591702775时间获得锁

线程:15在1478591706775释放锁

线程:12在1478591706778时间获得锁

线程:12在1478591710778释放锁

线程:11在1478591710783时间获得锁

线程:11在1478591714783释放锁

线程:9在1478591714786时间获得锁

线程:9在1478591718787释放锁

线程:10在1478591718790时间获得锁

线程:10在1478591722790释放锁

线程:16在1478591720773时间获得锁

线程:16在1478591724773释放锁

线程:13在1478591720774时间获得锁

线程:13在1478591724774释放锁

通过测试。

zookeeper的安装及共享锁的应用的更多相关文章

  1. Zookeeper的安装的配置

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt192 安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个 ...

  2. zookeeper的安装(图文详解。。。来点击哦!)

    zookeeper的安装(图文详解...来点击哦!) 一.服务器的配置 三台服务器: 192.168.83.133   sunshine 192.168.83.134   sunshineMin 19 ...

  3. (原) 1.1 Zookeeper单机安装

    本文为原创文章,转载请注明出处,谢谢 zookeeper 单机安装配置 1.安装前准备 linux系统(此文环境为Centos6.5) Zookeeper安装包,官网https://zookeeper ...

  4. ZooKeeper的安装、配置、启动和使用(一)——单机模式

    ZooKeeper的安装.配置.启动和使用(一)——单机模式 ZooKeeper的安装非常简单,它的工作模式分为单机模式.集群模式和伪集群模式,本博客旨在总结ZooKeeper单机模式下如何安装.配置 ...

  5. ZooKeeper 的安装和配置---单机和集群

    如题本文介绍的是ZooKeeper 的安装和配置过程,此过程非常简单,关键是如何应用(将放在下节及相关节中介绍). 单机安装.配置: 安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个 ...

  6. JDK+Tomcat+Zookeeper+DubboAdmin安装教程

    JDK+Tomcat+Zookeeper+DubboAdmin安装教程 1. 安装内容: JDK 1.8.131 Tomcat 7.0.77 Zookeeper 3.4.9 Dubbo admin 2 ...

  7. Zookeeper的安装部署

    1.Zookeeper的安装部署 7.1 Zookeeper工作机制 7.1.1.Zookeeper集群角色 Zookeeper集群的角色:  Leader 和  follower (Observer ...

  8. Zookeeper的安装配置及基本开发

    一.简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. ZooKeeper的目标就 ...

  9. ZooKeeper的安装

    一.准备 需要提前安装好Java 准备好zookeeper的软件包:软件包地址   二.部署 解压zookeeper压缩包到指定目录 执行如下命令: .tar.gz -C /opt/   三.修改配置 ...

随机推荐

  1. unset命令详解

    基础命令学习目录首页 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现.它可以取消 ...

  2. Linux安装软件包

    今天在坐公交的路上看到一遍文章感觉还不错,先收集了.原文链接 Linux安装软件包

  3. Daily Scrumming* 2015.10.30(Day 11)

    一.总体情况总结 今日项目总结: 1.前后端同一了API设计以及API权限认证.用户状态保存的开发方案 2.API以及后端模型已经开始开发,前端UEditor开始学习,本周任务有良好的起步 3.前后端 ...

  4. 项目Beta冲刺(团队)第七天

    1.昨天的困难 服务器部署出了问题,本地服务器差点崩掉 运行一直闪退,在查找哪里出现问题的路上一去不复返 2.今天解决的进度 成员 进度 陈家权 消息功能模块 赖晓连 问答功能模块 雷晶 部署服务器到 ...

  5. 利用session创建的cookies是这样的

    版权声明:本文为博主原创文章,未经博主允许不得转载.

  6. 补发9.27“天天向上”团队Scrum站立会议

    组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.27 地点:612寝 组员 已完成 未完成 王森 分析设计亮点 原型搭建 张金生 设计UI框架 美化完善 张政 学习C#语言初步应用 熟练 ...

  7. php 的stdClass类的简单实用

    <?php $person = new stdClass(); $person->name = "yu"; $person->sex = "man&qu ...

  8. [转帖]USB-C和Thunderbolt 3连接线你搞懂了吗?---没搞明白.

    USB-C和Thunderbolt 3连接线你搞懂了吗? 2018年11月25日 07:30 6318 次阅读 稿源:威锋网 3 条评论 按照计算行业的风潮,USB Type-C 将会是下一代主流的接 ...

  9. C++模板常用功能讲解

    前言 泛型编程是C++继面向对象编程之后的又一个重点,是为了编写与具体类型无关的代码.而模板是泛型编程的基础.模板简单来理解,可以看作是用宏来实现的,事实上确实有人用宏来实现了模板类似的功能.模板,也 ...

  10. [微软官网] SQLSERVER 执行页面还原

    执行页面还原 https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms175168(v=sql.105) ...