Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
·Ö²¼Ê½·þÎñ¿ò¼Ü Zookeeper
 
×÷Õß Ð¤µÂʱ£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-11-11
  2854  次浏览      27
 

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 ÌṩÁËÒ»Ì׺ܺõķֲ¼Ê½¼¯Èº¹ÜÀíµÄ»úÖÆ£¬¾ÍÊÇËüÕâÖÖ»ùÓÚ²ã´ÎÐ͵ÄĿ¼Ê÷µÄÊý¾Ý½á¹¹£¬²¢¶ÔÊ÷ÖÐµÄ½Úµã½øÐÐÓÐЧ¹ÜÀí£¬´Ó¶ø¿ÉÒÔÉè¼Æ³ö¶àÖÖ¶àÑùµÄ·Ö²¼Ê½µÄÊý¾Ý¹ÜÀíÄ£ÐÍ£¬¶ø²»½ö½ö¾ÖÏÞÓÚÉÏÃæÌáµ½µÄ¼¸¸ö³£ÓÃÓ¦Óó¡¾°¡£

   
2854 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þµÄ˼¿¼
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS
Ïà¹ØÅàѵ¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
Windows Azure ÔÆ¼ÆËãÓ¦ÓÃ

ĦÍÐÂÞÀ­ ÔÆÆ½Ì¨µÄ¹¹½¨ÓëÓ¦ÓÃ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ù
ijÑз¢ÖÐÐÄ Openstackʵ¼ù
ÖªÃûµç×Ó¹«Ë¾ ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦ÓÃ
ijµçÁ¦ÐÐÒµ »ùÓÚÔÆÆ½Ì¨¹¹½¨ÔÆ·þÎñ
ÔÆ¼ÆËãÓëWindows AzureÅàѵ
±±¾© ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ