1. 程式人生 > >Zookeeper 初始化以及get,set,監聽

Zookeeper 初始化以及get,set,監聽

1,安裝zookeeper
2,在目錄和環境變數上做對應配置,太多了,懶得寫
3,D:\zookeeper\zookeeper-3.4.10-1\conf裡的zoo.cfg(一開始是sample)改成對應的引數
dataDir=D://zookeeper//zookeeper-3.4.10-3//bin//data
clientPort=2181 預設是2181,也可以寫成其他的,一臺電腦上有多個機器的,要寫成不同的port才不會衝突
server.1=127.0.0.1:2777:3777
server.2=127.0.0.1:2888:3888

最好配置單數,因為單數和雙數,都需要保證過半機器能用的原則,所以其實雙數和單數在使用的時候沒有區別

4,在對應的bin/data資料夾下,建立myId檔案,裡面寫上對應的數字,1 or 2 or …對應server的ip

5,windows上雙擊執行bin/zkServer來執行zookeeper伺服器
6,把配置的所有伺服器都開啟來以後,雙擊zkCli嘗試執行,看看是否成功
不成功的可能原因
1,ip衝突,server.1 =127.0.0.1:2777:3777
ip:埠1:埠2
如果ip相同的情況下,要保證埠1和埠2和其他server的不一樣,不能重複佔用
同理clientPort
2,myId配置重複或者漏配

7,在java上配置客戶端

maven配置,根據自己對應的倉庫,有什麼版本用什麼

   <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
    </dependencies>

connectString: ip可以配置多個,這裡只配置一個,ip地址通過上面尋找,
執行的zkServer裡執行成功後,會提示
binding to port 0.0.0.0/0.0.0.0:2181


用這個就可以了!!
sessionTimeout: 和心跳檢測相關,在sessionTimeout時間內會進行心跳檢測,連不上就斷開(如果是本地可以設定長一點,因為打斷點的時候是不能順利心跳檢測的)
watcher: 可以不設定,設定的話,會回撥返回WatchedEvent型別,裡面含有三個引數:
- KeeperState:連線狀態,比如連線中斷,仍然連線著,等等,
- EventType :事件型別,比如節點新增,節點刪除,子節點變更,等等,
- path:路徑
程式碼

final String ip1 = "0.0.0.0:2181";
zooKeeper = new ZooKeeper(ip1 , 30000, null);

原始碼

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher);

設定資料

path:路徑
byte data[]:資料,byte[]格式
version:版本號,-1表示無所謂,如果不是-1,就表示,只有在xx版本下,才進行更新,樂觀鎖
程式碼

Stat stat = zooKeeper.setData(path , ("data").getBytes(), -1);

原始碼

public Stat setData(final String path, byte data[], int version)

獲取資料
獲取到的資料是byte[]格式的
path:略
watcher:監聽器註冊,這裡用預設的監聽器watcher的回撥watchedEvent,也可以填null,不管回撥
stat:可以通過stat去接收stat的值,這裡選擇null,不需要

  byte[] s = zooKeeper.getData(path , event -> {
            if (EventType.NodeDataChanged.equals(event.getType()) 
            || EventType.NodeChildrenChanged.equals(event.getType())) {
                   //......
            }       
      }, null);

原始碼

public byte[] getData(final String path, Watcher watcher, Stat stat);

獲取子節點

List<String> childrenList = zooKeeper.getChildren(path,false);
watcher:false
childrenList :子節點的相對路徑,不是絕對路徑!

節點存在

Stat stat = zooKeeper.exists(path, null/*watcher*/);
if(null ==stat){
    //path not exists
}

監聽:
1,監聽是一次性的
2,重複add監聽的話,那邊是真的會有多個,就會導致一次呼叫,多個監聽響應,其他懶得說了

create見另一篇