分享

zookeeper入门

 贪挽懒月 2022-06-20 发布于广东
是什么

简单地说就是管理员。有什么事它就会通知到所有被它管理的人。就比如宿舍管理员,宿舍要停电他就会发通知,然后所有住这栋楼的都会知道。说专业一点,它是由文件系统和通知机制组成的。

能干嘛

1、命名服务:
就是在分布式应用中,不同的模块可能会被拎出来单独做成一个服务,如果这些服务之间需要相互调用,就可以把这些服务都注册到zookeeper上,需要调那个就直接去zookeeper上找。比如有一个订单系统和一个库存系统部署在不同的服务器上,下单的时候订单系统需要调用库存系统的stockService,怎么搞?那么可以用zookeeper。我们把所有的service都注册到zookeeper上,所谓的注册,其实也就告诉zookeeper该服务在哪儿。当订单系统要调用stockService的时候,就去zookeeper上找。

2、配置维护:
比如我们在一台服务器上部署了20个应用,连接的都是同一个数据库。某一天数据库密码改了,要想这20个应用还能连接上数据库,那么就得改这20个应用连接数据库的配置文件。既然连接数据库的配置都是一样的,我们可以写一份,放在zookeeper上,让这20个应用都去zookeeper上读取,要修改的时候也只修改zookeeper上的这一份即可,实现一处更新,处处生效。

3、集群管理:
zookeeper可以监视集群,哪一台宕机了,会立即通知集群中的每一个节点,做出相应的措施,类似redis的哨兵。

4、分布式消息同步和协调机制:
这个有点类似于中间件的功能。比如有订单、库存、积分等系统都在盯着zookeeper,一有新订单下来,库存和积分系统也要立刻做出相应的操作。

5、负载均衡:
zookeeper也可以做负载均衡,但是一般不会用它干这个,因为做负载均衡,nginx是专业的!

6、对dubbo的支持:
dubbo是一个搞分布式的框架,dubbo一般就会配合zookeeper使用,将服务都注册到zookeeper上

安装zookeeper

1、安装:
安装很简单,直接解压就行了。然后进入conf目录把配置文件拷贝一份并且重命名为zoo.cfg。然后进入bin目录执行zkServer.sh start就可以启动了。
2、zookeeper的配置文件:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
4lw.commands.whitelist=*
  • tickTime:通信心跳次数,Zookeeper服务器心跳时间,单位毫秒。每两秒检测一次服务器是否还活着。

  • initLimit:从机和主机接头需要的时间

  • syncLimit:主机和从机同步通信时限。比如这个是5,tickTime是2,那么就是10秒内还没和主机建立连接,就不能加入了。

  • dataDir:数据存放的目录

  • clientPort:端口

以上5个是默认就有的配置,最后一行是自己添加的配置,是防止执行部分命令的时候报如下的错误:

 xxx is not executed because it is not in the whitelist.

3、zk相关命令:

  • 启动:进入bin目录,执行./zkServer.sh start

  • 启动客户端:./zkCli.sh,断开连接:quit

  • 启动并在控制台打印启动日志:./zkServer.sh start-foreground

  • 查看当前节点在集群中的状态:./zkServer.sh status

以下命令是在zkCli中执行的。

  • 创建持久化节点:create /path data,重启之后还会存在

  • 创建带序列的节点:create -s /path data,节点会加上0000X这样的后缀

  • 创建临时节点:create -e /path data,临时节点,重启后节点就没了

  • 创建临时带序列的节点:create -s -e /path data

  • 查看节点:ls /pathls2 /path

  • 查看节点状态信息:stat /path

  • 获取节点值:get /path

  • 获取节点值并查看状态信息:get -s /path

  • 更新节点:set /path newData

  • 删除节点:delete /path

  • 删除节点和子节点:rmr /path,相当于Linux的rm -rf

  • 四字命令:四字命令就是相当于redis中你ping会返回pong。启动了zkServer后,输入

echo ruok | nc 127.0.0.1 2181

没有意外的话就会返回如下内容:

imok[root@localhost bin]#

即输入ruok,响应imok。如果配置文件没有配置最后一行,执行这个命令就会报错。

开篇说了,zookeeper是文件系统加通知机制,通过上面的命令,其实就可以很好地理解文件系统这个概念了。类比Linux,Linux中叫文件或者目录,而zookeeper中换了种叫法,叫做zNode,即节点,每个zNode默认能够存储1MB的数据。Linux和zookeeper都是一棵倒装树,/代表的是根,根下面可以挂其他的节点,节点下面又可以挂节点。zNode = path + data + stat,即节点是由路径、数据、状态描述构成的。

java操作zookeeper

ava操作zookeeper也很简单,引入如下两个依赖:

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.5.5</version>
</dependency>
<dependency>
   <groupId>com.101tec</groupId>
   <artifactId>zkclient</artifactId>
   <version>0.11</version>
</dependency>

zkclient提供了和zk命令差不多的api,new一个zookeeper实例,然后就可以通过这个实例进行增删改查了。部分代码如下:

package com.zhusl.utils.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.util.List;

/**
 * @author zhusl
 * @date 2019/11/18 9:37
 */

public class HelloZk {

    private static final String CONNECTURL = "192.168.2.43:2181";
    private static final int SESSIONTIMEOUT = 30 * 1000;

    /**
     * 获取zk实例
     */

    public static ZooKeeper getInstance() throws  Exception{
        ZooKeeper zooKeeper = new ZooKeeper(CONNECTURL, SESSIONTIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
            }
        });
        return zooKeeper;
    }

    /**
     * create /path data
     */

    public static String createZnode(ZooKeeper zooKeeper, String path, String value) throws Exception{
        String returnInfo = null;
        if (zooKeeper.exists(path, false) == null){
            returnInfo = zooKeeper.create(path, value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }
        return returnInfo;
    }

    /**
     * get /path
     */

    public static String getZnode(ZooKeeper zooKeeper, String path) throws Exception{
        String returnInfo = null;
        byte[] bytes = zooKeeper.getData(path, falsenew Stat());
        returnInfo = new String(bytes);
        return returnInfo;
    }

    /**
     * set /pate newData
     */

    public static String setZnode(ZooKeeper zooKeeper, String path, String value) throws Exception{
        String returnInfo = null;
        if (zooKeeper.exists(path, false) != null){
            Stat stat = zooKeeper.setData(path, value.getBytes(), Version.REVISION);
            returnInfo = stat.toString();
        }
        return returnInfo;
    }

    /**
     * delete /path
     */

    public static void deleteZnode(ZooKeeper zooKeeper, String path) throws Exception{
        zooKeeper.delete(path, Version.REVISION);
    }

    /**
     * ls /path
     */

    public static String lsZnode(ZooKeeper zooKeeper, String path) throws Exception{
        String returnInfo = null;
        if (zooKeeper.exists(path, false) != null){
            List<String> znodes = zooKeeper.getChildren(path, false);
            returnInfo = znodes.toString();
        }
        return returnInfo;
    }
}

上面是基础的Java对zookeeper进行增删改查的代码

为避免篇幅过长,入门篇先介绍到这儿,后续会有进阶篇,介绍zookeeper的通知机制以及集群等内容……

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多