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結果:
這種動態監視的模式很值得學習吧?