1. 程式人生 > 程式設計 >Zookeeper的瞭解

Zookeeper的瞭解

1、 什麼是Zookeeper

 zookeeper是一個Java語言寫的分散式協調工具,它既能作為微服務的註冊中心,也能利用zookeeper實現業務邏輯,zooeeper從實現的角度來看,是採用觀察者模式,它負責儲存和管理資料,然後接受客戶端的註冊,當客戶端的資料發生變化的時候,它會負責通知相應的服務,對應的資料發生變化;
複製程式碼

2、 Zookeeper的作用

 統一命名服務、統一配置管理、統一叢集管理、伺服器節點動態上下線、負載均衡等
複製程式碼

3、 Zookeeper的節點型別

註冊到Zookeeper的節點型別稱為ZNode,節點型別分為臨時節點和持久化節點,臨時節點分為臨時節點和臨時順序節點,持久化節點分為持久化節點和持久化順序節點;臨時節點與會話保持連線,當會話斷開之後,臨時節點也跟著消失;持久化節點是儲存到硬碟上的,無論會話斷不斷開,都會儲存節點,而且節點不允許重複,所以當節點發生變化的時候,Zookeeper會通知相應客戶端,對應的節點發生變化;
複製程式碼

4、 Zookeeper中的Watch事件

Zookeeper中節點資料變化的通知就是利用了Zookeeper的watch事件,而且事件只會觸發一次;其型別有create、exisit、delete事件
複製程式碼

(1)Zookeeper的連線:

  private String connectString = "127.0.0.1:2181";
  private int sessionTimeout = 2000;
  private ZooKeeper zkClient;
  @Before
  public void init() throws IOException {

    zkClient = new ZooKeeper(connectString,sessionTimeout,new Watcher() {

        @Override
        public void process(WatchedEvent event) {
        }
    });
}
複製程式碼

(2) 判斷節點是否存在

@Test
public void exist() throws KeeperException,InterruptedException {

    Stat stat = zkClient.exists("/test",false);

    System.out.println(stat == null ? "not exist" : "exist");
}
複製程式碼

(3) 建立節點

 @Test
public void createNode() throws KeeperException,InterruptedException {

    User user = new User();
    user.setId(1);
    user.setUsername("aa");

    String json = JSON.toJSONString(user);


    String path = zkClient.create("/" + json,json.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

    if (path != null) {
        System.out.println(path);
    }

    Stat stat = new Stat();

    String str = new String(zkClient.getData("/" + json,true,stat));

    System.out.println(str);

    System.out.println(stat.getAversion());
    System.out.println(stat.getVersion());


    User user1 = new User();
    user1.setId(2);
    user1.setUsername("aa");

    String json1 = JSON.toJSONString(user1);

    String path1 = zkClient.create("/" + json1,json1.getBytes(),CreateMode.PERSISTENT);

    if (path1 != null) {
        System.out.println(path1);
    }

}
複製程式碼

這裡需要注意的是,建立節點的"/"需要,由於Zookeeper建立相同節點的時候,會拋異常,所以在建立節點的時候,需要用exists判斷該節點是否存在;

5、 Zookeeper叢集

 zookeeper叢集必須保證有n/2+1臺機器存活,其叢集才能正常執行,也就是至少3臺zookeeper存在,其叢集才不受到影響,而且zookeeper的叢集採用ZAB協議,其有:
 (1)訊息廣播
  當leader收到訊息之後,它會把訊息廣播給其他的伺服器
(2)崩潰恢復
 當leader宕機等,zookeeper就會重新選舉出新的leader
複製程式碼