`

ZooKeeper 安装部署及hello world

 
阅读更多

ZooKeeper  安装部署及hello world


先给一堆学习文档,方便以后查看
官网文档地址大全:

OverView(概述)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperOver.html

Getting Started(开始入门)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html

Tutorial(教程)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperTutorial.html

Java Example(Java示例)
http://zookeeper.apache.org/doc/r3.4.6/javaExample.html

Programmer's Guide(开发人员指南)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html

Recipes and Solutions(技巧及解决方案)
http://zookeeper.apache.org/doc/r3.4.6/recipes.html

3.4.6 API online(在线API速查)

http://zookeeper.apache.org/doc/r3.4.6/api/index.html

另外推荐园友sunddenly的zookeeper系列
http://www.cnblogs.com/sunddenly/category/620563.html

一、安装部署


本文在一台机器上模拟3个 zk server的集群安装

1.1 下载解压

解压到3个目录(模拟3台zk server):

  /home/hadoop/zookeeper-1
  /home/hadoop/zookeeper-2
  /home/hadoop/zookeeper-3
1.2 创建每个目录下conf/zoo.cfg配置文件 

/home/hadoop/zookeeper-1/conf/zoo.cfg 内容如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zk1/data
dataLogDir=/home/hadoop/tmp/zk1/log
clientPort=2181
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389

/home/hadoop/zookeeper-2/conf/zoo.cfg 内容如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zk2/data
dataLogDir=/home/hadoop/tmp/zk2/log
clientPort=2182
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389

/home/hadoop/zookeeper-3/conf/zoo.cfg 内容如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zk3/data
dataLogDir=/home/hadoop/tmp/zk3/log
clientPort=2183
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389

注:因为是在一台机器上模拟集群,所以端口不能重复,这里用2181~2183,2287~2289,以及3387~3389相互错开。另外每个zk的instance,都需要设置独立的数据存储目录、日志存储目录,所以dataDir、dataLogDir这二个节点对应的目录,需要手动先创建好。

另外还有一个灰常关键的设置,在每个zk server配置文件的dataDir所对应的目录下,必须创建一个名为myid的文件,其中的内容必须与zoo.cfg中server.x 中的x相同,即:

/home/hadoop/tmp/zk1/data/myid 中的内容为1,对应server.1中的1
/home/hadoop/tmp/zk2/data/myid 中的内容为2,对应server.2中的2
/home/hadoop/tmp/zk3/data/myid 中的内容为3,对应server.3中的3

生产环境中,分布式集群部署的步骤与上面基本相同,只不过因为各zk server分布在不同的机器,上述配置文件中的localhost换成各服务器的真实Ip即可。分布在不同的机器后,不存在端口冲突问题,可以让每个服务器的zk均采用相同的端口,这样管理起来比较方便。

1.3 启动验证 

/home/hadoop/zookeeper-1/bin/zkServer.sh start

/home/hadoop/zookeeper-2/bin/zkServer.sh start

/home/hadoop/zookeeper-3/bin/zkServer.sh start
启用成功后,输入 jps 看下进程

20351 ZooKeeperMain
20791 QuorumPeerMain
20822 QuorumPeerMain
20865 QuorumPeerMain

应该至少能看到以上几个进程。

可以启动客户端测试下:

bin/zkCli.sh -server localhost:2181
(注:如果是远程连接,把localhost换成指定的IP即可)

成功后,应该会进到提示符下,类似下面这样:

[zk: localhost:2181(CONNECTED) 0]  

然后,就可以用一些基础命令,比如 ls ,create ,delete ,get 来测试了(关于这些命令,大家可以查看文档),特别提一个很有用的命令rmr 用来递归删除某个节点及其所有子节点

二、java 与 zk的连接示例

2.1 maven项目的pom.xml中先添加以下依赖项
        <!--zk-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>

2.2 最基本的示例程序

package yjmyzz;
 
import java.io.IOException;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
 
public class ZooKeeperHello {
 
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        ZooKeeper zk = new ZooKeeper("172.28.20.102:2181", 300000, new DemoWatcher());//连接zk server
        String node = "/app1";
        Stat stat = zk.exists(node, false);//检测/app1是否存在
        if (stat == null) {
            //创建节点
            String createResult = zk.create(node, "test".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println(createResult);
        }
        //获取节点的值
        byte[] b = zk.getData(node, false, stat);
        System.out.println(new String(b));
        zk.close();
    }
 
    static class DemoWatcher implements Watcher {
        @Override
        public void process(WatchedEvent event) {
            System.out.println("----------->");
            System.out.println("path:" + event.getPath());
            System.out.println("type:" + event.getType());
            System.out.println("stat:" + event.getState());
            System.out.println("<-----------");
        }
    }
}
2.3 与zk集群的连接

zk的优点之一,就是高可用性,上面的代码连接的是单台zk server,如果这台server挂了,自然代码就会出错,事实上zk的API考虑到了这一点,把连接代码改成下面这样:

 ZooKeeper zk = new ZooKeeper("172.28.20.102:2181,172.28.20.102:2182,172.28.20.102:2183", 300000, new DemoWatcher());//连接zk server
 
 即:IP1:port1,IP2:port2,IP3:port3...  用这种方式连接集群就行了,只要有超过半数的zk server还活着,应用一般就没问题。但是也有一种极罕见的情况,比如这行代码执行时,刚初始化完成,正准备连接ip1时,因为网络故障ip1对应的server挂了,仍然会报错(此时,zk还来不及选出新leader),这个问题详见:http://segmentfault.com/q/1010000002506725/a-1020000002507402,参考该文的做法,改成:

         ZooKeeper zk = new ZooKeeper("172.28.20.102:2181,172.28.20.102:2182,172.28.20.102:2183", 300000, new DemoWatcher());//连接zk server
         if (!zk.getState().equals(ZooKeeper.States.CONNECTED)) {
             while (true) {
                 if (zk.getState().equals(ZooKeeper.States.CONNECTED)) {
                     break;
                 }
                 try {
                     TimeUnit.SECONDS.sleep(5);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }


 但是这样代码未免太冗长,建议用开源的zkClient,官方地址: https://github.com/sgroschupf/zkclient,使用方法很简单:

        <!--zkclient-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>

pom.xml先加这一坨,然后这样用:

     @Test
     public void testZkClient() {
         ZkClient zkClient = new ZkClient("172.28.20.102:2181,172.28.20.102:2182,172.28.20.102:2183");
         String node = "/app2";
         if (!zkClient.exists(node)) {
             zkClient.createPersistent(node, "hello zk");
         }
         System.out.println(zkClient.readData(node));
     }

分享到:
评论

相关推荐

    Dubbo新手入门实例HelloWorld(zookeeper)源码

    【Dubbo新手入门实例HelloWorld(zookeeper)源码】是一个非常适合初学者的教程,它将带你深入了解如何在实际项目中使用Dubbo框架,并结合Zookeeper作为注册中心进行服务治理。Dubbo是阿里巴巴开源的一个高性能、轻量...

    一款基于Netty+Zookeeper+Spring实现的轻量级Java RPC框架。提供服务注册,发现,负载均衡,.zip

    标题中的“一款基于Netty+Zookeeper+Spring实现的轻量级Java RPC框架”揭示了这个项目的核心技术栈,它整合了三个在分布式系统中广泛使用的开源库:Netty、Zookeeper和Spring。让我们逐一深入探讨这三个技术以及它们...

    HelloWorld

    根据提供的文件信息,我们可以归纳出一系列与微服务框架入门课程相关的知识点,特别是关于DUBBO入门篇-HelloWorld部分的内容。下面将详细阐述这些知识点: ### 知识点概述 #### 1. 环境配置 - **后台微服务环境...

    PyPI 官网下载 | hello-world-nagarjun-0.0.1.tar.gz

    标题中的"PyPI 官网下载 | hello-world-nagarjun-0.0.1.tar.gz"揭示了我们正在讨论的是一个在Python Package Index (PyPI) 上发布的软件包。PyPI是Python社区用来分发、查找和安装第三方Python模块的官方仓库。...

    zookeeper-3.4.14.zip

    该压缩包包含了ZooKeeper的所有源代码、构建脚本、文档以及必要的配置文件,供开发者下载、编译和部署使用。 描述中提到"zookeeper-3.4.14,分布式协调服务,搭配Hadoop分布式集群,更好地管理集群",这表明...

    zookeeper.zip

    《Zookeeper 3.4.8:分布式协调服务详解及安装指南》 Zookeeper,作为Apache软件基金会的一个顶级项目,是分布式系统中的一个重要组件,它主要用于实现分布式服务的配置管理、命名服务、集群同步以及分布式锁等核心...

    DUBBO技术课件

    **ZooKeeper的安装部署及Hello World** 在实际部署中,我们可能需要创建一个ZooKeeper集群,确保高可用性。这涉及多个节点的配置,以及客户端的连接测试。完成部署后,可以通过编写简单的Java程序或使用zkCli工具...

    zookeeper

    Zookeeper支持多种部署模式,如单机模式、伪集群模式和完全集群模式。在生产环境中,通常采用完全集群模式,以提高可用性和容错性。配置文件`zoo.cfg`中包含各种配置参数,如数据存储路径、会话超时时间、集群间通信...

    Codis集群部署文档

    - 验证Go语言安装:通过编写简单的Hello World程序测试Go语言是否安装正确,并配置好编译环境。 - 下载Codis源码:从官方仓库获取Codis源码,并根据文档指引进行编译与部署。 Codis的部署环境配置需要注意操作系统...

    docker-20.10_install.tar.gz

    sudo docker run hello-world ``` 在分布式系统中,Docker 被广泛应用于部署和管理微服务,如 Zookeeper。Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点...

    2018211582-李志毅-实验五1

    验证安装通常包括提交一个简单的“Hello, World!”程序。 3. **Kafka的安装与配置**:Kafka是一个分布式流处理平台,用于构建实时数据管道和流应用。在实验中,学生不仅安装了Kafka,还进行了配置,如设置`server....

    PyPI 官网下载 | naas-drivers-0.72.1.tar.gz

    zk.create_node('/test_node', 'Hello, World!') ``` 在这个例子中,`zookeeper_driver`模块提供了与Zookeeper通信的客户端类,允许开发者执行创建节点、读取数据等操作。 总结起来,naas-drivers是一个与...

    storm1.2.1-helloword

    标题“storm1.2.1-helloworld”暗示了这是一个关于Apache Storm 1.2.1版本的简单示例项目,通常用于新手入门学习。Apache Storm是一个开源的分布式实时计算系统,它允许用户处理无界数据流,即持续不断的数据流。在...

    dubbo 的安装

    以上就是Dubbo的安装过程,需要注意的是,实际部署时可能需要根据具体环境调整配置,如注册中心类型(Zookeeper、Nacos等)、网络环境等。同时,Dubbo还提供了许多高级特性,如集群策略、过滤器、监控等,可以根据...

    PyPI 官网下载 | slacker-0.6.1.tar.gz

    message = 'Hello, world!' slack.chat.post_message(channel, message) ``` 在云原生环境中,这种API调用可以集成到更复杂的系统流程中,例如作为任务完成或错误发生的通知机制。同时,由于Python库的灵活性,...

    Hadoop深度实战

    - **第一个HelloWorld程序** - 编写一个简单的WordCount程序,了解MapReduce的基本流程。 - **一个单表关联的例子** - 实现一个简单的数据处理任务,如两个表的关联操作。 #### 四、在Linux上安装Hive - **目的*...

    jetBrainsZookeeper

    4. 集群架构:ZooKeeper采用集群部署,每个节点既是服务器也是客户端,通过选举机制保证服务高可用性。 二、Python中的ZooKeeper应用 在Python中,我们可以使用 kazoo 这个库来与ZooKeeper进行交互。Kazoo提供了...

    SpringBoot整合Dubbo项目

    SpringBoot整合Dubbo项目是一个将流行的微服务框架Dubbo与SpringBoot结合的示例工程,旨在简化服务的开发和部署过程。SpringBoot以其简洁的配置和自动配置特性,极大地提升了开发效率,而Dubbo作为阿里巴巴开源的...

    Spring Boot 和 Vue 前后端分离教程

    + vue-hello-world - index.html - main.js - App.vue - components + ... * 后端项目结构 + spring-boot-backend - pom.xml - Application.java - controller - service - entity - ... ...

Global site tag (gtag.js) - Google Analytics