±¾ÎĽéÉÜµÄ 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 ÕâÖÖÊý¾Ý½á¹¹ÓÐÈçÏÂÕâÐ©ÌØµã£º
- ÿ¸ö×ÓĿ¼ÏîÈç NameService ¶¼±»³Æ×÷Ϊ znode£¬Õâ¸ö znode ÊDZ»ËüËùÔڵķ¾¶Î¨Ò»±êʶ£¬Èç Server1 Õâ¸ö znode µÄ±êʶΪ /NameService/Server1
- znode ¿ÉÒÔÓÐ×Ó½ÚµãĿ¼£¬²¢ÇÒÿ¸ö znode ¿ÉÒÔ´æ´¢Êý¾Ý£¬×¢Òâ EPHEMERAL ÀàÐ͵ÄĿ¼½Úµã²»ÄÜÓÐ×Ó½ÚµãĿ¼
- znode ÊÇÓа汾µÄ£¬Ã¿¸ö znode Öд洢µÄÊý¾Ý¿ÉÒÔÓжà¸ö°æ±¾£¬Ò²¾ÍÊÇÒ»¸ö·ÃÎÊ·¾¶ÖпÉÒÔ´æ´¢¶à·ÝÊý¾Ý
- znode ¿ÉÒÔÊÇÁÙʱ½Úµã£¬Ò»µ©´´½¨Õâ¸ö znode µÄ¿Í»§¶ËÓë·þÎñÆ÷ʧȥÁªÏµ£¬Õâ¸ö znode Ò²½«×Ô¶¯É¾³ý£¬Zookeeper µÄ¿Í»§¶ËºÍ·þÎñÆ÷ͨÐŲÉÓó¤Á¬½Ó·½Ê½£¬Ã¿¸ö¿Í»§¶ËºÍ·þÎñÆ÷ͨ¹ýÐÄÌøÀ´±£³ÖÁ¬½Ó£¬Õâ¸öÁ¬½Ó״̬³ÆÎª session£¬Èç¹û znode ÊÇÁÙʱ½Úµã£¬Õâ¸ö session ʧЧ£¬znode Ò²¾Íɾ³ýÁË
- znode µÄĿ¼Ãû¿ÉÒÔ×Ô¶¯±àºÅ£¬Èç App1 ÒѾ´æÔÚ£¬ÔÙ´´½¨µÄ»°£¬½«»á×Ô¶¯ÃüÃûΪ App2
- znode ¿ÉÒÔ±»¼à¿Ø£¬°üÀ¨Õâ¸öĿ¼½ÚµãÖд洢µÄÊý¾ÝµÄÐ޸ģ¬×Ó½ÚµãĿ¼µÄ±ä»¯µÈ£¬Ò»µ©±ä»¯¿ÉÒÔ֪ͨÉèÖÃ¼à¿ØµÄ¿Í»§¶Ë£¬Õâ¸öÊÇ Zookeeper µÄºËÐÄÌØÐÔ£¬Zookeeper µÄºÜ¶à¹¦Äܶ¼ÊÇ»ùÓÚÕâ¸öÌØÐÔʵÏֵģ¬ºóÃæÔÚµäÐ͵ÄÓ¦Óó¡¾°ÖлáÓÐʵÀý½éÉÜ
»ØÒ³Ê×
ÈçºÎʹÓÃ
Zookeeper ×÷Ϊһ¸ö·Ö²¼Ê½µÄ·þÎñ¿ò¼Ü£¬Ö÷ÒªÓÃÀ´½â¾ö·Ö²¼Ê½¼¯ÈºÖÐÓ¦ÓÃϵͳµÄÒ»ÖÂÐÔÎÊÌ⣬ËüÄÜÌṩ»ùÓÚÀàËÆÓÚÎļþϵͳµÄĿ¼½ÚµãÊ÷·½Ê½µÄÊý¾Ý´æ´¢£¬µ«ÊÇ Zookeeper ²¢²»ÊÇÓÃÀ´×¨ÃÅ´æ´¢Êý¾ÝµÄ£¬ËüµÄ×÷ÓÃÖ÷ÒªÊÇÓÃÀ´Î¬»¤ºÍ¼à¿ØÄã´æ´¢µÄÊý¾ÝµÄ״̬±ä»¯¡£Í¨¹ý¼à¿ØÕâЩÊý¾Ý״̬µÄ±ä»¯£¬´Ó¶ø¿ÉÒÔ´ïµ½»ùÓÚÊý¾ÝµÄ¼¯Èº¹ÜÀí£¬ºóÃæ½«»áÏêϸ½éÉÜ Zookeeper Äܹ»½â¾öµÄһЩµäÐÍÎÊÌ⣬ÕâÀïÏȽéÉÜһϣ¬Zookeeper µÄ²Ù×÷½Ó¿ÚºÍ¼òµ¥Ê¹ÓÃʾÀý¡£
³£ÓýӿÚÁбí
¿Í»§¶ËÒªÁ¬½Ó Zookeeper ·þÎñÆ÷¿ÉÒÔͨ¹ý´´½¨ org.apache.zookeeper. ZooKeeper µÄÒ»¸öʵÀý¶ÔÏó£¬È»ºóµ÷ÓÃÕâ¸öÀàÌṩµÄ½Ó¿ÚÀ´ºÍ·þÎñÆ÷½»»¥¡£
Ç°ÃæËµÁË ZooKeeper Ö÷ÒªÊÇÓÃÀ´Î¬»¤ºÍ¼à¿ØÒ»¸öĿ¼½ÚµãÊ÷Öд洢µÄÊý¾ÝµÄ״̬£¬ËùÓÐÎÒÃÇÄܹ»²Ù×÷ ZooKeeper µÄÒ²ºÍ²Ù×÷Ŀ¼½ÚµãÊ÷´óÌåÒ»Ñù£¬Èç´´½¨Ò»¸öĿ¼½Úµã£¬¸øÄ³¸öĿ¼½ÚµãÉèÖÃÊý¾Ý£¬»ñȡij¸öĿ¼½ÚµãµÄËùÓÐ×ÓĿ¼½Úµã£¬¸øÄ³¸öĿ¼½ÚµãÉèÖÃȨÏÞºÍ¼à¿ØÕâ¸öĿ¼½ÚµãµÄ״̬±ä»¯¡£
ÕâЩ½Ó¿ÚÈçϱíËùʾ£º
±í 1 org.apache.zookeeper. ZooKeeper ·½·¨Áбí
| ·½·¨Ãû |
·½·¨¹¦ÄÜÃèÊö |
| String create(String path, byte[] data, List<ACL> acl,CreateMode createMode) |
´´½¨Ò»¸ö¸ø¶¨µÄĿ¼½Úµã path, ²¢¸øËüÉèÖÃÊý¾Ý£¬CreateMode ±êʶÓÐËÄÖÖÐÎʽµÄĿ¼½Úµã£¬·Ö±ðÊÇ PERSISTENT£º³Ö¾Ã»¯Ä¿Â¼½Úµã£¬Õâ¸öĿ¼½Úµã´æ´¢µÄÊý¾Ý²»»á¶ªÊ§£»PERSISTENT_SEQUENTIAL£ºË³Ðò×Ô¶¯±àºÅµÄĿ¼½Úµã£¬ÕâÖÖĿ¼½Úµã»á¸ù¾Ýµ±Ç°Òѽü´æÔڵĽڵãÊý×Ô¶¯¼Ó 1£¬È»ºó·µ»Ø¸ø¿Í»§¶ËÒѾ³É¹¦´´½¨µÄĿ¼½ÚµãÃû£»EPHEMERAL£ºÁÙʱĿ¼½Úµã£¬Ò»µ©´´½¨Õâ¸ö½ÚµãµÄ¿Í»§¶ËÓë·þÎñÆ÷¶Ë¿ÚÒ²¾ÍÊÇ session ³¬Ê±£¬ÕâÖÖ½Úµã»á±»×Ô¶¯É¾³ý£»EPHEMERAL_SEQUENTIAL£ºÁÙʱ×Ô¶¯±àºÅ½Úµã |
| Stat exists(String path, boolean watch) |
ÅжÏij¸ö path ÊÇ·ñ´æÔÚ£¬²¢ÉèÖÃÊÇ·ñ¼à¿ØÕâ¸öĿ¼½Úµã£¬ÕâÀïµÄ watcher ÊÇÔÚ´´½¨ ZooKeeper ʵÀýʱָ¶¨µÄ watcher£¬exists·½·¨»¹ÓÐÒ»¸öÖØÔØ·½·¨£¬¿ÉÒÔÖ¸¶¨Ìض¨µÄ watcher |
| Stat exists(String path,Watcher watcher) |
ÖØÔØ·½·¨£¬ÕâÀï¸øÄ³¸öĿ¼½ÚµãÉèÖÃÌØ¶¨µÄ watcher£¬Watcher ÔÚ ZooKeeper ÊÇÒ»¸öºËÐŦÄÜ£¬Watcher ¿ÉÒÔ¼à¿ØÄ¿Â¼½ÚµãµÄÊý¾Ý±ä»¯ÒÔ¼°×ÓĿ¼µÄ±ä»¯£¬Ò»µ©ÕâЩ״̬·¢Éú±ä»¯£¬·þÎñÆ÷¾Í»á֪ͨËùÓÐÉèÖÃÔÚÕâ¸öĿ¼½ÚµãÉ쵀 Watcher£¬´Ó¶øÃ¿¸ö¿Í»§¶Ë¶¼ºÜ¿ìÖªµÀËüËù¹Ø×¢µÄĿ¼½ÚµãµÄ״̬·¢Éú±ä»¯£¬¶ø×ö³öÏàÓ¦µÄ·´Ó¦ |
| void delete(String path, int version) |
ɾ³ý path ¶ÔÓ¦µÄĿ¼½Úµã£¬version Ϊ -1 ¿ÉÒÔÆ¥ÅäÈκΰ汾£¬Ò²¾Íɾ³ýÁËÕâ¸öĿ¼½ÚµãËùÓÐÊý¾Ý |
| List<String>getChildren(String path, boolean watch) |
»ñȡָ¶¨ path ϵÄËùÓÐ×ÓĿ¼½Úµã£¬Í¬Ñù getChildren·½·¨Ò²ÓÐÒ»¸öÖØÔØ·½·¨¿ÉÒÔÉèÖÃÌØ¶¨µÄ watcher ¼à¿Ø×Ó½ÚµãµÄ״̬ |
| Stat setData(String path, byte[] data, int version) |
¸ø path ÉèÖÃÊý¾Ý£¬¿ÉÒÔÖ¸¶¨Õâ¸öÊý¾ÝµÄ°æ±¾ºÅ£¬Èç¹û version Ϊ -1 Ôõ¿ÉÒÔÆ¥ÅäÈκΰ汾 |
| byte[] getData(String path, boolean watch, Stat stat) |
»ñÈ¡Õâ¸ö path ¶ÔÓ¦µÄĿ¼½Úµã´æ´¢µÄÊý¾Ý£¬Êý¾ÝµÄ°æ±¾µÈÐÅÏ¢¿ÉÒÔͨ¹ý stat À´Ö¸¶¨£¬Í¬Ê±»¹¿ÉÒÔÉèÖÃÊÇ·ñ¼à¿ØÕâ¸öĿ¼½ÚµãÊý¾ÝµÄ״̬ |
| voidaddAuthInfo(String scheme, byte[] auth) |
¿Í»§¶Ë½«×Ô¼ºµÄÊÚȨÐÅÏ¢Ìá½»¸ø·þÎñÆ÷£¬·þÎñÆ÷½«¸ù¾ÝÕâ¸öÊÚȨÐÅÏ¢ÑéÖ¤¿Í»§¶ËµÄ·ÃÎÊȨÏÞ¡£ |
| Stat setACL(String path,List<ACL> acl, int version) |
¸øÄ³¸öĿ¼½ÚµãÖØÐÂÉèÖ÷ÃÎÊȨÏÞ£¬ÐèҪעÒâµÄÊÇ Zookeeper ÖеÄĿ¼½ÚµãȨÏÞ²»¾ßÓд«µÝÐÔ£¬¸¸Ä¿Â¼½ÚµãµÄȨÏÞ²»ÄÜ´«µÝ¸ø×ÓĿ¼½Úµã¡£Ä¿Â¼½Úµã ACL ÓÉÁ½²¿·Ö×é³É£ºperms ºÍ id¡£ Perms ÓÐ ALL¡¢READ¡¢WRITE¡¢CREATE¡¢DELETE¡¢ADMIN ¼¸ÖÖ ¶ø id ±êʶÁË·ÃÎÊĿ¼½ÚµãµÄÉí·ÝÁÐ±í£¬Ä¬ÈÏÇé¿öÏÂÓÐÒÔÏÂÁ½ÖÖ£º ANYONE_ID_UNSAFE = new Id("world", "anyone") ºÍ AUTH_IDS = new Id("auth", "") ·Ö±ð±íʾÈκÎÈ˶¼¿ÉÒÔ·ÃÎʺʹ´½¨ÕßÓµÓзÃÎÊȨÏÞ¡£ |
| List<ACL>getACL(String path,Stat stat) |
»ñȡij¸öĿ¼½ÚµãµÄ·ÃÎÊȨÏÞÁбí |
³ýÁËÒÔÉÏÕâЩÉϱíÖÐÁгöµÄ·½·¨Ö®Í⻹ÓÐÒ»Ð©ÖØÔØ·½·¨£¬Èç¶¼ÌṩÁËÒ»¸ö»Øµ÷ÀàµÄÖØÔØ·½·¨ÒÔ¼°¿ÉÒÔÉèÖÃÌØ¶¨ 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 ¿ÉÒÔ´¦ÀíÁ½ÖÖÀàÐ͵ĶÓÁУº
- µ±Ò»¸ö¶ÓÁеijÉÔ±¶¼¾ÛÆëʱ£¬Õâ¸ö¶ÓÁвſÉÓ㬷ñÔòÒ»Ö±µÈ´ýËùÓгÉÔ±µ½´ï£¬ÕâÖÖÊÇͬ²½¶ÓÁС£
- ¶ÓÁа´ÕÕ 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 ÌṩÁËÒ»Ì׺ܺõķֲ¼Ê½¼¯Èº¹ÜÀíµÄ»úÖÆ£¬¾ÍÊÇËüÕâÖÖ»ùÓÚ²ã´ÎÐ͵ÄĿ¼Ê÷µÄÊý¾Ý½á¹¹£¬²¢¶ÔÊ÷ÖÐµÄ½Úµã½øÐÐÓÐЧ¹ÜÀí£¬´Ó¶ø¿ÉÒÔÉè¼Æ³ö¶àÖÖ¶àÑùµÄ·Ö²¼Ê½µÄÊý¾Ý¹ÜÀíÄ£ÐÍ£¬¶ø²»½ö½ö¾ÖÏÞÓÚÉÏÃæÌáµ½µÄ¼¸¸ö³£ÓÃÓ¦Óó¡¾°¡£