¡¾±àÕß°´¡¿CoreOSÊÇÒ»¸ö»ùÓÚDockerµÄÇáÁ¿¼¶ÈÝÆ÷»¯Linux·¢Ðа棬רΪ´óÐÍÊý¾ÝÖÐÐĶøÉè¼Æ£¬Ö¼ÔÚͨ¹ýÇáÁ¿µÄϵͳ¼Ü¹¹ºÍÁé»îµÄÓ¦ÓóÌÐò²¿ÊðÄÜÁ¦¼ò»¯Êý¾ÝÖÐÐĵÄά»¤³É±¾ºÍ¸´ÔÓ¶È¡£ CoreOS×÷ΪDockerÉú̬ȦÖеÄÖØÒªÒ»Ô±£¬ÈÕÒæµÃµ½¸÷´óÔÆ·þÎñÉ̵ÄÖØÊÓ£¬Ä¿Ç°ÒѾÍê³ÉÁËAÂÖÈÚ×Ê£¬·¢Õ¹·çÍ·Õý¾¢¡£
1. ¸ÅÊö
etcd ÊÇÒ»¸öÓ¦ÓÃÔÚ·Ö²¼Ê½»·¾³Ï嵀 key/value ´æ´¢·þÎñ¡£ÀûÓà etcd µÄÌØÐÔ£¬Ó¦ÓóÌÐò¿ÉÒÔÔÚ¼¯ÈºÖй²ÏíÐÅÏ¢¡¢ÅäÖûò×÷·þÎñ·¢ÏÖ£¬ etcd »áÔÚ¼¯ÈºµÄ¸÷¸ö½ÚµãÖи´ÖÆÕâЩÊý¾Ý²¢±£Ö¤ÕâЩÊý¾ÝʼÖÕÕýÈ·¡£etcd ÎÞÂÛÊÇÔÚ CoreOS »¹ÊÇ Kubernetes ÌåϵÖж¼ÊDz»¿É»òȱµÄÒ»»·¡£ ±ÊÕßÓÉÓÚÏîÄ¿µÄÔÒò¶Ô etcd ½øÐÐÁËһЩÁ˽⣬ҲÒѾʹÓÃÁËÒ»¶Îʱ¼ä¡£Í¬Ê±ÔÚÓëͬÐеĽ»Á÷Öг£±»Îʵ½ etcd ÊÇʲô¡¢Óë ZooKeeper ÓÐʲô²»Í¬¡£ ÄÇô½è×Å etcd 0.5.0 ¼´½«·¢²¼µÄ»ú»á£¬Ïò¸ÐÐËȤµÄ¶ÁÕß½éÉÜһϠetcd£¬Ï£Íû¿ÉÒÔ°ïÖú¶ÁÕßÁ˽â etcd µÄ¹¤×÷ÔÀíÒÔ¼°¾ßÌåʵÏÖ£¬Í¬Ê±Ò²×÷Ϊ CoreOS ʵսµÄµÚ¶þ²¿·ÖÄÚÈÝΪºóÃæÏà¹ØµÄ²¿·Ö½øÐÐÆÌµæ¡£
Ëæ×Å etcd 0.5.0 alpha £¨±¾ÎÄÍê¸åʱΪ etcd 0.5.0 alpha.3£©°æ·¢²¼£¬etcd ½«ÔÚδÀ´¼¸ÖÜÄÚÓÀ´Ò»´ÎÖØÒªµÄ¸üС£ ÔÚ 0.5.0 °æÀï³ýÁËÐÞ¸´ÏÖÓÐÎȶ¨°æÖеÄһϵÁÐ Bug Ö®Í⣬һЩеÄÌØÐԺͱä¸üÒ²½«ËæÖ®·¢²¼¡£ÕâЩ±ä»¯½«ÌáÉý etcd ·þÎñ°²È«ÐÔ¡¢¿É¿¿ÐԺͿÉά»¤ÐÔ¡£
еÄÌØÐÔ°üÀ¨
1.¹æ·¶´Ê»ã±í£»
2.Ð嵀 raft Ë㷨ʵÏÖ£»
3.ÐÂÔö etcd node Éí·Ý±ê¼Ç£»
4.WAL (Write-ahead logging) Ôö¼Ó CRC УÑ飻
5.API ÖÐÐÂÔö member {list, add, remove} ½Ó¿Ú£¬ÔÀ´µÄ list machines ½Ó¿Ú½«±»ÒƳý£¬Î´À´ etcd ¼¯ÈºÖн«²»´æÔÚ machine µÄ³Æºô£»
6.Á½¸öÖ÷Òª¶Ë¿Ú±ä¸üΪ 2379 (for client) Óë 2380 (for peer/raft) ²¢³ÉΪ IANA µÄ×¢²á¶Ë¿Ú¡£
ÖØÒªµÄ±ä¸ü°üÀ¨
1.ÔËÐÐÊ±ÖØ¹¹ (runtime reconfiguration)¡£Óû§²»ÐèÒªÖØÆô etcd ·þÎñ¼´¿ÉʵÏÖ¶Ô etcd ¼¯Èº½á¹¹½øÐбä¸ü¡£
2.ÞðÆúͨ¹ýÅäÖÃÎļþÅäÖà etcd ÊôÐԵķ½Ê½£¬×ª¶øÒÔ CLI (command-line interface) flags »ò»·¾³±äÁ¿µÄ·½Ê½ÊµÏÖ etcd ½ÚµãµÄÅäÖá£
3.ÿ¸ö½Úµã¿É¼àÌý¶à¸ö¹ã²¥µØÖ·¡£¼àÌýµÄµØÖ·ÓÉÔÀ´µÄÒ»¸öÀ©Õ¹µ½¶à¸ö£¬Óû§¿ÉÒÔ¸ù¾ÝÐèÇóʵÏÖ¸ü¼Ó¸´Ôӵļ¯Èº»·¾³£¬Èç´î½¨Ò»¸ö»ìºÏÁË˽ÓÐÔÆÓ빫ÓÐÔÆ·þÎñµÄ etcd ¼¯Èº¡£
4.ÐÂÔö proxy mode¡£
2. ¹æ·¶´Ê»ã±í
etcd 0.5.0 °æÊ×´Î¶Ô etcd ´úÂë¡¢Îĵµ¼° CLI ÖÐʹÓõÄÊõÓï½øÐÐÁ˶¨Òå¡£
2.1. node
node Ö¸Ò»¸ö raft ״̬»úʵÀý¡£Ã¿¸ö node ¶¼¾ßÓÐΨһµÄ±êʶ£¬²¢ÔÚ´¦ÓÚ leader ״̬ʱ¼Ç¼ÆäËü½ÚµãµÄ²½½øÊý¡£
2.2. member
member Ö¸Ò»¸ö etcd ʵÀý¡£member ÔËÐÐÔÚÿ¸ö node ÉÏ£¬²¢ÏòÕâÒ» node ÉÏµÄÆäËüÓ¦ÓóÌÐòÌṩ·þÎñ¡£
2.3. Cluster
Cluster Óɶà¸ö member ×é³É¡£Ã¿¸ö member ÖÐµÄ node ×ñÑ raft ¹²Ê¶ÐÒéÀ´¸´ÖÆÈÕÖ¾¡£Cluster ½ÓÊÕÀ´×Ô member µÄÌá°¸ÏûÏ¢£¬½«ÆäÌá½»²¢´æ´¢ÓÚ±¾µØ´ÅÅÌ¡£
2.4. Peer
ͬһ Cluster ÖÐµÄÆäËü member¡£
2.5. Client
Client Ö¸µ÷Óà Cluster API µÄ¶ÔÏó¡£
3. Raft ¹²Ê¶Ëã·¨
etcd ¼¯ÈºµÄ¹¤×÷ÔÀí»ùÓÚ raft ¹²Ê¶Ëã·¨ (The Raft Consensus Algorithm)¡£ etcd ÔÚ 0.5.0 °æ±¾ÖÐÖØÐÂʵÏÖÁË raft Ëã·¨£¬¶ø·ÇÏñ֮ǰÄÇÑùÒÀÀµÓÚµÚÈý·½¿â go-raft ¡£ raft ¹²Ê¶Ëã·¨µÄÓŵãÔÚÓÚ¿ÉÒÔÔÚ¸ßЧµÄ½â¾ö·Ö²¼Ê½ÏµÍ³Öи÷¸ö½ÚµãÈÕÖ¾ÄÚÈÝÒ»ÖÂÐÔÎÊÌâµÄͬʱ£¬Ò²Ê¹µÃ¼¯Èº¾ß±¸Ò»¶¨µÄÈÝ´íÄÜÁ¦¡£ ¼´Ê¹¼¯ÈºÖгöÏÖ²¿·Ö½Úµã¹ÊÕÏ¡¢ÍøÂç¹ÊÕϵÈÎÊÌ⣬ÈԿɱ£Ö¤ÆäÓà´ó¶àÊý½ÚµãÕýÈ·µÄ²½½ø¡£ ÉõÖÁµ±¸ü¶àµÄ½Úµã£¨Ò»°ãÀ´Ëµ³¬¹ý¼¯Èº½Úµã×ÜÊýµÄÒ»°ë£©³öÏÖ¹ÊÕ϶øµ¼Ö¼¯Èº²»¿ÉÓÃʱ£¬ÒÀÈ»¿ÉÒÔ±£Ö¤½ÚµãÖеÄÊý¾Ý²»»á³öÏÖ´íÎóµÄ½á¹û¡£
3.1. ¼¯Èº½¨Á¢Óë״̬»ú
raft ¼¯ÈºÖеÄÿ¸ö½Úµã¶¼¿ÉÒÔ¸ù¾Ý¼¯ÈºÔËÐеÄÇé¿öÔÚÈýÖÖ״̬¼äÇл»£ºfollower, candidate Óë leader¡£leader Ïò follower ͬ²½ÈÕÖ¾£¬follower Ö»´Ó leader ´¦»ñÈ¡ÈÕÖ¾¡£ ÔÚ½Úµã³õʼÆô¶¯Ê±£¬½ÚµãµÄ raft ״̬»ú½«´¦ÓÚ follower ״̬²¢±»É趨һ¸ö election timeout£¬Èç¹ûÔÚÕâһʱ¼äÖÜÆÚÄÚûÓÐÊÕµ½À´×Ô leader µÄ heartbeat£¬ ½Úµã½«·¢ÆðÑ¡¾Ù£º½ÚµãÔÚ½«×Ô¼ºµÄ״̬Çл»Îª candidate Ö®ºó£¬Ïò¼¯ÈºÖÐÆäËü follower ½Úµã·¢ËÍÇëÇó£¬Ñ¯ÎÊÆäÊÇ·ñÑ¡¾Ù×Ô¼º³ÉΪ leader¡£ µ±ÊÕµ½À´×Ô¼¯ÈºÖйý°ëÊý½ÚµãµÄ½ÓÊÜͶƱºó£¬½Úµã¼´³ÉΪ leader£¬¿ªÊ¼½ÓÊÕ±£´æ client µÄÊý¾Ý²¢ÏòÆäËüµÄ follower ½Úµãͬ²½ÈÕÖ¾¡£ leader ½ÚµãÒÀ¿¿¶¨Ê±Ïò follower ·¢ËÍ heartbeat À´±£³ÖÆäµØÎ»¡£ ÈκÎʱºòÈç¹ûÆäËü follower ÔÚ election timeout ÆÚ¼ä¶¼Ã»ÓÐÊÕµ½À´×Ô leader µÄ heartbeat£¬Í¬Ñù»á½«×Ô¼ºµÄ״̬Çл»Îª candidate ²¢·¢ÆðÑ¡¾Ù¡£ ÿ³É¹¦Ñ¡¾ÙÒ»´Î£¬Ð leader µÄ²½½øÊý¶¼»á±È֮ǰ leader µÄ²½½øÊý´ó1¡£

ͼ 3-1 raft ״̬Çл»Ê¾Òâͼ
3.2. Ñ¡¾Ù
3.2.1. Ò»¸ö candidate ³ÉΪ leader ÐèÒª¾ß±¸Èý¸öÒªËØ£º
- »ñµÃ¼¯Èº¶àÊý½ÚµãµÄͬÒ⣻
- ¼¯ÈºÖв»´æÔÚ±È×Ô¼º²½½øÊý¸ü¸ßµÄ candidate£»
- ¼¯ÈºÖв»´æÔÚÆäËû leader¡£
3.2.2. ÏÂÃæÎªÒ»¸ö etcd ¼¯ÈºÑ¡¾Ù¹ý³ÌµÄ¼òµ¥ÃèÊö£º
1.³õʼ״̬ϼ¯ÈºÖеÄËùÓнڵ㶼´¦ÓÚ follower ״̬¡£

2.ijһʱ¿Ì£¬ÆäÖеÄÒ»¸ö follower ÓÉÓÚûÓÐÊÕµ½ leader µÄ heartbeat ÂÊÏÈ·¢Éú election timeout ½ø¶ø·¢ÆðÑ¡¾Ù¡£

3.Ö»Òª¼¯ÈºÖг¬¹ý°ëÊýµÄ½Úµã½ÓÊÜͶƱ£¬candidate ½Úµã½«³ÉΪ¼´Çл» leader ״̬¡£

4.³ÉΪ leader ½ÚµãÖ®ºó£¬leader ½«¶¨Ê±Ïò follower ½Úµãͬ²½ÈÕÖ¾²¢·¢ËÍ heartbeat¡£

3.3. ½ÚµãÒì³£
¼¯ÈºÖи÷¸ö½ÚµãµÄ×´Ì¬ËæÊ±¶¼ÓпÉÄÜ·¢Éú±ä»¯¡£´Óʵ¼ÊµÄ±ä»¯ÉÏÀ´·ÖÀàµÄ»°£¬½ÚµãµÄÒì³£´óÖ¿ÉÒÔ·ÖΪËÄÖÖÀàÐÍ£º
- leader ²»¿ÉÓã»
- follower ²»¿ÉÓã»
- ¶à¸ö candidate »ò¶à¸ö leader£»
- нڵã¼ÓÈ뼯Ⱥ¡£
3.3.1. leader ²»¿ÉÓÃ
ÏÂÃæ½«ËµÃ÷µ±¼¯ÈºÖÐµÄ leader ½Úµã²»¿ÉÓÃʱ£¬raft ¼¯ÈºÊÇÈçºÎÓ¦¶ÔµÄ¡£
1.Ò»°ãÇé¿öÏ£¬leader ½Úµã¶¨Ê±·¢ËÍ heartbeat µ½ follower ½Úµã¡£

2.ÓÉÓÚijЩÒì³£µ¼Ö leader ²»ÔÙ·¢ËÍ heartbeat £¬»ò follower ÎÞ·¨ÊÕµ½ heartbeat ¡£

3.µ±Ä³Ò» follower ·¢Éú election timeout ʱ£¬Æä״̬±ä¸üΪ candidate£¬²¢ÏòÆäËû follower ·¢ÆðͶƱ¡£

4.µ±³¬¹ý°ëÊýµÄ follower ½ÓÊÜͶƱºó£¬ÕâÒ»½Úµã½«³ÉΪÐ嵀 leader£¬leader µÄ²½½øÊý¼Ó1²¢¿ªÊ¼Ïò follower ͬ²½ÈÕÖ¾¡£

5.µ±Ò»¶Îʱ¼äÖ®ºó£¬Èç¹û֮ǰµÄ leader ÔٴμÓÈ뼯Ⱥ£¬ÔòÁ½¸ö leader ±È½Ï±Ë´ËµÄ²½½øÊý£¬²½½øÊýµÍµÄ leader ½«Çл»×Ô¼ºµÄ״̬Ϊ follower¡£

6.½ÏÔçǰ leader Öв»Ò»ÖµÄÈÕÖ¾½«±»Çå³ý£¬²¢ÓëÏÖÓÐ leader ÖеÄÈÕÖ¾±£³ÖÒ»Ö¡£

3.3.2. follower ½Úµã²»¿ÉÓÃ
follower ½Úµã²»¿ÉÓõÄÇé¿öÏà¶ÔÈÝÒ×½â¾ö¡£ÒòΪ¼¯ÈºÖеÄÈÕÖ¾ÄÚÈÝʼÖÕÊÇ´Ó leader ½Úµãͬ²½µÄ£¬Ö»ÒªÕâÒ»½ÚµãÔٴμÓÈë¼¯ÈºÊ±ÖØÐÂ´Ó leader ½Úµã´¦¸´ÖÆÈÕÖ¾¼´¿É¡£
1.¼¯ÈºÖеÄij¸ö follower ½Úµã·¢ÉúÒì³££¬²»ÔÙͬ²½ÈÕÖ¾ÒÔ¼°½ÓÊÕ heartbeat¡£

2. ¾¹ýÒ»¶Îʱ¼äÖ®ºó£¬ÔÀ´µÄ follower ½ÚµãÖØÐ¼ÓÈ뼯Ⱥ¡£

3.ÕâÒ»½ÚµãµÄÈÕÖ¾½«´Óµ±Ê±µÄ leader ´¦Í¬²½¡£

3.3.3. ¶à¸ö candidate »ò¶à¸ö leader
ÔÚ¼¯ÈºÖгöÏÖ¶à¸ö candidate »ò¶à¸ö leader ͨ³£ÊÇÓÉÓÚÊý¾Ý´«Êä²»³©Ôì³ÉµÄ¡£³öÏÖ¶à¸ö leader µÄÇé¿öÏà¶ÔÉÙ¼û£¬µ«¶à¸ö candidate ±È½ÏÈÝÒ׳öÏÖÔÚ¼¯Èº½ÚµãÆô¶¯³õÆÚÉÐδѡ³ö leader µÄ“»ìãç”ʱÆÚ¡£
1.³õʼ״̬ϼ¯ÈºÖеÄËùÓнڵ㶼´¦ÓÚ follower ״̬¡£

2.Á½¸ö½Úµãͬʱ³ÉΪ candidate ·¢ÆðÑ¡¾Ù¡£

3.Á½¸ö candidate ¶¼Ö»µÃµ½ÁËÉÙ²¿·Ö follower µÄ½ÓÊÜͶƱ¡£

4.candidate ¼ÌÐøÏòÆäËûµÄ follower ѯÎÊ¡£

5.ÓÉÓÚһЩ follower ÒѾͶ¹ýƱÁË£¬ËùÒÔ¾ù·µ»Ø¾Ü¾ø½ÓÊÜ¡£

6.candidate Ò²¿ÉÄÜÏòÒ»¸ö candidate ѯÎÊͶƱ¡£

7.ÔÚ²½½øÊýÏàͬµÄÇé¿öÏ£¬candidate ½«¾Ü¾ø½ÓÊÜÁíÒ»¸ö candidate µÄÇëÇó¡£

8.ÓÉÓÚµÚÒ»´Îδѡ³ö leader£¬candidate ½«Ëæ»úÑ¡ÔñÒ»¸öµÈ´ý¼ä¸ô£¨150ms ~ 300ms£©Ôٴη¢ÆðͶƱ¡£

9.Èç¹ûµÃµ½¼¯ÈºÖаëÊýÒÔÉ쵀 follower µÄ½ÓÊÜ£¬ÕâÒ» candidate ½«³ÉΪ leader¡£

10.ÉÔºóÁíÒ»¸ö candidate Ò²½«Ôٴη¢ÆðͶƱ¡£
11.ÓÉÓÚ¼¯ÈºÖÐÒѾѡ³ö leader£¬candidate ½«ÊÕµ½¾Ü¾ø½ÓÊܵÄͶƱ¡£

12.ÔÚ±»¶àÊý½Úµã¾Ü¾øÖ®ºó£¬²¢ÒÑÖª¼¯ÈºÖÐÒÑ´æÔÚ leader ºó£¬ÕâÒ» candidate ½Úµã½«ÖÕֹͶƱÇëÇó¡¢Çл»Îª follower£¬´Ó leader ½Úµãͬ²½ÈÕÖ¾¡£

3.4. ÈÕÖ¾
3.4.1. ¸´ÖÆ
ÔÚ raft ¼¯ÈºÖУ¬ËùÓÐÈÕÖ¾¶¼±ØÐëÊ×ÏÈÌá½»ÖÁ leader ½Úµã¡£leader ÔÚÿ¸ö heartbeat Ïò follower ͬ²½ÈÕÖ¾£¬follower ÔÚÊÕµ½ÈÕÖ¾Ö®ºóÏò leader ·´À¡½á¹û£¬leader ÔÚÈ·ÈÏÈÕÖ¾ÄÚÈÝÕýÈ·Ö®ºó½«´ËÌõÄ¿Ìá½»²¢´æ´¢ÓÚ±¾µØ´ÅÅÌ¡£

1.Ê×ÏÈÓÐÒ»Ìõ uncommitted µÄÈÕÖ¾ÌõÄ¿Ìá½»ÖÁ leader ½Úµã¡£

2.ÔÚÏÂÒ»¸ö heartbeat£¬leader ½«´ËÌõÄ¿¸´ÖƸøËùÓÐµÄ follower¡£

3.µ±´ó¶àÊý½Úµã¼Ç¼´ËÌõĿ֮ºó£¬leader ½ÚµãÈ϶¨´ËÌõÄ¿ÓÐЧ£¬½«´ËÌõÄ¿É趨ΪÒÑÌá½»²¢´æ´¢ÓÚ±¾µØ´ÅÅÌ¡£


4.ÔÚÏÂÒ»¸ö heartbeat£¬leader ֪ͨËùÓÐ follower Ìá½»ÕâÒ»ÈÕÖ¾ÌõÄ¿²¢´æ´¢ÓÚ¸÷×ԵĴÅÅÌÄÚ¡£

3.4.2. ÈÝ´í
Èç¹ûÓÉÓÚÍøÂçµÄ¸ô¶Ï£¬Ôì³É¼¯ÈºÖжàÊýµÄ½ÚµãÔÚÒ»¶Îʱ¼äÄÚÎÞ·¨·ÃÎʵ½ leader ½Úµã¡£°´ÕÕ raft ¹²Ê¶Ëã·¨£¬Ã»ÓÐ leader µÄÄÇÒ»×鼯Ⱥ½«»áͨ¹ýÑ¡¾ÙͶƱ³öÐ嵀 leader£¬ÉõÖÁ»áÔÚÁ½¸ö¼¯ÈºÄÚ²úÉú²»Ò»ÖµÄÈÕÖ¾ÌõÄ¿¡£ÔÚ¼¯ÈºÖØÐÂÍêÕûÁ¬Í¨Ö®ºó£¬ÔÀ´µÄ leader ÈԻᰴÕÕ raft ¹²Ê¶Ëã·¨´Ó²½½øÊý¸ü¸ßµÄ leader ͬ²½ÈÕÖ¾²¢½«×Ô¼ºÇл»Îª follower¡£

1. ¼¯ÈºµÄÀíÏë״̬¡£
2. ÍøÂç¼ä¸ôÔì³É´ó¶àÊýµÄ½ÚµãÎÞ·¨·ÃÎÊ leader ½Úµã¡£

3. еÄÈÕÖ¾ÌõÄ¿Ìí¼Óµ½ leader ÖС£

4. leader ½Úµã½«´ËÌõÈÕ־ͬ²½ÖÁÄܹ»·ÃÎʵ½ leader µÄ½Úµã¡£

5. follower È·ÈÏÈÕÖ¾±»¼Ç¼£¬µ«ÊÇÈ·ÈϼǼÈÕÖ¾µÄ follower ÊýÁ¿Ã»Óг¬¹ý¼¯Èº½ÚµãµÄ°ëÊý£¬leader ½Úµã²¢²»½«´ËÌõÈÕÖ¾´æµµ¡£

6. ÔÚ±»¸ô¶ÏµÄÕⲿ·Ö½Úµã£¬ÔÚ election timeout Ö®ºó£¬followers ÖвúÉú candidate ²¢·¢ÆðÑ¡¾Ù¡£

7. ¶àÊý½Úµã½ÓÊÜͶƱ֮ºó£¬candidate ³ÉΪ leader¡£

8. Ò»¸öÈÕÖ¾ÌõÄ¿±»Ìí¼Óµ½Ð嵀 leader¡£

9. ÈÕÖ¾±»¸´ÖƸøÐ leader µÄ follower¡£

10. ¶àÊý½ÚµãÈ·ÈÏÖ®ºó£¬leader ½«ÈÕÖ¾ÌõÄ¿Ìá½»²¢´æ´¢¡£

11. ÔÚÏÂÒ»¸ö heartbeat£¬leader ֪ͨ follower ¸÷×ÔÌá½»²¢±£´æÔÚ±¾µØ´ÅÅÌ¡£

12. ¾¹ýÒ»¶Îʱ¼äÖ®ºó£¬¼¯ÈºÖØÐÂÁ¬Í¨µ½Ò»Æð£¬¼¯ÈºÖгöÏÖÁ½¸ö leader ²¢ÇÒ´æÔÚ²»Ò»ÖµÄÈÕÖ¾ÌõÄ¿¡£

13. Ð嵀 leader ÔÚÏÂÒ»´Î heartbeat timeout ʱÏòËùÓеĽڵ㷢ËÍÒ»´Î heartbeat¡£

14. #1 leader ÔÚÊÕµ½²½½øÊý¸ü¸ßµÄ #2 leader heartbeat ʱ·ÅÆú leader µØÎ»²¢Çл»µ½ follower ״̬¡£

15. ½ÚµãÖÐËùÓÐδ´æµµµÄÈÕÖ¾ÌõÄ¿¶¼½«±»¶ªÆú¡£

16. δ±»¸´ÖƵÄÈÕÖ¾ÌõÄ¿½«»á±»Í¬²½¸øËùÓÐµÄ follower¡£

ͨ¹ýÕâÖÖ·½Ê½£¬Ö»Òª¼¯ÈºÖÐÓÐЧÁ¬½ÓµÄ½Úµã³¬¹ý×ÜÊýµÄÒ»°ë£¬¼¯Èº½«Ò»Ö±ÒÔÕâÖÖ¹æÔòÔËÐÐÏÂÈ¥²¢Ê¼ÖÕÈ·±£¸÷¸ö½ÚµãÖеÄÊý¾ÝʼÖÕÒ»Ö¡£
4. ʵÏÖ
4.1. etcd ½á¹¹

Ò»¸ö etcd ½ÚµãµÄºËÐÄÓÉÈý²¿·Ö×é³É£º
- Raft£ºraft ״̬»úÊÇ¶Ô raft ¹²Ê¶Ëã·¨µÄʵÏÖ
- WAL£ºraft ÈÕÖ¾´æ´¢
- Storage£ºÊý¾ÝµÄ´æ´¢ÓëË÷Òý
WAL (Write-ahead logging)£¬ÊÇÓÃÓÚÏòϵͳÌṩÔ×ÓÐԺͳ־ÃÐÔµÄһϵÁм¼Êõ¡£ÔÚʹÓà WAL µÄϵÌṩÖУ¬ËùÓеÄÐÞ¸ÄÔÚÌύ֮ǰ¶¼ÒªÏÈдÈë log ÎļþÖС£etcd µÄ WAL ÓÉÈÕÖ¾´æ´¢Óë¿ìÕÕ´æ´¢Á½²¿·Ö×é³É£¬ÆäÖÐ Entry ¸ºÔð´æ´¢¾ßÌåÈÕÖ¾µÄÄÚÈÝ£¬¶ø Snapshot ¸ºÔðÔÚÈÕÖ¾ÄÚÈÝ·¢Éú±ä»¯µÄʱºò±£´æ raft µÄ״̬¡£WAL »áÔÚ±¾µØ´ÅÅ̵ÄÒ»¸öÖ¸¶¨Ä¿Â¼Ï·ֱðÈÕÖ¾ÌõÄ¿Óë¿ìÕÕÄÚÈÝ¡£
4.2. ·þÎñ
4.2.1. Clients
ÔÚĬÈÏÉ趨Ï£¬etcd ͨ¹ýÖ÷»úµÄ 2379 ¶Ë¿ÚÏò Client Ìṩ·þÎñ¡£ÈçÏÂͼ£º

ÿ¸öÖ÷»úÉϵÄÓ¦ÓóÌÐò¶¼¿ÉÒÔͨ¹ýÖ÷»úµÄ 2379 ÒÔ HTTP + JSON µÄ·½Ê½Ïò etcd ¶ÁдÊý¾Ý¡£Ð´ÈëµÄÊý¾Ý»áÓÉ etcd ͬ²½µ½¼¯ÈºµÄÆäËü½ÚµãÖС£
4.2.2. Peers
ÔÚĬÈÏÉ趨Ï£¬etcd ͨ¹ýÖ÷»úµÄ 2380 ¶Ë¿ÚÔÚ¸÷¸ö½ÚµãÖÐͬ²½ raft ״̬¼°Êý¾Ý¡£

5. ´´½¨
´Ó·½·¨ÉÏÀ´»®·Ö£¬´´½¨ etcd ¼¯ÈºµÄ·½Ê½·ÖΪÁ½ÖÖ£ºStatic £¨Í¨¹ýÖÆ¶¨ peers µÄ IP ºÍ¶Ë¿Ú´´½¨£©Óë Discovery £¨Í¨¹ýÒ»¸ö·¢ÏÖ·þÎñ´´½¨£©¡£
Static ·½Ê½ÐèÒªÔ¤ÏÈÖªµÀ¼¯ÈºËùÓнڵãµÄ IP£¬ËùÒÔÊʺÏС¹æÄ£µÄ¼¯Èº»òÕߴһ¸öÁÙʱµÄ¿ª·¢Óë²âÊÔ»·¾³¡£
Discovery ·½Ê½²»ÐèÒªÔ¤ÏÈÁ˽âÆäËû½ÚµãµÄ IP¡£Æô¶¯Ê± etcd ͨ¹ý·ÃÎÊÒ»¸ö Discovery URL À´×¢²á×Ô¼º²¢»ñÈ¡ÆäËû½ÚµãµÄÐÅÏ¢¡£
ÕâÖÖ·½Ê½Í¨³£ÊʺϽ« etcd ²¿ÊðÔÚij¸öÔÆ·þÎñƽ̨»òÊÇÒ»¸ö DHCP »·¾³ÖС£
ÆäÖÐ Discovery ·þÎñ¿ÉÒÔʹÓà CoreOS ÌṩµÄÒ»¸ö¹«¹²µØÖ· https://discovery.etcd.io/new À´ÉêÇëÒ»¸ö token£¬»òÕß×Ô¼º´î½¨Ò»¸öÕâÑùµÄ·þÎñ²¢É趨һ¸ö token¡£
³öÓÚ°²È«µÄ¿¼ÂÇ£¬Õâ¸ö token Ó¦¸ÃÖ»ÔÚ¼¯Èº³õʼÒýµ¼Ê±¶ÌÔÝ´æÔÚ£¬ÒòΪ¼¯Èº½¨Á¢Ö®ºó½«²»ÔÙÐèÒªÕâÒ»µØÖ·£¬¶ø¼¯ÈºÖнڵãµÄ±ä¸ü¿ÉÒÔͨ¹ý etcd ÔËÐÐÊ±ÖØ¹¹µÄÄÜÁ¦À´½øÐÐÅäÖá£
6. ÔËÐÐ
ÏÂÃæÎÒÃdz¢ÊÔʹÓà etcd 0.5.0 ÒÔ discovery ·½Ê½´´½¨Ò»¸ö CoreOS ¼¯Èº¡£
µ±È»ÓÉÓÚ etcd 0.5.0 ÉÐδÕýʽ·¢²¼£¬ËùÒÔÎÒÃÇĿǰ»¹ÎÞ·¨´Ó¹Ù·½ÇþµÀ»ñµÃ´ò°ü etcd 0.5.0 µÄ CoreOS ¾µÏñ£¬
µ«ÊÇÎÒÃÇ¿ÉÒÔÐÞ¸ÄÒýµ¼Îļþ£¬ÔÚ CoreOS Æô¶¯Ê±½« etcd 0.5.0 ÏÂÔØÖÁϵͳÀï½øÐÐÅäÖò¢Æô¶¯¡£
CoreOS ¹Ù·½ÌṩÁËÒ»¸öʹÓà vagrant + virtualbox ÏîÄ¿£¬¹©Óû§ÔÚ±¾µØµçÄÔÖд´½¨Ò»¸ö΢ÐÍ CoreOS ¼¯Èº¡£ÎÒÃÇ¿ÉÒÔÔÚÕâ¸öÏîÄ¿µÄ»ù´¡ÉϽøÐÐÐÞ¸ÄÀ´ÊµÏÖÎÒÃǵÄÐèÇó¡£
6.1. Clone ÏîÄ¿µ½±¾µØ
git clone
https://github.com/coreos/coreos-vagrant.git
cd coreos-vagrant
cp config.rb.sample config.rb
cp user-data.sample user-data
|
6.2. ͨ¹ý CoreOS ÌṩµÄ¹«¹² discovery ·þÎñÉêÇë token
curl https://discovery.etcd.io/new?size=3
|
https://discovery.etcd.io/780456e1317eb2db312b62ba1cb9a4f7
size = 3 ±íʾÕâ¸ö¼¯Èº½Úµã×ÜÊýΪ 3 ¸ö¡£
6.3. ÐÞ¸Ä config.rb Îļþ
# Size of the CoreOS cluster created by Vagrant
$num_instances=3
|
½«Æô¶¯µÄ CoreOS ʵÀýÊýÁ¿¶¨Îª 3 ¸ö
6.4. ÐÞ¸Ä user-data Îļþ
6.4.1. ÐÞ¸Ä etcd ²ÎÊý£º
etcd:
discovery: https://discovery.etcd.io/780456e1317eb2db312b62ba1cb9a4f7
advertise-client-urls: http://$public_ipv4:2379
initial-advertise-peer-urls: http://$public_ipv4:2380
listen-client-urls: http://$public_ipv4:2379
listen-peer-urls: http://$public_ipv4:2380
|
6.4.2. ÐÞ¸Ä etcd ·þÎñÄÚÈÝ
name: etcd.service
command: start
content: |
[Unit]
After=network-online.target
Requires=network-online.target
[Service]
ExecStartPre=/usr/bin/wget -N -P /opt/bin https://github.com/coreos/etcd/releases/
download/v0.5.0-alpha.3/etcd-v0.5.0-alpha.3-linux-amd64.tar.gz
ExecStartPre=/usr/bin/tar -C /opt/bin -xvf /opt/bin/etcd-v0.5.0-alpha.3-linux-amd64.tar.gz
ExecStartPre=/usr/bin/chmod +x /opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcd
ExecStart=/opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcd
[Install]
WantedBy=multi-user.target
|
Ð޸ĵIJ¿·ÖÈÃÎÒÃÇÖØÐ¶¨ÖÆÁË etcd ·þÎñµÄÄÚÈÝ¡£ÔÚϵͳÆô¶¯Ê±£¬ÏȽ« etcd 0.5.0 µÄ´ò°üÎļþÏÂÔØÖÁÖ¸¶¨Ä¿Â¼²¢ÔÚÉÔºó½«ÆäÆô¶¯¡£
6.4.3. ʹÓà vagrant Æô¶¯¼¯Èº
ÉÔºó vagrant ½«°ïÖúÎÒÃÇÔÚ VirtualBox Öд´½¨Èý¸ö CoreOS ʵÀý¡£
6.4.4. µÇ¼µ½ CoreOS
µÇ¼µ½ÆäÖеÄÒ»¸ö½Úµã
²é¿´Ò»Ï etcd.service µÄ״̬£¬ÊäÈ룺
systemctl status etcd.service
|
²»³öÒâÍâµÄ»°£¬¿ÉÒÔ¿´µ½Æä״̬Ϊ active (running)
etcd.service
Loaded: loaded (/etc/systemd/system/etcd.service; disabled)
Drop-In: /run/systemd/system/etcd.service.d
©¸©¤20-cloudinit.conf
Active: active (running) since Sun 2014-11-16 13:10:59 UTC; 12min ago
Process: 894 ExecStartPre=/usr/bin/chmod +x /opt/bin/etcd-v0.5.0-alpha.3-
linux-amd64/etcd (code=exited, status=0/SUCCESS)
Process: 890 ExecStartPre=/usr/bin/tar -C /opt/bin -xvf /opt/bin/etcd-
v0.5.0-alpha.3-linux-amd64.tar.gz (code=exited, status=0/SUCCESS)
Process: 857 ExecStartPre=/usr/bin/wget -N -P /opt/bin
https://github.com/coreos/etcd/releases/download/v0.5.0-alpha.3/etcd-v0.5.0
-alpha.3-linux-amd64.tar.gz (code=exited, status=0/SUCCESS)
Main PID: 896 (etcd)
CGroup: /system.slice/etcd.service
©¸©¤896 /opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcd
|
6.4.5. ͨ¹ý etcdctl ²éѯ¼¯Èº×´Ì¬
etcdctl ¿ÉÒÔ°ïÖúÎÒÃDzéѯһϼ¯ÈºÖнڵãÐÅÏ¢£¬ÊäÈ룺
ÕâÀïÓеãÒªÌØ±ð˵Ã÷µÄµØ·½
/opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcdctl --peers 172.17.8.101:2379 member list
|
Æô¶¯²ÎÊý --peers 172.17.8.101:2379 ±íʾͨ¹ý±¾½ÚµãµÄ 2379 ¶Ë¿Ú·ÃÎÊ etcd ½Ó¿Ú£¬Óû§¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄʵ¼ÊÇé¿ö¶Ô IP µØÖ·½øÐÐÐÞÕý¡£
Õý³£Çé¿öÏ¿ɿ´µ½ÈçÏÂÊä³ö£º
b4f4d25ed56d7a44: name=b74c24773df147e1be8e1e35defaad38 peerURLs=
http://172.17.8.101:2380 clientURLs=http://172.17.8.101:2379
b7404cc414e7affa: name=001db0fc02184af5b293e2cb21c86a11 peerURLs=
http://172.17.8.102:2380 clientURLs=http://172.17.8.102:2379
f609956c55a6809e: name=2840dc331d224360a097b781c876c9e5 peerURLs=
http://172.17.8.103:2380 clientURLs=http://172.17.8.103:2379
|
ÕâÑù£¬ÎÒÃǾÍÔÚ±¾µØ´´½¨ÁËÒ»¸ö»ùÓÚ etcd 0.5.0 µÄ CoreOS ¼¯Èº¡£ |