一、Zookeeper单击模式安装及使用

1、系统环境

2、导入JDK和Zookeeper包

1)、使用SecureCRT工具打开SFTP连接,直接拖拽,到当前用户文件夹下,然后使用mv命令(mv 文件 目标文件夹)移动到自定义路径下

2)、使用tar -zxvf 包名,解压JDK和Zookeeper

3、配置java环境变量,vi /etc/profile,编辑完成保存后,使用source /etc/profile使环境变量生效,java -version命令验证

4、在zookeeper目录下的conf目录下,新建zoo.cfg文件并配置如下(zoo.cfg文件是Zookeeper默认配置文件,其配置案例在zoo_samples.cfg中)

tickTime:服务器与服务器之间或服务器与客户端之间心跳间隔

dataDir:Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这;如果目录不存在启动时候会自动创建

clientPort:客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口,接收客户端的访问请求

5、启动Zookeeper,在bin文件夹下调用zkServer.sh start命令,start后面如果不指定配置文件路径,默认使用con/zoo.cfg

查看服务状态,./zkServer.sh status

6、客户端连接服务端,bin/zkCli.sh -server 127.0.0.1:2181

7、增删改查命令使用,进入客户端后通过help可查看所有命令使用方法

1)、ls 查看znode节点

2)、create 创建znode节点,节点后面必须赋值,否则不会创建成功

3)、get 获取节点值

4)、set 修改节点值

5)、创建/test子节点,注意获取/test值时,cversion由0变为1

6)、delete 删除节点

如果有子节点,父节点不能删除,需要先删除子节点再删除父节点

7)、quit 退出客户端操作界面

8、停掉Zookeeper服务

二、Zookeeper集群模式搭建(3台,最好奇数台,根据Leader选举算法Paxos协议,半数原则)

zk1对应IP:192.168.7.128

zk2对应IP:192.168.7.216

zk3对应IP:192.168.7.217

1、每台服务器上搭建基础环境,参照单击模式搭建

2、在Zookeeper保存数据的文件路径下创建myid文件,并写入server对应值(如果保存数据文件路径不存在自己创建),各台机器执行如下命令

zk1中命令:echo "1">myid;zk2中命令:echo "2">myid;zk3中命令:echo "3">myid

最终如下

3、配置各台及其conf/zoo.cfg文件如下

initLimit:Zookeeper集群中,连接到Leader的Follower服务初始化连接时最长限制时间多少个心跳间隔,如上配置5,表示5*2000=10秒,10秒内没有连接上表示Follower连接失败

syncLimit:Leader和Follower之间发送消息,请求和应答最长心跳间隔数,如上2*2000=4秒

server.x(x表示上面配置的1,2,3),x就是各台服务器中写入myid文件的数

IP:2888:3888      IP就是各服务器IP,2888是这个服务器与集群中的Leader进行信息交换的端口,3888是表示万一集群中的Leader服务器挂掉,需要一个端口来重新进行选举,选出一个新Leader,也就是这个3888端口是用来执行选举Leader时候用

4、启动各台Zookeeper服务 bin/zkServer.sh start ,都启动成功后,bin/zkServer.sh status查看服务器状态

起初查看状态报错如下,后来想到是防火墙的问题,就执行 systemctl stop firewalld 关闭即可

查看防火墙并关闭

各台服务器 bin/zkServer.sh restart 命令重启Zookeeper服务,查看状态

zk1服务器如下,注意Mode:leader,即此服务器为集群Leader(Leader选举有算法,并非第一个就是Leader)

zk2服务器如下,注意Mode:

zk3服务器和zk2服务器一样,Mode都是follower

5、测试集群,随便一个服务器上增删改节点,另一个服务器上也会一致性变化(可自行验证)

6、如果Leader服务器挂掉,会选出另一台Leader服务器,3台服务器最多可挂掉一台,超过一台挂掉Zookeeper就不可用了

三、ZooKeeper JavaAPI使用,直接上代码,看注释

package com.hjp.zookeeper;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper; import java.io.IOException;
import java.util.concurrent.CountDownLatch; public class ConnectionWatcher implements Watcher { private static final int SESSION_TIMEOUT = 5000; protected ZooKeeper zk;
private CountDownLatch connectedSignal = new CountDownLatch(1); public void connect(String hosts) throws IOException, InterruptedException {
//第一个参数是Zookeeper服务主机地址,可指定端口号,默认为2181;第二个参数以毫秒为单位的会话超时参数;
// 第三个参数是一个Watcher对象的实例。Watcher对象接收来自于Zookeeper的回调,以获得各种事件通知,
// 本例中CreateGroup是一个Watcher对象,因此参数为this
zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
//当一个ZooKeeper的实例被创建时,会启动一个线程连接到Zookeeper服务。
// 由于对构造函数的调用是立即返回的,因此在使用新建的Zookeeper对象之前一定要等待其与Zookeeper服务之间的连接建立成功。
// 使用CountDownLatch使当前线程等待,直到Zookeeper对象准备就绪
connectedSignal.await();
} public void process(WatchedEvent watchedEvent) {
//客户端与ZK建立连接后,Watcher的process方法会被调用,参数是表示该连接的事件,
// 连接成功后调用CountDownLatch的countDown方法,计数器减为0,释放线程锁,zk对象可用
if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
connectedSignal.countDown();
}
} public void close() throws InterruptedException {
zk.close();
}
}

连接ZK

package com.hjp.zookeeper;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids; import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch; public class ZKOperateAPI extends ConnectionWatcher { //创建组
public void create(String groupName, String data) throws KeeperException, InterruptedException {
String path = "/" + groupName;
//创建znode节点,第一个参数为路径;第二个参数为znode内容,字节数组;
// 第三个参数访问控制列表(简称ACL,此处使用完全开放的ACL,允许任何客户端对znode进行读写);
// 第四个为创建znode类型,此处是持久的(两种类型,短暂的和持久的,短暂类型会在客户端与zk服务断开连接后,被zk服务删掉,而持久的不会)
String createPath = zk.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("Created " + createPath);
} //加入组
public void join(String groupName, String memberName, String data) throws KeeperException, InterruptedException {
String path = "/" + groupName + "/" + memberName;
//创建短暂znode,会在客户端断开连接后删掉
String createPath = zk.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Create " + createPath);
} //列出组成员
public void list(String groupName) {
String path = "/" + groupName;
try {
//第一个参数为组名,即znode路径;第二个参数是否设置观察标识,如果为true,那么一旦znode状态改变,当前对象的Watcher会被触发
List<String> children = zk.getChildren(path, false);
if (children.isEmpty()) {
System.out.printf("No members in group %s\n", groupName);
System.exit(1);
}
for (String child : children) {
System.out.println(child);
}
} catch (KeeperException.NoNodeException ex) {
System.out.printf("Group %s does not exist\n", groupName);
System.exit(1);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
} //删除组
public void delete(String groupName) throws KeeperException, InterruptedException {
String path = "/" + groupName;
try {
List<String> children = zk.getChildren(path, false);
for (String child : children) {
//删除方法第一个参数指定路径,第二个参数是版本号;这是一种乐观锁机制,如果指定的版本号和对应znode版本号一致才可删除;
// 如果设置为-1,不校验可直接删除
zk.delete(path + "/" + child, -1);
}
zk.delete(path, -1);
} catch (KeeperException.NoNodeException ex) {
System.out.printf("Group %s does not exist\n", groupName);
System.exit(1);
}
} }

增删改查操作,继承连接类

import com.hjp.zookeeper.ZKOperateAPI;
import org.junit.Test; public class TestZK { @Test
public void create() throws Exception {
ZKOperateAPI operateAPI = new ZKOperateAPI();
//端口号不写,默认是2181
// operateAPI.connect("192.168.7.128:2181");
operateAPI.connect("192.168.7.128");
operateAPI.create("testAPI", "aaa");
operateAPI.close();
} @Test
public void join() throws Exception {
ZKOperateAPI operateAPI = new ZKOperateAPI();
operateAPI.connect("192.168.7.128");
;
operateAPI.join("testAPI", "testAPIChild", "aaaChild");
//模拟正在某种操作,休眠20秒后,断开zk服务连接,可查看zk服务中短暂znode被删除
Thread.sleep(20000);
operateAPI.close();
} @Test
public void list() throws Exception {
ZKOperateAPI operateAPI = new ZKOperateAPI();
operateAPI.connect("192.168.7.216");
operateAPI.list("testAPI");
operateAPI.close();
} @Test
public void delete() throws Exception{
ZKOperateAPI operateAPI = new ZKOperateAPI();
operateAPI.connect("192.168.7.217");
operateAPI.delete("testAPI");
operateAPI.close();
} }

测试执行代码

Zookeeper安装使用及JavaAPI使用的更多相关文章

  1. zookeeper安装及部署

    安装及部署 一. 单机安装.配置 1.下载zookeeper二进制安装包 下载 curl -L -O http://apache.fayea.com/zookeeper/stable/zookeepe ...

  2. ZooKeeper 安装部署及hello world(转)

    ZooKeeper  安装部署及hello world 先给一堆学习文档,方便以后查看官网文档地址大全:OverView(概述)http://zookeeper.apache.org/doc/r3.4 ...

  3. ZooKeeper学习第二期--ZooKeeper安装配置

    一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境:■ 伪集群模式:就是在一台物 ...

  4. Zookeeper安装部署

    Zookeeper安装 1. 安装 wget http://www.apache.org/dist//zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz ...

  5. ZooKeeper 安装部署及hello world

    ZooKeeper  安装部署及hello world 先给一堆学习文档,方便以后查看官网文档地址大全: OverView(概述)http://zookeeper.apache.org/doc/r3. ...

  6. zookeeper 安装

    Zookeeper安装 一.   下载zookeeper http://www.apache.org/dist/zookeeper/stable/ 二.   解压zookeeper.tar >& ...

  7. ZooKeeper安装与运行

    ZooKeeper安装与运行 首先从官网下载ZooKeeper压缩包,然后解压下载得到的ZooKeeper压缩包,发现有“bin,conf,lib”等目录.“bin目录”中存放有运行脚本:“conf目 ...

  8. zookeeper安装以及遇到的一些坑

    最近项目中用到了storm,然后storm中用到了zookeeper,然后今天抽空整理一下zookeeper的安装使用,原来后期再慢慢学习. 本篇文档,操作部分是摘自其他博客,里边的问题分析是自己在实 ...

  9. Zookeeper系列一:Zookeeper介绍、Zookeeper安装配置、ZK Shell的使用

    https://www.cnblogs.com/leeSmall/p/9563547.html 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分布式主要是下面 ...

随机推荐

  1. db2执行计划介绍

    在数据库调优过程中,SQL语句往往是导致性能问题的主要原因,而执行计划则是解释SQL语句执行过程的语言,只有充分读懂执行计划才能在数据库性能优化中做到游刃有余. 常见的关系型数据库中,虽然执行计划的表 ...

  2. tomcat配置问题

    1.首先安装JDK和Tomcat(我的tomcat是解压缩版的) 2.配置JDK环境变量 3.配置tomcat环境变量 4.在MyEcliipse中配置JDK(可以使用MyEclipse自带的tomc ...

  3. import pandas as pd Python安装pandas模块

    在学习python过程中需要用到一个叫pandas的模块,在pycharm中安装时总是出错. 千般百度折腾还是无果,后来发现它需要安装很多依赖包.就问你气不气~ 需要手动安装啊,千万记住,这里有个py ...

  4. springboot自定义http反馈状态码

    最近在开发一些http server类型程序,通过spring boot构建一些web程序,这些web程序之间通过http进行数据访问.共享,如下图: 假设现在client发起一次保存数据的请求到se ...

  5. raw_socket(原始套接字)以及普通socket使用终极总结

      一.传输层socket(四层socket,普通socket) 可参考本人以下博客: Windows Socket编程之UDP实现大文件的传输:http://blog.csdn.net/luchen ...

  6. 【OpenCV学习】计算两幅图像的重叠区域

    问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图 ...

  7. 用户人品预测大赛--就是gan队--竞赛分享

     用户人品预测大赛--就是gan队--竞赛分享  DataCastle运营 发表于 2016-3-24 14:14:05      1194  1  0 答辩PPT

  8. MySql之修改操作与进阶

    一:更新特定行 UPDATE tableName SET 列名 = 值,列名 = 值... WHERE 条件; 二:使用子查询更新数据 UPDATE tableName SET 列名 = SELECT ...

  9. 让 Python 更加充分的使用 Sqlite3

    我最近在涉及大量数据处理的项目中频繁使用 sqlite3.我最初的尝试根本不涉及任何数据库,所有的数据都将保存在内存中,包括字典查找.迭代和条件等查询.这很好,但可以放入内存的只有那么多,并且将数据从 ...

  10. Backbone hello world

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...