zookeeper的安装及共享锁的应用
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 代码如下:
- package com.daat.front.activity.web.actions.tools;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.Lock;
- import org.apache.log4j.Logger;
- import org.apache.zookeeper.CreateMode;
- import org.apache.zookeeper.KeeperException;
- import org.apache.zookeeper.WatchedEvent;
- import org.apache.zookeeper.Watcher;
- import org.apache.zookeeper.ZooDefs;
- import org.apache.zookeeper.ZooKeeper;
- import org.apache.zookeeper.data.Stat;
- import com.daat.front.activity.service.bo.impl.BoActivity;
- /**
- * 基于zoopkeeper的分布式共享锁
- * @author yank
- *
- */
- public class DistributedLock implements Lock, Watcher {
- private ZooKeeper zk;
- private String root = "/locks";
- private String lockName;
- private String waitNode;
- private String myZnode;
- private CountDownLatch latch;
- private int sessionTimeout = ;
- private List<Exception> exception = new ArrayList<Exception>();
- private static Logger log = Logger.getLogger(DistributedLock.class);
- public DistributedLock(String config, String lockName) {
- this.lockName = lockName;
- try {
- zk = new ZooKeeper(config, sessionTimeout, this);
- Stat stat = zk.exists(root, false);
- if (stat == null) {
- zk.create(root, new byte[], ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
- }
- } catch (IOException e) {
- e.printStackTrace();
- exception.add(e);
- } catch (KeeperException e) {
- e.printStackTrace();
- exception.add(e);
- } catch (InterruptedException e) {
- e.printStackTrace();
- exception.add(e);
- }
- }
- public void process(WatchedEvent event) {
- if (this.latch != null) {
- this.latch.countDown();
- }
- }
- public void lock() {
- if (exception.size() > ) {
- throw new LockException(exception.get());
- }
- try {
- if (this.tryLock()) {
- System.out.println("Thread " + Thread.currentThread().getId()+ " " + myZnode + " get lock true");
- return;
- } else {
- waitForLock(waitNode, sessionTimeout);
- }
- } catch (KeeperException e) {
- e.printStackTrace();
- throw new LockException(e);
- } catch (InterruptedException e) {
- e.printStackTrace();
- throw new LockException(e);
- }
- }
- public boolean tryLock() {
- try {
- String splitStr = "_lock_";
- if (lockName.contains(splitStr))
- throw new LockException("lockName can not contains \\u000B");
- myZnode = zk.create(root + "/" + lockName + splitStr, new byte[],ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
- System.out.println(myZnode + " is created ");
- List<String> subNodes = zk.getChildren(root, false);
- List<String> lockObjNodes = new ArrayList<String>();
- for (String node : subNodes) {
- String _node = node.split(splitStr)[];
- if (_node.equals(lockName)) {
- lockObjNodes.add(node);
- }
- }
- Collections.sort(lockObjNodes);
- System.out.println(myZnode + "==" + lockObjNodes.get());
- if (myZnode.equals(root + "/" + lockObjNodes.get())) {
- return true;
- }
- String subMyZnode = myZnode.substring(myZnode.lastIndexOf("/") + );
- waitNode = lockObjNodes.get(Collections.binarySearch(lockObjNodes,subMyZnode) - );
- } catch (KeeperException e) {
- e.printStackTrace();
- throw new LockException(e);
- } catch (InterruptedException e) {
- e.printStackTrace();
- throw new LockException(e);
- }
- return false;
- }
- public boolean tryLock(long time, TimeUnit unit) {
- try {
- if (this.tryLock()) {
- return true;
- }
- return waitForLock(waitNode, time);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
- private boolean waitForLock(String lower, long waitTime)
- throws InterruptedException, KeeperException {
- Stat stat = zk.exists(root + "/" + lower, true);
- if (stat != null) {
- System.out.println("Thread " + Thread.currentThread().getId()+ " waiting for " + root + "/" + lower);
- this.latch = new CountDownLatch();
- this.latch.await(waitTime, TimeUnit.MILLISECONDS);
- this.latch = null;
- }
- return true;
- }
- public void unlock() {
- try {
- System.out.println("unlock " + myZnode);
- zk.delete(myZnode, -);
- myZnode = null;
- zk.close();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (KeeperException e) {
- e.printStackTrace();
- }
- }
- public void lockInterruptibly() throws InterruptedException {
- this.lock();
- }
- public Condition newCondition() {
- return null;
- }
- public class LockException extends RuntimeException {
- private static final long serialVersionUID = 1L;
- public LockException(String e) {
- super(e);
- }
- public LockException(Exception e) {
- super(e);
- }
- }
- }
2.2 再写一个测试类 TestLock.java 代码如下:
- package com.daat.front.base.web.tools;
- import java.util.Date;
- public class TestLock implements Runnable{
- public static void main(String[] args) {
- for(int i=;i<;i++){
- Thread ad=new Thread(new TestLock());
- ad.start();
- }
- }
- @Override
- public void run() {
- DistributedLock lock = null;
- try {
- System.out.println("线程开启:"+Thread.currentThread().getId());
- //多个锁用“,” 分隔开
- //lock = new DistributedLock("10.168.128.113:2181,10.168.173.159:2181", "amount");
- Thread.sleep();
- lock = new DistributedLock("192.168.122.129:2181", "testLock");
- lock.lock();
- System.out.println("线程:"+Thread.currentThread().getId()+"在"+new Date().getTime()+"时间获得锁");
- Thread.sleep();
- System.out.println("===Thread "+ Thread.currentThread().getId() + " running");
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if (lock != null){
- System.out.println("线程:"+Thread.currentThread().getId()+"在"+new Date().getTime()+"释放锁");
- lock.unlock();
- }
- }
- }
- }
测试类是开启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的安装及共享锁的应用的更多相关文章
- Zookeeper的安装的配置
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt192 安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个 ...
- zookeeper的安装(图文详解。。。来点击哦!)
zookeeper的安装(图文详解...来点击哦!) 一.服务器的配置 三台服务器: 192.168.83.133 sunshine 192.168.83.134 sunshineMin 19 ...
- (原) 1.1 Zookeeper单机安装
本文为原创文章,转载请注明出处,谢谢 zookeeper 单机安装配置 1.安装前准备 linux系统(此文环境为Centos6.5) Zookeeper安装包,官网https://zookeeper ...
- ZooKeeper的安装、配置、启动和使用(一)——单机模式
ZooKeeper的安装.配置.启动和使用(一)——单机模式 ZooKeeper的安装非常简单,它的工作模式分为单机模式.集群模式和伪集群模式,本博客旨在总结ZooKeeper单机模式下如何安装.配置 ...
- ZooKeeper 的安装和配置---单机和集群
如题本文介绍的是ZooKeeper 的安装和配置过程,此过程非常简单,关键是如何应用(将放在下节及相关节中介绍). 单机安装.配置: 安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个 ...
- JDK+Tomcat+Zookeeper+DubboAdmin安装教程
JDK+Tomcat+Zookeeper+DubboAdmin安装教程 1. 安装内容: JDK 1.8.131 Tomcat 7.0.77 Zookeeper 3.4.9 Dubbo admin 2 ...
- Zookeeper的安装部署
1.Zookeeper的安装部署 7.1 Zookeeper工作机制 7.1.1.Zookeeper集群角色 Zookeeper集群的角色: Leader 和 follower (Observer ...
- Zookeeper的安装配置及基本开发
一.简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. ZooKeeper的目标就 ...
- ZooKeeper的安装
一.准备 需要提前安装好Java 准备好zookeeper的软件包:软件包地址 二.部署 解压zookeeper压缩包到指定目录 执行如下命令: .tar.gz -C /opt/ 三.修改配置 ...
随机推荐
- unset命令详解
基础命令学习目录首页 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现.它可以取消 ...
- Linux安装软件包
今天在坐公交的路上看到一遍文章感觉还不错,先收集了.原文链接 Linux安装软件包
- Daily Scrumming* 2015.10.30(Day 11)
一.总体情况总结 今日项目总结: 1.前后端同一了API设计以及API权限认证.用户状态保存的开发方案 2.API以及后端模型已经开始开发,前端UEditor开始学习,本周任务有良好的起步 3.前后端 ...
- 项目Beta冲刺(团队)第七天
1.昨天的困难 服务器部署出了问题,本地服务器差点崩掉 运行一直闪退,在查找哪里出现问题的路上一去不复返 2.今天解决的进度 成员 进度 陈家权 消息功能模块 赖晓连 问答功能模块 雷晶 部署服务器到 ...
- 利用session创建的cookies是这样的
版权声明:本文为博主原创文章,未经博主允许不得转载.
- 补发9.27“天天向上”团队Scrum站立会议
组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.27 地点:612寝 组员 已完成 未完成 王森 分析设计亮点 原型搭建 张金生 设计UI框架 美化完善 张政 学习C#语言初步应用 熟练 ...
- php 的stdClass类的简单实用
<?php $person = new stdClass(); $person->name = "yu"; $person->sex = "man&qu ...
- [转帖]USB-C和Thunderbolt 3连接线你搞懂了吗?---没搞明白.
USB-C和Thunderbolt 3连接线你搞懂了吗? 2018年11月25日 07:30 6318 次阅读 稿源:威锋网 3 条评论 按照计算行业的风潮,USB Type-C 将会是下一代主流的接 ...
- C++模板常用功能讲解
前言 泛型编程是C++继面向对象编程之后的又一个重点,是为了编写与具体类型无关的代码.而模板是泛型编程的基础.模板简单来理解,可以看作是用宏来实现的,事实上确实有人用宏来实现了模板类似的功能.模板,也 ...
- [微软官网] SQLSERVER 执行页面还原
执行页面还原 https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms175168(v=sql.105) ...