ZooKeeperÊÇÒ»¸ö·Ö²¼Ê½µÄ£¬¿ª·ÅÔ´ÂëµÄ·Ö²¼Ê½Ó¦ÓóÌÐòе÷·þÎñ£¬Ëü°üº¬Ò»¸ö¼òµ¥µÄÔÓO£¬·Ö²¼Ê½Ó¦ÓóÌÐò¿ÉÒÔ»ùÓÚËüʵÏÖͬ²½·þÎñ£¬ÅäÖÃά»¤ºÍÃüÃû·þÎñµÈ¡£ZookeeperÊÇhadoopµÄÒ»¸ö×ÓÏîÄ¿£¬Æä·¢Õ¹Àú³ÌÎÞÐè׸Êö¡£ÔÚ·Ö²¼Ê½Ó¦ÓÃÖУ¬ÓÉÓÚ¹¤³Ìʦ²»ÄܺܺõØÊ¹ÓÃËø»úÖÆ£¬ÒÔ¼°»ùÓÚÏûÏ¢µÄе÷»úÖÆ²»ÊʺÏÔÚijЩӦÓÃÖÐʹÓã¬Òò´ËÐèÒªÓÐÒ»ÖÖ¿É¿¿µÄ¡¢¿ÉÀ©Õ¹µÄ¡¢·Ö²¼Ê½µÄ¡¢¿ÉÅäÖõÄе÷»úÖÆÀ´Í³Ò»ÏµÍ³µÄ״̬¡£ZookeeperµÄÄ¿µÄ¾ÍÔÚÓÚ´Ë¡£±¾Îļòµ¥·ÖÎözookeeperµÄ¹¤×÷ÔÀí£¬¶ÔÓÚÈçºÎʹÓÃzookeeper²»ÊDZ¾ÎÄÌÖÂÛµÄÖØµã¡£
1 ZookeeperµÄ»ù±¾¸ÅÄî
1.1 ½ÇÉ«
ZookeeperÖеĽÇÉ«Ö÷ÒªÓÐÒÔÏÂÈýÀ࣬ÈçϱíËùʾ£º

ϵͳģÐÍÈçͼËùʾ£º

1.2 Éè¼ÆÄ¿µÄ
1.×îÖÕÒ»ÖÂÐÔ£ºclient²»ÂÛÁ¬½Óµ½ÄĸöServer£¬Õ¹Ê¾¸øËü¶¼ÊÇͬһ¸öÊÓͼ£¬ÕâÊÇzookeeper×îÖØÒªµÄÐÔÄÜ¡£
2 .¿É¿¿ÐÔ£º¾ßÓмòµ¥¡¢½¡×³¡¢Á¼ºÃµÄÐÔÄÜ£¬Èç¹ûÏûÏ¢m±»µ½Ò»Ì¨·þÎñÆ÷½ÓÊÜ£¬ÄÇôËü½«±»ËùÓеķþÎñÆ÷½ÓÊÜ¡£
3 .ʵʱÐÔ£ºZookeeper±£Ö¤¿Í»§¶Ë½«ÔÚÒ»¸öʱ¼ä¼ä¸ô·¶Î§ÄÚ»ñµÃ·þÎñÆ÷µÄ¸üÐÂÐÅÏ¢£¬»òÕß·þÎñÆ÷ʧЧµÄÐÅÏ¢¡£µ«ÓÉÓÚÍøÂçÑÓʱµÈÔÒò£¬Zookeeper²»Äܱ£Ö¤Á½¸ö¿Í»§¶ËÄÜͬʱµÃµ½¸Õ¸üеÄÊý¾Ý£¬Èç¹ûÐèÒª×îÐÂÊý¾Ý£¬Ó¦¸ÃÔÚ¶ÁÊý¾Ý֮ǰµ÷ÓÃsync()½Ó¿Ú¡£
4 .µÈ´ýÎ޹أ¨wait-free£©£ºÂýµÄ»òÕßʧЧµÄclient²»µÃ¸ÉÔ¤¿ìËÙµÄclientµÄÇëÇó£¬Ê¹µÃÿ¸öclient¶¼ÄÜÓÐЧµÄµÈ´ý¡£
5.Ô×ÓÐÔ£º¸üÐÂÖ»Äܳɹ¦»òÕßʧ°Ü£¬Ã»ÓÐÖмä״̬¡£
6 .˳ÐòÐÔ£º°üÀ¨È«¾ÖÓÐÐòºÍÆ«ÐòÁ½ÖÖ£ºÈ«¾ÖÓÐÐòÊÇÖ¸Èç¹ûÔÚһ̨·þÎñÆ÷ÉÏÏûÏ¢aÔÚÏûÏ¢bǰ·¢²¼£¬ÔòÔÚËùÓÐServerÉÏÏûÏ¢a¶¼½«ÔÚÏûÏ¢bǰ±»·¢²¼£»Æ«ÐòÊÇÖ¸Èç¹ûÒ»¸öÏûÏ¢bÔÚÏûÏ¢aºó±»Í¬Ò»¸ö·¢ËÍÕß·¢²¼£¬a±Ø½«ÅÅÔÚbÇ°Ãæ¡£
2 ZooKeeperµÄ¹¤×÷ÔÀí
ZookeeperµÄºËÐÄÊÇÔ×ӹ㲥£¬Õâ¸ö»úÖÆ±£Ö¤Á˸÷¸öServerÖ®¼äµÄͬ²½¡£ÊµÏÖÕâ¸ö»úÖÆµÄÐÒé½Ð×öZabÐÒé¡£ZabÐÒéÓÐÁ½ÖÖģʽ£¬ËüÃÇ·Ö±ðÊǻָ´Ä£Ê½£¨Ñ¡Ö÷£©ºÍ¹ã²¥Ä£Ê½£¨Í¬²½£©¡£µ±·þÎñÆô¶¯»òÕßÔÚÁìµ¼Õß±ÀÀ£ºó£¬Zab¾Í½øÈëÁ˻ָ´Ä£Ê½£¬µ±Áìµ¼Õß±»Ñ¡¾Ù³öÀ´£¬ÇÒ´ó¶àÊýServerÍê³ÉÁ˺ÍleaderµÄ״̬ͬ²½ÒԺ󣬻ָ´Ä£Ê½¾Í½áÊøÁË¡£×´Ì¬Í¬²½±£Ö¤ÁËleaderºÍServer¾ßÓÐÏàͬµÄϵͳ״̬¡£
ΪÁ˱£Ö¤ÊÂÎñµÄ˳ÐòÒ»ÖÂÐÔ£¬zookeeper²ÉÓÃÁ˵ÝÔöµÄÊÂÎñidºÅ£¨zxid£©À´±êʶÊÂÎñ¡£ËùÓеÄÌáÒ飨proposal£©¶¼ÔÚ±»Ìá³öµÄʱºò¼ÓÉÏÁËzxid¡£ÊµÏÖÖÐzxidÊÇÒ»¸ö64λµÄÊý×Ö£¬Ëü¸ß32λÊÇepochÓÃÀ´±êʶleader¹ØÏµÊÇ·ñ¸Ä±ä£¬Ã¿´ÎÒ»¸öleader±»Ñ¡³öÀ´£¬Ëü¶¼»áÓÐÒ»¸öеÄepoch£¬±êʶµ±Ç°ÊôÓÚÄǸöleaderµÄͳÖÎʱÆÚ¡£µÍ32λÓÃÓÚµÝÔö¼ÆÊý¡£
ÿ¸öServerÔÚ¹¤×÷¹ý³ÌÖÐÓÐÈýÖÖ״̬£º
1. LOOKING£ºµ±Ç°Server²»ÖªµÀleaderÊÇË£¬ÕýÔÚËÑѰ
2.LEADING£ºµ±Ç°Server¼´ÎªÑ¡¾Ù³öÀ´µÄleader
3.FOLLOWING£ºleaderÒѾѡ¾Ù³öÀ´£¬µ±Ç°ServerÓë֮ͬ²½
2.1 Ñ¡Ö÷Á÷³Ì
µ±leader±ÀÀ£»òÕßleaderʧȥ´ó¶àÊýµÄfollower£¬Õâʱºòzk½øÈë»Ö¸´Ä£Ê½£¬»Ö¸´Ä£Ê½ÐèÒªÖØÐÂÑ¡¾Ù³öÒ»¸öеÄleader£¬ÈÃËùÓеÄServer¶¼»Ö¸´µ½Ò»¸öÕýÈ·µÄ״̬¡£ZkµÄÑ¡¾ÙËã·¨ÓÐÁ½ÖÖ£ºÒ»ÖÖÊÇ»ùÓÚbasic
paxosʵÏֵģ¬ÁíÍâÒ»ÖÖÊÇ»ùÓÚfast paxosË㷨ʵÏֵġ£ÏµÍ³Ä¬ÈϵÄÑ¡¾ÙË㷨Ϊfast paxos¡£ÏȽéÉÜbasic
paxosÁ÷³Ì£º
1. 1 .Ñ¡¾ÙÏß³ÌÓɵ±Ç°Server·¢ÆðÑ¡¾ÙµÄÏ̵߳£ÈΣ¬ÆäÖ÷Òª¹¦ÄÜÊǶÔͶƱ½á¹û½øÐÐͳ¼Æ£¬²¢Ñ¡³öÍÆ¼öµÄServer£»
2. 2 .Ñ¡¾ÙÏß³ÌÊ×ÏÈÏòËùÓÐServer·¢ÆðÒ»´ÎѯÎÊ(°üÀ¨×Ô¼º)£»
3. 3 .Ñ¡¾ÙÏß³ÌÊÕµ½»Ø¸´ºó£¬ÑéÖ¤ÊÇ·ñÊÇ×Ô¼º·¢ÆðµÄѯÎÊ(ÑéÖ¤zxidÊÇ·ñÒ»ÖÂ)£¬È»ºó»ñÈ¡¶Ô·½µÄid(myid)£¬²¢´æ´¢µ½µ±Ç°Ñ¯ÎʶÔÏóÁбíÖУ¬×îºó»ñÈ¡¶Ô·½ÌáÒéµÄleaderÏà¹ØÐÅÏ¢(id,zxid)£¬²¢½«ÕâЩÐÅÏ¢´æ´¢µ½µ±´ÎÑ¡¾ÙµÄͶƱ¼Ç¼±íÖУ»
4. 4. ÊÕµ½ËùÓÐServer»Ø¸´ÒԺ󣬾ͼÆËã³özxid×î´óµÄÄǸöServer£¬²¢½«Õâ¸öServerÏà¹ØÐÅÏ¢ÉèÖóÉÏÂÒ»´ÎҪͶƱµÄServer£»
5. 5. Ï߳̽«µ±Ç°zxid×î´óµÄServerÉèÖÃΪµ±Ç°ServerÒªÍÆ¼öµÄLeader£¬Èç¹û´Ëʱ»ñʤµÄServer»ñµÃn/2
+ 1µÄServerƱÊý£¬ ÉèÖõ±Ç°ÍƼöµÄleaderΪ»ñʤµÄServer£¬½«¸ù¾Ý»ñʤµÄServerÏà¹ØÐÅÏ¢ÉèÖÃ×Ô¼ºµÄ״̬£¬·ñÔò£¬¼ÌÐøÕâ¸ö¹ý³Ì£¬Ö±µ½leader±»Ñ¡¾Ù³öÀ´¡£
ͨ¹ýÁ÷³Ì·ÖÎöÎÒÃÇ¿ÉÒԵóö£ºÒªÊ¹Leader»ñµÃ¶àÊýServerµÄÖ§³Ö£¬ÔòServer×ÜÊý±ØÐëÊÇÆæÊý2n+1£¬ÇÒ´æ»îµÄServerµÄÊýÄ¿²»µÃÉÙÓÚn+1.
ÿ¸öServerÆô¶¯ºó¶¼»áÖØ¸´ÒÔÉÏÁ÷³Ì¡£ÔÚ»Ö¸´Ä£Ê½Ï£¬Èç¹ûÊǸմӱÀÀ£×´Ì¬»Ö¸´µÄ»òÕߏկô¶¯µÄserver»¹»á´Ó´ÅÅÌ¿ìÕÕÖлָ´Êý¾ÝºÍ»á»°ÐÅÏ¢£¬zk»á¼Ç¼ÊÂÎñÈÕÖ¾²¢¶¨ÆÚ½øÐпìÕÕ£¬·½±ãÔÚ»Ö¸´Ê±½øÐÐ״̬»Ö¸´¡£Ñ¡Ö÷µÄ¾ßÌåÁ÷³ÌͼÈçÏÂËùʾ£º

fast paxosÁ÷³ÌÊÇÔÚÑ¡¾Ù¹ý³ÌÖУ¬Ä³ServerÊ×ÏÈÏòËùÓÐServerÌáÒé×Ô¼ºÒª³ÉΪleader£¬µ±ÆäËüServerÊÕµ½ÌáÒéÒԺ󣬽â¾öepochºÍzxidµÄ³åÍ»£¬²¢½ÓÊܶԷ½µÄÌáÒ飬ȻºóÏò¶Ô·½·¢ËͽÓÊÜÌáÒéÍê³ÉµÄÏûÏ¢£¬Öظ´Õâ¸öÁ÷³Ì£¬×îºóÒ»¶¨ÄÜÑ¡¾Ù³öLeader¡£ÆäÁ÷³ÌͼÈçÏÂËùʾ£º

2.2 ͬ²½Á÷³Ì
Ñ¡ÍêleaderÒÔºó£¬zk¾Í½øÈë״̬ͬ²½¹ý³Ì¡£
1. 1. leaderµÈ´ýserverÁ¬½Ó£»
2. 2 .FollowerÁ¬½Óleader£¬½«×î´óµÄzxid·¢Ë͸øleader£»
3. 3 .Leader¸ù¾ÝfollowerµÄzxidÈ·¶¨Í¬²½µã£»
4. 4 .Íê³Éͬ²½ºó֪ͨfollower ÒѾ³ÉΪuptodate״̬£»
5. 5 .FollowerÊÕµ½uptodateÏûÏ¢ºó£¬ÓÖ¿ÉÒÔÖØÐ½ÓÊÜclientµÄÇëÇó½øÐзþÎñÁË¡£
Á÷³ÌͼÈçÏÂËùʾ£º

2.3 ¹¤×÷Á÷³Ì
2.3.1 Leader¹¤×÷Á÷³Ì
LeaderÖ÷ÒªÓÐÈý¸ö¹¦ÄÜ£º
1. 1 .»Ö¸´Êý¾Ý£»
2. 2 .ά³ÖÓëLearnerµÄÐÄÌø£¬½ÓÊÕLearnerÇëÇó²¢ÅжÏLearnerµÄÇëÇóÏûÏ¢ÀàÐÍ£»
3. 3 .LearnerµÄÏûÏ¢ÀàÐÍÖ÷ÒªÓÐPINGÏûÏ¢¡¢REQUESTÏûÏ¢¡¢ACKÏûÏ¢¡¢REVALIDATEÏûÏ¢£¬¸ù¾Ý²»Í¬µÄÏûÏ¢ÀàÐÍ£¬½øÐв»Í¬µÄ´¦Àí¡£
PINGÏûÏ¢ÊÇÖ¸LearnerµÄÐÄÌøÐÅÏ¢£»REQUESTÏûÏ¢ÊÇFollower·¢Ë͵ÄÌáÒéÐÅÏ¢£¬°üÀ¨Ð´ÇëÇó¼°Í¬²½ÇëÇó£»ACKÏûÏ¢ÊÇFollowerµÄ¶ÔÌáÒéµÄ»Ø¸´£¬³¬¹ý°ëÊýµÄFollowerͨ¹ý£¬Ôòcommit¸ÃÌáÒ飻REVALIDATEÏûÏ¢ÊÇÓÃÀ´ÑÓ³¤SESSIONÓÐЧʱ¼ä¡£
LeaderµÄ¹¤×÷Á÷³Ì¼òͼÈçÏÂËùʾ£¬ÔÚʵ¼ÊʵÏÖÖУ¬Á÷³ÌÒª±ÈÏÂͼ¸´Ôӵö࣬Æô¶¯ÁËÈý¸öÏß³ÌÀ´ÊµÏÖ¹¦ÄÜ¡£

2.3.2 Follower¹¤×÷Á÷³Ì
FollowerÖ÷ÒªÓÐËĸö¹¦ÄÜ£º
1. 1. ÏòLeader·¢ËÍÇëÇó£¨PINGÏûÏ¢¡¢REQUESTÏûÏ¢¡¢ACKÏûÏ¢¡¢REVALIDATEÏûÏ¢£©£»
2. 2 .½ÓÊÕLeaderÏûÏ¢²¢½øÐд¦Àí£»
3. 3 .½ÓÊÕClientµÄÇëÇó£¬Èç¹ûΪдÇëÇ󣬷¢Ë͸øLeader½øÐÐͶƱ£»
4. 4 .·µ»ØClient½á¹û¡£
FollowerµÄÏûϢѻ·´¦ÀíÈçϼ¸ÖÖÀ´×ÔLeaderµÄÏûÏ¢£º
1. 1 .PINGÏûÏ¢£º ÐÄÌøÏûÏ¢£»
2. 2 .PROPOSALÏûÏ¢£ºLeader·¢ÆðµÄÌá°¸£¬ÒªÇóFollowerͶƱ£»
3. 3 .COMMITÏûÏ¢£º·þÎñÆ÷¶Ë×îÐÂÒ»´ÎÌá°¸µÄÐÅÏ¢£»
4. 4 .UPTODATEÏûÏ¢£º±íÃ÷ͬ²½Íê³É£»
5. 5 .REVALIDATEÏûÏ¢£º¸ù¾ÝLeaderµÄREVALIDATE½á¹û£¬¹Ø±Õ´ýrevalidateµÄsession»¹ÊÇÔÊÐíÆä½ÓÊÜÏûÏ¢£»
6. 6 .SYNCÏûÏ¢£º·µ»ØSYNC½á¹ûµ½¿Í»§¶Ë£¬Õâ¸öÏûÏ¢×î³õÓɿͻ§¶Ë·¢Æð£¬ÓÃÀ´Ç¿ÖƵõ½×îеĸüС£
FollowerµÄ¹¤×÷Á÷³Ì¼òͼÈçÏÂËùʾ£¬ÔÚʵ¼ÊʵÏÖÖУ¬FollowerÊÇͨ¹ý5¸öÏß³ÌÀ´ÊµÏÖ¹¦Äܵġ£

¶ÔÓÚobserverµÄÁ÷³Ì²»ÔÙÐðÊö£¬observerÁ÷³ÌºÍFollowerµÄΨһ²»Í¬µÄµØ·½¾ÍÊÇobserver²»»á²Î¼Óleader·¢ÆðµÄͶƱ¡£
Ö÷Á÷Ó¦Óó¡¾°£º
ZookeeperµÄÖ÷Á÷Ó¦Ó󡾰ʵÏÖ˼·£¨³ýÈ¥¹Ù·½Ê¾Àý£©
(1)ÅäÖùÜÀí
¼¯ÖÐʽµÄÅäÖùÜÀíÔÚÓ¦Óü¯ÈºÖÐÊǷdz£³£¼ûµÄ£¬Ò»°ãÉÌÒµ¹«Ë¾ÄÚ²¿¶¼»áʵÏÖÒ»Ì×¼¯ÖеÄÅäÖùÜÀíÖÐÐÄ£¬Ó¦¶Ô²»Í¬µÄÓ¦Óü¯Èº¶ÔÓÚ¹²Ïí¸÷×ÔÅäÖõÄÐèÇ󣬲¢ÇÒÔÚÅäÖñä¸üʱÄܹ»Í¨Öªµ½¼¯ÈºÖеÄÿһ¸ö»úÆ÷¡£
ZookeeperºÜÈÝÒ×ʵÏÖÕâÖÖ¼¯ÖÐʽµÄÅäÖùÜÀí£¬±ÈÈ罫APP1µÄËùÓÐÅäÖÃÅäÖõ½/APP1
znodeÏ£¬APP1ËùÓлúÆ÷Ò»Æô¶¯¾Í¶Ô/APP1Õâ¸ö½Úµã½øÐÐ¼à¿Ø(zk.exist("/APP1",true)),²¢ÇÒʵÏֻص÷·½·¨Watcher£¬ÄÇôÔÚzookeeperÉÏ/APP1
znode½ÚµãÏÂÊý¾Ý·¢Éú±ä»¯µÄʱºò£¬Ã¿¸ö»úÆ÷¶¼»áÊÕµ½Í¨Öª£¬Watcher·½·¨½«»á±»Ö´ÐУ¬ÄÇôӦÓÃÔÙÈ¡ÏÂÊý¾Ý¼´¿É(zk.getData("/APP1",false,null));
ÒÔÉÏÕâ¸öÀý×ÓÖ»ÊǼòµ¥µÄ´Ö¿ÅÁ£¶ÈÅäÖÃ¼à¿Ø£¬Ï¸¿ÅÁ£¶ÈµÄÊý¾Ý¿ÉÒÔ½øÐзֲ㼶¼à¿Ø£¬ÕâÒ»Çж¼ÊÇ¿ÉÒÔÉè¼ÆºÍ¿ØÖƵġ£
(2)¼¯Èº¹ÜÀí
Ó¦Óü¯ÈºÖУ¬ÎÒÃdz£³£ÐèÒªÈÃÿһ¸ö»úÆ÷ÖªµÀ¼¯ÈºÖУ¨»òÒÀÀµµÄÆäËûijһ¸ö¼¯Èº£©ÄÄЩ»úÆ÷ÊÇ»î×ŵ쬲¢ÇÒÔÚ¼¯Èº»úÆ÷ÒòΪ崻ú£¬ÍøÂç¶ÏÁ´µÈÔÒòÄܹ»²»ÔÚÈ˹¤½éÈëµÄÇé¿öÏÂѸËÙ֪ͨµ½Ã¿Ò»¸ö»úÆ÷¡£
ZookeeperͬÑùºÜÈÝÒ×ʵÏÖÕâ¸ö¹¦ÄÜ£¬±ÈÈçÎÒÔÚzookeeper·þÎñÆ÷¶ËÓÐÒ»¸öznode½Ð/APP1SERVERS,ÄÇô¼¯ÈºÖÐÿһ¸ö»úÆ÷Æô¶¯µÄʱºò¶¼È¥Õâ¸ö½ÚµãÏ´´½¨Ò»¸öEPHEMERALÀàÐ͵Ľڵ㣬±ÈÈçserver1´´½¨/APP1SERVERS/SERVER1(¿ÉÒÔʹÓÃip,±£Ö¤²»Öظ´)£¬server2´´½¨/APP1SERVERS/SERVER2£¬È»ºóSERVER1ºÍSERVER2¶¼watch
/APP1SERVERSÕâ¸ö¸¸½Úµã£¬ÄÇôҲ¾ÍÊÇÕâ¸ö¸¸½ÚµãÏÂÊý¾Ý»òÕß×Ó½Úµã±ä»¯¶¼»á֪ͨ¶Ô¸Ã½Úµã½øÐÐwatchµÄ¿Í»§¶Ë¡£ÒòΪEPHEMERALÀàÐͽڵãÓÐÒ»¸öºÜÖØÒªµÄÌØÐÔ£¬¾ÍÊǿͻ§¶ËºÍ·þÎñÆ÷¶ËÁ¬½Ó¶Ïµô»òÕßsession¹ýÆÚ¾Í»áʹ½ÚµãÏûʧ£¬ÄÇôÔÚijһ¸ö»úÆ÷¹Òµô»òÕß¶ÏÁ´µÄʱºò£¬Æä¶ÔÓ¦µÄ½Úµã¾Í»áÏûʧ£¬È»ºó¼¯ÈºÖÐËùÓжÔ/APP1SERVERS½øÐÐwatchµÄ¿Í»§¶Ë¶¼»áÊÕµ½Í¨Öª£¬È»ºóÈ¡µÃ×îÐÂÁÐ±í¼´¿É¡£
ÁíÍâÓÐÒ»¸öÓ¦Óó¡¾°¾ÍÊǼ¯ÈºÑ¡master,Ò»µ©master¹ÒµôÄܹ»ÂíÉÏÄÜ´ÓslaveÖÐÑ¡³öÒ»¸ömaster,ʵÏÖ²½ÖèºÍǰÕßÒ»Ñù£¬Ö»ÊÇ»úÆ÷ÔÚÆô¶¯µÄʱºòÔÚAPP1SERVERS´´½¨µÄ½ÚµãÀàÐͱäΪEPHEMERAL_SEQUENTIALÀàÐÍ£¬ÕâÑùÿ¸ö½Úµã»á×Ô¶¯±»±àºÅ
ÎÒÃÇĬÈϹ涨±àºÅ×îСµÄΪmaster,ËùÒÔµ±ÎÒÃǶÔ/APP1SERVERS½Úµã×ö¼à¿ØµÄʱºò£¬µÃµ½·þÎñÆ÷ÁÐ±í£¬Ö»ÒªËùÓм¯Èº»úÆ÷Âß¼ÈÏΪ×îС±àºÅ½ÚµãΪmaster£¬ÄÇômaster¾Í±»Ñ¡³ö£¬¶øÕâ¸ömasterå´»úµÄʱºò£¬ÏàÓ¦µÄznode»áÏûʧ£¬È»ºóеķþÎñÆ÷Áбí¾Í±»ÍÆË͵½¿Í»§¶Ë£¬È»ºóÿ¸ö½ÚµãÂß¼ÈÏΪ×îС±àºÅ½ÚµãΪmaster£¬ÕâÑù¾Í×öµ½¶¯Ì¬masterÑ¡¾Ù¡£

Zookeeper ¼àÊÓ£¨Watches£© ¼ò½é
Zookeeper C API µÄÉùÃ÷ºÍÃèÊöÔÚ include/zookeeper.h
ÖпÉÒÔÕÒµ½£¬ÁíÍâ´ó²¿·ÖµÄ Zookeeper C API ³£Á¿¡¢½á¹¹ÌåÉùÃ÷Ò²ÔÚ zookeeper.h
ÖУ¬Èç¹ûÈç¹ûÄãÔÚʹÓà C API ÊÇÓöµ½²»Ã÷°×µÄµØ·½£¬×îºÃ¿´¿´ zookeeper.h£¬»òÕß×Ô¼ºÊ¹Óà doxygen
Éú³É Zookeeper C API µÄ°ïÖúÎĵµ¡£
Zookeeper ÖÐ×îÓÐÌØÉ«ÇÒ×î²»ÈÝÒ×Àí½âµÄÊǼàÊÓ(Watches)¡£Zookeeper
ËùÓеĶÁ²Ù×÷¡ª¡ªgetData(), getChildren(), ºÍ exists() ¶¼ ¿ÉÒÔÉèÖüàÊÓ(watch)£¬¼àÊÓʼþ¿ÉÒÔÀí½âΪһ´ÎÐԵĴ¥·¢Æ÷£¬
¹Ù·½¶¨ÒåÈçÏ£º a watch event is one-time trigger, sent to the
client that set the watch, which occurs when the data
for which the watch was set changes¡£¶Ô´ËÐèÒª×÷³öÈçÏÂÀí½â£º
1¡¢£¨Ò»´ÎÐÔ´¥·¢£©One-time trigger
µ±ÉèÖüàÊÓµÄÊý¾Ý·¢Éú¸Ä±äʱ£¬¸Ã¼àÊÓʼþ»á±»·¢Ë͵½¿Í»§¶Ë£¬ÀýÈ磬Èç¹û¿Í»§¶Ëµ÷ÓÃÁË
getData("/znode1", true) ²¢ÇÒÉÔºó /znode1 ½ÚµãÉϵÄÊý¾Ý·¢ÉúÁ˸ıä»òÕß±»É¾³ýÁË£¬¿Í»§¶Ë½«»á»ñÈ¡µ½
/znode1 ·¢Éú±ä»¯µÄ¼àÊÓʼþ£¬¶øÈç¹û /znode1 ÔÙÒ»´Î·¢ÉúÁ˱仯£¬³ý·Ç¿Í»§¶ËÔÙ´Î¶Ô /znode1
ÉèÖüàÊÓ£¬·ñÔò¿Í»§¶Ë²»»áÊÕµ½Ê¼þ֪ͨ¡£
2¡¢£¨·¢ËÍÖÁ¿Í»§¶Ë£©Sent to the client
Zookeeper ¿Í»§¶ËºÍ·þÎñ¶ËÊÇͨ¹ý socket ½øÐÐͨÐŵģ¬ÓÉÓÚÍøÂç´æÔÚ¹ÊÕÏ£¬ËùÒÔ¼àÊÓʼþºÜÓпÉÄܲ»»á³É¹¦µØµ½´ï¿Í»§¶Ë£¬¼àÊÓʼþÊÇÒì²½·¢ËÍÖÁ¼àÊÓÕߵģ¬Zookeeper
±¾ÉíÌṩÁ˱£ÐòÐÔ(ordering guarantee)£º¼´¿Í»§¶ËÖ»ÓÐÊ×ÏÈ¿´µ½Á˼àÊÓʼþºó£¬²Å»á¸ÐÖªµ½ËüËùÉèÖüàÊÓµÄ
znode ·¢ÉúÁ˱仯(a client will never see a change for which
it has set a watch until it first sees the watch event).
ÍøÂçÑÓ³Ù»òÕ߯äËûÒòËØ¿ÉÄܵ¼Ö²»Í¬µÄ¿Í»§¶ËÔÚ²»Í¬µÄʱ¿Ì¸Ð֪ijһ¼àÊÓʼþ£¬µ«ÊDz»Í¬µÄ¿Í»§¶ËËù¿´µ½µÄÒ»ÇоßÓÐÒ»ÖµÄ˳Ðò¡£
3¡¢ £¨±»ÉèÖà watch µÄÊý¾Ý£©The data for which
the watch was set
ÕâÒâζ×Å znode ½Úµã±¾Éí¾ßÓв»Í¬µÄ¸Ä±ä·½Ê½¡£ÄãÒ²¿ÉÒÔÏëÏó Zookeeper
ά»¤ÁËÁ½Ìõ¼àÊÓÁ´±í£ºÊý¾Ý¼àÊÓºÍ×Ó½Úµã¼àÊÓ(data watches and child watches)
getData() and exists() ÉèÖÃÊý¾Ý¼àÊÓ£¬getChildren() ÉèÖÃ×Ó½Úµã¼àÊÓ¡£
»òÕߣ¬ÄãÒ²¿ÉÒÔÏëÏó Zookeeper ÉèÖõIJ»Í¬¼àÊÓ·µ»Ø²»Í¬µÄÊý¾Ý£¬getData() ºÍ exists()
·µ»Ø znode ½ÚµãµÄÏà¹ØÐÅÏ¢£¬¶ø getChildren() ·µ»Ø×Ó½ÚµãÁÐ±í¡£Òò´Ë£¬ setData()
»á´¥·¢ÉèÖÃÔÚijһ½ÚµãÉÏËùÉèÖõÄÊý¾Ý¼àÊÓ(¼Ù¶¨Êý¾ÝÉèÖóɹ¦)£¬¶øÒ»´Î³É¹¦µÄ create() ²Ù×÷Ôò»á³ö·¢µ±Ç°½ÚµãÉÏËùÉèÖõÄÊý¾Ý¼àÊÓÒÔ¼°¸¸½ÚµãµÄ×Ó½Úµã¼àÊÓ¡£Ò»´Î³É¹¦µÄ
delete() ²Ù×÷½«»á´¥·¢µ±Ç°½ÚµãµÄÊý¾Ý¼àÊÓºÍ×Ó½Úµã¼àÊÓʼþ£¬Í¬Ê±Ò²»á´¥·¢¸Ã½Úµã¸¸½ÚµãµÄchild
watch¡£
Zookeeper ÖеļàÊÓÊÇÇáÁ¿¼¶µÄ£¬Òò´ËÈÝÒ×ÉèÖá¢Î¬»¤ºÍ·Ö·¢¡£µ±¿Í»§¶ËÓë
Zookeeper ·þÎñÆ÷¶ËʧȥÁªÏµÊ±£¬¿Í»§¶Ë²¢²»»áÊÕµ½¼àÊÓʼþµÄ֪ͨ£¬Ö»Óе±¿Í»§¶ËÖØÐÂÁ¬½Óºó£¬ÈôÔÚ±ØÒªµÄÇé¿öÏ£¬ÒÔǰע²áµÄ¼àÊÓ»áÖØÐ±»×¢²á²¢´¥·¢£¬¶ÔÓÚ¿ª·¢ÈËÔ±À´Ëµ
Õâͨ³£ÊÇ͸Ã÷µÄ¡£Ö»ÓÐÒ»ÖÖÇé¿ö»áµ¼Ö¼àÊÓʼþµÄ¶ªÊ§£¬¼´£ºÍ¨¹ý exists() ÉèÖÃÁËij¸ö znode ½ÚµãµÄ¼àÊÓ£¬µ«ÊÇÈç¹ûij¸ö¿Í»§¶ËÔÚ´Ë
znode ½Úµã±»´´½¨ºÍɾ³ýµÄʱ¼ä¼ä¸ôÄÚÓë zookeeper ·þÎñÆ÷ʧȥÁËÁªÏµ£¬¸Ã¿Í»§¶Ë¼´Ê¹ÉÔºóÖØÐÂÁ¬½Ó
zookeeper·þÎñÆ÷ºóÒ²µÃ²»µ½Ê¼þ֪ͨ¡£
|