zookeeper快速入门

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 一。zookeeper简介 zookeeper 是apache旗下的hadoop子项目,它一个开源的,分布式的服务协调器。同样通过zookeeper可以实现服务间的同步与配置维护。通常情况下,在分布式应用开发中,协调服务这样的工作不是件容易的事,很容易出现死锁,不恰当的选举竞争等。

一。zookeeper简介

  1. zookeeper 是apache旗下的hadoop子项目,它一个开源的,分布式的服务协调器。同样通过zookeeper可以实现服务间的同步与配置维护。通常情况下,在分布式应用开发中,协调服务这样的工作不是件容易的事,很容易出现死锁,不恰当的选举竞争等。zookeeper就是担负起了分布式协调的重担。
  2. zookeeper的特点:
    1. 使用简单:ZooKeeper允许分布式程序通过一个类似于标准文件系统的共享的层次化名称空间来相互协调。名称空间由数据寄存器(称为znode)组成,在ZooKeeper中,它们类似于文件和目录。与为存储而设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以达到高吞吐量和低延迟数
    2. 同步与复制:组成ZooKeeper服务的服务器必须互相有感知。客户端连接到一个ZooKeeper服务器。客户端维护一个TCP连接,通过它发送请求、获取响应、获取观察事件和发送心跳。如果连接到服务器的TCP连接中断,客户端将连接到另一个服务器。   
    3. 有序
    4. 在进行大量读操作时,运行速度奇快
  3. ZooKeeper提供的名称空间非常类似于标准文件系统。名称是由斜杠(/)分隔的路径元素序列。在ZooKeeper的名称空间中,每一个节点都是通过一条路径来标识的。如图所示 :
  4. 当然zookeeper与标准文件系统不同的是,它的节点分为永久节点和临时节点(随着会话断开而消失)
  5. 客户端的节点都会被设置一个监控,当znode发生更改时,这个变化会通知所有客户端然后删除

 

二。zookeeper快速上手

  1. 下载zookeeper:地址,并解压,然后得到如下目录:
  2. 进入conf目录下我们复制一份zoo_sample.cfg并改名为zoo.cfg  
    cp zoo_sample.cfg zoo.cfg

    运行 vi zoo.cfg 我们先来看看配置

    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial 
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between 
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just 
    # example sakes.
    dataDir=../zookeeper-data
    # the port at which the clients will connect
    clientPort=2181
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the 
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    View Code

    在这里我们保持默认配置先不变。更改一下dataDir这个值,注意:先在zookeeper的根目录下把该文件夹建好

  3. 进入bin目录下启动zookeeper。注意:再此之前必须配置JAVA_HOME的环境变量
    ./zkServer.sh start

     

  4. 紧接着在bin目录下运行客户端
    ./zkCli.sh -server 127.0.0.1:2181

    运行过后会得到如下提示界面:

    Connecting to localhost:2181
    log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
    log4j:WARN Please initialize the log4j system properly.
    Welcome to ZooKeeper!
    JLine support is enabled
    [zkshell: 0]

    紧接着我们运行help命令可以看看当前可以运行哪些指令:

[zkshell: 0] help
ZooKeeper host:port cmd args
        get path [watch]
        ls path [watch]
        set path data [version]
        delquota [-n|-b] path
        quit
        printwatches on|off
        create path data acl
        stat path [watch]
        listquota path
        history
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]
        setquota -n|-b val path

    其中 get:为获取节点数据 , ls查看当前节点的子节点 create:创建节点 delete:删除节点  set设置节点的内容数据

    下面我们依次运行如下命令看看:

  1. [zkshell: 8] ls /
    [zookeeper]
            
    [zkshell: 9] create /zk_test my_data
    Created /zk_test
    [zkshell: 11] ls /
    [zookeeper, zk_test]
    [zkshell: 12] get /zk_test
    my_data
    cZxid = 5
    ctime = Fri Jun 05 13:57:06 PDT 2009
    mZxid = 5
    mtime = Fri Jun 05 13:57:06 PDT 2009
    pZxid = 5
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0
    dataLength = 7
    numChildren = 0
    [zkshell: 14] set /zk_test junk
    cZxid = 5
    ctime = Fri Jun 05 13:57:06 PDT 2009
    mZxid = 6
    mtime = Fri Jun 05 14:01:52 PDT 2009
    pZxid = 5
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0
    dataLength = 4
    numChildren = 0
    [zkshell: 15] get /zk_test
    junk
    cZxid = 5
    ctime = Fri Jun 05 13:57:06 PDT 2009
    mZxid = 6
    mtime = Fri Jun 05 14:01:52 PDT 2009
    pZxid = 5
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0
    dataLength = 4
    numChildren = 0
    [zkshell: 16] delete /zk_test
    [zkshell: 17] ls /
    [zookeeper]
    [zkshell: 18]

     

三。使用java操作zookeeper

  通常情况下我们可以使用zookeeper提供的原生jar包操作zookeeper服务,但是zookeeper原生方式操作很麻烦,不过我们可以用第三方的组件来操作zookeeper,比如说:zkClient 或者curator。curator提供了更丰富的功能,但是使用起来比zkClient稍微复杂一点。关于curator我们后续篇幅会介绍,这里先贴出zkClient的例子:

  添加zkClient的依赖:

// https://mvnrepository.com/artifact/com.101tec/zkclient
compile group: 'com.101tec', name: 'zkclient', version: '0.10'

   示例代码:

package com.bdqn.lyrk.register;

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;

import java.io.IOException;

public class ResgisterApplication {

    public static void main(String[] args) throws IOException {
        ZkClient zkClient = new ZkClient("localhost:2181", 1000);
        //获取指定路径的子节点个数
        System.out.println(zkClient.countChildren("/"));
        //如果节点存在则删除该节点
        if (zkClient.exists("/dubbo")) {
            zkClient.delete("/dubbo");
        }
        //创建永久的节点
        String nodeName = zkClient.create("/dubbo", "{\"name\":\"admin\"}", CreateMode.PERSISTENT);
        System.out.println(nodeName);
        //创建临时节点
        zkClient.createEphemeralSequential("/dubbo/test", "a");
        zkClient.createEphemeralSequential("/dubbo/test", "b");
        //读取节点数据
        System.out.println(zkClient.readData("/dubbo").toString());
        //订阅dubbo数据的变化
        zkClient.subscribeDataChanges("/dubbo", new IZkDataListener() {
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception {
                System.out.println(dataPath+"节点数据发生变化。。。");
            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception {
                System.out.println(dataPath+"节点数据被删除....");
            }
        });
        //订阅dubbo子节点的变化
        zkClient.subscribeChildChanges("/dubbo",(parentPath, currentChilds) -> System.out.println("dubbo节点发生变化"));

        //更新dubbo节点的数据
        zkClient.writeData("/dubbo", "dubbo");
        System.in.read();
    }
}
View Code

   注意以下几点:

    1.不能删除已经存在子节点的节点

    2.不能再临时节点上创建节点

  

  

四。zookeeper与eureka浅谈

  一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)

  zookeeper优先保证CP,当服务发生故障会进行leader的选举,整个期间服务处在不可用状态,如果选举时间过长势必会大幅度降低性能,另外就用途来说zookeeper偏向于服务的协调,当然含有注册中心的作用

  eureka优先保证AP, 即服务的节点各个都是平等的,没有leader不leader一说, 当服务发生故障时,其余的节点仍然可以提供服务,因此在出现故障时,性能表现优于zookeeper,但是可能会造成数据不一致的情况。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
8月前
|
数据安全/隐私保护
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(二)
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(二)
|
4月前
|
存储 API 数据安全/隐私保护
【ZooKeeper快速入门】 —— 每天一点小知识
【ZooKeeper快速入门】 —— 每天一点小知识
|
8月前
|
消息中间件 负载均衡 监控
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(一)
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(一)
|
10月前
|
存储 消息中间件 Dubbo
快速入门zookeeper
快速入门zookeeper
143 0
|
11月前
|
存储 消息中间件 Dubbo
快速入门zookeeper
快速入门zookeeper
|
分布式计算 Hadoop 网络安全
Hadoop快速入门——第四章、zookeeper(集群)(2)
Hadoop快速入门——第四章、zookeeper(集群)
73 0
Hadoop快速入门——第四章、zookeeper(集群)(2)
|
分布式计算 Hadoop 网络安全
Hadoop快速入门——第四章、zookeeper(集群)(1)
Hadoop快速入门——第四章、zookeeper(集群)
72 0
Hadoop快速入门——第四章、zookeeper(集群)(1)
|
分布式计算 Hadoop
Hadoop快速入门——第四章、zookeeper安装
Hadoop快速入门——第四章、zookeeper安装
89 0
Hadoop快速入门——第四章、zookeeper安装
|
14天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
30 2