1. 程式人生 > >zk叢集搭建以及java客戶端連線zk

zk叢集搭建以及java客戶端連線zk

 專案終於不忙了.閒來無事,想起上次面試被人問了一個zk把我給問住了.看來要好好了解一下zk了.於是開始了zk的學習之路.

首先帶大家搭建一下zk叢集環境,這個很簡單,我就不說那麼詳細了,

首先準備三臺機器,來安裝zk叢集  要有root許可權,因為要改hosts

下載zk安裝包上傳到liunx伺服器  我用的zookeeper.3.4.10.tar.gz   你們用其他版本也行

解壓  tar -zxvf  .....

個人習慣重新命名  為zookeeper 在當前使用者的家目錄  

然後cd到conf這個目錄下面  

重新命名zoo.cfg   然後開啟這個檔案  重點兩點  一個是datadir  我是直接在zookeeper下建立了data目錄  所以我的配置是  datadir=/home/gang/zookeeper/data

然後配置 server.0=uamserver:2888:3888  
server.1=uamserver1:2888:3888  
server.2=uamserver2:2888:3888  

uamserver 和uamserver1 ,uamserver2分別對應三個機器.三個機器都配置一樣  

然後在data目錄下建立myid檔案 內容分別是0  1   2  這三個數server0對應的myid為0  切換到root使用者修改hosts檔案

然後啟動切換到zookeeper/bin目錄下./zkServer.sh start  啟動三臺後 驗證是否成功  ./zkServer.sh status  

這時候 

[[email protected] bin]$ ./zkServer.sh  status
ZooKeeper JMX enabled by default
Using config: /home/was/zookeeper1/bin/../conf/zoo.cfg
Mode: follower
[[email protected] bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/was/zookeeper3/bin/../conf/zoo.cfg
Mode: leader

這時候說明叢集已經搭建成功

現在我們通過zk原生api來操作下zk,java客戶端

public class Zookeeper {

   private static CountDownLatch countDownLatch=new CountDownLatch(1);

   private final static String zk_url="1.11.11.1:2181,1.11.11.2:2182,1.11.11.3:2183";

   private final static int time_out=5000;

   public static void main(String[] arges) throws IOException, InterruptedException {
       //初始化zk
       ZooKeeper zooKeeper=new ZooKeeper(zk_url, time_out, new Watcher() {
           public void process(WatchedEvent watchedEvent) {
               Event.KeeperState state = watchedEvent.getState();
               Event.EventType type = watchedEvent.getType();
               if(Event.KeeperState.SyncConnected==state){
                   if(Event.EventType.None==type){
                       //呼叫此方法測計數減一
                       countDownLatch.countDown();
                   }
               }
           }
       });
       //阻礙當前執行緒進行,除非計數歸零
       countDownLatch.await();
       try {
           //建立持久化節點
           zooKeeper.create("/gang","你好".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
           //獲取節點資料
           byte[] data = zooKeeper.getData("/gang", false, null);
           System.out.println(new String(data));
           //修改節點資料
           zooKeeper.setData("/gang","呂金剛".getBytes(),0);
           //刪除節點資料
           zooKeeper.delete("/gang",-1);
           //建立臨時節點 非同步建立
           zooKeeper.create("/jingang", "臨時節點".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new AsyncCallback.StringCallback() {
               @Override
               public void processResult(int i, String s, Object o, String s1) {
                    System.out.println(o);
                    System.out.println(i);
                    System.out.println(s1);
                    System.out.println(s);
               }
           },"a");
           //獲取臨時節點資料
           byte[] jingangs = zooKeeper.getData("/jingang", false, null);
           System.out.println(new String(jingangs));
           //驗證節點是否存在
           Stat exists = zooKeeper.exists("/jingang", false);
           System.out.println(exists);
       } catch (KeeperException e) {
           e.printStackTrace();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       zooKeeper.close();
   }
}

咱們把他簡單的封裝一下
public class ZookWatcher implements Watcher {
    //預設從0開始,原子性
    private AtomicInteger count = new AtomicInteger();

    private static ZooKeeper zk;

    private static final int time_out=10000;

    private static CountDownLatch countDownLatch=new CountDownLatch(1);

    private static final String  url="1.11.11.1:2181,1.11.11.2:2182,1.11.11.3:2183";

    /**
     * 重寫process用來監控watcher事件
     * @param watchedEvent
     */
    @Override
    public void process(WatchedEvent watchedEvent) {
        Event.EventType type = watchedEvent.getType();
        Event.KeeperState state = watchedEvent.getState();
        //是否連線成功
        if(Event.KeeperState.SyncConnected==state){
            if(Event.EventType.None==type){
                System.out.println("成功連線到zk伺服器");
                //zk連線成功將計數器清零
                countDownLatch.countDown();
            }
            //如果是建立節點事件
            else if(Event.EventType.NodeCreated==type){
                System.out.println("建立節點成功");
            }
            //如果節點中的資料被改變
            else if(Event.EventType.NodeDataChanged==type){
                System.out.println("節點資料發生變化");
            }
            //如果子節點的資料發生改變
            else if(Event.EventType.NodeChildrenChanged==type){
                System.out.println("子節點資料發生改變");
            }
            //節點被刪除事件
            else if(Event.EventType.NodeDeleted==type){
                System.out.println("節點被刪除");
            }else;

        }else if(Event.KeeperState.Disconnected==state){
            //連線失敗直接退出
            return;
        }
        try {
            //阻塞當前執行緒,直到zk初始化完畢.
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取zk連線
     * @return
     * @throws InterruptedException
     */
    public ZooKeeper createConntection() throws InterruptedException {
        try {
            zk=new ZooKeeper(url, time_out, this);
            //阻塞當前執行緒,當創好連線以後再繼續執行當前執行緒
            countDownLatch.await();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return zk;
    }

    /**
     * 關閉zk連線
     * @param zooKeeper
     */
    public void close(ZooKeeper zooKeeper){
        try {
            zooKeeper.close();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 驗證此節點是否存在
     * @param path
     * @param watcher
     * @return
     */
    public Stat extis(String path,boolean watcher){
        try {
            Stat exists = zk.exists(path, watcher);
            return exists;
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 建立節點
     * @param path   節點路徑
     * @param data   資料
     * @return
     */
    public String createNode(String path,String data,boolean watcher){
        String result=null;
        try {
            Stat exists = zk.exists(path, watcher);
            if(null==exists){
                result= zk.create(path,data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
            }else{
                System.out.println("節點已經存在");
            }
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 修改節點的資料
     * @param path      節點路徑
     * @param data      資料
     * @param version   版本號
     * @return
     */
    public Stat setNodeData(String path,String data,int version,boolean watcher){
        Stat stat =null;
        try {
            Stat exists = zk.exists(path, watcher);
            stat = zk.setData(path, data.getBytes(), version);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return stat;
    }

    /**
     * 刪除節點
     * @param path    節點的路徑
     * @param version 版本號,當輸入-1時候是指所有資料
     */
    public void deleteNode(String path,int version,boolean watcher){
        try {
            Stat exists = zk.exists(path, watcher);
            zk.delete(path,version);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }
    }

    /**
     *  獲取節點資料
     * @param path
     * @return
     */
    public String getNodeData(String path,boolean watcher){
        byte[] data=null;
        try {
            data = zk.getData(path, watcher, null);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new String(data);
    }
}

下篇重點介紹一下zk的特性,以及watcher和watcher事件

相關推薦

zk叢集搭建以及java客戶連線zk

 專案終於不忙了.閒來無事,想起上次面試被人問了一個zk把我給問住了.看來要好好了解一下zk了.於是開始了zk的學習之路. 首先帶大家搭建一下zk叢集環境,這個很簡單,我就不說那麼詳細了, 首先準備三臺機器,來安裝zk叢集  要有root許可權,因為要改hosts 下

Ubuntu搭建VPN伺服器以及配置客戶連線

伺服器環境:Ubuntu 16.0.4.2  客戶端環境:windows7 VPN伺服器搭建 一,解除安裝pptpd以及iptables(對於之前VPN配置錯誤的) #解除安裝pptpd sudo apt-get autoremove pptpd sudo apt-get

CentOS虛擬機器HBase2.1.0單機 與 WindowsJava客戶連線:基礎連線

首先達成的目的是: 1、使用java客戶端連線成功HBase客戶端。 2、使用java客戶端寫基本demo建立一個測試表。 一、準備工作 (1)寫pom依賴: <dependency> <groupId>io.netty</gr

Redis 5.0 Cluster叢集帶認證及客戶連線

Redis在3.0版正式引入redis-cluster叢集這個特性。Redis叢集是一個提供在多個Redis間節點間共享資料的程式集。Redis叢集是一個分散式(distributed)、容錯(fault-tolerant)的Redis記憶體K/V服務,叢集可以使用的功能是普通單機Redis所能使用的功能的一

Windows安裝MySql服務詳細步驟講解以及相關客戶連線問題解決方法

# Windows安裝MySql服務的相關問題 MySql服務的安裝小總結,以及服務安裝成功,但是使用DOS命令時,無論輸入什麼命令,都會有報錯提示"ERROR 1820 (HY000): You must reset your password using A

公鑰和私鑰的含義,以及java客戶和伺服器之間進行安全加解密的簡單實現

所謂公鑰和私鑰,一般是指在一個伺服器中,每個伺服器各自有自己的公鑰和私鑰,私鑰絕對保密,不可洩露,而公鑰會提供給可以被訪問的伺服器知曉。 如果serverA和serverB進行資料互動 那麼ServerA會知道B的公鑰 在傳送資料時 資料內容使用B的公鑰加密,傳送給B 數字

Java 客戶連線 Memcached & Spring 整合

Memcached Java 客戶端連線 Memcached目前連線 Memcahed 服務的 Java 客戶端主要有以下 3 種方案:Memcached Client for JavaSpyMemcahedXMemcached其中 Memcahed 是比較早期,使用廣泛的技

Linux系統中KafKa安裝和使用方法 java客戶連線kafka

kafka linux單機安裝1 下載並安裝kafka# tar zxvf kafka_2.12-1.1.0tgz  # mv kafka_2.12-1.1.0 /usr/local/kafka # cd /usr/local/kafka2 啟動服務執行kafka需要使用Zo

RabbitMQ學習之Java客戶連線測試(二)

前面花了幾天糾結完RabbitMQ在Linux下的安裝之後,開始找簡單的例子來測試RabbitMQ和Java的連線。 和前面的安裝一樣,問題依舊。因為網上的帖子大多數都是很正常的步驟,並且沒有貼出來自己途中可能遇到的低階錯誤。 本文將沿用網上很經典的一個帖子來說出我過程中出

安裝kafka到window上,編寫kafka java客戶連線kafka

package com.kafka; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.Executo

centos7 sftp多使用者配置與java客戶連線

知識背景SFTP 為 SSH的一部分。在SSH軟體包中,已經包含了一個叫作SFTP(Secure File Transfer Protocol)的安全檔案資訊傳輸子系統,SFTP本身沒有單獨的守護程序,它必須使用sshd守護程序(埠號預設是22)來完成相應的連線和答覆操作,所

Java客戶連線Zookeeper報錯 org.apache.zookeeper.KeeperException$ConnectionLossException

Java客戶端連線Linux伺服器上的zookeeper出現了 ConnectionLossException錯誤 網上說一些亂七八糟的配置檔案錯了又這裡不對那裡不對的浪費時間 解決辦法 (當然解決辦法也是有前提的,別你的配置檔案真有問題那誰也救不了你)如果你的配置檔案

通過java客戶連線hbase 注意事項

1、通過java客戶端連線hbase,其中hbase通過zookeeper去管理,需要注意的是客戶端埠。      通過在瀏覽器端輸入地址檢視:http://192.168.3.206:60010/m

redis叢集環境搭建以及java中jedis客戶叢集程式碼實現

    最近專案中用到了redis,所以就找了相關的資料學習了,然後搭建了redis叢集,以及客戶端的java程式碼實現。由於對linux不太熟悉,所以在Linux上搭建redis叢集的時候碰到了很多問題,下面就大概總結下。 redis相關網站: 作業系統:c

zookeeper概念、應用場景、資料組織、叢集搭建客戶操作、Java客戶、curator

  一、zookeeper簡介      1.1 zookeeper簡介      Apache的很多專案以動物來命令,比如Hadoop(大象)、Hive(小蜜蜂)、Pig(豬豬),這些專案都是hadoop生態系統的成員。Hadoop生態系統是為了解決大資料儲存、大資料計算和大資料資料分析的,解決大

jdk8環境下,用eclipse indigo進行Zookeeper叢集java api客戶連線,因版本報錯

Unresolved compilation problem: The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files S

Kafka叢集搭建及簡單使用(控制檯與Java客戶

1.下載 去官網下載即可 2.解壓 3.配置環境變數 /etc/profile 4.安裝zookeeper ZooKeeper完全分散式叢集搭建5.我先按照官方文件在單節點上用一下,先不修改配置檔案 5.1啟動zookeeper [email protec

websocket的java客戶,使用Tomcat中的websocket搭建

pom.xml的配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</ar

客戶連線Eureka叢集

客戶端分別yml: ###服務啟動埠號 server: port: 8002 ###服務名稱(服務註冊到eureka名稱) spring: application: name: app-toov5-order ###服務註冊到eureka地址 eureka: cli

客戶連線不上kafka的問題以及kafka總是自動關閉問題

客戶端連線不上kafka的問題 java使用客戶端測試連線kafka:https://blog.csdn.net/Lnho2015/article/details/51353936 以下問題是基於kafka所在伺服器跟開發環境不在一臺機器上 1.把listeners和adver