Zookeeper
·Ö²¼Ê½·þÎñ¿ò¼ÜÊÇ Apache Hadoop µÄÒ»¸ö×ÓÏîÄ¿£¬ËüÖ÷ÒªÊÇÓÃÀ´½â¾ö·Ö²¼Ê½Ó¦ÓÃÖо³£Óöµ½µÄһЩÊý¾Ý¹ÜÀíÎÊÌ⣬È磺ͳһÃüÃû·þÎñ¡¢×´Ì¬Í¬²½·þÎñ¡¢¼¯Èº¹ÜÀí¡¢·Ö²¼Ê½Ó¦ÓÃÅäÖÃÏîµÄ¹ÜÀíµÈ¡£±¾ÎĽ«´ÓʹÓÃÕ߽ǶÈÏêϸ½éÉÜ
Zookeeper µÄ°²×°ºÍÅäÖÃÎļþÖи÷¸öÅäÖÃÏîµÄÒâÒ壬ÒÔ¼°·ÖÎö Zookeeper µÄµäÐ͵ÄÓ¦Óó¡¾°£¨ÅäÖÃÎļþµÄ¹ÜÀí¡¢¼¯Èº¹ÜÀí¡¢Í¬²½Ëø¡¢Leader
Ñ¡¾Ù¡¢¶ÓÁйÜÀíµÈ£©£¬Óà Java ʵÏÖËüÃDz¢¸ø³öʾÀý´úÂë¡£
°²×°ºÍÅäÖÃÏê½â
±¾ÎĽéÉÜµÄ Zookeeper ÊÇÒÔ 3.2.2 Õâ¸öÎȶ¨°æ±¾Îª»ù´¡£¬×îеİ汾¿ÉÒÔͨ¹ý¹ÙÍø
http://hadoop.apache.org/zookeeper/À´»ñÈ¡£¬Zookeeper µÄ°²×°·Ç³£¼òµ¥£¬ÏÂÃæ½«´Óµ¥»úģʽºÍ¼¯ÈºÄ£Ê½Á½¸ö·½Ãæ½éÉÜ
Zookeeper µÄ°²×°ºÍÅäÖá£
µ¥»úģʽ
µ¥»ú°²×°·Ç³£¼òµ¥£¬Ö»Òª»ñÈ¡µ½ Zookeeper µÄѹËõ°ü²¢½âѹµ½Ä³¸öĿ¼È磺/home/zookeeper-3.2.2
Ï£¬Zookeeper µÄÆô¶¯½Å±¾ÔÚ bin Ŀ¼Ï£¬Linux ÏÂµÄÆô¶¯½Å±¾ÊÇ zkServer.sh£¬ÔÚ
3.2.2 Õâ¸ö°æ±¾ Zookeeper ûÓÐÌṩ windows ÏÂµÄÆô¶¯½Å±¾£¬ËùÒÔÒªÏëÔÚ windows
ÏÂÆô¶¯ Zookeeper Òª×Ô¼ºÊÖ¹¤Ð´Ò»¸ö£¬ÈçÇåµ¥ 1 Ëùʾ£º
Çåµ¥ 1. Windows Ï Zookeeper Æô¶¯½Å±¾
setlocal
set ZOOCFGDIR=%~dp0%..\conf
set ZOO_LOG_DIR=%~dp0%..
set ZOO_LOG4J_PROP=INFO,CONSOLE
set CLASSPATH=%ZOOCFGDIR%
set CLASSPATH=%~dp0..\*;%~dp0..\lib\*;%CLASSPATH%
set CLASSPATH=%~dp0..\build\classes;%~dp0..\build\lib\*;%CLASSPATH%
set ZOOCFG=%ZOOCFGDIR%\zoo.cfg
set ZOOMAIN=org.apache.zookeeper.server.ZooKeeperServerMain
java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%"
-cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
endlocal
|
ÔÚÄãÖ´ÐÐÆô¶¯½Å±¾Ö®Ç°£¬»¹Óм¸¸ö»ù±¾µÄÅäÖÃÏîÐèÒªÅäÖÃһϣ¬Zookeeper µÄÅäÖÃÎļþÔÚ conf Ŀ¼Ï£¬Õâ¸öĿ¼ÏÂÓÐ
zoo_sample.cfg ºÍ log4j.properties£¬ÄãÐèÒª×öµÄ¾ÍÊǽ« zoo_sample.cfg
¸ÄÃûΪ zoo.cfg£¬ÒòΪ Zookeeper ÔÚÆô¶¯Ê±»áÕÒÕâ¸öÎļþ×÷ΪĬÈÏÅäÖÃÎļþ¡£ÏÂÃæÏêϸ½éÉÜһϣ¬Õâ¸öÅäÖÃÎļþÖи÷¸öÅäÖÃÏîµÄÒâÒå¡£
tickTime=2000 dataDir=D:/devtools/zookeeper-3.2.2/build clientPort=2181 |
tickTime£ºÕâ¸öʱ¼äÊÇ×÷Ϊ Zookeeper ·þÎñÆ÷Ö®¼ä»ò¿Í»§¶ËÓë·þÎñÆ÷Ö®¼äά³ÖÐÄÌøµÄʱ¼ä¼ä¸ô£¬Ò²¾ÍÊÇÿ¸ö
tickTime ʱ¼ä¾Í»á·¢ËÍÒ»¸öÐÄÌø¡£dataDir£º¹ËÃû˼Òå¾ÍÊÇ Zookeeper ±£´æÊý¾ÝµÄĿ¼£¬Ä¬ÈÏÇé¿öÏ£¬Zookeeper
½«Ð´Êý¾ÝµÄÈÕÖ¾ÎļþÒ²±£´æÔÚÕâ¸öĿ¼Àï¡£clientPort£ºÕâ¸ö¶Ë¿Ú¾ÍÊǿͻ§¶ËÁ¬½Ó Zookeeper
·þÎñÆ÷µÄ¶Ë¿Ú£¬Zookeeper »á¼àÌýÕâ¸ö¶Ë¿Ú£¬½ÓÊܿͻ§¶ËµÄ·ÃÎÊÇëÇó¡£µ±ÕâЩÅäÖÃÏîÅäÖúúó£¬ÄãÏÖÔھͿÉÒÔÆô¶¯
Zookeeper ÁË£¬Æô¶¯ºóÒª¼ì²é Zookeeper ÊÇ·ñÒѾÔÚ·þÎñ£¬¿ÉÒÔͨ¹ý netstat ¨C
ano ÃüÁî²é¿´ÊÇ·ñÓÐÄãÅäÖÃµÄ clientPort ¶Ë¿ÚºÅÔÚ¼àÌý·þÎñ¡£
¼¯ÈºÄ£Ê½
Zookeeper ²»½ö¿ÉÒÔµ¥»úÌṩ·þÎñ£¬Í¬Ê±Ò²Ö§³Ö¶à»ú×é³É¼¯ÈºÀ´Ìṩ·þÎñ¡£Êµ¼ÊÉÏ Zookeeper
»¹Ö§³ÖÁíÍâÒ»ÖÖα¼¯ÈºµÄ·½Ê½£¬Ò²¾ÍÊÇ¿ÉÒÔÔÚһ̨ÎïÀí»úÉÏÔËÐжà¸ö Zookeeper ʵÀý£¬ÏÂÃæ½«½éÉܼ¯ÈºÄ£Ê½µÄ°²×°ºÍÅäÖá£
Zookeeper µÄ¼¯ÈºÄ£Ê½µÄ°²×°ºÍÅäÖÃÒ²²»ÊǺܸ´ÔÓ£¬ËùÒª×öµÄ¾ÍÊÇÔö¼Ó¼¸¸öÅäÖÃÏî¡£¼¯ÈºÄ£Ê½³ýÁËÉÏÃæµÄÈý¸öÅäÖÃÏҪÔö¼ÓÏÂÃæ¼¸¸öÅäÖÃÏ
initLimit=5 syncLimit=2 server.1=192.168.211.1:2888:3888 server.2=192.168.211.2:2888:3888 |
initLimit£ºÕâ¸öÅäÖÃÏîÊÇÓÃÀ´ÅäÖà Zookeeper ½ÓÊܿͻ§¶Ë£¨ÕâÀïËù˵µÄ¿Í»§¶Ë²»ÊÇÓû§Á¬½Ó
Zookeeper ·þÎñÆ÷µÄ¿Í»§¶Ë£¬¶øÊÇ Zookeeper ·þÎñÆ÷¼¯ÈºÖÐÁ¬½Óµ½ Leader µÄ Follower
·þÎñÆ÷£©³õʼ»¯Á¬½Óʱ×ÄÜÈÌÊܶàÉÙ¸öÐÄÌøÊ±¼ä¼ä¸ôÊý¡£µ±ÒѾ³¬¹ý 10 ¸öÐÄÌøµÄʱ¼ä£¨Ò²¾ÍÊÇ tickTime£©³¤¶Èºó
Zookeeper ·þÎñÆ÷»¹Ã»ÓÐÊÕµ½¿Í»§¶ËµÄ·µ»ØÐÅÏ¢£¬ÄÇô±íÃ÷Õâ¸ö¿Í»§¶ËÁ¬½Óʧ°Ü¡£×ܵÄʱ¼ä³¤¶È¾ÍÊÇ 5*2000=10
ÃësyncLimit£ºÕâ¸öÅäÖÃÏî±êʶ Leader Óë Follower Ö®¼ä·¢ËÍÏûÏ¢£¬ÇëÇóºÍÓ¦´ðʱ¼ä³¤¶È£¬×²»Äܳ¬¹ý¶àÉÙ¸ö
tickTime µÄʱ¼ä³¤¶È£¬×ܵÄʱ¼ä³¤¶È¾ÍÊÇ 2*2000=4 Ãëserver.A=B£ºC£ºD£ºÆäÖÐ
A ÊÇÒ»¸öÊý×Ö£¬±íʾÕâ¸öÊǵڼ¸ºÅ·þÎñÆ÷£»B ÊÇÕâ¸ö·þÎñÆ÷µÄ ip µØÖ·£»C ±íʾµÄÊÇÕâ¸ö·þÎñÆ÷Ó뼯ȺÖеÄ
Leader ·þÎñÆ÷½»»»ÐÅÏ¢µÄ¶Ë¿Ú£»D ±íʾµÄÊÇÍòÒ»¼¯ÈºÖÐµÄ Leader ·þÎñÆ÷¹ÒÁË£¬ÐèÒªÒ»¸ö¶Ë¿ÚÀ´ÖØÐ½øÐÐÑ¡¾Ù£¬Ñ¡³öÒ»¸öеÄ
Leader£¬¶øÕâ¸ö¶Ë¿Ú¾ÍÊÇÓÃÀ´Ö´ÐÐÑ¡¾Ùʱ·þÎñÆ÷Ï໥ͨÐŵĶ˿ڡ£Èç¹ûÊÇα¼¯ÈºµÄÅäÖ÷½Ê½£¬ÓÉÓÚ B ¶¼ÊÇÒ»Ñù£¬ËùÒÔ²»Í¬µÄ
Zookeeper ʵÀýͨÐŶ˿ںŲ»ÄÜÒ»Ñù£¬ËùÒÔÒª¸øËüÃÇ·ÖÅ䲻ͬµÄ¶Ë¿ÚºÅ¡£³ýÁËÐÞ¸Ä zoo.cfg ÅäÖÃÎļþ£¬¼¯ÈºÄ£Ê½Ï»¹ÒªÅäÖÃÒ»¸öÎļþ
myid£¬Õâ¸öÎļþÔÚ dataDir Ŀ¼Ï£¬Õâ¸öÎļþÀïÃæ¾ÍÓÐÒ»¸öÊý¾Ý¾ÍÊÇ A µÄÖµ£¬Zookeeper
Æô¶¯Ê±»á¶ÁÈ¡Õâ¸öÎļþ£¬Äõ½ÀïÃæµÄÊý¾ÝÓë zoo.cfg ÀïÃæµÄÅäÖÃÐÅÏ¢±È½Ï´Ó¶øÅжϵ½µ×ÊÇÄǸö server¡£
Êý¾ÝÄ£ÐÍ
Zookeeper »áά»¤Ò»¸ö¾ßÓвã´Î¹ØÏµµÄÊý¾Ý½á¹¹£¬Ëü·Ç³£ÀàËÆÓÚÒ»¸ö±ê×¼µÄÎļþϵͳ£¬Èçͼ 1 Ëùʾ£º

ͼ 1 Zookeeper Êý¾Ý½á¹¹
Zookeeper ÕâÖÖÊý¾Ý½á¹¹ÓÐÈçÏÂÕâÐ©ÌØµã£º
1.ÿ¸ö×ÓĿ¼ÏîÈç NameService ¶¼±»³Æ×÷Ϊ znode£¬Õâ¸ö znode ÊDZ»ËüËùÔڵķ¾¶Î¨Ò»±êʶ£¬Èç
Server1 Õâ¸ö znode µÄ±êʶΪ /NameService/Server1
2.znode ¿ÉÒÔÓÐ×Ó½ÚµãĿ¼£¬²¢ÇÒÿ¸ö znode ¿ÉÒÔ´æ´¢Êý¾Ý£¬×¢Òâ EPHEMERAL ÀàÐ͵ÄĿ¼½Úµã²»ÄÜÓÐ×Ó½ÚµãĿ¼
3.znode ÊÇÓа汾µÄ£¬Ã¿¸ö znode Öд洢µÄÊý¾Ý¿ÉÒÔÓжà¸ö°æ±¾£¬Ò²¾ÍÊÇÒ»¸ö·ÃÎÊ·¾¶ÖпÉÒÔ´æ´¢¶à·ÝÊý¾Ý
4.znode ¿ÉÒÔÊÇÁÙʱ½Úµã£¬Ò»µ©´´½¨Õâ¸ö znode µÄ¿Í»§¶ËÓë·þÎñÆ÷ʧȥÁªÏµ£¬Õâ¸ö znode
Ò²½«×Ô¶¯É¾³ý£¬Zookeeper µÄ¿Í»§¶ËºÍ·þÎñÆ÷ͨÐŲÉÓó¤Á¬½Ó·½Ê½£¬Ã¿¸ö¿Í»§¶ËºÍ·þÎñÆ÷ͨ¹ýÐÄÌøÀ´±£³ÖÁ¬½Ó£¬Õâ¸öÁ¬½Ó״̬³ÆÎª
session£¬Èç¹û znode ÊÇÁÙʱ½Úµã£¬Õâ¸ö session ʧЧ£¬znode Ò²¾Íɾ³ýÁË
5.znode µÄĿ¼Ãû¿ÉÒÔ×Ô¶¯±àºÅ£¬Èç App1 ÒѾ´æÔÚ£¬ÔÙ´´½¨µÄ»°£¬½«»á×Ô¶¯ÃüÃûΪ App2
6.znode ¿ÉÒÔ±»¼à¿Ø£¬°üÀ¨Õâ¸öĿ¼½ÚµãÖд洢µÄÊý¾ÝµÄÐ޸ģ¬×Ó½ÚµãĿ¼µÄ±ä»¯µÈ£¬Ò»µ©±ä»¯¿ÉÒÔ֪ͨÉèÖÃ¼à¿ØµÄ¿Í»§¶Ë£¬Õâ¸öÊÇ
Zookeeper µÄºËÐÄÌØÐÔ£¬Zookeeper µÄºÜ¶à¹¦Äܶ¼ÊÇ»ùÓÚÕâ¸öÌØÐÔʵÏֵģ¬ºóÃæÔÚµäÐ͵ÄÓ¦Óó¡¾°ÖлáÓÐʵÀý½éÉÜ
ÈçºÎʹÓÃ
Zookeeper ×÷Ϊһ¸ö·Ö²¼Ê½µÄ·þÎñ¿ò¼Ü£¬Ö÷ÒªÓÃÀ´½â¾ö·Ö²¼Ê½¼¯ÈºÖÐÓ¦ÓÃϵͳµÄÒ»ÖÂÐÔÎÊÌ⣬ËüÄÜÌṩ»ùÓÚÀàËÆÓÚÎļþϵͳµÄĿ¼½ÚµãÊ÷·½Ê½µÄÊý¾Ý´æ´¢£¬µ«ÊÇ
Zookeeper ²¢²»ÊÇÓÃÀ´×¨ÃÅ´æ´¢Êý¾ÝµÄ£¬ËüµÄ×÷ÓÃÖ÷ÒªÊÇÓÃÀ´Î¬»¤ºÍ¼à¿ØÄã´æ´¢µÄÊý¾ÝµÄ״̬±ä»¯¡£Í¨¹ý¼à¿ØÕâЩÊý¾Ý״̬µÄ±ä»¯£¬´Ó¶ø¿ÉÒÔ´ïµ½»ùÓÚÊý¾ÝµÄ¼¯Èº¹ÜÀí£¬ºóÃæ½«»áÏêϸ½éÉÜ
Zookeeper Äܹ»½â¾öµÄһЩµäÐÍÎÊÌ⣬ÕâÀïÏȽéÉÜһϣ¬Zookeeper µÄ²Ù×÷½Ó¿ÚºÍ¼òµ¥Ê¹ÓÃʾÀý¡£
³£ÓýӿÚÁбí
¿Í»§¶ËÒªÁ¬½Ó Zookeeper ·þÎñÆ÷¿ÉÒÔͨ¹ý´´½¨ org.apache.zookeeper. ZooKeeper
µÄÒ»¸öʵÀý¶ÔÏó£¬È»ºóµ÷ÓÃÕâ¸öÀàÌṩµÄ½Ó¿ÚÀ´ºÍ·þÎñÆ÷½»»¥¡£
Ç°ÃæËµÁË ZooKeeper Ö÷ÒªÊÇÓÃÀ´Î¬»¤ºÍ¼à¿ØÒ»¸öĿ¼½ÚµãÊ÷Öд洢µÄÊý¾ÝµÄ״̬£¬ËùÓÐÎÒÃÇÄܹ»²Ù×÷
ZooKeeper µÄÒ²ºÍ²Ù×÷Ŀ¼½ÚµãÊ÷´óÌåÒ»Ñù£¬Èç´´½¨Ò»¸öĿ¼½Úµã£¬¸øÄ³¸öĿ¼½ÚµãÉèÖÃÊý¾Ý£¬»ñȡij¸öĿ¼½ÚµãµÄËùÓÐ×ÓĿ¼½Úµã£¬¸øÄ³¸öĿ¼½ÚµãÉèÖÃȨÏÞºÍ¼à¿ØÕâ¸öĿ¼½ÚµãµÄ״̬±ä»¯¡£
ÕâЩ½Ó¿ÚÈçϱíËùʾ£º
±í 1 org.apache.zookeeper. ZooKeeper ·½·¨Áбí

³ýÁËÒÔÉÏÕâЩÉϱíÖÐÁгöµÄ·½·¨Ö®Í⻹ÓÐÒ»Ð©ÖØÔØ·½·¨£¬Èç¶¼ÌṩÁËÒ»¸ö»Øµ÷ÀàµÄÖØÔØ·½·¨ÒÔ¼°¿ÉÒÔÉèÖÃÌØ¶¨ Watcher
µÄÖØÔØ·½·¨£¬¾ßÌåµÄ·½·¨¿ÉÒԲο¼ org.apache.zookeeper. ZooKeeper ÀàµÄ API
˵Ã÷¡£
»ù±¾²Ù×÷
ÏÂÃæ¸ø³ö»ù±¾µÄ²Ù×÷ ZooKeeper µÄʾÀý´úÂ룬ÕâÑùÄã¾ÍÄÜ¶Ô ZooKeeper ÓÐÖ±¹ÛµÄÈÏʶÁË¡£ÏÂÃæµÄÇåµ¥°üÀ¨ÁË´´½¨Óë
ZooKeeper ·þÎñÆ÷µÄÁ¬½ÓÒÔ¼°×î»ù±¾µÄÊý¾Ý²Ù×÷£º
Çåµ¥ 2. ZooKeeper »ù±¾µÄ²Ù×÷ʾÀý
// ´´½¨Ò»¸öÓë·þÎñÆ÷µÄÁ¬½Ó ZooKeeper zk = new ZooKeeper("localhost:" + CLIENT_PORT, ClientBase.CONNECTION_TIMEOUT, new Watcher() { // ¼à¿ØËùÓб»´¥·¢µÄʼþ public void process(WatchedEvent event) { System.out.println("ÒѾ´¥·¢ÁË" + event.getType() + "ʼþ£¡"); } }); // ´´½¨Ò»¸öĿ¼½Úµã zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // ´´½¨Ò»¸ö×ÓĿ¼½Úµã zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); System.out.println(new String(zk.getData("/testRootPath",false,null))); // È¡³ö×ÓĿ¼½ÚµãÁбí System.out.println(zk.getChildren("/testRootPath",true)); // ÐÞ¸Ä×ÓĿ¼½ÚµãÊý¾Ý zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1); System.out.println("Ŀ¼½Úµã״̬£º["+zk.exists("/testRootPath",true)+"]"); // ´´½¨ÁíÍâÒ»¸ö×ÓĿ¼½Úµã zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null))); // ɾ³ý×ÓĿ¼½Úµã zk.delete("/testRootPath/testChildPathTwo",-1); zk.delete("/testRootPath/testChildPathOne",-1); // ɾ³ý¸¸Ä¿Â¼½Úµã zk.delete("/testRootPath",-1); // ¹Ø±ÕÁ¬½Ó zk.close(); |
Êä³öµÄ½á¹ûÈçÏ£º
ÒѾ´¥·¢ÁË None ʼþ£¡ testRootData [testChildPathOne] Ŀ¼½Úµã״̬£º[5,5,1281804532336,1281804532336,0,1,0,0,12,1,6] ÒѾ´¥·¢ÁË NodeChildrenChanged ʼþ£¡ testChildDataTwo ÒѾ´¥·¢ÁË NodeDeleted ʼþ£¡ ÒѾ´¥·¢ÁË NodeDeleted ʼþ£¡ |
µ±¶ÔĿ¼½Úµã¼à¿Ø×´Ì¬´ò¿ªÊ±£¬Ò»µ©Ä¿Â¼½ÚµãµÄ״̬·¢Éú±ä»¯£¬Watcher ¶ÔÏóµÄ process ·½·¨¾Í»á±»µ÷Óá£
ZooKeeper µäÐ͵ÄÓ¦Óó¡¾°
Zookeeper ´ÓÉè¼ÆÄ£Ê½½Ç¶ÈÀ´¿´£¬ÊÇÒ»¸ö»ùÓÚ¹Û²ìÕßģʽÉè¼ÆµÄ·Ö²¼Ê½·þÎñ¹ÜÀí¿ò¼Ü£¬Ëü¸ºÔð´æ´¢ºÍ¹ÜÀí´ó¼Ò¶¼¹ØÐĵÄÊý¾Ý£¬È»ºó½ÓÊܹ۲ìÕßµÄ×¢²á£¬Ò»µ©ÕâЩÊý¾ÝµÄ״̬·¢Éú±ä»¯£¬Zookeeper
¾Í½«¸ºÔð֪ͨÒѾÔÚ Zookeeper ÉÏ×¢²áµÄÄÇЩ¹Û²ìÕß×ö³öÏàÓ¦µÄ·´Ó¦£¬´Ó¶øÊµÏÖ¼¯ÈºÖÐÀàËÆ Master/Slave
¹ÜÀíģʽ£¬¹ØÓÚ Zookeeper µÄÏêϸ¼Ü¹¹µÈÄÚ²¿Ï¸½Ú¿ÉÒÔÔĶÁ Zookeeper µÄÔ´Âë
ÏÂÃæÏêϸ½éÉÜÕâЩµäÐ͵ÄÓ¦Óó¡¾°£¬Ò²¾ÍÊÇ Zookeeper µ½µ×ÄܰïÎÒÃǽâ¾öÄÇЩÎÊÌ⣿ÏÂÃæ½«¸ø³ö´ð°¸¡£
ͳһÃüÃû·þÎñ£¨Name Service£©
·Ö²¼Ê½Ó¦ÓÃÖУ¬Í¨³£ÐèÒªÓÐÒ»Ì×ÍêÕûµÄÃüÃû¹æÔò£¬¼ÈÄܹ»²úÉúΨһµÄÃû³ÆÓÖ±ãÓÚÈËʶ±ðºÍ¼Çס£¬Í¨³£Çé¿öÏÂÓÃÊ÷ÐεÄÃû³Æ½á¹¹ÊÇÒ»¸öÀíÏëµÄÑ¡Ôñ£¬Ê÷ÐεÄÃû³Æ½á¹¹ÊÇÒ»¸öÓвã´ÎµÄĿ¼½á¹¹£¬¼È¶ÔÈËÓѺÃÓÖ²»»áÖØ¸´¡£Ëµµ½ÕâÀïÄã¿ÉÄÜÏëµ½ÁË
JNDI£¬Ã»´í Zookeeper µÄ Name Service Óë JNDI Äܹ»Íê³ÉµÄ¹¦ÄÜÊDz¶àµÄ£¬ËüÃǶ¼Êǽ«Óвã´ÎµÄĿ¼½á¹¹¹ØÁªµ½Ò»¶¨×ÊÔ´ÉÏ£¬µ«ÊÇ
Zookeeper µÄ Name Service ¸ü¼ÓÊǹ㷺ÒâÒåÉϵĹØÁª£¬Ò²ÐíÄã²¢²»ÐèÒª½«Ãû³Æ¹ØÁªµ½Ìض¨×ÊÔ´ÉÏ£¬Äã¿ÉÄÜÖ»ÐèÒªÒ»¸ö²»»áÖØ¸´Ãû³Æ£¬¾ÍÏñÊý¾Ý¿âÖвúÉúÒ»¸öΨһµÄÊý×ÖÖ÷¼üÒ»Ñù¡£
Name Service ÒѾÊÇ Zookeeper ÄÚÖõŦÄÜ£¬ÄãÖ»Òªµ÷Óà Zookeeper µÄ
API ¾ÍÄÜʵÏÖ¡£Èçµ÷Óà create ½Ó¿Ú¾Í¿ÉÒÔºÜÈÝÒ×´´½¨Ò»¸öĿ¼½Úµã¡£
ÅäÖùÜÀí£¨Configuration Management£©
ÅäÖõĹÜÀíÔÚ·Ö²¼Ê½Ó¦Óû·¾³Öкܳ£¼û£¬ÀýÈçͬһ¸öÓ¦ÓÃϵͳÐèÒª¶ą̀ PC Server ÔËÐУ¬µ«ÊÇËüÃÇÔËÐеÄÓ¦ÓÃϵͳµÄijЩÅäÖÃÏîÊÇÏàͬµÄ£¬Èç¹ûÒªÐÞ¸ÄÕâЩÏàͬµÄÅäÖÃÏÄÇô¾Í±ØÐëͬʱÐÞ¸Äÿ̨ÔËÐÐÕâ¸öÓ¦ÓÃϵͳµÄ
PC Server£¬ÕâÑù·Ç³£Âé·³¶øÇÒÈÝÒ׳ö´í¡£
ÏñÕâÑùµÄÅäÖÃÐÅÏ¢ÍêÈ«¿ÉÒÔ½»¸ø Zookeeper À´¹ÜÀí£¬½«ÅäÖÃÐÅÏ¢±£´æÔÚ Zookeeper µÄij¸öĿ¼½ÚµãÖУ¬È»ºó½«ËùÓÐÐèÒªÐ޸ĵÄÓ¦ÓûúÆ÷¼à¿ØÅäÖÃÐÅÏ¢µÄ״̬£¬Ò»µ©ÅäÖÃÐÅÏ¢·¢Éú±ä»¯£¬Ã¿Ì¨Ó¦ÓûúÆ÷¾Í»áÊÕµ½
Zookeeper µÄ֪ͨ£¬È»ºó´Ó Zookeeper »ñȡеÄÅäÖÃÐÅÏ¢Ó¦Óõ½ÏµÍ³ÖС£

ͼ 2. ÅäÖùÜÀí½á¹¹Í¼
¼¯Èº¹ÜÀí£¨Group Membership£©
Zookeeper Äܹ»ºÜÈÝÒ×µÄʵÏÖ¼¯Èº¹ÜÀíµÄ¹¦ÄÜ£¬ÈçÓжą̀ Server ×é³ÉÒ»¸ö·þÎñ¼¯Èº£¬ÄÇô±ØÐëÒªÒ»¸ö¡°×ܹܡ±ÖªµÀµ±Ç°¼¯ÈºÖÐÿ̨»úÆ÷µÄ·þÎñ״̬£¬Ò»µ©ÓлúÆ÷²»ÄÜÌṩ·þÎñ£¬¼¯ÈºÖÐÆäËü¼¯Èº±ØÐëÖªµÀ£¬´Ó¶ø×ö³öµ÷ÕûÖØÐ·ÖÅä·þÎñ²ßÂÔ¡£Í¬Ñùµ±Ôö¼Ó¼¯ÈºµÄ·þÎñÄÜÁ¦Ê±£¬¾Í»áÔö¼Óһ̨»ò¶ą̀
Server£¬Í¬ÑùÒ²±ØÐëÈá°×ܹܡ±ÖªµÀ¡£
Zookeeper ²»½öÄܹ»°ïÄãά»¤µ±Ç°µÄ¼¯ÈºÖлúÆ÷µÄ·þÎñ״̬£¬¶øÇÒÄܹ»°ïÄãÑ¡³öÒ»¸ö¡°×ܹܡ±£¬ÈÃÕâ¸ö×ܹÜÀ´¹ÜÀí¼¯Èº£¬Õâ¾ÍÊÇ
Zookeeper µÄÁíÒ»¸ö¹¦ÄÜ Leader Election¡£
ËüÃǵÄʵÏÖ·½Ê½¶¼ÊÇÔÚ Zookeeper ÉÏ´´½¨Ò»¸ö EPHEMERAL ÀàÐ͵ÄĿ¼½Úµã£¬È»ºóÿ¸ö Server
ÔÚËüÃÇ´´½¨Ä¿Â¼½ÚµãµÄ¸¸Ä¿Â¼½ÚµãÉϵ÷Óà getChildren(String path, boolean
watch) ·½·¨²¢ÉèÖà watch Ϊ true£¬ÓÉÓÚÊÇ EPHEMERAL Ŀ¼½Úµã£¬µ±´´½¨ËüµÄ Server
ËÀÈ¥£¬Õâ¸öĿ¼½ÚµãÒ²ËæÖ®±»É¾³ý£¬ËùÒÔ Children ½«»á±ä»¯£¬Õâʱ getChildrenÉ쵀 Watch
½«»á±»µ÷Óã¬ËùÒÔÆäËü Server ¾ÍÖªµÀÒѾÓÐij̨ Server ËÀÈ¥ÁË¡£ÐÂÔö Server Ò²ÊÇͬÑùµÄÔÀí¡£
Zookeeper ÈçºÎʵÏÖ Leader Election£¬Ò²¾ÍÊÇÑ¡³öÒ»¸ö Master Server¡£ºÍÇ°ÃæµÄÒ»Ñùÿ̨
Server ´´½¨Ò»¸ö EPHEMERAL Ŀ¼½Úµã£¬²»Í¬µÄÊÇËü»¹ÊÇÒ»¸ö SEQUENTIAL Ŀ¼½Úµã£¬ËùÒÔËüÊǸö
EPHEMERAL_SEQUENTIAL Ŀ¼½Úµã¡£Ö®ËùÒÔËüÊÇ EPHEMERAL_SEQUENTIAL
Ŀ¼½Úµã£¬ÊÇÒòΪÎÒÃÇ¿ÉÒÔ¸øÃ¿Ì¨ Server ±àºÅ£¬ÎÒÃÇ¿ÉÒÔÑ¡Ôñµ±Ç°ÊÇ×îС±àºÅµÄ Server Ϊ Master£¬¼ÙÈçÕâ¸ö×îС±àºÅµÄ
Server ËÀÈ¥£¬ÓÉÓÚÊÇ EPHEMERAL ½Úµã£¬ËÀÈ¥µÄ Server ¶ÔÓ¦µÄ½ÚµãÒ²±»É¾³ý£¬ËùÒÔµ±Ç°µÄ½ÚµãÁбíÖÐÓÖ³öÏÖÒ»¸ö×îС±àºÅµÄ½Úµã£¬ÎÒÃǾÍÑ¡ÔñÕâ¸ö½ÚµãΪµ±Ç°
Master¡£ÕâÑù¾ÍʵÏÖÁ˶¯Ì¬Ñ¡Ôñ Master£¬±ÜÃâÁË´«Í³ÒâÒåÉϵ¥ Master ÈÝÒ׳öÏÖµ¥µã¹ÊÕϵÄÎÊÌâ¡£

ͼ 3. ¼¯Èº¹ÜÀí½á¹¹Í¼
Õⲿ·ÖµÄʾÀý´úÂëÈçÏ£¬ÍêÕûµÄ´úÂëÇë¿´¸½¼þ£º
Çåµ¥ 3. Leader Election ¹Ø¼ü´úÂë
void findLeader() throws InterruptedException { byte[] leader = null; try { leader = zk.getData(root + "/leader", true, null); } catch (Exception e) { logger.error(e); } if (leader != null) { following(); } else { String newLeader = null; try { byte[] localhost = InetAddress.getLocalHost().getAddress(); newLeader = zk.create(root + "/leader", localhost, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); } catch (Exception e) { logger.error(e); } if (newLeader != null) { leading(); } else { mutex.wait(); } } } |
¹²ÏíËø£¨Locks£©
¹²ÏíËøÔÚͬһ¸ö½ø³ÌÖкÜÈÝÒ×ʵÏÖ£¬µ«ÊÇÔÚ¿ç½ø³Ì»òÕßÔÚ²»Í¬ Server Ö®¼ä¾Í²»ºÃʵÏÖÁË¡£Zookeeper
È´ºÜÈÝÒ×ʵÏÖÕâ¸ö¹¦ÄÜ£¬ÊµÏÖ·½Ê½Ò²ÊÇÐèÒª»ñµÃËøµÄ Server ´´½¨Ò»¸ö EPHEMERAL_SEQUENTIAL
Ŀ¼½Úµã£¬È»ºóµ÷Óà getChildren·½·¨»ñÈ¡µ±Ç°µÄĿ¼½ÚµãÁбíÖÐ×îСµÄĿ¼½ÚµãÊDz»ÊǾÍÊÇ×Ô¼º´´½¨µÄĿ¼½Úµã£¬Èç¹ûÕýÊÇ×Ô¼º´´½¨µÄ£¬ÄÇôËü¾Í»ñµÃÁËÕâ¸öËø£¬Èç¹û²»ÊÇÄÇôËü¾Íµ÷ÓÃ
exists(String path, boolean watch) ·½·¨²¢¼à¿Ø Zookeeper ÉÏĿ¼½ÚµãÁбíµÄ±ä»¯£¬Ò»Ö±µ½×Ô¼º´´½¨µÄ½ÚµãÊÇÁбíÖÐ×îС±àºÅµÄĿ¼½Úµã£¬´Ó¶ø»ñµÃËø£¬ÊÍ·ÅËøºÜ¼òµ¥£¬Ö»ÒªÉ¾³ýÇ°ÃæËü×Ô¼ºËù´´½¨µÄĿ¼½Úµã¾ÍÐÐÁË¡£

ͼ 4. Zookeeper ʵÏÖ Locks µÄÁ÷³Ìͼ
ͬ²½ËøµÄʵÏÖ´úÂëÈçÏ£¬ÍêÕûµÄ´úÂëÇë¿´¸½¼þ£º
Çåµ¥ 4. ͬ²½ËøµÄ¹Ø¼ü´úÂë
void getLock() throws KeeperException, InterruptedException{ List<String> list = zk.getChildren(root, false); String[] nodes = list.toArray(new String[list.size()]); Arrays.sort(nodes); if(myZnode.equals(root+"/"+nodes[0])){ doAction(); } else{ waitForLock(nodes[0]); } } void waitForLock(String lower) throws InterruptedException, KeeperException { Stat stat = zk.exists(root + "/" + lower,true); if(stat != null){ mutex.wait(); } else{ getLock(); } } |
¶ÓÁйÜÀí
Zookeeper ¿ÉÒÔ´¦ÀíÁ½ÖÖÀàÐ͵ĶÓÁУº
1.µ±Ò»¸ö¶ÓÁеijÉÔ±¶¼¾ÛÆëʱ£¬Õâ¸ö¶ÓÁвſÉÓ㬷ñÔòÒ»Ö±µÈ´ýËùÓгÉÔ±µ½´ï£¬ÕâÖÖÊÇͬ²½¶ÓÁС£
2.¶ÓÁа´ÕÕ FIFO ·½Ê½½øÐÐÈë¶ÓºÍ³ö¶Ó²Ù×÷£¬ÀýÈçʵÏÖÉú²úÕߺÍÏû·ÑÕßÄ£ÐÍ¡£
ͬ²½¶ÓÁÐÓà Zookeeper ʵÏÖµÄʵÏÖ˼·ÈçÏ£º
´´½¨Ò»¸ö¸¸Ä¿Â¼ /synchronizing£¬Ã¿¸ö³ÉÔ±¶¼¼à¿Ø±êÖ¾£¨Set Watch£©Î»Ä¿Â¼ /synchronizing/start
ÊÇ·ñ´æÔÚ£¬È»ºóÿ¸ö³ÉÔ±¶¼¼ÓÈëÕâ¸ö¶ÓÁУ¬¼ÓÈë¶ÓÁеķ½Ê½¾ÍÊÇ´´½¨ /synchronizing/member_i
µÄÁÙʱĿ¼½Úµã£¬È»ºóÿ¸ö³ÉÔ±»ñÈ¡ / synchronizing Ŀ¼µÄËùÓÐĿ¼½Úµã£¬Ò²¾ÍÊÇ member_i¡£ÅжÏ
i µÄÖµÊÇ·ñÒѾÊdzÉÔ±µÄ¸öÊý£¬Èç¹ûСÓÚ³ÉÔ±¸öÊýµÈ´ý /synchronizing/start µÄ³öÏÖ£¬Èç¹ûÒѾÏàµÈ¾Í´´½¨
/synchronizing/start¡£
ÓÃÏÂÃæµÄÁ÷³Ìͼ¸üÈÝÒ×Àí½â£º

ͼ 5. ͬ²½¶ÓÁÐÁ÷³Ìͼ
ͬ²½¶ÓÁеĹؼü´úÂëÈçÏ£¬ÍêÕûµÄ´úÂëÇë¿´¸½¼þ£º
Çåµ¥ 5. ͬ²½¶ÓÁÐ
void addQueue() throws KeeperException, InterruptedException{ zk.exists(root + "/start",true); zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); synchronized (mutex) { List<String> list = zk.getChildren(root, false); if (list.size() < size) { mutex.wait(); } else { zk.create(root + "/start", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } } } |
µ±¶ÓÁÐûÂúÊǽøÈë wait()£¬È»ºó»áÒ»Ö±µÈ´ý Watch µÄ֪ͨ£¬Watch µÄ´úÂëÈçÏ£º
public void process(WatchedEvent event) { if(event.getPath().equals(root + "/start") && event.getType() == Event.EventType.NodeCreated){ System.out.println("µÃµ½Í¨Öª"); super.process(event); doAction(); } } |
FIFO ¶ÓÁÐÓà Zookeeper ʵÏÖ˼·ÈçÏ£º
ʵÏÖµÄ˼·Ҳ·Ç³£¼òµ¥£¬¾ÍÊÇÔÚÌØ¶¨µÄĿ¼Ï´´½¨ SEQUENTIAL ÀàÐ͵Ä×ÓĿ¼ /queue_i£¬ÕâÑù¾ÍÄܱ£Ö¤ËùÓгÉÔ±¼ÓÈë¶ÓÁÐʱ¶¼ÊÇÓбàºÅµÄ£¬³ö¶ÓÁÐʱͨ¹ý
getChildren( ) ·½·¨¿ÉÒÔ·µ»Øµ±Ç°ËùÓеĶÓÁÐÖеÄÔªËØ£¬È»ºóÏû·ÑÆäÖÐ×îСµÄÒ»¸ö£¬ÕâÑù¾ÍÄܱ£Ö¤
FIFO¡£
ÏÂÃæÊÇÉú²úÕߺÍÏû·ÑÕßÕâÖÖ¶ÓÁÐÐÎʽµÄʾÀý´úÂ룬ÍêÕûµÄ´úÂëÇë¿´¸½¼þ£º
Çåµ¥ 6. Éú²úÕß´úÂë
boolean produce(int i) throws KeeperException, InterruptedException{ ByteBuffer b = ByteBuffer.allocate(4); byte[] value; b.putInt(i); value = b.array(); zk.create(root + "/element", value, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); return true; } |
Çåµ¥ 7. Ïû·ÑÕß´úÂë
int consume() throws KeeperException, InterruptedException{ int retvalue = -1; Stat stat = null; while (true) { synchronized (mutex) { List<String> list = zk.getChildren(root, true); if (list.size() == 0) { mutex.wait(); } else { Integer min = new Integer(list.get(0).substring(7)); for(String s : list){ Integer tempValue = new Integer(s.substring(7)); if(tempValue < min) min = tempValue; } byte[] b = zk.getData(root + "/element" + min,false, stat); zk.delete(root + "/element" + min, 0); ByteBuffer buffer = ByteBuffer.wrap(b); retvalue = buffer.getInt(); return retvalue; } } } } |
×ܽá
Zookeeper ×÷Ϊ Hadoop ÏîÄ¿ÖеÄÒ»¸ö×ÓÏîÄ¿£¬ÊÇ Hadoop ¼¯Èº¹ÜÀíµÄÒ»¸ö±Ø²»¿ÉÉÙµÄÄ£¿é£¬ËüÖ÷ÒªÓÃÀ´¿ØÖƼ¯ÈºÖеÄÊý¾Ý£¬ÈçËü¹ÜÀí
Hadoop ¼¯ÈºÖÐµÄ NameNode£¬»¹ÓÐ Hbase ÖÐ Master Election¡¢Server
Ö®¼ä״̬ͬ²½µÈ¡£
±¾ÎĽéÉÜµÄ Zookeeper µÄ»ù±¾ÖªÊ¶£¬ÒÔ¼°½éÉÜÁ˼¸¸öµäÐ͵ÄÓ¦Óó¡¾°¡£ÕâЩ¶¼ÊÇ Zookeeper
µÄ»ù±¾¹¦ÄÜ£¬×îÖØÒªµÄÊÇ Zoopkeeper ÌṩÁËÒ»Ì׺ܺõķֲ¼Ê½¼¯Èº¹ÜÀíµÄ»úÖÆ£¬¾ÍÊÇËüÕâÖÖ»ùÓÚ²ã´ÎÐ͵ÄĿ¼Ê÷µÄÊý¾Ý½á¹¹£¬²¢¶ÔÊ÷ÖÐµÄ½Úµã½øÐÐÓÐЧ¹ÜÀí£¬´Ó¶ø¿ÉÒÔÉè¼Æ³ö¶àÖÖ¶àÑùµÄ·Ö²¼Ê½µÄÊý¾Ý¹ÜÀíÄ£ÐÍ£¬¶ø²»½ö½ö¾ÖÏÞÓÚÉÏÃæÌáµ½µÄ¼¸¸ö³£ÓÃÓ¦Óó¡¾°¡£
|