zookeeper之動態監控/觀察者模式


1、介紹

ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務!

zookeeper集群中,每一個節點叫做znode,而每一個節點又可以有多個子節點。每一個節點znode和子節點都可以存儲少量的數據貌似是1Mib,而且這些數據在集群中是同步共享的;

zookeepe集群作為服務端,集群多個znode間存在一個leader,其他都是follower,當集群中有一半以上的znode損壞時,zookeeper停止工作,固zookeeper適合安裝在基數台電腦中;

zookeeper的節點創建時,znode有四種形式:臨時的,臨時+序列,持久,持久+序列;

zookeeper的客戶端Client既可以和服務端存在於同一個節點,又可以完全獨立於zookeeper集群之外。

Client使用zookeeper集群時,需要向zookeeper集群中注冊一個zookeeper bean;

2、觀察者模式

zookeeper作為分布式應用程序的協調服務,其最常用的功能便是觀察者模式observe;

雙11要來了,平時的1台tomcat無法支持更大的訪問量,我們租10台服務器,我們一共有11台機器;

我們做如下分配:

  1台作為訪問轉發,一台作為備用機,其他9台按照3:3:3來分別作為MVC模式的Controller、Service、Dao的服務;

  這里我們使用zookeeper集群:每一台電腦既作為客戶端也作為服務端,當然一台電腦也可以作為zookeeper服務端,但是這台電腦壞了怎么辦,zookeeper集群是為了高可靠性而設計的;

  我們用zookeeper動態監視每一台電腦ip,來防止突發情況;

 

 1 package app;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.apache.zookeeper.WatchedEvent;
 7 import org.apache.zookeeper.Watcher;
 8 import org.apache.zookeeper.Watcher.Event.EventType;
 9 import org.apache.zookeeper.ZooKeeper;
10 import org.apache.zookeeper.data.Stat;
11 
12 public class Client {
13   //
14     private String groupNode = "/servergroup";
15     private ZooKeeper zk;
16     private Stat stat = new Stat();
17 
18     private volatile List<String> serverlist;
19 
20     private String hosts = "192.168.47.128:2181,192.168.47.129:2181,192.168.47.130:2181";
21 
22     public void connectZooKeeper() throws Exception{
23         zk=new ZooKeeper(hosts, 5000, new Watcher(){
24 
25             @Override
26             public void process(WatchedEvent event) {
27                 // 如果/servergroup 發生關於子節點變化事件,更新serverlist,並重新監聽
28                 if(event.getType()==EventType.NodeChildrenChanged && groupNode.equals(event.getPath())){
29                     try {
30                         updateServerList();
31                     } catch (Exception e) {
32                         e.printStackTrace();
33                     }    
34                 }
35             }            
36         });    
37         updateServerList();
38     }
39 
40     // 更新serverlist
41     public void updateServerList()throws Exception{
42         List<String> newserverlist = new ArrayList<String>();
43         List<String> sublist =zk.getChildren(groupNode, true);
44         for(String subNode:sublist){
45             byte[] data =zk.getData(groupNode+"/"+subNode, false, stat);
46             String a = new String(data,"utf-8");
47             newserverlist.add(a);
48         }
49         serverlist=newserverlist;
50         System.out.println("serverlist updated:"+serverlist);
51     }
52     
53     /*
54      * client的工作邏輯編寫在這個方法中
55      * 我們先不做任務處理,讓client sleep
56      */
57     
58     public void handle() throws Exception{
59         //這里的線程休眠是讓eclipse一直處於運行狀態,這樣才能動態接收到服務端傳來的信息
60         Thread.sleep(Long.MAX_VALUE);
61     }
62     
63     public static void main(String[] args) throws Exception {
64         
65         Client client = new Client();
66         client.connectZooKeeper();
67         client.handle();
68         
69     }
70 
71 }

我們在linux系統下安裝zookeeper后 每台機器都啟動;

命令:zkServer.sh start; 這個是服務端啟動;

我們執行java程序結果如下:

我們在linux下開啟客戶端,進行一些操作:

命令:zkCli.sh -server

 

我看到eclipse的Console結果:

這種動態監視的模式很值得學習吧?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM