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结果:
这种动态监视的模式很值得学习吧?