小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

zookeeper入門

 貪挽懶月 2022-06-20 發(fā)布于廣東
是什么

簡單地說就是管理員。有什么事它就會通知到所有被它管理的人。就比如宿舍管理員,宿舍要停電他就會發(fā)通知,然后所有住這棟樓的都會知道。說專業(yè)一點(diǎn),它是由文件系統(tǒng)和通知機(jī)制組成的。

能干嘛

1、命名服務(wù):
就是在分布式應(yīng)用中,不同的模塊可能會被拎出來單獨(dú)做成一個(gè)服務(wù),如果這些服務(wù)之間需要相互調(diào)用,就可以把這些服務(wù)都注冊到zookeeper上,需要調(diào)那個(gè)就直接去zookeeper上找。比如有一個(gè)訂單系統(tǒng)和一個(gè)庫存系統(tǒng)部署在不同的服務(wù)器上,下單的時(shí)候訂單系統(tǒng)需要調(diào)用庫存系統(tǒng)的stockService,怎么搞?那么可以用zookeeper。我們把所有的service都注冊到zookeeper上,所謂的注冊,其實(shí)也就告訴zookeeper該服務(wù)在哪兒。當(dāng)訂單系統(tǒng)要調(diào)用stockService的時(shí)候,就去zookeeper上找。

2、配置維護(hù):
比如我們在一臺服務(wù)器上部署了20個(gè)應(yīng)用,連接的都是同一個(gè)數(shù)據(jù)庫。某一天數(shù)據(jù)庫密碼改了,要想這20個(gè)應(yīng)用還能連接上數(shù)據(jù)庫,那么就得改這20個(gè)應(yīng)用連接數(shù)據(jù)庫的配置文件。既然連接數(shù)據(jù)庫的配置都是一樣的,我們可以寫一份,放在zookeeper上,讓這20個(gè)應(yīng)用都去zookeeper上讀取,要修改的時(shí)候也只修改zookeeper上的這一份即可,實(shí)現(xiàn)一處更新,處處生效。

3、集群管理:
zookeeper可以監(jiān)視集群,哪一臺宕機(jī)了,會立即通知集群中的每一個(gè)節(jié)點(diǎn),做出相應(yīng)的措施,類似redis的哨兵。

4、分布式消息同步和協(xié)調(diào)機(jī)制:
這個(gè)有點(diǎn)類似于中間件的功能。比如有訂單、庫存、積分等系統(tǒng)都在盯著zookeeper,一有新訂單下來,庫存和積分系統(tǒng)也要立刻做出相應(yīng)的操作。

5、負(fù)載均衡:
zookeeper也可以做負(fù)載均衡,但是一般不會用它干這個(gè),因?yàn)樽鲐?fù)載均衡,nginx是專業(yè)的!

6、對dubbo的支持:
dubbo是一個(gè)搞分布式的框架,dubbo一般就會配合zookeeper使用,將服務(wù)都注冊到zookeeper上

安裝zookeeper

1、安裝:
安裝很簡單,直接解壓就行了。然后進(jìn)入conf目錄把配置文件拷貝一份并且重命名為zoo.cfg。然后進(jìn)入bin目錄執(zhí)行zkServer.sh start就可以啟動了。
2、zookeeper的配置文件:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
4lw.commands.whitelist=*
  • tickTime:通信心跳次數(shù),Zookeeper服務(wù)器心跳時(shí)間,單位毫秒。每兩秒檢測一次服務(wù)器是否還活著。

  • initLimit:從機(jī)和主機(jī)接頭需要的時(shí)間

  • syncLimit:主機(jī)和從機(jī)同步通信時(shí)限。比如這個(gè)是5,tickTime是2,那么就是10秒內(nèi)還沒和主機(jī)建立連接,就不能加入了。

  • dataDir:數(shù)據(jù)存放的目錄

  • clientPort:端口

以上5個(gè)是默認(rèn)就有的配置,最后一行是自己添加的配置,是防止執(zhí)行部分命令的時(shí)候報(bào)如下的錯(cuò)誤:

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

3、zk相關(guān)命令:

  • 啟動:進(jìn)入bin目錄,執(zhí)行./zkServer.sh start

  • 啟動客戶端:./zkCli.sh,斷開連接:quit

  • 啟動并在控制臺打印啟動日志:./zkServer.sh start-foreground

  • 查看當(dāng)前節(jié)點(diǎn)在集群中的狀態(tài):./zkServer.sh status

以下命令是在zkCli中執(zhí)行的。

  • 創(chuàng)建持久化節(jié)點(diǎn):create /path data,重啟之后還會存在

  • 創(chuàng)建帶序列的節(jié)點(diǎn):create -s /path data,節(jié)點(diǎn)會加上0000X這樣的后綴

  • 創(chuàng)建臨時(shí)節(jié)點(diǎn):create -e /path data,臨時(shí)節(jié)點(diǎn),重啟后節(jié)點(diǎn)就沒了

  • 創(chuàng)建臨時(shí)帶序列的節(jié)點(diǎn):create -s -e /path data

  • 查看節(jié)點(diǎn):ls /pathls2 /path

  • 查看節(jié)點(diǎn)狀態(tài)信息:stat /path

  • 獲取節(jié)點(diǎn)值:get /path

  • 獲取節(jié)點(diǎn)值并查看狀態(tài)信息:get -s /path

  • 更新節(jié)點(diǎn):set /path newData

  • 刪除節(jié)點(diǎn):delete /path

  • 刪除節(jié)點(diǎn)和子節(jié)點(diǎn):rmr /path,相當(dāng)于Linux的rm -rf

  • 四字命令:四字命令就是相當(dāng)于redis中你ping會返回pong。啟動了zkServer后,輸入

echo ruok | nc 127.0.0.1 2181

沒有意外的話就會返回如下內(nèi)容:

imok[root@localhost bin]#

即輸入ruok,響應(yīng)imok。如果配置文件沒有配置最后一行,執(zhí)行這個(gè)命令就會報(bào)錯(cuò)。

開篇說了,zookeeper是文件系統(tǒng)加通知機(jī)制,通過上面的命令,其實(shí)就可以很好地理解文件系統(tǒng)這個(gè)概念了。類比Linux,Linux中叫文件或者目錄,而zookeeper中換了種叫法,叫做zNode,即節(jié)點(diǎn),每個(gè)zNode默認(rèn)能夠存儲1MB的數(shù)據(jù)。Linux和zookeeper都是一棵倒裝樹,/代表的是根,根下面可以掛其他的節(jié)點(diǎn),節(jié)點(diǎn)下面又可以掛節(jié)點(diǎn)。zNode = path + data + stat,即節(jié)點(diǎn)是由路徑、數(shù)據(jù)、狀態(tài)描述構(gòu)成的。

java操作zookeeper

ava操作zookeeper也很簡單,引入如下兩個(gè)依賴:

<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一個(gè)zookeeper實(shí)例,然后就可以通過這個(gè)實(shí)例進(jìn)行增刪改查了。部分代碼如下:

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實(shí)例
     */

    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;
    }
}

上面是基礎(chǔ)的Java對zookeeper進(jìn)行增刪改查的代碼

為避免篇幅過長,入門篇先介紹到這兒,后續(xù)會有進(jìn)階篇,介紹zookeeper的通知機(jī)制以及集群等內(nèi)容……

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多