{"action":"opened","issue":{"url":"https://api.github.com/repos/guevara/read-it-later/issues/1580","repository_url":"https://api.github.com/repos/guevara/read-it-later","labels_url":"https://api.github.com/repos/guevara/read-it-later/issues/1580/labels{/name}","comments_url":"https://api.github.com/repos/guevara/read-it-later/issues/1580/comments","events_url":"https://api.github.com/repos/guevara/read-it-later/issues/1580/events","html_url":"https://github.com/guevara/read-it-later/issues/1580","id":384244189,"node_id":"MDU6SXNzdWUzODQyNDQxODk=","number":1580,"title":"etcd","user":{"login":"guevara","id":228309,"node_id":"MDQ6VXNlcjIyODMwOQ==","avatar_url":"https://avatars1.githubusercontent.com/u/228309?v=4","gravatar_id":"","url":"https://api.github.com/users/guevara","html_url":"https://github.com/guevara","followers_url":"https://api.github.com/users/guevara/followers","following_url":"https://api.github.com/users/guevara/following{/other_user}","gists_url":"https://api.github.com/users/guevara/gists{/gist_id}","starred_url":"https://api.github.com/users/guevara/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/guevara/subscriptions","organizations_url":"https://api.github.com/users/guevara/orgs","repos_url":"https://api.github.com/users/guevara/repos","events_url":"https://api.github.com/users/guevara/events{/privacy}","received_events_url":"https://api.github.com/users/guevara/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2018-11-26T09:36:08Z","updated_at":"2018-11-26T09:36:08Z","closed_at":null,"author_association":"OWNER","body":"etcd<br>\n<br>\nhttps://ift.tt/2FsDNYX<br>\n<br>\n<br>\n<br>\n<div>\n<h2 id=\"toc_0\">etcd&#20351;&#29992;&#32463;&#39564;&#24635;&#32467;</h2>\n<hr>\n<p><em>written by Alex Stocks on 2018/01/09&#65292;&#29256;&#26435;&#25152;&#26377;&#65292;&#26080;&#25480;&#26435;&#19981;&#24471;&#36716;&#36733;</em></p>\n<h3 id=\"toc_1\">0 &#35828;&#26126;</h3>\n<hr>\n<p>&#36817;&#26085;&#22312;&#21333;&#26426;&#19978;&#37096;&#32626;&#20102;&#19968;&#20010;etcd&#38745;&#24577;&#38598;&#32676;&#21644;&#22522;&#20110;&#36825;&#20010;&#38745;&#24577;&#38598;&#32676;&#30340;&#21160;&#24577;&#38598;&#32676;&#65292;&#24182;&#36827;&#34892;&#20102;&#30456;&#20851;&#27979;&#35797;&#65292;&#26412;&#25991;&#26159;&#37096;&#32626;&#20197;&#21450;&#27979;&#35797;&#36807;&#31243;&#30340;&#36935;&#21040;&#30340;&#30456;&#20851;&#38382;&#39064;&#30340;&#27969;&#27700;&#36134;&#65292;&#26435;&#20570;&#35760;&#24518;&#65292;&#20197;&#22791;&#21518;&#26469;&#21442;&#32771;&#12290;</p>\n<p>&#20026;&#20998;&#24067;&#24335;&#38598;&#32676;&#25552;&#20379;&#19968;&#33268;&#24615;&#26381;&#21153;&#30340;&#32452;&#20214;&#65292;&#20808;&#26377;google&#20869;&#37096;&#30340;Chubby&#65292;&#21518;&#26377;hadoop&#29983;&#24577;&#30340;zookeeper&#12290;&#22522;&#20110;Java&#30340;zookeeper&#20445;&#35777;CP&#65292;&#20294;&#26159;&#24265;&#39047;&#32769;&#30691;&#65292;&#20197;&#24448;&#26366;&#26377;&#21516;&#20107;&#26366;&#32463;&#27979;&#35797;&#36807;&#22312;&#19977;&#21315;&#24038;&#21491;&#30340;&#23458;&#25143;&#31471;&#30340;&#39057;&#32321;&#35835;&#20889;&#24773;&#20917;&#19979;zookeeper&#20250;&#39057;&#32321;&#27515;&#25481;&#12290;&#21644;zookeeper&#31561;&#21516;&#31867;&#20135;&#21697;&#30456;&#27604;&#65292;coreos&#24320;&#21457;&#30340;&#21516;&#26679;&#20445;&#35777;CP&#30340;etcd&#19982;&#20854;&#21151;&#33021;&#20960;&#20046;&#38647;&#21516;&#65292;&#20294;&#26159;zookeeper&#30340;&#35774;&#35745;&#21644;&#23454;&#29616;&#37117;&#24456;&#32321;&#29712;&#65292;&#32780;&#37319;&#29992;&#20102;gRPC&#20316;&#20026;&#24213;&#23618;&#36890;&#20449;&#26694;&#26550;&#30340;etcd&#20960;&#20046;&#26377;&#25152;&#26377;&#30452;&#27969;&#35821;&#35328;&#30340;&#23458;&#25143;&#31471;&#25903;&#25345;&#12290;zookeeper&#30340;&#36890;&#20449;&#21327;&#35758;&#26159;&#33258;&#23450;&#21046;&#30340;Jute RPC&#21327;&#35758;&#65292;&#32780;etcd&#20351;&#29992;&#30340;gRPC&#21487;&#20197;&#25509;&#25910;&#36890;&#36807;HTTP&#21457;&#26469;&#30340;JSON&#35831;&#27714;&#65292;&#36890;&#36807;curl&#24037;&#20855;&#23601;&#21487;&#20197;&#23545;etcd&#36827;&#34892;&#27979;&#35797;&#12290;&#23481;&#22120;&#26102;&#20195;&#30340;&#29579;&#32773;kubuernets&#20381;&#36182;&#23427;&#21487;&#23454;&#29616;&#19978;&#19975;&#20010;&#23481;&#22120;&#30340;&#31649;&#29702;&#12290;</p>\n<p>etcd&#25552;&#20379;&#20102;leader&#36873;&#20030;&#12289;&#20998;&#24067;&#24335;&#26102;&#38047;&#12289;&#20998;&#24067;&#24335;&#38145;&#12289;&#25345;&#32493;&#30417;&#25511;&#65288;watch&#65289;&#21644;&#38598;&#32676;&#20869;&#21508;&#20010;&#25104;&#21592;&#30340;liveness&#30417;&#25511;&#31561;&#21151;&#33021;&#12290;zookeer&#34429;&#28982;&#20063;&#23454;&#29616;&#20102;&#31867;&#20284;&#30340;&#21151;&#33021;&#65292;&#20294;&#26159;&#19981;&#26041;&#20415;&#26131;&#29992;&#65292;&#36824;&#38656;&#20511;&#21161;Netflix&#25552;&#20379;&#30340;Apache Curator&#24211;&#12290;</p>\n<p>etcd&#30446;&#21069;&#20027;&#35201;&#26377;v2&#21644;v3&#20004;&#20010;&#29256;&#26412;&#65292;&#20294;v3&#27604;v2&#22312;API&#23618;&#20570;&#20102;&#22823;&#24133;&#24230;&#30340;&#20248;&#21270;&#65292;&#19988;etcd2&#23458;&#25143;&#31471;&#32463;&#36807;&#35299;&#26512;&#20248;&#21270;&#21518;&#19982;etcd3&#30340;&#28040;&#24687;&#22788;&#29702;&#24615;&#33021;&#20173;&#28982;&#26377;2&#20493;&#30340;&#24046;&#36317;&#65292;&#32780;v2&#30340;JSON&#22806;&#37096;&#21327;&#35758;&#21644;&#38598;&#32676;&#20869;&#37096;&#21327;&#35758;&#22312;v3&#20013;&#21516;&#26679;&#25903;&#25345;&#65292;&#25152;&#20197;&#26412;&#25991;&#20197;v3&#20026;&#20027;&#12290;&#20010;&#20154;&#20351;&#29992;etcd&#30340;&#20307;&#20250;&#65306;etcd&#19982;&#20854;&#35828;&#26159;&#19968;&#20010;&#25552;&#20379;&#19968;&#33268;&#24615;&#26381;&#21153;&#30340;&#20998;&#24067;&#24335;&#31995;&#32479;&#65292;&#19981;&#22914;&#35828;&#26159;&#19968;&#20010;&#20998;&#24067;&#24335;kv&#25968;&#25454;&#24211;&#12290;</p>\n<p><a href=\"https://github.com/coreos/etcd/blob/master/Documentation/learning/why.md\">&#21442;&#32771;&#25991;&#26723;21</a>&#25552;&#21040;etcd&#21517;&#23383;&#30340;&#30001;&#26469;&#65306;unix&#31995;&#32479;&#30340;&#30446;&#24405;/etc&#26159;&#23384;&#20648;&#37197;&#32622;&#25991;&#20214;&#30340;&#22320;&#26041;&#65292;&#21518;&#26469;&#20877;&#21152;&#19978;&#19968;&#20010;&#20195;&#34920;distributed systems&#30340;&rdquo;d&rdquo;&#23601;&#32452;&#25104;&#20102;etcd&#12290;&#25152;&#20197;&#35828;etcd&#21487;&#20197;&#34987;&#35748;&#35782;&#26159;&#19968;&#20010;&#20998;&#24067;&#24335;kv&#37197;&#32622;&#39033;&#25968;&#25454;&#24211;&#12290;</p>\n<p><a href=\"https://github.com/coreos/etcd/blob/master/Documentation/learning/data_model.md\">&#21442;&#32771;&#25991;&#26723;23</a>&#25552;&#21040;etcd&#26159;&#19968;&#20010;&#23384;&#20648; <strong>&#26356;&#26032;&#39057;&#29575;&#19981;&#39640;</strong> &#30340;kv&#23384;&#20648;&#24211;&#24182;&#33021;&#25552;&#20379;&#26597;&#35810;&#26381;&#21153;&#65292;&#20854;&#25968;&#25454;&#21482;&#26377;&#19968;&#20010;&#23618;&#32423;&#65292;&#25968;&#25454;&#27169;&#22411;&#37319;&#29992;MVCC&#65292;&#27599;&#20010;key&#21019;&#24314;&#26102;&#20854;&#23454;version&#26159;1&#65292;&#27599;&#27425;&#26356;&#26032;&#25805;&#20316;&#22686;&#19968;&#12290;&#23454;&#38469;etcd&#24213;&#23618;&#30340;boltdb&#37319;&#29992;B+&#26641;&#24418;&#24335;&#23384;&#20648;kv&#30340;MVCC&#25968;&#25454;&#65292;&#27599;&#27425;&#20462;&#25913;&#30340;&#25968;&#25454;&#21482;&#23384;&#20648;&#22686;&#37327;&#29256;&#26412;&#65292;&#25152;&#20197;&#21019;&#24314;snapshot&#30340;&#25104;&#26412;&#20063;&#26159;&#25402;&#39640;&#30340;&#12290;kv&#20013;&#30340;key&#26159;&#19968;&#20010;&#19977;&#20803;&#32452;(major, sub, type)&#65292;Major&#23384;&#20648;&#20102;key&#30340;revision&#65292;Sub&#21017;&#23384;&#20648;&#20102;&#21516;&#26679;revision&#19979;&#30340;&#24046;&#24322;&#65292;type&#21017;&#26159;&#19968;&#20010;&#21518;&#32512;&#65292;&#29992;&#20110;&#25351;&#26126;&#19968;&#20123;&#29305;&#27530;value&#30340;&#31867;&#22411;&#65292;&#22914;&#26524;&#24403;&#21069;value&#20013;&#26377;tombstone&#21017;type&#20026;t&#12290;B+&#26641;&#30340;key&#25353;&#29031;&#35789;&#20856;&#39034;&#24207;&#36827;&#34892;&#25490;&#24207;&#12290;etcd&#22312;&#20869;&#23384;&#20013;&#23545;key&#30340;revision&#20063;&#26159;&#20197;B+&#26641;&#32452;&#32455;&#36215;&#26469;&#24418;&#25104;&#19968;&#20010;&#32034;&#24341;&#65292;value&#25351;&#38024;&#25351;&#21521;&#30913;&#30424;&#20013;&#30456;&#24212;&#22320;&#22686;&#37327;&#20540;&#65292;&#36825;&#31181;&#32452;&#32455;&#24418;&#24335;&#20415;&#20110;&#36827;&#34892;iteration&#12290;</p>\n<p>etcd&#36824;&#25552;&#20379;&#20102;&#19968;&#20010;&#23458;&#25143;&#31471;&#24037;&#20855;<a href=\"https://github.com/coreos/etcd/blob/master/etcdctl/README.md\">etcdctl</a>&#65292;&#20851;&#20110;&#20854;&#35814;&#32454;&#29992;&#27861;&#35265;&#21442;&#32771;&#25991;&#26723;22&#12290;</p>\n<h3 id=\"toc_2\">1 &#38745;&#24577;&#38598;&#32676;</h3>\n<hr>\n<p>&#20851;&#20110;&#38598;&#32676;&#22914;&#20309;&#37096;&#32626;&#65292;&#20854;&#23454;&#21442;&#32771;&#25991;&#26723;1&#24050;&#32463;&#26377;&#35814;&#32454;&#35828;&#26126;&#65292;&#26412;&#33410;&#21482;&#35828;&#26126;&#25105;&#33258;&#24049;&#27979;&#35797;&#26102;&#30340;&#20351;&#29992;&#26041;&#24335;&#12290;</p>\n<p>etcd&#21333;&#33410;&#28857;&#21551;&#21160;&#21629;&#20196;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>etcd --name=${name} \\\n    --data-dir=${data_dir} \\\n    --wal-dir=${wal_dir} \\\n    --auto-compaction-retention=1 \\\n    --snapshot-count=5000  \\\n    --quota-backend-bytes=$((160*1024*1024*1024)) \\\n    --heartbeat-interval=100 \\\n    --election-timeout=500 \\\n    --max-request-bytes 1536 \\\n    --initial-advertise-peer-urls http://${ip}:${peer_port} \\\n    --listen-peer-urls http://${ip}:${peer_port} \\\n    --listen-client-urls http://${ip}:${client_port},http://127.0.0.1:${client_port} \\\n    --advertise-client-urls http://${ip}:${client_port} \\\n    --initial-cluster-token ${cluster_name} \\\n    --initial-cluster etcd_node0=http://${ip}:${peer_port},etcd_node1=http://${peer1_ip}:${peer1_peer_port},etcd_node2=http://${peer2_ip}:${peer2_peer_port} \\\n    --initial-cluster-state new  &gt;&gt; ${log_dir}/${name}.log 2&gt;&amp;1 &amp;</code>\n</pre>\n</div>\n<p>&#21508;&#20010;&#21442;&#25968;&#30340;&#35814;&#32454;&#24847;&#20041;&#35265;&#21442;&#32771;&#25991;&#26723;17&#65292;&#19979;&#38754;&#21015;&#20986;&#19968;&#20123;&#20027;&#35201;&#21442;&#25968;&#30340;&#21547;&#20041;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>1 name&#26159;node&#30340;&#21517;&#31216;&#65292;&#29992;&#20110;&#22312;&#38598;&#32676;&#20013;&#26631;&#35782;&#24403;&#21069;&#33410;&#28857;&#65292;etcd&#21333;&#33410;&#28857;&#20801;&#35768;&#36801;&#31227;&#65292;&#36801;&#31227;&#21518;&#21517;&#31216;&#19981;&#21464;&#21363;&#21487;&#34987;&#20854;&#20182;&#33410;&#28857;&#35782;&#21035;&#65307;</li>\n<li>2 etcd&#24213;&#23618;&#20351;&#29992;&#30340;kv&#25968;&#25454;&#24211;coreos/bbolt&#26159;&#31867;&#20284;&#20110;Rocksdb&#30340;&#19968;&#20010;LSM&#25968;&#25454;&#24211;&#23454;&#29616;&#65292;&#19982;Rocksdb&#19968;&#26679;&#25968;&#25454;&#26377;wal&#21644;data&#20004;&#31181;&#65292;&#24314;&#35758;&#20004;&#31181;&#25968;&#25454;&#20998;&#21035;&#23384;&#20648;&#21040;&#19981;&#21516;&#30340;&#23384;&#20648;&#31995;&#32479;&#19978;&#65292;&#20197;&#20445;&#35777;&#25968;&#25454;&#23433;&#20840;&#21644;&#31995;&#32479;&#24615;&#33021;&#65307;</li>\n<li>3 etcd&#24213;&#23618;&#20351;&#29992;&#30340;coreos/bbolt&#31867;&#20284;&#20110;rocksdb&#20250;&#23450;&#26399;&#20570;compaction&#20197;&#28165;&#38500;&#36807;&#26399;&#25968;&#25454;&#65292;&#19978;&#38754;&#30340;auto-compaction-retention&#25351;&#23450;&#30340;&#26102;&#38388;&#21333;&#20301;&#26159;&#23567;&#26102;&#65292;&#24403;&#28982;&#20063;&#21487;&#20197;&#20511;&#21161;&#24037;&#20855;etcdctl&#24378;&#34892;&#36827;&#34892;compaction&#65292;&#20351;&#29992;&#26041;&#27861;&#35814;&#35265;&#21442;&#32771;&#25991;&#26723;9#History compaction#&#19968;&#33410;&#65307;</li>\n<li>4 &#21442;&#32771;&#25991;&#26723;9#Space quota#&#19968;&#33410;&#24314;&#35758;&#32473;etcd&#38480;&#23450;&#30913;&#30424;&#20351;&#29992;&#37327;&#65292;&#20197;&#38450;&#27490;etcd&#26080;&#38480;&#24230;&#30340;&#20351;&#29992;&#30913;&#30424;&#23548;&#33268;&#30913;&#30424;&#29190;&#28385;&#21518;&#20877;&#21435;&#20570;compaction&#23548;&#33268;&#31995;&#32479;&#21709;&#24212;&#36895;&#24230;&#19979;&#38477;&#36827;&#32780;&#23548;&#33268;&#31995;&#32479;&#19981;&#31283;&#23450;&#65292;&#24403;etcd&#20351;&#29992;&#30340;&#30913;&#30424;&#39069;&#24230;&#21040;&#36798;&#38480;&#23450;&#39069;&#24230;&#30340;&#26102;&#20505;&#20250;&#21457;&#20986;cluster&#32423;&#21035;&#30340;alarm&#20351;&#38598;&#32676;&#36827;&#20837;maintenance&#27169;&#24335;&#65292;&#21482;&#25509;&#25910;&#35835;&#21644;&#21024;&#38500;&#35831;&#27714;&#65292;&#24403;&#36827;&#34892;compaction&#21644;defragmenting(&#30862;&#29255;&#21270;&#25972;&#29702;)&#23436;&#27605;&#30041;&#20986;&#36275;&#22815;&#31354;&#38388;&#30340;&#26102;&#20505;&#25165;&#20250;&#22238;&#21040;&#27491;&#24120;&#24037;&#20316;&#29366;&#24577;&#65307;</li>\n<li>5 max-request-bytes&#21487;&#20197;&#38480;&#21046;key&#30340;&#26368;&#22823;&#38271;&#24230;&#65292;&#27492;&#22788;&#38480;&#21046;&#38271;&#24230;&#20026;15KiB&#65307;</li>\n<li>5 initial-cluster-token&#29992;&#20110;&#26631;&#35782;&#38598;&#32676;&#30340;&#21517;&#31216;&#65292;initial-cluster&#21017;&#32473;&#20986;&#20102;&#38745;&#24577;cluster&#30340;&#21508;&#20010;&#25104;&#21592;&#30340;&#21517;&#31216;&#20197;&#21450;&#22320;&#22336;&#65307;</li>\n<li>6 initial-cluster-state&#35828;&#26126;&#21333;&#33410;&#28857;&#21551;&#21160;&#26102;&#20505;&#30340;&#29366;&#24577;&#65292;&#33410;&#28857;&#37325;&#21551;&#26102;&#36825;&#20010;&#21442;&#25968;&#20540;&#25913;&#20026; <strong>existing</strong>&#65307;</li>\n<li>7 initial-cluster&#21015;&#20986;&#20102;cluster&#30340;&#21021;&#22987;&#25104;&#21592;&#65292;cluster&#21551;&#21160;&#21518;&#21487;&#36890;&#36807;&#21629;&#20196; <strong>etcdctl member update</strong> &#36827;&#34892;&#26356;&#25913;&#65307;</li>\n<li>8 --force-new-cluster&#36825;&#20010;&#36873;&#39033;&#29992;&#20110;&#21019;&#24314;&#19968;&#20010;&#21333;&#33410;&#28857;&#38598;&#32676;&#65307;</li>\n</ul>\n<p>&#38598;&#32676;&#37096;&#32626;&#23436;&#27605;&#21518;&#65292;&#21487;&#20197;&#20511;&#21161;etcdctl&#26597;&#30475;&#38598;&#32676;&#30340;&#25104;&#21592;&#21015;&#34920;&#20197;&#21450;&#38598;&#32676;&#36816;&#34892;&#29366;&#24577;&#12290;etcdctl&#33258;&#36523;&#20063;&#20998;&#20026;v2&#21644;v3&#20004;&#20010;&#29256;&#26412;&#65292;&#38598;&#32676;&#29366;&#24577;&#30340;&#26597;&#30475;&#21487;&#20511;&#21161;&#20854;v2&#29256;&#26412;&#65292;&#20351;&#29992;&#26041;&#24335;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>export ETCDCTL_API=2\necho \"-----------------member list----------------\"\netcdctl --endpoints=&ldquo;http://localhost:2379&rdquo; member list\necho \"-----------------cluster health-------------\"\netcdctl --endpoints=&ldquo;http://localhost:2379&ldquo; cluster-health</code>\n</pre>\n</div>\n<p>&#38745;&#24577;&#38598;&#32676;&#33258;&#36523;&#20063;&#26159;&#21487;&#20197;&#25193;&#23481;&#30340;&#65292;&#20855;&#20307;&#25193;&#23481;&#26041;&#27861;&#35265;&#21442;&#32771;&#25991;&#26723;6&#21644;&#21442;&#32771;&#25991;&#26723;7&#12290;</p>\n<h3 id=\"toc_3\">1.1 &#26356;&#25913;client&#30340;advertise-client-urls</h3>\n<hr>\n<p>&#21442;&#32771;&#25991;&#26723;7#Update advertise client URLs#&#25552;&#21040;&#22914;&#26524;&#24819;&#26356;&#25913;&#36825;&#20010;&#21442;&#25968;&#65292;&#21482;&#38656;&#35201;&#22312;&#37197;&#32622;&#25991;&#20214;&#20013;&#25226;&#21442;&#25968;&#20540;&#26356;&#25913;&#21518;&#65292;&#37325;&#21551;&#23454;&#20363;&#21363;&#21487;&#12290;</p>\n<h3 id=\"toc_4\">1.2 &#26356;&#25913;client&#30340;advertise-peer-urls</h3>\n<hr>\n<p>&#21442;&#32771;&#25991;&#26723;7#Update advertise peer URLs#&#32473;&#20986;&#20102;&#26356;&#25913;&#36825;&#20010;&#21442;&#25968;&#30340;&#26041;&#27861;&#65306;</p>\n<ul>\n<li>1 &#25191;&#34892;&#21629;&#20196; <strong>etcdctl member update a8266ecf031671f3 http://10.0.1.10:2380</strong> &#20197;&#21578;&#30693;cluster&#20869;&#20854;&#20182;&#25104;&#21592;&#36825;&#20010;&#33410;&#28857;&#30340;&#26032;&#22320;&#22336;&#65307;</li>\n<li>2 &#26356;&#25913;&#33410;&#28857;&#37197;&#32622;&#65292;&#37325;&#21551;&#33410;&#28857;&#65292;&#20197;&#24674;&#22797;&#33410;&#28857;&#30340;quorum&#12290;</li>\n</ul>\n<h3 id=\"toc_5\">1.3 &#28155;&#21152;&#19968;&#20010;&#33410;&#28857;</h3>\n<hr>\n<p>&#20855;&#20307;&#35814;&#32454;&#27493;&#39588;&#35265;&#21442;&#32771;&#25991;&#26723;7#Add a New Member#&#19968;&#33410;&#65292;&#19979;&#38754;&#32473;&#20986;&#25805;&#20316;&#36807;&#31243;&#65306;</p>\n<ul>\n<li>\n<p>1 ETCDCTL<em>API=3 etcdctl --endpoints=http://192.168.11.1:2379,http://192.168.11.1:12379,http://192.168.11.1:22379 member add etcd</em>node3 --peer-urls=https://ift.tt/2TJK7yS</p>\n<p>ETCD<em>NAME=\"etcd</em>node3\" ETCD<em>INITIAL</em>CLUSTER=\"etcd<em>node1=http://192.168.11.1:12380,etcd</em>node2=http://192.168.11.1:22380,etcd<em>node0=http://192.168.11.1:2380,etcd</em>node3=https://ift.tt/2TJK7yS\" ETCD<em>INITIAL</em>CLUSTER_STATE=\"existing\"</p>\n</li>\n<li>\n<p>2 etcd --name=etcd<em>node3 \\<br>\n--data-dir=/tmp/etcd/etcd</em>node3/./data/ \\<br>\n--wal-dir=/tmp/etcd/etcd<em>node3/./wal/ \\<br>\n--listen-peer-urls=https://ift.tt/2An05pD \\<br>\n--initial-advertise-peer-urls=https://ift.tt/2An05pD \\<br>\n--listen-client-urls=http://192.168.11.100:32379,http://127.0.0.1:32379 \\<br>\n--advertise-client-urls=https://ift.tt/2TJK85U \\<br>\n--initial-cluster-state=existing \\<br>\n--initial-cluster=\"etcd</em>node2=http://192.168.11.100:22380,etcd<em>node1=http://192.168.11.100:12380,etcd</em>node0=http://192.168.11.100:2380,etcd_node3=http://192.168.11.100:32380\"</p>\n</li>\n</ul>\n<p>&#19968;&#23450;&#35201;&#27880;&#24847;&#65292;&rdquo;initial-cluster&rdquo;&#37324;&#38754;&#19968;&#23450;&#35201;&#26377;&#26032;&#25104;&#21592;&#30340;peer&#22320;&#22336;&#12290;&#21442;&#32771;&#25991;&#26723;7#Strict Reconfiguration Check Mode#&#25552;&#21040;&#65306;etcdctl&#25191;&#34892;&#23436;&#27605;&rdquo;etcdctl member add&ldquo;&#21518;&#65292;etcd cluster&#23601;&#25226;&#36825;&#20010;&#36824;&#26410;&#23384;&#22312;&#30340;node&#31639;&#36827;quorum&#20102;&#65292;<strong>&#31532;&#20108;&#27493;&#24517;&#39035;&#20934;&#30830;&#23436;&#25104;</strong>&#12290;</p>\n<div>\n<pre>\n<code>&#22914;&#26524;&#20165;&#20165;&#36890;&#36807;&#21629;&#20196;&rdquo;etcdctl member add&ldquo;&#28155;&#21152;&#19968;&#20010;&#33410;&#28857;&#65292;&#20294;&#26159;&#19981;&#28155;&#21152;&#23454;&#38469;&#33410;&#28857;&#65292;&#28982;&#21518;&#23601;&#36890;&#36807;&rdquo;etcdctl member remove&ldquo;&#21024;&#38500;&#65292;&#21017;&#20250;&#24471;&#21040;&#22914;&#19979;&#32467;&#26524;&#65306;\n\n$ ETCDCTL_API=3 etcdctl --endpoints=http://192.168.11.100:2379,http://192.168.11.100:12379,http://192.168.11.100:22379 member add    etcd_node3 --peer-urls=http://192.168.11.100:32380\nMember e9cfc62cee5f30d1 added to cluster 63e8b43e8a1af9bc\n\nETCD_NAME=&ldquo;etcd_node3&rdquo;\nETCD_INITIAL_CLUSTER=&ldquo;etcd_node2=http://192.168.11.100:22380,etcd_node1=http://192.168.11.100:12380,etcd_node0=http://192.168.11.100:2380,etcd_node3=http://192.168.11.100:32380&rdquo;\nETCD_INITIAL_ADVERTISE_PEER_URLS=&ldquo;http://192.168.11.100:32380&rdquo;\nETCD_INITIAL_CLUSTER_STATE=&ldquo;existing&rdquo;\n\n$ etcdctl member remove 63e8b43e8a1af9bc\nCouldn't find a member in the cluster with an ID of 63e8b43e8a1af9bc.</code>\n</pre>\n</div>\n<p>&#21487;&#35265;&#22914;&#26524;&#19981;&#28155;&#21152;&#33410;&#28857;&#65292;&#36825;&#20010;&#29702;&#35770;&#19978;&#23384;&#22312;&#20294;&#26159;&#23454;&#38469;&#19978;&#19981;&#23384;&#22312;&#30340;node&#26159;&#19981;&#21487;&#33021;&#20174;quorum&#20013;&#21076;&#38500;&#25481;&#30340;&#12290;</p>\n<h3 id=\"toc_6\">1.4 &#21024;&#38500;&#19968;&#20010;&#33410;&#28857;</h3>\n<hr>\n<p>&#20855;&#20307;&#35814;&#32454;&#27493;&#39588;&#35265;&#21442;&#32771;&#25991;&#26723;7#Remove a New Member#&#19968;&#33410;&#65292;&#19968;&#20010;&#21629;&#20196;&#21363;&#21487;&#23436;&#25104;&#20219;&#21153;&#65306;</p>\n<div>\n<pre>\n<code>$ etcdctl member remove a8266ecf031671f3\nRemoved member a8266ecf031671f3 from cluster</code>\n</pre>\n</div>\n<p>&#22312;&#21442;&#32771;&#25991;&#26723;7#Error Cases When Adding Members#&#19968;&#23567;&#33410;&#20013;&#65292;&#25552;&#21040;&#19968;&#20010;node&#34987;remove&#21518;&#65292;&#22914;&#26524;&#20877;&#27425;&#37325;&#26032;&#21551;&#21160;&#65292;&#21017;&#20250;&#24471;&#21040;&#22914;&#19979;&#38169;&#35823;&#25552;&#31034;&#65306;</p>\n<div>\n<pre>\n<code>$ etcd\netcd: this member has been permanently removed from the cluster. Exiting.\nexit 1</code>\n</pre>\n</div>\n<h2 id=\"toc_7\">2 &#21160;&#24577;&#38598;&#32676;</h2>\n<hr>\n<p>&#24403;&#21487;&#20197;&#39044;&#20272;etcd&#38598;&#32676;&#30340;&#20351;&#29992;&#37327;&#20197;&#21450;&#26126;&#30830;&#30693;&#36947;&#38598;&#32676;&#30340;&#25104;&#21592;&#30340;&#26102;&#20505;&#65292;&#21487;&#20197;&#38745;&#24577;&#26041;&#24335;&#37096;&#32626;&#38598;&#32676;&#12290;&#20294;&#22823;&#37096;&#20998;&#24773;&#20917;&#19979;&#36825;&#20004;&#20010;&#26080;&#27861;&#30830;&#23450;&#30340;&#26102;&#20505;&#65292;&#21487;&#20197;&#20351;&#29992;&#21160;&#24577;&#26041;&#24335;&#37096;&#32626;&#38598;&#32676;&#12290;</p>\n<p>&#21160;&#24577;&#26041;&#24335;&#37096;&#32626;etcd&#38598;&#32676;&#20381;&#36182;&#20110;etcd&#20855;&#22791;&#30340;&#21160;&#24577;&#21457;&#29616;(&#23448;&#25991;&#25104;&#20026;discovery)&#21151;&#33021;&#65306;&#21487;&#20197;&#20351;&#29992;&#24050;&#26377;&#30340;etcd&#38598;&#32676;&#25110;&#32773;dns&#26381;&#21153;&#20316;&#20026;etcd&#36890;&#20449;&#25968;&#25454;pubsub&#33410;&#28857;&#65292;&#23454;&#29616;&#21478;&#19968;&#20010;&#38598;&#32676;&#20013;&#21508;&#20010;&#24050;&#26377;&#25104;&#21592;&#20043;&#38388;&#30340;&#26381;&#21153;&#21457;&#29616;&#21644;&#26032;&#25104;&#21592;&#30340;&#21152;&#20837;&#65292;&#36827;&#32780;&#23454;&#29616;&#38598;&#32676;&#30340;&#25193;&#23637;&#12290;</p>\n<p>&#20010;&#20154;&#20542;&#21521;&#20110;&#20197;&#19968;&#20010;&#25968;&#37327;&#26377;&#38480;&#19988;&#21387;&#21147;&#19981;&#22823;&#30340;&#38745;&#24577;&#38598;&#32676;&#20316;&#20026;&#21160;&#24577;&#38598;&#32676;&#21508;&#20010;&#33410;&#28857;&#30340;discovery&#30340;&#22522;&#30784;&#12290;&#20010;&#20154;&#20351;&#29992;Elasticsearch&#22810;&#24180;&#65292;&#36825;&#31181;&#20351;&#29992;&#26041;&#24335;&#20854;&#23454;&#19982;Elasticsearch&#38598;&#32676;&#30340;&#37096;&#32626;&#26041;&#24335;&#38647;&#21516;&#65306;&#20808;&#37096;&#32626;&#33509;&#24178;&#20197;&#25511;&#21046;&#35282;&#33394;&#21551;&#21160;&#30340;Elasticsearch&#33410;&#28857;&#32452;&#25104;&#19968;&#20010;discovery&#20013;&#24515;&#65292;&#28982;&#21518;&#21508;&#20010;&#20197;&#25968;&#25454;&#33410;&#28857;&#35282;&#33394;&#21551;&#21160;&#30340;Elasticsearch&#36890;&#36807;&#36825;&#20010;discovery&#20013;&#24515;&#23454;&#29616;&#26381;&#21153;&#21457;&#29616;&#12290;&#21487;&#35265;&#22823;&#36947;&#25152;&#34892;&#22788;&#65292;&#25104;&#29087;&#30340;&#26550;&#26500;&#38647;&#21516;&#12290;</p>\n<p>&#22312;&#19968;&#20010;&#38745;&#24577;&#38598;&#32676;&#19978;&#21019;&#24314;channel&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>curl -X PUT \"http://${registry_url}/v2/keys/discovery/testdiscoverycluster/_config/size\" -d value=3</code>\n</pre>\n</div>\n<p>&#21160;&#24577;&#38598;&#32676;etcd&#21333;&#33410;&#28857;&#21551;&#21160;&#21629;&#20196;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>etcd --name=${name} \\\n    --data-dir=${data_dir} \\\n    --wal-dir=${wal_dir} \\\n    --auto-compaction-retention=1 \\\n    --snapshot-count=5000  \\\n    --quota-backend-bytes=$((160*1024*1024*1024)) \\\n    --heartbeat-interval=100 \\\n    --election-timeout=500 \\\n    --max-request-bytes 1536 \\\n    --initial-advertise-peer-urls http://${ip}:${peer_port} \\\n    --listen-peer-urls http://${ip}:${peer_port} \\\n    --listen-client-urls http://${ip}:${client_port},http://127.0.0.1:${client_port} \\\n    --advertise-client-urls http://${ip}:${client_port} \\\n    --discovery http://localhost:2379/v2/keys/discovery/testdiscoverycluster \\\n    --initial-cluster-token ${cluster_name} &gt;&gt; ${log_dir}/${name}.log 2&gt;&amp;1 &amp;</code>\n</pre>\n</div>\n<p>&#21487;&#35265;&#19981;&#38656;&#35201;&#20877;&#25351;&#23450;&#38598;&#32676;&#20869;&#30340;&#21508;&#20010;&#25104;&#21592;&#65292;&#21482;&#38656;&#35201;&#25351;&#23450;discovery channel&#21363;&#21487;&#12290;</p>\n<h2 id=\"toc_8\">3 &#27979;&#35797;</h2>\n<hr>\n<p>&#20026;&#20102;&#27979;&#35797;&#20004;&#31181;&#38598;&#32676;&#27169;&#24335;&#23545;&#38598;&#32676;&#25104;&#21592;&#21464;&#21160;&#30340;&#21453;&#24212;&#65292;&#20998;&#21035;&#36827;&#34892;&#19968;&#31995;&#21015;&#27979;&#35797;&#12290;</p>\n<h2 id=\"toc_9\">3.1 &#38745;&#24577;&#38598;&#32676;&#27979;&#35797;</h2>\n<hr>\n<p>&#38745;&#24577;&#38598;&#32676;&#25104;&#21592;&#22914;&#26524;&#20002;&#22833;&#25968;&#25454;&#25110;&#32773;&#25913;&#21464;&#21517;&#31216;&#65292;&#21017;&#20877;&#27425;&#21152;&#20837;&#38598;&#32676;&#21518;&#19981;&#20250;&#34987;&#25509;&#32435;&#12290;</p>\n<p>&#26377;&#20316;&#35777;&#26126;&#30340;&#27979;&#35797;&#36807;&#31243;1&#22914;&#19979;&#65306;</p>\n<ul>\n<li>1 &#37096;&#32626;&#19968;&#20010;&#38745;&#24577;&#38598;&#32676;&#65307;</li>\n<li>2 &#20197;kill&#26041;&#24335;&#26432;&#27515;&#19968;&#20010;&#25104;&#21592;&#65292;&#28982;&#21518;clear&#25481;&#25968;&#25454;&#65292;&#37325;&#21551;&#22833;&#36133;&#65307;</li>\n</ul>\n<p>&#27492;&#26102;etcd&#30340;log&#26174;&#31034;&#19968;&#20010;critical&#32423;&#21035;&#38169;&#35823;log &ldquo;etcdmain: member 7f198dd1e26bed5a has already been bootstrapped&rdquo;&#12290;</p>\n<p>&#26377;&#20316;&#35777;&#26126;&#30340;&#27979;&#35797;&#36807;&#31243;2&#22914;&#19979;&#65306;</p>\n<ul>\n<li>1 &#37096;&#32626;&#19968;&#20010;&#38745;&#24577;&#38598;&#32676;&#65307;</li>\n<li>2 &#20197;kill&#26041;&#24335;&#26432;&#27515;&#19968;&#20010;&#25104;&#21592;&#65292;&#28982;&#21518;&#32473;&#25104;&#21592;&#19968;&#20010;&#26032;&#21517;&#31216;&#65292;&#37325;&#21551;&#22833;&#36133;&#65307;</li>\n</ul>\n<p>&#27492;&#26102;etcd&#30340;log&#32473;&#20986;critical&#32423;&#21035;&#38169;&#35823;log&ldquo;etcdmain: couldn't find local name \"etcd_node3\" in the initial cluster configuration&rdquo;&#12290;</p>\n<p>&#20462;&#25913;&#21517;&#31216;&#31561;&#21516;&#20110;&#25193;&#20805;&#38598;&#32676;&#65292;&#27491;&#30830;&#30340;&#25805;&#20316;&#27493;&#39588;&#21442;&#35265;#1.3#&#33410;&#12290;</p>\n<h2 id=\"toc_10\">3.2 &#21160;&#24577;&#38598;&#32676;&#27979;&#35797;</h2>\n<hr>\n<p>&#24403;&#21160;&#24577;&#38598;&#32676;&#21551;&#21160;&#21518;&#65292;&#38598;&#32676;&#20869;&#25104;&#21592;&#38388;&#21363;&#21487;&#30456;&#20114;&#36890;&#20449;&#65292;&#19981;&#20381;&#36182;&#20110;&#21407;&#38745;&#24577;&#38598;&#32676;&#12290;&#26377;&#20316;&#35777;&#26126;&#30340;&#27979;&#35797;&#36807;&#31243;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>1 &#37096;&#32626;&#19968;&#20010;&#38745;&#24577;&#38598;&#32676;&#65307;</li>\n<li>2 &#20197;discovery&#26041;&#24335;&#22312;&#38745;&#24577;&#38598;&#32676;&#20043;&#19978;&#20877;&#37096;&#32626;&#19968;&#20010;&#21160;&#24577;&#38598;&#32676;&#65307;</li>\n<li>3 &#26432;&#25481;&#38745;&#24577;&#38598;&#32676;&#21508;&#20010;&#25104;&#21592;&#65307;</li>\n<li>4 &#36890;&#36807;etcdctl&#26597;&#30475;&#21160;&#24577;&#38598;&#32676;&#25104;&#21592;&#21015;&#34920;&#20197;&#21450;&#38598;&#32676;&#29366;&#24577;&#65292;&#25104;&#21592;&#19981;&#21464;&#65292;&#38598;&#32676;&#29366;&#24577;&#26159;healthy&#65307;</li>\n<li>5 &#21521;&#21160;&#24577;&#38598;&#32676;&#28155;&#21152;&#26032;&#25104;&#21592;&#22833;&#36133;&#65307;</li>\n<li>6 &#26432;&#25481;&#19968;&#20010;&#21160;&#24577;&#38598;&#32676;&#25104;&#21592;&#65292;&#20877;&#37325;&#26032;&#21551;&#21160;&#21518;&#25104;&#21151;&#21152;&#20837;&#21160;&#24577;&#38598;&#32676;&#65307;</li>\n<li>7 &#26432;&#25481;&#19968;&#20010;&#21160;&#24577;&#38598;&#32676;&#25104;&#21592;&#65292;&#28165;&#31354;&#20854;data<em>dir&#21644;wal</em>dir&#19979;&#25968;&#25454;&#65292;&#20877;&#37325;&#26032;&#21551;&#21160;&#21518;&#21152;&#20837;&#21160;&#24577;&#38598;&#32676;&#22833;&#36133;&#65307;</li>\n</ul>\n<p>&#21482;&#35201;&#21160;&#24577;&#38598;&#32676;&#29616;&#26377;&#25104;&#21592;&#30340;&#25968;&#25454;&#36824;&#22312;&#65292;&#23601;&#33021;&#20445;&#35777;&#21160;&#24577;&#38598;&#32676;&#33258;&#36523;&#30340;&#31283;&#23450;&#36816;&#34892;&#12304;&#21442;&#32771;&#25991;&#26723;6#Do not use public discovery service for runtime reconfiguration#&#20063;&#35777;&#23454;&#20102;&#36825;&#28857;&#12305;&#12290;&#21448;&#26377;&#20316;&#35777;&#26126;&#30340;&#27979;&#35797;&#36807;&#31243;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>1 &#37096;&#32626;&#19968;&#20010;&#38745;&#24577;&#38598;&#32676;&#65307;</li>\n<li>2 &#20197;discovery&#26041;&#24335;&#22312;&#38745;&#24577;&#38598;&#32676;&#20043;&#19978;&#20877;&#37096;&#32626;&#19968;&#20010;&#21160;&#24577;&#38598;&#32676;&#65307;</li>\n<li>3 &#26432;&#25481;&#21160;&#24577;&#38598;&#32676;&#21508;&#20010;&#25104;&#21592;&#65292;&#28165;&#31354;&#21508;&#20010;&#25104;&#21592;&#25968;&#25454;&#65292;&#28982;&#21518;&#20998;&#21035;&#21551;&#21160;&#20043;&#65292;&#36825;&#20123;&#25104;&#21592;&#21152;&#20837;&#21160;&#24577;&#38598;&#32676;&#22833;&#36133;&#65307;</li>\n<li>4 &#20462;&#25913;&#21508;&#20010;&#25104;&#21592;&#30340;name&#65292;&#28982;&#21518;&#20877;&#21551;&#21160;&#65292;&#21152;&#20837;&#21160;&#24577;&#38598;&#32676;&#25104;&#21151;&#65307;</li>\n</ul>\n<p>&#19978;&#38754;&#26368;&#21518;&#19968;&#27493;&#21551;&#21160;&#30340;&#21508;&#20010;&#33410;&#28857;&#65292;&#20854;&#23454;&#26159;&#20197;&#26032;node&#30340;&#36523;&#20221;&#21152;&#20837;&#20102;&#21407;&#21160;&#24577;&#38598;&#32676;&#12290;</p>\n<h2 id=\"toc_11\">4 &#20998;&#24067;&#24335;&#19968;&#33268;&#24615;</h2>\n<hr>\n<p>&#30446;&#21069;etcd&#30340;&#21516;&#31867;&#20135;&#21697;&#24456;&#22810;&#65292;&#26082;&#26377;&#36890;&#36807;zab&#21327;&#35758;&#23454;&#29616;paxos&#30340;zookeeper&#65292;&#20063;&#26377;kafka&#33258;&#36523;&#22312;topic&#30340;partition&#32423;&#21035;&#23454;&#29616;&#30340;&#31867;&#20284;&#20110;raft&#30340;&#19968;&#33268;&#24615;&#30340;coordinator&#12290;&#20851;&#20110;etcd&#19982;&#21516;&#31867;&#20135;&#21697;&#30340;&#27604;&#36739;&#35814;&#35265;<a href=\"https://github.com/coreos/etcd/blob/master/Documentation/learning/why.md\">&#21442;&#32771;&#25991;&#26723;21</a>&#12290;</p>\n<h3 id=\"toc_12\">4.1 consul &amp; Eureka</h3>\n<hr>\n<p>&#25991;&#31456;&#24320;&#22836;&#25552;&#21450;&#20102;zookeeper&#65292;&#24182;&#32473;&#20986;&#20102;&#20108;&#32773;&#29305;&#24615;&#30340;&#19968;&#20123;&#27604;&#36739;&#65292;&#36825;&#37324;&#20877;&#34917;&#20805;&#19979;consul&#30340;&#30456;&#20851;&#29305;&#24615;&#12290;consul&#33258;&#36523;&#26159;&#19968;&#20010;&#31471;&#21040;&#31471;&#30340;&#26381;&#21153;&#21457;&#29616;&#26694;&#26550;&#12290;&#23427;&#21253;&#25324;&#20102;&#30417;&#25511;&#26816;&#26597;&#12289;&#22833;&#36133;&#25506;&#27979;&#21644;DNS&#33021;&#21147;&#25903;&#25345;&#12290;&#23427;&#20063;&#25552;&#20379;&#20102;&#19968;&#20010;&#24615;&#33021;&#19968;&#33324;&#30340;&#23384;&#20648;&#24341;&#25806;&#20197;&#21450;&#19968;&#32452;&#22797;&#26434;&#30340;API&#25509;&#21475;&#65292;Consul 0.7&#30340;&#23384;&#20648;&#24341;&#25806;&#30340;&#21487;&#25193;&#23637;&#24615;&#19981;&#22909;&#65292;&#24403;key&#30340;&#25968;&#30446;&#36798;&#21040;&#30334;&#19975;&#32423;&#30340;&#26102;&#20505;&#65292;&#20854;&#24310;&#36831;&#21644;&#20869;&#23384;&#21387;&#21147;&#24613;&#21095;&#19978;&#21319;&#12290;&#23427;&#31455;&#28982;&#27809;&#26377;KV&#25509;&#21475;&#65292;&#32780;&#19988;&#19981;&#25552;&#20379;&#22810;&#29256;&#26412;key&#25903;&#25345;&#65292;&#27809;&#26377;&#26465;&#20214;&#20107;&#21153;(conditional transactions)&#25903;&#25345;&#65292;&#20063;&#27809;&#26377;&#27969;&#24335;watch&#21151;&#33021;&#25903;&#25345;&#12290;</p>\n<p>&#24403;&#28982;consul&#21644;etcd&#30340;&#20351;&#29992;&#30446;&#30340;&#19981;&#19968;&#26679;&#65292;&#29992;&#20110;&#35299;&#20915;&#19981;&#21516;&#20351;&#29992;&#22330;&#26223;&#19979;&#30340;&#30456;&#20851;&#38382;&#39064;&#12290;&#22914;&#26524;&#21333;&#32431;&#20174;&#23384;&#20648;&#35282;&#24230;&#26469;&#30475;&#65292;&#24403;&#28982;&#36873;&#25321;etcd&#12290;&#22914;&#26524;&#38656;&#35201;&#31471;&#21040;&#31471;&#30340;&#26381;&#21153;&#21457;&#29616;&#33021;&#21147;&#65292;etcd&#30340;&#29305;&#24615;&#23601;&#19981;&#22815;&#31361;&#20986;&#20102;&#65292;&#21487;&#20197;&#36873;&#25321;Kubernetes&#12289;Consul&#21644;SmartStack&#12290;</p>\n<p>etcd&#25152;&#26377;&#30340;&#25968;&#25454;&#21516;&#27493;&#37117;&#26159;&#22312;&#19968;&#20010;&#21807;&#19968;&#30340;&ldquo;&#22797;&#21046;&#32452;&rdquo;&#65288;consistent replication group&#65289;&#37324;&#36827;&#34892;&#30340;&#12290;&#24403;&#36827;&#34892;&#23569;&#37327;GB&#32423;&#21035;&#30340;&#25968;&#25454;&#25490;&#24207;&#26102;&#65292;etcd&#36824;&#26159;&#33021;&#22815;&#32988;&#20219;&#36825;&#20010;&#24037;&#20316;&#30340;&#65292;&#27599;&#27425;&#25913;&#21160;leader&#37117;&#20250;&#32473;&#36825;&#20010;&#21160;&#20316;&#20998;&#37197;&#19968;&#20010;cluster&#32423;&#21035;&#30340;&#21807;&#19968;ID&#12304;revision ID&#12305;&#65292;&#36825;&#20010;ID&#26159;&#20840;&#23616;&#21333;&#35843;&#36882;&#22686;&#30340;&#12290;&#21807;&#19968;&#30340;&ldquo;&#22797;&#21046;&#32452;&rdquo;&#24847;&#21619;&#30528;etcd cluster&#30340;&#25968;&#25454;&#26159;&#19981;&#33021;&#25193;&#23637;&#25110;&#32773;&#35828;&#26159;&#19981;&#33021;&#20998;&#21306;(sharding)&#30340;&#65292;&#22914;&#26524;&#38656;&#35201;&#36890;&#36807;&#22810;raft group&#25552;&#20379;sharding&#30340;&#33021;&#21147;&#23601;&#21482;&#33021;&#20351;&#29992;NewSQL&#32780;&#38750;etcd&#20102;&#12290;</p>\n<p><a href=\"http://dockone.io/article/801\">&#21442;&#32771;&#25991;&#26723;28</a>&#19968;&#25991;&#20013;&#65292;etcd &#30340;&#20316;&#32773;&#26446;&#21709;&#25552;&#21040;&#65306;<code>Consul&#26159;&#20010;full stack&#30340;&#24037;&#20855;&#12290;etcd&#21482;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340;&#19968;&#33268;&#24615;kv&#12290;&#25105;&#20204;&#35748;&#20026;&#33021;&#25226;&#19968;&#33268;&#24615;kv&#36825;&#20214;&#20107;&#24773;&#23436;&#25972;&#30340;&#20570;&#22909;&#24050;&#32463;&#19981;&#23481;&#26131;&#20102;&#12290;&#25105;&#20204;&#24076;&#26395;&#19978;&#23618;&#30340;&#31995;&#32479;&#21487;&#20197;&#22312;etcd&#19978;&#25645;&#24314;&#65292;&#32780;&#19981;&#26159;&#35753;etcd&#26412;&#36523;&#26381;&#21153;&#26368;&#32456;&#29992;&#25143;&#12290;&#21478;&#22806;&#22312;&#26576;&#20123;&#31243;&#24230;&#19978;&#32780;&#35328;&#65292;Consul&#24182;&#19981;&#30528;&#37325;&#20445;&#35777;&#33258;&#36523;&#30340;&#31283;&#23450;&#24615;&#21644;&#21487;&#38752;&#24615;&#12290;HashiCorp&#33258;&#24049;&#30340;&#35843;&#24230;&#31995;&#32479;nomad&#20063;&#24182;&#27809;&#26377;&#37319;&#29992;Consul&#12290;&#36825;&#20123;&#24046;&#21035;&#23548;&#33268;&#20102;&#24456;&#22810;&#35774;&#35745;&#12289;&#23454;&#29616;&#19978;&#30340;&#19981;&#21516;&#12290;</code></p>\n<p><a href=\"http://calvin1978.blogcn.com/articles/routing.html\">&#21442;&#32771;&#25991;&#26723;29</a>&#25552;&#21040;&#65306;<code>Netflix &#23478;&#20063;&#26377;&#20010; Eureka&#65292;&#30446;&#21069;&#30340;&#29256;&#26412;&#22522;&#20110;RESTFul&#30340;API&#65292; &#25152;&#20197;&#25512;&#36865;&#33021;&#21147;&#27604;&#21069;&#20960;&#23478;&#24369;&#65292;&#38752;&#30528;&#40664;&#35748;&#23450;&#26102;30&#31186;&#30340;&#21047;&#26032;&#65292;Server&#38388;&#35201;&#25968;&#25454;&#21516;&#27493;&#65292;Client&#19982;Server&#35201;&#25968;&#25454;&#21516;&#27493;&#65292;&#25991;&#26723;&#37324;&#35828;&#26368;&#22810;&#20004;&#20998;&#38047;&#25165;&#20445;&#35777;&#36890;&#30693;&#21040;&#25152;&#26377;&#23458;&#25143;&#31471;&#65292;&#19982;ZK&#20204;&#31186;&#32423;&#30340;&#25512;&#36865;&#36895;&#24230;&#30456;&#24046;&#29978;&#36828;&#12290;&#23545;&#20110;&#33041;&#35010;&#30340;&#24773;&#20917;&#65292;Eureka&#30340;&#24577;&#24230;&#26159;&#23425;&#24895;&#20445;&#30041;&#22351;&#25968;&#25454;&#65292;&#19981;&#35201;&#20002;&#22833;&#22909;&#25968;&#25454;&#65292;&#35265;&#20161;&#35265;&#26234;&#12290;</code>&#12290;</p>\n<h3 id=\"toc_13\">4.2 zookeeper</h3>\n<hr>\n<p>&#32771;&#34385;&#21040;zookeeper&#38598;&#32676;&#26159;&#31532;&#19968;&#20010;&#27969;&#34892;&#36215;&#26469;&#30340;&#21516;&#31867;&#32452;&#20214;&#65292;&#24050;&#26377;&#24456;&#22810;&#20998;&#24067;&#24335;&#31995;&#32479;&#24050;&#32463;&#37319;&#29992;&#23427;&#65292;&#36825;&#20123;&#31995;&#32479;&#19981;&#21487;&#33021;&#20026;&#20102;&#20351;&#29992;etcd&#32780;&#37325;&#26032;&#24320;&#21457;&#65292;etcd&#20026;&#20102;&#19982;&#20043;&#20860;&#23481;&#32780;&#22312;etcd v3&#20043;&#19978;&#24320;&#21457;&#20102;&#19968;&#20010;etcd&#20195;&#29702;&#65306;zetcd&#12290;</p>\n<p>etcd v3&#22522;&#20110;grpc&#25552;&#20379;&#20102;REST&#25509;&#21475;&#65292;&#25552;&#20379;&#20102;PUT/DELETE/GET&#31561;&#31867;&#20284;HTTP&#30340;&#24130;&#31561;&#21407;&#35821;&#65292;&#20351;&#20043;&#21487;&#22312;&#21151;&#33021;&#19978;&#19982;zookeeper&#31561;&#21516;&#65292;&#20294;&#26159;&#20351;&#29992;go&#24320;&#21457;&#30340;etcd&#24615;&#33021;&#21487;&#29993;&#22522;&#20110;JVM&#30340;zookeeper&#22909;&#20960;&#26465;&#34903;&#12304;&#21442;&#32771;&#25991;&#26723;2&#12305;&#12290;etcd v3&#30340;&#21327;&#35758;&#19982;zookeeper&#19981;&#21516;&#65292;zetcd&#23558;ZooKeeper&#23458;&#25143;&#31471;&#30340;&#35831;&#27714;&#36716;&#25442;&#20026;&#36866;&#21512;&#20110;etcd&#25968;&#25454;&#27169;&#22411;&#21644;API&#35201;&#27714;&#30340;&#28040;&#24687;&#21457;&#36865;&#32473;etcd&#65292;&#28982;&#21518;&#23558;etcd&#30340;&#21709;&#24212;&#28040;&#24687;&#36716;&#25442;&#21518;&#36820;&#22238;&#32473;&#23458;&#25143;&#31471;&#12290;</p>\n<p>&#20010;&#20154;&#24314;&#35758;&#25226;zetcd&#20316;&#20026;&#26381;&#21153;&#31471;&#29615;&#22659;&#30340;&#22522;&#30784;&#35774;&#32622;&#65292;&#22312;&#20351;&#29992;etcd&#38598;&#32676;&#25552;&#20379;&#30340;&#26381;&#21153;&#30340;&#27599;&#20010;&#31995;&#32479;&#19978;&#37117;&#37096;&#32626;&#19968;&#20010;&#65292;&#25226;&#21407;&#26377;&#20381;&#36182;zookeeper&#26381;&#21153;&#30340;&#31995;&#32479;&#36801;&#31227;&#21040;etcd&#20043;&#19978;&#12290;&#23448;&#26041;&#25991;&#26723;&#12304;&#21442;&#32771;&#25991;&#26723;3&#12305;&#20013;&#25552;&#21040;&#20351;&#29992;proxy&#30340;&#22909;&#22788;&#26159;&#65306;&#24403;etcd cluster&#25104;&#21592;&#21464;&#21160;&#27604;&#36739;&#22823;&#30340;&#26102;&#20505;&#65292;proxy&#33258;&#21160;&#25226;&#22833;&#25928;&#30340;&#25104;&#21592;&#20174;&#21487;&#29992;etcd member list&#20013;&#21076;&#38500;&#25481;&#65292;&#24182;&#21457;&#36865;&#24515;&#36339;&#21253;&#21435;&#25506;&#27979;&#20854;&#26159;&#21542;&#27963;&#36807;&#26469;&#12290;</p>\n<p>&#21442;&#32771;&#25991;&#26723;3&#35828;&#21035;&#25351;&#26395;&#19968;&#20010;proxy&#23545;&#31995;&#32479;&#24615;&#33021;&#25552;&#39640;&#26377;&#22823;&#30340;&#24110;&#21161;&#65292;&#21442;&#32771;&#25991;&#26723;8&#30340;#Limitions#&#25351;&#20986;&#26377;&#20123;&#24773;&#20917;&#19979;&#36824;&#21487;&#33021;&#36896;&#25104;watch&#36820;&#22238;&#30340;&#32467;&#26524;&#19981;&#27491;&#30830;&#12290;</p>\n<p>&#21442;&#32771;&#25991;&#26723;25 &#25552;&#21040; zetcd &#26377;&#19968;&#20010; <code>cross-checking</code> &#24037;&#20316;&#27169;&#24335;&#12290;&#22312; cross-checking &#27169;&#24335;&#19979;&#65292;zetcd &#21516;&#26102;&#36830;&#25509; zookeeper &#38598;&#32676;&#21644; etcd &#38598;&#32676;&#65292;zookeeper &#38598;&#32676;&#31216;&#20026; oracle&#65292;etcd &#38598;&#32676;&#31216;&#20026; candidate&#12290;&#27599;&#27425;&#35835;&#20889;&#35831;&#27714;&#65292;zetcd &#37117;&#20250;&#21516;&#26102;&#21457;&#24448; zookeeper &#21644; etcd&#65292;&#20197; zookeeper &#30340;&#21709;&#24212;&#26816;&#39564; etcd &#30340;&#21709;&#24212;&#65292;&#33509;&#20108;&#32773;&#21709;&#24212;&#32467;&#26524;&#19981;&#19968;&#33268;&#21017;&#21487;&#20197;&#25226;&#32467;&#26524;&#20197; log &#24418;&#24335;&#35760;&#24405;&#19979;&#26469;&#12290;&#20551;&#35774;&#26377;&#19968;&#20010; zookeeper &#21333;&#33410;&#28857;&#20266;&#38598;&#32676; <code>localhost:2182</code>&#65292;&#38169;&#35823;&#26085;&#24535;&#36755;&#20986;&#21040; stderr&#65292;&#21017; cross-checking &#27169;&#24335;&#21551;&#21160;&#21629;&#20196;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>zetcd --zkaddr 0.0.0.0:2181 --endpoints localhost:2379 --debug-zkbridge localhost:2182  --debug-oracle zk --logtostderr -v 9</code>\n</pre>\n</div>\n<p>&#19978;&#38754;&#21629;&#20196;&#34892;&#20013; flag &#21442;&#25968; <code>-zkbridge</code> &#29992;&#26469;&#25351;&#23450;&#19968;&#20010; ZooKeeper &#38598;&#32676;&#65292;<code>-oracle zk</code> &#29992;&#26469;&#21551;&#29992; <code>cross-checking</code> &#24037;&#20316;&#27169;&#24335;&#12290;</p>\n<p>&#33267;&#20110;zetcd&#22914;&#20309;&#20351;&#29992;&#26412;&#25991;&#19981;&#20877;&#35814;&#36848;&#12290;</p>\n<p><a href=\"http://dockone.io/article/801\">&#21442;&#32771;&#25991;&#26723;28</a>&#19968;&#25991;&#20013;&#65292;etcd &#30340;&#20316;&#32773;&#26446;&#21709;&#25552;&#21040;&#65306;<code>etcd&#21644;ZooKeeper&#30340;&#35774;&#35745;&#29702;&#24565;&#21644;&#26041;&#21521;&#19981;&#22826;&#19968;&#26679;&#12290;&#30446;&#21069;etcd&#30528;&#37325;&#20110;go stack&#21644;cloud infra&#39046;&#22495;&#12290;&#24456;&#22810;&#19978;&#23618;&#31995;&#32479;&#20363;&#22914;Kubernetes&#12289;CloudFoundry&#12289;Mesos&#31561;&#37117;&#23545;&#31283;&#23450;&#24615;&#12289;&#25193;&#23637;&#24615;&#26377;&#26356;&#39640;&#30340;&#35201;&#27714;&#12290;&#30001;&#20110;&#29702;&#24565;&#30340;&#19981;&#21516;&#65292;&#23548;&#33268;&#20102;&#24456;&#22810;&#35774;&#35745;&#30340;&#19981;&#21516;&#12290;&#27604;&#22914;etcd&#20250;&#25903;&#25345;&#31283;&#23450;&#30340;watch&#32780;&#19981;&#26159;&#31616;&#21333;&#30340;one time trigger watch&#65292;&#22240;&#20026;&#24456;&#22810;&#35843;&#24230;&#31995;&#32479;&#26159;&#38656;&#35201;&#24471;&#21040;&#23436;&#25972;&#21382;&#21490;&#35760;&#24405;&#30340;&#12290;etcd&#25903;&#25345;mvcc&#65292;&#22240;&#20026;&#21487;&#33021;&#26377;&#21327;&#21516;&#31995;&#32479;&#38656;&#35201;&#26080;&#38145;&#25805;&#20316;&#31561;&#31561;&#12290;&#22312;&#24615;&#33021;&#19978;&#20170;&#21518;etcd&#21487;&#33021;&#20063;&#35201;&#20570;&#26356;&#22810;&#24037;&#20316;&#65292;&#22240;&#20026;container infra&#26377;&#26356;&#22810;&#30340;&#22823;&#35268;&#27169;&#22330;&#26223;&#12290;</code></p>\n<h3 id=\"toc_14\">4.3 etcd v2 &amp; v3</h3>\n<hr>\n<p>etcd &#26368;&#26032;&#29256;&#26412;&#26159; v3&#65292;&#19982;&#20854;&#20197;&#21069;&#30340; v2 &#29256;&#26412;&#26377;&#24456;&#22823;&#19981;&#21516;&#65292;<a href=\"http://dockone.io/article/801\">&#21442;&#32771;&#25991;&#26723;28</a> &#25552;&#21040; <code>etcd 3&#20027;&#35201;&#35299;&#20915;&#22914;&#19979;&#20960;&#20010;&#38382;&#39064;&#65306;&#22810;&#29256;&#26412;&#38190;&#20540;&#65288;MVCC&#65289;&#12289;&#36855;&#20320;&#20107;&#21153;&#65288;mini transcation&#65289;&#12289;&#26356;&#31283;&#23450;&#30340;watch&#12289;&#22823;&#25968;&#25454;&#35268;&#27169;&#12289;&#22823;&#29992;&#25143;watch&#12289;&#24615;&#33021;&#20248;&#21270;&#12290;</code></p>\n<p>etcd v2&#25903;&#25345;CompareAndSwap&#36825;&#20010;&#21407;&#23376;&#24615;&#25805;&#20316;&#12290;CompareAndSwap&#39318;&#20808;&#23545;&#19968;&#20010;key&#36827;&#34892;&#20540;&#27604;&#36739;&#65292;&#22914;&#26524;&#27604;&#36739;&#32467;&#26524;&#19968;&#33268;&#25165;&#20250;&#36827;&#34892;&#19979;&#19968;&#27493;&#30340;&#36171;&#20540;&#25805;&#20316;&#12290;&#20687;&#21033;&#29992;x86&#30340;CAS&#23454;&#29616;&#38145;&#19968;&#26679;&#65292;&#21033;&#29992;CompareAndSwap&#21487;&#20197;&#23454;&#29616;&#20998;&#24067;&#24335;&#30340;&#38145;&#31995;&#32479;&#12290;&#20294;&#26159;&#36825;&#20010; feature &#22312; v3 &#20013;&#31227;&#38500;&#20102;&#12290;</p>\n<p>v3 &#19982; v2 &#30340;&#20027;&#35201;&#23545;&#27604;&#65292;<a href=\"http://dockone.io/article/801\">&#21442;&#32771;&#25991;&#26723;28</a> &#32599;&#21015;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>\n<p>mini transaction&#25903;&#25345;&#21407;&#23376;&#24615;&#27604;&#36739;&#22810;&#20010;&#38190;&#20540;&#24182;&#19988;&#25805;&#20316;&#22810;&#20010;&#38190;&#20540;&#12290;&#20043;&#21069;&#30340;CompareAndSwap&#23454;&#38469;&#19978;&#19968;&#20010;&#38024;&#23545;&#21333;&#20010;key&#30340;mini transaction&#12290;&#19968;&#20010;&#31616;&#21333;&#30340;&#20363;&#23376;&#26159; Tx(compare: A=1 &amp;&amp; B=2, success: C = 3, D = 3, fail: C = 0, D = 0)&#12290;&#24403;etcd&#25910;&#21040;&#36825;&#26465;transcation&#35831;&#27714;&#65292;etcd&#20250;&#21407;&#23376;&#24615;&#30340;&#21028;&#26029;A&#21644;B&#24403;&#21069;&#30340;&#20540;&#21644;&#26399;&#24453;&#30340;&#20540;&#12290;&#22914;&#26524;&#21028;&#26029;&#25104;&#21151;&#65292;C&#21644;D&#30340;&#20540;&#20250;&#34987;&#35774;&#32622;&#20026;3&#12290;</p>\n</li>\n<li>\n<p>etcd 2&#20445;&#23384;&#20102;&#19968;&#20010;&#20165;&#20445;&#23384;&#20102;1000&#20010;&#21382;&#21490;&#26356;&#25913;&#65292;&#22914;&#26524;watch&#36807;&#24930;&#23601;&#26080;&#27861;&#24471;&#21040;&#20043;&#21069;&#30340;&#21464;&#26356;&#12290;etcd 3&#20026;&#20102;&#25903;&#25345;&#22810;&#32426;&#24405;&#65292;&#37319;&#29992;&#20102;&#21382;&#21490;&#35760;&#24405;&#20026;&#20027;&#32034;&#24341;&#30340;&#23384;&#20648;&#32467;&#26500;&#12290;etcd3&#21487;&#20197;&#23384;&#20648;&#19978;&#21313;&#19975;&#20010;&#32426;&#24405;&#65292;&#36827;&#34892;&#24555;&#36895;&#26597;&#35810;&#24182;&#19988;&#25903;&#25345;&#26681;&#25454;&#29992;&#25143;&#30340;&#35201;&#27714;&#36827;&#34892;compaction&#12290;</p>\n</li>\n<li>\n<p>etcd 2&#21644;&#20854;&#23427;&#31867;&#20284;&#24320;&#28304;&#19968;&#33268;&#24615;&#31995;&#32479;&#19968;&#26679;&#26368;&#22810;&#21482;&#33021;&#23384;&#20648;&#25968;&#21313;&#19975;&#32423;&#21035;&#30340;key&#12290;&#20027;&#35201;&#21407;&#22240;&#26159;&#19968;&#33268;&#24615;&#31995;&#32479;&#37117;&#37319;&#29992;&#20102;&#22522;&#20110;log&#30340;&#22797;&#21046;&#65292;log&#19981;&#33021;&#26080;&#38480;&#22686;&#38271;&#65292;&#25152;&#20197;&#22312;&#26576;&#19968;&#26102;&#21051;&#31995;&#32479;&#38656;&#35201;&#20570;&#19968;&#20010;&#23436;&#25972;&#30340;snapshot&#24182;&#19988;&#23558;snapshot&#23384;&#20648;&#21040;&#30913;&#30424;&#12290;&#22312;&#23384;&#20648;snapshot&#20043;&#21518;&#25165;&#33021;&#23558;&#20043;&#21069;&#30340;log&#20002;&#24323;&#12290;&#27599;&#27425;&#23384;&#20648;&#23436;&#25972;&#30340;snapshot&#26159;&#38750;&#24120;&#27809;&#26377;&#25928;&#29575;&#30340;&#65292;&#20294;&#26159;&#23545;&#20110;&#19968;&#33268;&#24615;&#31995;&#32479;&#26469;&#35828;&#35774;&#35745;&#22686;&#37327;snapshot&#20197;&#21450;&#20256;&#36755;&#21516;&#27493;&#22823;&#37327;&#25968;&#25454;&#37117;&#26159;&#38750;&#24120;&#32321;&#29712;&#30340;&#12290;etcd 3&#36890;&#36807;&#23545;raft&#21644;&#23384;&#20648;&#31995;&#32479;&#30340;&#37325;&#26500;&#65292;&#33021;&#22815;&#24456;&#22909;&#30340;&#25903;&#25345;&#22686;&#37327;snapshot&#21644;&#20256;&#36755;&#30456;&#23545;&#36739;&#22823;&#30340;snapshot&#12290;&#30446;&#21069;etcd 3&#21487;&#20197;&#23384;&#20648;&#30334;&#19975;&#21040;&#21315;&#19975;&#32423;&#21035;&#30340;key&#12290;</p>\n</li>\n<li>\n<p>&#21478;&#22806;&#19968;&#20010;&#38382;&#39064;&#26159;&#25903;&#25345;&#22823;&#35268;&#27169;watch&#12290;&#25105;&#20204;&#20027;&#35201;&#24037;&#20316;&#26159;&#20943;&#23567;&#27599;&#20010;watch&#24102;&#26469;&#30340;&#36164;&#28304;&#28040;&#32791;&#12290;&#39318;&#20808;&#25105;&#20204;&#21033;&#29992;&#20102;HTTP/2&#30340;multiple stream per tcp connection&#65292;&#36825;&#26679;&#21516;&#19968;&#20010;client&#30340;&#19981;&#21516;watch&#21487;&#20197;share&#21516;&#19968;&#20010;tcp connection&#12290;&#21478;&#19968;&#26041;&#38754;&#25105;&#20204;&#23545;&#20110;&#21516;&#19968;&#20010;&#29992;&#25143;&#30340;&#19981;&#21516;watch&#21482;&#20351;&#29992;&#19968;&#20010;go routine&#26469;serve&#65292;&#36825;&#26679;&#20877;&#19968;&#27425;&#20943;&#36731;&#20102;server&#30340;&#36164;&#28304;&#28040;&#32791;&#12290;&#12304;v2 &#27599;&#20010;watch&#37117;&#20250;&#21344;&#29992;&#19968;&#20010;tcp&#36164;&#28304;&#21644;&#19968;&#20010;go routine&#36164;&#28304;&#65292;&#22823;&#27010;&#35201;&#28040;&#32791;30-40kb&#12290;&#12305;</p>\n</li>\n<li>\n<p>&#25105;&#20204;&#22312;&#24615;&#33021;&#26041;&#38754;&#20063;&#20570;&#20102;&#24456;&#22810;&#30456;&#20851;&#30340;&#20248;&#21270;&#12290;etcd 3&#30446;&#21069;&#30340;&#24615;&#33021;&#36828;&#24378;&#20110;etcd 2&#65292;&#25105;&#20204;&#30456;&#20449;etcd 3&#30340;&#24615;&#33021;&#22312;&#19981;&#36827;&#34892;&#29305;&#27530;&#20248;&#21270;&#30340;&#24773;&#20917;&#19979;&#23601;&#21487;&#20197;&#36275;&#22815;&#24212;&#20184;&#32477;&#22823;&#37096;&#20998;&#30340;&#20351;&#29992;&#22330;&#26223;&#12290;&#22312;&#19968;&#20010;&#30001;3&#21488;8&#26680;&#33410;&#28857;&#32452;&#25104;&#30340;&#30340;&#20113;&#26381;&#21153;&#22120;&#19978;&#65292;<font><strong>etcd 3&#21487;&#20197;&#20570;&#21040;&#27599;&#31186;&#25968;&#19975;&#27425;&#30340;&#20889;&#25805;&#20316;&#21644;&#21313;&#19975;&#27425;&#35835;&#25805;&#20316;</strong></font>&#12290;</p>\n</li>\n</ul>\n<h3 id=\"toc_15\">4.4 Raft</h3>\n<hr>\n<p><a href=\"https://yuerblog.cc/yuerblog.cc/2017/12/10/principle-about-etcd-v3/\">&#21442;&#32771;&#25991;&#26723;27</a> &#25552;&#21040; Raft &#21327;&#35758;&#20869;&#23481;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>+ &#27599;&#27425;&#20889;&#20837;&#37117;&#26159;&#22312;&#19968;&#20010;&#20107;&#21153;&#65288;tx&#65289;&#20013;&#23436;&#25104;&#30340;&#12290;\n+ &#19968;&#20010;&#20107;&#21153;&#65288;tx&#65289;&#21487;&#20197;&#21253;&#21547;&#33509;&#24178;put&#65288;&#20889;&#20837;K-V&#38190;&#20540;&#23545;&#65289;&#25805;&#20316;&#12290;\n+ etcd&#38598;&#32676;&#26377;&#19968;&#20010;leader&#65292;&#20889;&#20837;&#35831;&#27714;&#37117;&#20250;&#25552;&#20132;&#32473;&#23427;&#12290;\n+ leader&#20808;&#23558;&#25968;&#25454;&#20445;&#23384;&#25104;&#26085;&#24535;&#24418;&#24335;&#65292;&#24182;&#23450;&#26102;&#30340;&#23558;&#26085;&#24535;&#21457;&#24448;&#20854;&#20182;&#33410;&#28857;&#20445;&#23384;&#12290;\n+ &#24403;&#36229;&#36807;1/2&#33410;&#28857;&#25104;&#21151;&#20445;&#23384;&#20102;&#26085;&#24535;&#65292;&#21017;leader&#20250;&#23558;tx&#26368;&#32456;&#25552;&#20132;&#65288;&#20063;&#26159;&#19968;&#26465;&#26085;&#24535;&#65289;&#12290;\n+ &#19968;&#26086;leader&#25552;&#20132;tx&#65292;&#21017;&#20250;&#22312;&#19979;&#19968;&#27425;&#24515;&#36339;&#26102;&#23558;&#25552;&#20132;&#35760;&#24405;&#21457;&#36865;&#32473;&#20854;&#20182;&#33410;&#28857;&#65292;&#20854;&#20182;&#33410;&#28857;&#20063;&#20250;&#25552;&#20132;&#12290;\n+ leader&#23445;&#26426;&#21518;&#65292;&#21097;&#20313;&#33410;&#28857;&#21327;&#21830;&#25214;&#21040;&#25317;&#26377;&#26368;&#22823;&#24050;&#25552;&#20132;tx ID&#65288;&#24517;&#39035;&#26159;&#34987;&#36229;&#36807;&#21322;&#25968;&#30340;&#33410;&#28857;&#24050;&#25552;&#20132;&#30340;&#65289;&#30340;&#33410;&#28857;&#20316;&#20026;&#26032;leader&#12290;\n\n&#26368;&#37325;&#35201;&#30340;&#26159;&#65306;\n+ Raft&#20013;&#65292;&#21518;&#25552;&#20132;&#30340;&#20107;&#21153;ID&gt;&#20808;&#25552;&#20132;&#30340;&#20107;&#21153;ID&#65292;&#27599;&#20010;&#20107;&#21153;ID&#37117;&#26159;&#21807;&#19968;&#30340;&#12290;\n+ &#26080;&#35770;&#23458;&#25143;&#31471;&#26159;&#22312;&#21738;&#20010;etcd&#33410;&#28857;&#25552;&#20132;&#65292;&#25972;&#20010;&#38598;&#32676;&#23545;&#22806;&#34920;&#29616;&#20986;&#25968;&#25454;&#35270;&#22270;&#26368;&#32456;&#37117;&#26159;&#19968;&#26679;&#30340;&#12290;</code>\n</pre>\n</div>\n<p>etcd&#36890;&#36807;boltdb&#30340;MVCC&#20445;&#35777;&#21333;&#26426;&#25968;&#25454;&#19968;&#33268;&#24615;&#65292;&#36890;&#36807;raft&#20445;&#35777;&#38598;&#32676;&#25968;&#25454;&#30340;&#19968;&#33268;&#24615;&#12290;&#21442;&#32771;&#25991;&#26723;15#Operation#&#25552;&#21040;&#65292;raft&#30340;quorum&#19968;&#33268;&#24615;&#31639;&#27861;&#35828;&#26469;&#20063;&#23601;&#19968;&#21477;&#35805;&#65306;&#38598;&#32676;&#20013;&#33267;&#23569;(n+1)/2&#20010;&#33410;&#28857;&#37117;&#33021;&#23545;&#19968;&#20010;&#22806;&#37096;&#20889;&#25805;&#20316;&#25110;&#32773;&#20869;&#37096;&#38598;&#32676;&#25104;&#21592;&#26356;&#26032;&#36798;&#25104;&#20849;&#35782;&#12290;&#36825;&#20010;&#27169;&#22411;&#33021;&#22815;&#23436;&#20840;&#35268;&#36991;&#33041;&#35010;&#29616;&#35937;&#30340;&#21457;&#29983;&#12290;</p>\n<p>&#22914;&#26524;raft&#38598;&#32676;&#20013;&#26377;&#22788;&#20110;unhealthy&#29366;&#24577;&#30340;node&#65292;&#38656;&#35201;&#20808;&#25226;&#23427;&#21076;&#38500;&#25481;&#65292;&#28982;&#21518;&#25165;&#33021;&#36827;&#34892;&#26367;&#25442;&#25805;&#20316;&#12290;&#20294;&#26159;&#28155;&#21152;&#19968;&#20010;&#26032;&#30340;node&#26159;&#19968;&#20214;&#38750;&#24120;&#39640;&#39118;&#38505;&#30340;&#25805;&#20316;&#65306;&#22914;&#26524;&#19968;&#20010;3&#33410;&#28857;&#30340;etcd&#38598;&#32676;&#26377;&#19968;&#20010;unhealthy node&#65292;&#27492;&#26102;&#27809;&#26377;&#20808;&#25226;unhealthy node&#21076;&#38500;&#25481;&#65292;&#32780;&#26032;&#28155;&#21152;&#33410;&#28857;&#26102;&#21487;&#33021;&#30001;&#20110;&#37197;&#32622;&#19981;&#24403;&#25110;&#32773;&#20854;&#20182;&#21407;&#22240;&#23548;&#33268;&#26032;&#30340;node&#28155;&#21152;&#22833;&#36133;&#65292;&#21017;&#26032;&#38598;&#32676;&#29702;&#35770;&#19978;node number&#20026;4&#32780;&#24403;&#21069;quorum&#21482;&#21487;&#33021;&#36798;&#21040;2&#65292;&#22833;&#21435;consensus&#30340;&#38598;&#32676;&#23545;&#20219;&#20309;&#25805;&#20316;&#37117;&#26080;&#27861;&#36798;&#25104;&#20849;&#35782;&#12290;</p>\n<p>&#22914;&#26524;&#25353;&#29031;&#27491;&#30830;&#30340;&#25805;&#20316;&#27493;&#39588;&#65292;&#20808;&#21076;&#38500; unhealthy node&#65292;&#27492;&#26102; n &#20026; 2 &#32780; quorum &#20026; 2&#65292;&#28155;&#21152;&#26032;&#33410;&#28857;&#21518; n &#20026; 3&#65292;&#21450;&#26102;&#28155;&#21152;&#26032;&#33410;&#28857;&#22833;&#36133;&#20063;&#19981;&#20250;&#23548;&#33268;&#38598;&#32676;&#19981;&#21487;&#29992;&#12290;</p>\n<p>etcd&#36890;&#36807;&#35774;&#32622;&#37197;&#32622;&#25991;&#20214;&#20013; <a href=\"https://github.com/coreos/etcd/blob/15bfc1b36162805e8a90ae747d955667870c2f95/etcd.conf.yml.sample#L70\">strict-reconfig-check&#36873;&#39033;</a> &#20026;true&#65292;&#31105;&#27490;&#20219;&#20309;&#21361;&#21450;quorum&#30340;&#34892;&#20026;&#12290;&#22914;&#26524;&#29992;&#25143;&#25226;&#36825;&#20010;&#36873;&#39033;&#35774;&#20026;false&#65292;&#21017;&#28155;&#21152;&#19968;&#20010;&#26032;&#33410;&#28857;&#23601;&#36731;&#26494;&#22810;&#20102;&#65292;&#32467;&#26524;&#23601;&#26159;&#38598;&#32676;&#25968;&#25454;&#19981;&#19968;&#33268;&#65292;&#22823;&#37096;&#20998;&#24773;&#20917;&#19979;&#20250;&#25910;&#21040; \"disk geometry corruption&rdquo; &#20043;&#31867;&#30340;error log&#12290;</p>\n<p>etcd&#20869;&#37096;&#30340;raft&#23454;&#29616;&#35265;<a href=\"https://github.com/coreos/etcd/blob/master/raft/design.md\">&#21442;&#32771;&#25991;&#26723;24</a>&#12290;leader&#20250;&#23384;&#20648;&#25152;&#26377;follower&#23545;&#33258;&#36523;log&#25968;&#25454;&#30340;progress&#65288;&#22797;&#21046;&#36827;&#24230;&#65289;&#65292;leader&#26681;&#25454;&#27599;&#20010;follower&#30340;progress&#21521;&#20854;&#21457;&#36865;&rdquo;replication message&rdquo;&#65292;replication message&#26159;msgApp&#22806;&#21152;&#19978;log&#25968;&#25454;&#12290;progress&#26377;&#20004;&#20010;&#27604;&#36739;&#37325;&#35201;&#30340;&#23646;&#24615;&#65306;match&#21644;next&#12290;match&#26159;leader&#30693;&#36947;&#30340;follower&#23545;&#33258;&#36523;&#25968;&#25454;&#30340;&#26368;&#26032;&#22797;&#21046;&#36827;&#24230;&#12304;&#25110;&#32773;&#35828;&#23601;&#26159;follower&#26368;&#26032;&#30340;log entry set index&#12305;&#65292;&#22914;&#26524;leader&#23545;follower&#30340;&#22797;&#21046;&#36827;&#24230;&#19968;&#26080;&#25152;&#30693;&#21017;&#36825;&#20010;&#20540;&#20026;0&#65292;next&#21017;&#26159;&#23558;&#35201;&#21457;&#36865;&#32473;follower&#30340;&#19979;&#19968;&#20010;log entry set&#30340;&#24207;&#21495;range end&#12290;</p>\n<p>progress&#26377;&#19977;&#20010;&#29366;&#24577;&#65306;probe&#65292;replicate&#21644;snapshot&#12290;</p>\n<div>\n<pre>\n<code>                            +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+\n                            |                  send snapshot                         |\n                            |                                                        |\n                  +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;v&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+                                  +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;v&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+\n              +&mdash;&gt;       probe          |                                  |      snapshot      |\n              |   |  max inflight = 1  &lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+  max inflight = 0  |\n              |   +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;v&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+                                  +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;v&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+\n              |             |            1. snapshot success\n              |             |               (next=snapshot.index + 1)\n              |             |            2. snapshot failure\n              |             |               (no change)\n              |             |            3. receives msgAppResp(rej=false&amp;&amp;index&gt;lastsnap.index)\n              |             |               (match=m.index,next=match+1)\nreceives msgAppResp(rej=true)\n(next=match+1)|             |\n              |             |\n              |             |\n              |             |   receives msgAppResp(rej=false&amp;&amp;index&gt;match)\n              |             |   (match=m.index,next=match+1)\n              |             |\n              |             |\n              |             |\n              |   +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;v&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+\n              |   |     replicate      |\n              +&mdash;+ | max inflight = n   |\n                  +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;v&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+</code>\n</pre>\n</div>\n<p>&#22914;&#26524;follower&#22788;&#20110;probe&#29366;&#24577;&#65292;&#21017;leader&#27599;&#20010;&#24515;&#36339;&#21253;&#26368;&#22810;&#21482;&#21457;&#36865;&#19968;&#20010;&ldquo;replication message&rdquo;&#12290;leader&#20250;&#32531;&#24930;&#21457;&#36865;&ldquo;replication message&rdquo;&#24182;&#25506;&#27979;follower&#30340;&#22788;&#29702;&#36895;&#24230;&#12290;leader&#25910;&#21040;msgHeartbeatResp&#25110;&#32773;&#25910;&#21040;msgAppResp&#65288;&#20854;&#20013;reject&#20540;&#20026;true&#65289;&#26102;&#65292;leader&#20250;&#21457;&#36865;&#19979; <strong>&#19968;&#20010;</strong> &ldquo;replication message&rdquo;&#12290;</p>\n<p>&#24403;follower&#32473;leader&#30340;msgAppResp&#30340;reject&#20026;false&#30340;&#26102;&#20505;&#65292;&#23427;&#20250;&#34987;&#32622;&#20026;replicate&#29366;&#24577;&#65292;reject&#20026;false&#23601;&#24847;&#21619;&#30528;follower&#33021;&#22815;&#36319;&#19978;leader&#30340;&#21457;&#36865;&#36895;&#24230;&#12290;leader&#20250;&#21551;&#21160;stream&#26041;&#24335;&#21521;&#20197;&#27714;&#26368;&#24555;&#30340;&#26041;&#24335;&#21521;follower&#21457;&#36865;&ldquo;replication message&rdquo;&#12290;&#24403;follower&#19982;leader&#20043;&#38388;&#30340;&#36830;&#25509;&#26029;&#36830;&#25110;&#32773;follower&#32473;leader&#22238;&#22797;&#30340;msgAppResp&#30340;reject&#20026;true&#26102;&#65292;&#23601;&#20250;&#34987;&#37325;&#26032;&#32622;&#20026;probe&#29366;&#24577;&#65292;leader&#24403;&#28982;&#20063;&#20250;&#25226;next&#32622;&#20026;match+1&#12290;</p>\n<p>&#24403;follower&#22788;&#20110;replicate&#29366;&#24577;&#26102;&#65292;leader&#20250;&#19968;&#27425;&#23613;&#37327;&#22810;&#22320;&#25226;&#25209;&#37327;&ldquo;replication message&rdquo;&#21457;&#36865;&#32473;follower&#65292;&#24182;&#25226;&ldquo;next&rdquo;&#21462;&#20540;&#20026;&#24403;&#21069;log entry set&#30340;&#26368;&#22823;&#20540;&#65292;&#20197;&#35753;follower&#23613;&#21487;&#33021;&#24555;&#22320;&#36319;&#19978;leader&#30340;&#26368;&#26032;&#25968;&#25454;&#12290;</p>\n<p>&#24403;follower&#30340;log entry set&#19982;leader&#30340;log entry set&#30456;&#24046;&#29978;&#24040;&#30340;&#26102;&#20505;&#65292;leader&#20250;&#25226;follower&#30340;&#29366;&#24577;&#32622;&#20026;snapshot&#65292;&#28982;&#21518;&#20197;msgSnap&#35831;&#27714;&#26041;&#24335;&#21521;&#20854;&#21457;&#36865;snapshot&#25968;&#25454;&#65292;&#21457;&#36865;&#23436;&#21518;leader&#23601;&#31561;&#24453;follower&#30452;&#21040;&#36229;&#26102;&#25110;&#32773;&#25104;&#21151;&#25110;&#32773;&#22833;&#36133;&#25110;&#32773;&#36830;&#25509;&#20013;&#26029;&#12290;&#24403;follower&#25509;&#25910;&#23436;&#27605;snapshot&#25968;&#25454;&#21518;&#65292;&#23601;&#20250;&#22238;&#21040;probe&#29366;&#24577;&#12290;<a href=\"http://www.sohu.com/a/204912012_505827\">&#21442;&#32771;&#25991;&#26723;30</a> &#20013;&#25552;&#21040;&#25509;&#25910; snapshot &#30340; follower &#27492;&#26102;&#30340;&#35282;&#33394;&#26159; learner &#12290;</p>\n<p>&#24403;follower&#22788;&#20110;snapshot&#29366;&#24577;&#26102;&#20505;&#65292;leader&#19981;&#20877;&#21457;&#36865;&ldquo;replication message&rdquo;&#32473;follower&#12290;</p>\n<p>&#26032;&#24403;&#36873;&#30340;leader&#20250;&#25226;&#25152;&#26377;follower&#30340;state&#32622;&#20026;probe&#65292;&#25226;matchi&#32622;&#20026;0&#65292;&#25226;next&#32622;&#20026;&#33258;&#36523;log entry set&#30340;&#26368;&#22823;&#20540;&#12290;</p>\n<p>leader&#21521;follower&#21457;&#36865;&#25968;&#25454;&#30340;&#26041;&#24335;&#31867;&#21516;&#20110;kafka&#27599;&#20010;topic partition&#32423;&#21035;leader&#21521;follower&#21516;&#27493;&#25968;&#25454;&#30340;&#36807;&#31243;&#12290;&#20108;&#32773;&#20043;&#38388;&#36827;&#34892;&#25968;&#25454;&#21516;&#27493;&#30340;&#26102;&#20505;&#65292;&#21487;&#20197;&#36890;&#36807;&#19979;&#38754;&#20004;&#20010;&#27493;&#39588;&#36827;&#34892;&#27969;&#37327;&#25511;&#21046;&#65306;</p>\n<ul>\n<li>1. &#38480;&#21046;message&#30340;max size&#12290;&#36825;&#20010;&#20540;&#26159;&#21487;&#20197;&#36890;&#36807;&#30456;&#20851;&#21442;&#25968;&#36827;&#34892;&#38480;&#23450;&#30340;&#65292;&#38480;&#23450;&#21518;&#21487;&#20197;&#38477;&#20302;&#25506;&#27979;follower&#25509;&#25910;&#36895;&#24230;&#30340;&#25104;&#26412;&#65307;</li>\n<li>2. &#24403;follower&#22788;&#20110;replicate&#29366;&#24577;&#26102;&#20505;&#65292;&#38480;&#23450;&#27599;&#27425;&#25209;&#37327;&#21457;&#36865;&#28040;&#24687;&#30340;&#25968;&#30446;&#12290;leader&#22312;&#32593;&#32476;&#23618;&#20043;&#19978;&#26377;&#19968;&#20010;&#21457;&#36865;buffer&#65292;&#36890;&#36807;&#31867;&#20284;&#20110;tcp&#30340;&#21457;&#36865;&#31383;&#21475;&#30340;&#31639;&#27861;&#21160;&#24577;&#35843;&#25972;buffer&#30340;&#22823;&#23567;&#65292;&#20197;&#38450;&#27490;leader&#30001;&#20110;&#21457;&#21253;&#36807;&#24555;&#23548;&#33268;follower&#22823;&#37327;&#22320;&#20002;&#21253;&#65292;&#25552;&#39640;&#21457;&#36865;&#25104;&#21151;&#29575;&#12290;</li>\n</ul>\n<p>&#22312; Raft &#36827;&#34892; &ldquo;membership change&rdquo; &#30340;&#26102;&#20505;&#65292;&#19968;&#23450;&#35201;&#27880;&#24847;&#20197;&#19979;&#20960;&#20010; key point &#65306;</p>\n<ul>\n<li>1. &#21407;&#26469;&#30340; Quorum &#20013;&#26377;&#22788;&#20110;&#23849;&#28291;&#29366;&#24577;&#30340; follower&#65292;&#19968;&#23450;&#35201;&#20808;&#25226;&#36825;&#20010;&#33410;&#28857;&#20174; Quorum &#20013;&#21024;&#38500;&#65307;</li>\n<li>2. learner &#27809;&#26377; vote &#26435;&#38480;&#65292;&#19981;&#31639;&#20837; Quorum&#65307;</li>\n<li>3. &#19968;&#27425;&#21521;&#19968;&#20010; Quorom &#20013;&#26368;&#22810;&#28155;&#21152;&#19968;&#20010; node&#65307;</li>\n<li>4. Raft &#20013;&#27491;&#30830;&#21521;&#20854;&#20013;&#28155;&#21152;&#19968;&#20010;&#33410;&#28857;&#30340;&#31639;&#27861;&#26159;&#25903;&#25345; Joint Consensus &#31639;&#27861;&#65292;<code>&#34429;&#28982;&#25105;&#30693;&#36947;&#29702;&#35770;&#19978;&#38754; 100% &#30340;&#20107;&#24773;&#24590;&#20040;&#20570;&#65292;&#20294;&#20026;&#20102;&#26356;&#21152;&#31616;&#21333;&#65292;&#25105;&#21487;&#20197;&#31245;&#24494;&#25918;&#20302;&#19968;&#28857;&#35201;&#27714;&#12290;TiKV &#21644; etcd &#29616;&#22312;&#37117;&#26159;&#27809;&#26377;&#29992; joint consensus &#30340;&#65292;&#20294;&#25105;&#20204;&#29616;&#22312;&#22312;&#24320;&#22987;&#28155;&#21152; Learner&#65292;&#21518;&#38754;&#22914;&#26524;&#30495;&#30340;&#36935;&#21040;&#20102;&#20854;&#20182;&#30340; corner case&#65292;&#20250;&#19981;&#20250;&#32771;&#34385;&#19968;&#19979;&#65292;&#27809;&#20934;&#20063;&#19981;&#26159;&#19981;&#21487;&#33021;&#30340;&#20107;&#24773;&#12290;</code><a href=\"http://www.sohu.com/a/204912012_505827\">&#24341;&#33258;&#21442;&#32771;&#25991;&#26723;30</a>&#12290;</li>\n</ul>\n<p><a href=\"http://www.sohu.com/a/202861958_736949\">&#21442;&#32771;&#25991;&#26723;31</a> &#32473;&#20986;&#20102;Etcd Raft &#27491;&#24120;&#24037;&#20316;&#27969;&#31243;&#20248;&#21270;&#30340;&#20960;&#20010;&#20851;&#38190;&#28857;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>\n<p>Pipeline</p>\n<p>Raft &#24037;&#20316;&#27969;&#31243;&#20998;&#20026;Propose&#65292;Append&#65292;Broadcast &#21644; Apply&#12290;&#23458;&#25143;&#21457;&#36215;&#20132;&#26131;&#65292;&#25105;&#20204;&#21483;&#20570; Propose&#65292;&#28982;&#21518;&#25105;&#20204;&#35760;&#24405;&#20132;&#26131;&#65292;&#36825;&#20010;&#21483;&#20570; Append&#65292;&#20877;&#23601;&#26159;&#36890;&#30693;&#20854;&#20182;&#32593;&#28857;&#65292;&#36825;&#20010;&#21483;&#20570; Broadcast&#65292;&#31561;&#25105;&#20204;&#26368;&#21518;&#30693;&#36947;&#22823;&#37096;&#20998;&#32593;&#28857;&#37117;&#30830;&#35748;&#20102;&#36825;&#31508;&#20132;&#26131;&#35760;&#24405;&#65292;&#25105;&#20204;&#23601;&#25191;&#34892;&#20132;&#26131;&#65292;&#20063;&#23601;&#26159; Apply&#12290;</p>\n<p>&#23545;&#20110;&#23458;&#25143; A&#65292;&#25805;&#20316;&#26159; Propose&#65292;Append&#65292;Broadcast&#65292; Apply&#65292;&#23545;&#20110;&#23458;&#25143; B &#20063;&#26159;&#19968;&#26679;&#30340;&#27969;&#31243;&#65292;&#20043;&#21069;&#25105;&#20204;&#24517;&#39035;&#31561; A &#23436;&#25104;&#20102;&#65292;&#25165;&#33021;&#22788;&#29702; B&#12290;&#24403; A &#22312; Append &#20043;&#21518;&#65292;&#25105;&#20204;&#23601;&#21487;&#20197;&#24320;&#22987;&#22788;&#29702; B &#30340; Propose &#20102;&#12290;&#25105;&#20204;&#21482;&#35201;&#20445;&#35777;&#30340;&#26159;&#25152;&#26377;&#38134;&#34892;&#32593;&#28857;&#30340;&#20132;&#26131;&#35760;&#24405;&#26159;&#19968;&#33268;&#26377;&#24207;&#30340;&#65292;&#37027;&#20040;&#25105;&#20204;&#23601;&#19968;&#23450;&#33021;&#20445;&#35777;&#26368;&#32456;&#25152;&#26377;&#38134;&#34892;&#30340;&#25968;&#25454;&#26159;&#19968;&#33268;&#30340;&#65292;&#25152;&#20197;&#21482;&#35201; A Append &#20102;&#65292;B &#24320;&#22987; Propose&#65292;B Append &#30340;&#26102;&#20505;&#20132;&#26131;&#35760;&#24405;&#19968;&#23450;&#22312; A &#30340;&#21518;&#38754;&#65292;&#36825;&#26679;&#35760;&#24405;&#23601;&#19968;&#23450;&#26159;&#26377;&#24207;&#30340;&#20102;&#12290;</p>\n<p>&#24403; A &#25191;&#34892;&#23436; Append &#20043;&#21518;&#65292;&#25105;&#20204;&#23601;&#33021;&#31435;&#21051;&#24320;&#22987;&#22788;&#29702; B&#65292;&#32780;&#24403; B Append &#20043;&#21518;&#65292;&#25105;&#20204;&#20063;&#21487;&#20197;&#31435;&#21051;&#22788;&#29702;&#19979;&#19968;&#20010;&#29992;&#25143; C&#65292;&#36825;&#26679;&#25972;&#20010;&#27969;&#31243;&#23601;&#26159;&#19968;&#20010;&#20687;&#27700;&#27969;&#37027;&#26679;&#28304;&#28304;&#19981;&#26029;&#27969;&#21160;&#30340;&#20102;&#65292;&#36825;&#19981;&#23601;&#26159;&#19968;&#20010; Pipeline &#20102;&#12290;</p>\n</li>\n<li>\n<p>Batch</p>\n<p>&#22914;&#26524;&#24456;&#22810;&#23458;&#25143;&#21516;&#26102;&#35201;&#21457;&#36215;&#20132;&#26131;&#65292;&#37027;&#20040;&#25105;&#20204;&#21487;&#20197;&#23558;&#36825;&#20123;&#20132;&#26131;&#35760;&#24405;&#65292;&#29992;&#19968;&#20010;&#28040;&#24687;&#21457;&#36865;&#36807;&#21435;&#21040;&#20854;&#20182;&#32593;&#28857;&#65292;&#36825;&#26679;&#25105;&#20204;&#23601;&#19981;&#38656;&#35201;&#19968;&#20010;&#19968;&#20010;&#30340;&#21457;&#36865;&#28040;&#24687;&#20102;&#65292;&#36825;&#23601;&#26159; Batch&#12290;</p>\n<p>&#21508;&#20010;&#32593;&#28857;&#20043;&#38388;&#36317;&#31163;&#36824;&#26159;&#26377;&#28857;&#36828;&#30340;&#65292;&#28040;&#24687;&#20256;&#36882;&#30340;&#26102;&#38388;&#24320;&#38144;&#36824;&#26159;&#26377;&#28857;&#22823;&#30340;&#12290;&#20351;&#29992; Batch &#21487;&#20197;&#20943;&#23569;&#28040;&#24687;&#30340;&#21457;&#36865;&#27425;&#25968;&#65292;&#33258;&#28982;&#23601;&#33021;&#25552;&#39640;&#25928;&#29575;&#20102;&#12290;</p>\n</li>\n<li>\n<p>Leader &#24182;&#21457;&#20889;&#30424;</p>\n<p>&#25972;&#20010; Raft &#30340;&#27969;&#31243;&#65306;Leader &#25910;&#21040; Propose&#65292;Append Log&#65292;&#28982;&#21518; Broadcast Log&#65292;&#31561;&#25910;&#21040; Follower &#30340;&#22238;&#22797;&#30830;&#23450; Log &#34987; Committed &#20043;&#21518;&#65292;&#24320;&#22987; Apply&#12290;&#32780;&#23545;&#24212;&#30340; Follower&#65292;&#22312;&#25910;&#21040; Log &#20043;&#21518;&#65292;&#20808; Append Log&#65292;&#28982;&#21518;&#32473; Leader reply &#28040;&#24687;&#65292;&#31561;&#19979;&#27425; Leader &#21457;&#36807;&#26469;&#30340;&#28040;&#24687;&#30693;&#36947; Log &#34987; Committed &#20102;&#65292;&#23601;&#21487;&#20197; Apply &#20102;&#12290;</p>\n<p>&#24403;&#29992;&#25143;&#22312; Leader &#32593;&#28857;&#36827;&#34892;&#20132;&#26131;&#30340;&#26102;&#20505;&#65292;&#21407;&#26469;&#25105;&#20204;&#30340;&#27969;&#31243;&#26159; Propose&#65292;Append&#65292;&#28982;&#21518;&#22312; Broadcast&#65292;&#20294;&#29616;&#22312;&#65292;&#25105;&#20204;&#22312; Propose &#20043;&#21518;&#65292;&#23601;&#21487;&#20197;&#30452;&#25509; Broadcast&#65292;&#21516;&#26102; Append&#65292;&#36825;&#20004;&#20010;&#27493;&#39588;&#22312; Leader &#32593;&#28857;&#26159;&#21487;&#20197;&#21516;&#26102;&#22788;&#29702;&#30340;&#12290;&#21363;&#20351; Broadcast &#20808;&#36827;&#34892;&#65292;Leader &#32593;&#28857;&#36825;&#36793;&#20173;&#28982;&#38656;&#35201;&#22312; Append &#20043;&#21518;&#30830;&#20445;&#36825;&#31508;&#35760;&#24405;&#34987;&#22823;&#22810;&#25968;&#32593;&#28857;&#30830;&#35748;&#20102;&#12290;</p>\n<p>Leader &#32593;&#28857;&#24517;&#39035;&#30693;&#36947;&#22823;&#37096;&#20998;&#32593;&#28857;&#37117;&#25910;&#21040;&#20102;&#20132;&#26131;&#35760;&#24405;&#65292;&#25165;&#33021;&#35748;&#20026;&#26159; Committed&#65292;&#28982;&#21518;&#32487;&#32493;&#22788;&#29702;&#12290;&#22914;&#26524; Follower &#32593;&#28857;&#36825;&#36793;&#20063;&#30452;&#25509;&#20808;&#22238;&#22797;&#28040;&#24687;&#65292;&#22312; Append&#65292;&#23601;&#21487;&#33021;&#20986;&#29616;&#19968;&#31181;&#24773;&#20917;&#65292;&#22312; Append &#20043;&#21069;&#65292;Follower &#32593;&#28857;&#20986;&#29616;&#20102;&#38382;&#39064;&#65292;&#23548;&#33268; Append &#19981;&#25104;&#21151;&#12290;&#37027;&#20040;&#26497;&#31471;&#24773;&#20917;&#19979;&#38754;&#23601;&#20250;&#20986;&#29616;&#65292;Leader &#35748;&#20026;&#35760;&#24405;&#37117;&#24050;&#32463;&#34987;&#22823;&#37096;&#20998;&#33410;&#28857;&#25509;&#21463;&#20102;&#65292;&#20294;&#23454;&#38469;&#24182;&#27809;&#26377;&#65292;&#25105;&#20204;&#23601;&#24456;&#21487;&#33021;&#38754;&#20020;&#25968;&#25454;&#20002;&#22833;&#30340;&#38382;&#39064;&#20102;&#12290;&#25152;&#20197; leader &#21487;&#20197;&#20808;&#21457;&#36215; Broadcast &#28982;&#21518;&#20877;&#36827;&#34892; Append&#65292;&#20294;&#26159; follower &#24517;&#39035;&#20808; Append &#28982;&#21518;&#20877; Broadcast&#12290;</p>\n</li>\n</ul>\n<h4 id=\"toc_16\">4.4.1 MVCC</h4>\n<hr>\n<p>etcd &#22312;&#20869;&#23384;&#20013;&#32500;&#25252;&#20102;&#19968;&#20010; btree&#65288;B&#26641;&#65289;&#32431;&#20869;&#23384;&#32034;&#24341;&#65292;&#23601;&#21644; MySQL &#30340;&#32034;&#24341;&#19968;&#26679;&#65292;&#23427;&#26159;&#26377;&#24207;&#30340;&#12290;</p>\n<p>&#22312;&#36825;&#20010;btree&#20013;&#65292;&#25972;&#20010;k-v&#23384;&#20648;&#22823;&#27010;&#23601;&#26159;&#36825;&#26679;&#65306;</p>\n<div>\n<pre>\n<code>type treeIndex struct {\n    sync.RWMutex\n    tree *btree.BTree\n}</code>\n</pre>\n</div>\n<p>&#24403;&#23384;&#20648;&#22823;&#37327;&#30340;K-V&#26102;&#65292;&#22240;&#20026;&#29992;&#25143;&#30340;value&#19968;&#33324;&#27604;&#36739;&#22823;&#65292;&#20840;&#37096;&#25918;&#22312;&#20869;&#23384;btree&#37324;&#20869;&#23384;&#32791;&#36153;&#36807;&#22823;&#65292;&#25152;&#20197;etcd&#23558;&#29992;&#25143;value&#20445;&#23384;&#22312;&#30913;&#30424;&#20013;&#12290;</p>\n<p>etcd&#22312;&#20107;&#20214;&#27169;&#22411;&#65288;watch &#26426;&#21046;&#65289;&#19978;&#19982;ZooKeeper&#23436;&#20840;&#19981;&#21516;&#65292;&#27599;&#27425;&#25968;&#25454;&#21464;&#21270;&#37117;&#20250;&#36890;&#30693;&#65292;&#24182;&#19988;&#36890;&#30693;&#37324;&#25658;&#24102;&#26377;&#21464;&#21270;&#21518;&#30340;&#25968;&#25454;&#20869;&#23481;&#65292;&#20854;&#22522;&#30784;&#23601;&#26159;&#33258;&#24102; MVCC &#30340; bboltdb &#23384;&#20648;&#24341;&#25806;&#12290;</p>\n<p>MVCC &#19979;&#38754;&#26159;&#20960;&#26465;&#39044;&#22791;&#30693;&#35782;&#65306;</p>\n<ul>\n<li>&#27599;&#20010;tx&#20107;&#21153;&#26377;&#21807;&#19968;&#20107;&#21153;ID&#65292;&#22312;etcd&#20013;&#21483;&#20570;main ID&#65292;&#20840;&#23616;&#36882;&#22686;&#19981;&#37325;&#22797;&#12290;</li>\n<li>&#19968;&#20010;tx&#21487;&#20197;&#21253;&#21547;&#22810;&#20010;&#20462;&#25913;&#25805;&#20316;&#65288;put&#21644;delete&#65289;&#65292;&#27599;&#19968;&#20010;&#25805;&#20316;&#21483;&#20570;&#19968;&#20010;revision&#65288;&#20462;&#35746;&#65289;&#65292;&#20849;&#20139;&#21516;&#19968;&#20010;main ID&#12290;</li>\n<li>&#19968;&#20010;tx&#20869;&#36830;&#32493;&#30340;&#22810;&#20010;&#20462;&#25913;&#25805;&#20316;&#20250;&#34987;&#20174;0&#36882;&#22686;&#32534;&#21495;&#65292;&#36825;&#20010;&#32534;&#21495;&#21483;&#20570;sub ID&#12290;</li>\n<li>&#27599;&#20010;revision&#30001;&#65288;main ID&#65292;sub ID&#65289;&#21807;&#19968;&#26631;&#35782;&#12290;</li>\n</ul>\n<p>revision &#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>// A revision indicates modification of the key-value space.\n// The set of changes that share same main revision changes the key-value space atomically.\ntype revision struct {\n    // main is the main revision of a set of changes that happen atomically.\n    main int64\n\n    // sub is the the sub revision of a change in a set of changes that happen\n    // atomically. Each change has different increasing sub revision in that\n    // set.\n    sub int64\n}</code>\n</pre>\n</div>\n<p>&#20869;&#23384;&#32034;&#24341;&#20013;&#65292;&#27599;&#20010;&#21407;&#22987;key&#20250;&#20851;&#32852;&#19968;&#20010;key_index&#32467;&#26500;&#65292;&#37324;&#38754;&#32500;&#25252;&#20102;&#22810;&#29256;&#26412;&#20449;&#24687;&#65306;</p>\n<div>\n<pre>\n<code>type keyIndex struct {\n    key         []byte   // key&#23383;&#27573;&#23601;&#26159;&#29992;&#25143;&#30340;&#21407;&#22987;key\n    modified    revision // modified&#23383;&#27573;&#35760;&#24405;&#36825;&#20010;key&#30340;&#26368;&#21518;&#19968;&#27425;&#20462;&#25913;&#23545;&#24212;&#30340;revision&#20449;&#24687;\n    generations []generation // &#22810;&#29256;&#26412;&#65288;&#21382;&#21490;&#20462;&#25913;&#65289;\n}\n\n// generation contains multiple revisions of a key.\ntype generation struct {\n    ver     int64\n    created revision // &#35760;&#24405;&#20102;&#24341;&#36215;&#26412;&#27425;key&#21019;&#24314;&#30340;revision&#20449;&#24687;\n    revs    []revision\n}</code>\n</pre>\n</div>\n<p>key &#21021;&#22987;&#21019;&#24314;&#30340;&#26102;&#20505;&#65292;generations[0]&#20250;&#34987;&#21019;&#24314;&#65292;&#24403;&#29992;&#25143;&#32487;&#32493;&#26356;&#26032;&#36825;&#20010;key&#30340;&#26102;&#20505;&#65292;generations[0].revs&#25968;&#32452;&#20250;&#19981;&#26029;&#36861;&#21152;&#35760;&#24405;&#26412;&#27425;&#30340;revision&#20449;&#24687;&#65288;main&#65292;sub&#65289;&#12290;&#22312;bbolt&#20013;&#65292;&#27599;&#20010;revision&#23558;&#20316;&#20026;key&#65292;&#21363;&#24207;&#21015;&#21270;&#65288;revision.main+revision.sub&#65289;&#20316;&#20026;key&#12290;&#22240;&#27492;&#65292;&#25105;&#20204;&#20808;&#36890;&#36807;&#20869;&#23384;btree&#22312;keyIndex.generations[0].revs&#20013;&#25214;&#21040;&#26368;&#21518;&#19968;&#26465;revision&#65292;&#21363;&#21487;&#21435;bbolt&#20013;&#35835;&#21462;&#23545;&#24212;&#30340;&#25968;&#25454;&#12290;&#22914;&#26524;&#25105;&#20204;&#25345;&#32493;&#26356;&#26032;&#21516;&#19968;&#20010;key&#65292;&#37027;&#20040;generations[0].revs&#23601;&#20250;&#19968;&#30452;&#21464;&#22823;&#65292;&#36825;&#24590;&#20040;&#21150;&#21602;&#65311;&#22312;&#22810;&#29256;&#26412;&#20013;&#30340;&#65292;&#19968;&#33324;&#37319;&#29992;compact&#26469;&#21387;&#32553;&#21382;&#21490;&#29256;&#26412;&#65292;&#21363;&#24403;&#21382;&#21490;&#29256;&#26412;&#21040;&#36798;&#19968;&#23450;&#25968;&#37327;&#26102;&#65292;&#20250;&#21024;&#38500;&#19968;&#20123;&#21382;&#21490;&#29256;&#26412;&#65292;&#21482;&#20445;&#23384;&#26368;&#36817;&#30340;&#19968;&#20123;&#29256;&#26412;&#12290;</p>\n<p><font><strong>keyIndex &#20013;&#30340; generations &#25968;&#32452;&#19981;&#20250;&#22312;&#19968;&#20010;&#25968;&#32452;&#30340; index &#19978;&#19981;&#26029;&#33192;&#32960;&#19979;&#21435;&#65292;&#19968;&#26086;&#21457;&#29983;&#21024;&#38500;&#23601;&#20250;&#32467;&#26463;&#24403;&#21069;&#30340;Generation&#65292;&#29983;&#25104;&#26032;&#30340;Generation&#12290;&#21516;&#26102; version &#20063;&#20250;&#24402;&#38646;&#65292;&#27599;&#27425; put &#25805;&#20316;&#20250;&#35753;&#20854;&#20174; 1 &#37325;&#26032;&#24320;&#22987;&#22686;&#38271;&#12290;</strong></font></p>\n<p>put&#25805;&#20316;&#30340; bboltdb &#30340;key&#30001; main+sub &#26500;&#25104;&#65306;</p>\n<p>&#8203; ibytes := newRevBytes() &#8203; idxRev := revision{main: rev, sub: int64(len(tw.changes))} &#8203; revToBytes(idxRev, ibytes)</p>\n<p>delete &#25805;&#20316;&#30340; key &#30001; main+sub+&rdquo;t&rdquo; &#26500;&#25104;&#65306;</p>\n<p>&#8203; idxRev := revision{main: tw.beginRev + 1, sub: int64(len(tw.changes))} &#8203; revToBytes(idxRev, ibytes) &#8203; ibytes = appendMarkTombstone(ibytes) &#8203; &#8203; &#8203; // appendMarkTombstone appends tombstone mark to normal revision bytes. &#8203; func appendMarkTombstone(b []byte) []byte { &#8203; if len(b) != revBytesLen { &#8203; plog.Panicf(&ldquo;cannot append mark to non normal revision bytes&rdquo;) &#8203; } &#8203; return append(b, markTombstone) &#8203; }</p>\n<div>\n<pre>\n<code>// isTombstone checks whether the revision bytes is a tombstone.\nfunc isTombstone(b []byte) bool {\n    return len(b) == markedRevBytesLen &amp;&amp; b[markBytePosition] == markTombstone\n}</code>\n</pre>\n</div>\n<p>bbolt&#20013;&#23384;&#20648;&#30340;value&#26159;&#36825;&#26679;&#19968;&#20010;json&#24207;&#21015;&#21270;&#21518;&#30340;&#32467;&#26500;&#65292;&#21253;&#25324;key&#21019;&#24314;&#26102;&#30340;revision&#65288;&#23545;&#24212;&#26576;&#19968;&#20195;generation&#30340;created&#65289;&#65292;&#26412;&#27425;&#26356;&#26032;&#29256;&#26412;&#65292;sub ID&#65288;Version ver&#65289;&#65292;Lease ID&#65288;&#31199;&#32422;ID&#65289;&#65306;</p>\n<p>&#8203; kv := mvccpb.KeyValue{ &#8203; Key: key, &#8203; Value: value, &#8203; CreateRevision: c, &#8203; ModRevision: rev, &#8203; Version: ver, // version is the version of the key. A deletion resets the version to zero and any modification of the key increases its version. &#8203; Lease: int64(leaseID), &#8203; }</p>\n<p>&#24635;&#32467;&#26469;&#35828;&#65306;&#20869;&#23384;btree&#32500;&#25252;&#30340;&#26159;&#29992;&#25143;key =&gt; keyIndex&#30340;&#26144;&#23556;&#65292;keyIndex&#20869;&#32500;&#25252;&#22810;&#29256;&#26412;&#30340;revision&#20449;&#24687;&#65292;&#32780;revision&#21487;&#20197;&#26144;&#23556;&#21040;&#30913;&#30424;bbolt&#20013;&#30340;&#29992;&#25143;value&#12290;</p>\n<p>!! &#27880;&#24847;&#65306;&#26412;&#23567;&#33410;&#36873;&#33258; <a href=\"https://yuerblog.cc/2017/12/10/principle-about-etcd-v3\">&#21442;&#32771;&#25991;&#26723; 27</a>&#12290;</p>\n<h2 id=\"toc_17\">5 &#36816;&#34892;&#29615;&#22659;</h2>\n<hr>\n<p>&#23448;&#26041;&#25991;&#26723;&#12304;&#21442;&#32771;&#25991;&#26723;4&#12305;&#32473;&#20986;&#20102;etcd&#31283;&#23450;&#36816;&#34892;&#31995;&#32479;&#30340;&#19968;&#20123;&#30828;&#20214;&#21442;&#32771;&#25351;&#26631;&#65292;&#26412;&#25991;&#31934;&#31616;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>1 CPU: 2~4 core&#21363;&#21487;&#20445;&#35777;etcd&#27969;&#30021;&#36816;&#34892;&#65292;&#24403;&#27599;&#31186;&#30340;&#35831;&#27714;&#25104;&#21315;&#19978;&#19975;&#26102;&#65292;CPU&#38656;&#35201;&#39057;&#32321;&#22320;&#20174;&#20869;&#23384;&#21152;&#36733;&#25968;&#25454;&#65292;&#27492;&#26102;&#24314;&#35758;&#20351;&#29992;8 ~ 16&#20010;core&#65307;</li>\n<li>2 Memory: &#24179;&#24120;&#24773;&#20917;&#19979;8G&#20869;&#23384;&#21363;&#21487;&#20445;&#35777;etcd&#27969;&#30021;&#36816;&#34892;&#65292;&#20854;&#20013;&#20027;&#35201;&#23384;&#20648;kv cache&#25968;&#25454;&#21644;&#23458;&#25143;&#31471;watch&#30340;&#25968;&#25454;&#65292;&#24403;&#22788;&#29702;&#30340;qps&#19978;&#19975;&#30340;&#26102;&#20505;&#65292;&#24314;&#35758;16 ~ 64GB&#30340;&#20869;&#23384;&#37327;&#65292;&#21442;&#32771;&#25991;&#26723;15#System requirements#&#25552;&#21040;etcd&#35201;&#27714;&#30340;&#20869;&#23384;&#26368;&#23567;&#23481;&#37327;&#26159;2GB&#65307;</li>\n<li>3 Disk: &#23384;&#20648;&#20171;&#36136;&#30340;&#36136;&#37327;&#26159;etcd&#36816;&#34892;performance&#21644;stability&#30340;&#20851;&#38190;&#65292;&#24046;&#21170;&#30340;&#23384;&#20648;&#20171;&#36136;&#20250;&#23548;&#33268;&#24310;&#36831;&#22686;&#21152;&#21644;&#31995;&#32479;&#19981;&#31283;&#23450;&#12290;&#19968;&#33324;&#24773;&#20917;&#19979;&#39034;&#24207;&#35835;&#20889;&#33021;&#36798;&#21040;50 IOPS(&#22914;7200RPM&#30340;&#30913;&#30424;)&#21363;&#21487;&#28385;&#36275;&#35201;&#27714;&#65292;&#24403;&#21387;&#21147;&#22823;&#30340;&#26102;&#20505;&#65292;&#35201;&#27714;&#33021;&#36798;&#21040;500 IOPS&#65288;SSD&#30424;&#25110;&#32773;&#20854;&#20182;&#34394;&#25311;&#30340;block&#35774;&#22791;&#65289;&#12290;&#38656;&#35201;&#27880;&#24847;&#30340;&#26159;&#65292;&#19968;&#33324;&#20113;&#21378;&#21830;&#25552;&#20379;&#30340;&#30913;&#30424;IOPS&#26159;&#24182;&#34892;&#32780;&#38750;&#39034;&#24207;&#30340;&#65292;&#36825;&#20010;&#24182;&#34892;&#30340;&#25351;&#26631;&#19968;&#33324;&#26159;&#39034;&#24207;&#25351;&#26631;&#30340;&#21313;&#20493;&#20197;&#19978;&#65292;&#21487;&#20197;&#20351;&#29992;diskbench or fio&#24037;&#20855;&#21435;&#27979;&#35797;&#20043;&#12290;&#24403;etcd&#27515;&#25481;&#37325;&#21551;&#21518;&#65292;&#20026;&#20102;&#24555;&#36895;&#24674;&#22797;&#26381;&#21153;&#65292;etcd&#38656;&#35201;&#24555;&#36895;&#36827;&#34892;&#25968;&#25454;&#24674;&#22797;&#12290;&#36890;&#24120;&#24773;&#20917;&#19979;&#24674;&#22797;100MB&#25968;&#25454;&#38656;&#35201;15s&#65288;&#27599;&#31186;10MB/s&#65289;&#65292;&#22312;&#22823;etcd&#38598;&#32676;&#20013;&#35201;&#27714;1GB&#25968;&#25454;15s&#20869;&#24674;&#22797;&#23436;&#27605;&#65288;&#27599;&#31186;100MB/s&#65289;&#12290;<font>&#36890;&#24120;&#24773;&#20917;&#19979;&#24314;&#35758;&#20351;&#29992;SSD&#20316;&#20026;&#23384;&#20648;&#20171;&#36136;&#12290;&#22914;&#26524;&#29992;&#30913;&#30424;&#65292;&#35201;&#27714;&#33021;&#36798;&#21040;15,000 RPM&#30340;RAID0&#12290;</font><br>\n</li>\n<li>4 Network: &#19968;&#33324;&#24773;&#20917;&#19979;1GbE&#65288;&#21315;&#20806;&#65289;&#32593;&#21345;&#21487;&#20197;&#20445;&#35777;&#31283;&#23450;&#36816;&#34892;&#65292;&#23545;&#20110;&#22823;&#30340;&#38598;&#32676;&#21017;&#35201;&#27714;10GbE(&#19975;&#20806;)&#32593;&#21345;&#12290;&#19981;&#20165;&#26159;&#36895;&#24230;&#65292;&#21516;&#26102;&#23613;&#37327;&#25226;etcd&#38598;&#32676;&#37096;&#32626;&#22312;&#21516;&#19968;&#20010;IDC&#20197;&#20445;&#35777;&#32593;&#32476;&#31283;&#23450;&#65292;&#21542;&#21017;&#24456;&#23481;&#26131;&#20986;&#29616;&#32593;&#32476;&#20998;&#21306;&#23548;&#33268;&#30340;&#38598;&#32676;&#34987;&#21010;&#20998;&#25104;&#22823;&#38598;&#32676;&#21644;&#23567;&#38598;&#32676;&#30340;&#24773;&#20917;&#12290;</li>\n<li>5 System: &#25298;&#21442;&#32771;&#25991;&#26723;5&#65292;etcd&#23448;&#26041;&#20445;&#35777;etcd&#21487;&#22312;amd64 + linux &amp; ppc64Ie + linux&#19978;&#31283;&#23450;&#36816;&#34892;&#65292;&#20854;&#20182;&#30828;&#20214;&#20973;&#20182;&#19981;&#25512;&#33616;&#65292;&#30001;&#20110;go runtime&#22312;32-bit&#31995;&#32479;&#19978;&#30340;bug&#65292;&#20063;&#19981;&#25512;&#33616;32&#20301;&#25805;&#20316;&#31995;&#32479;&#65307;</li>\n<li>\n<p>6 Etcd&#65306; &#38598;&#32676;&#30340;&#25968;&#30446;&#19968;&#33324;&#20026;3&#25110;&#32773;5&#21363;&#21487;&#65292;&#25104;&#21592;&#19981;&#26159;&#36234;&#22810;&#36234;&#22909;&#65292;&#21442;&#32771;&#25991;&#26723;7&#30340;#Change the cluster size#&#23601;&#25552;&#21040;etcd&#38598;&#32676;&#25104;&#21592;&#36234;&#22810;&#65292;leader&#30340;&#36890;&#20449;&#20219;&#21153;&#23601;&#36234;&#32321;&#37325;&#65292;&#21487;&#33021;&#23548;&#33268;&#21709;&#24212;&#24310;&#36831;&#19978;&#21319;&#65292;&#21442;&#32771;&#25991;&#26723;15 #What is maximum cluster size# &#21017;&#25552;&#21040;Google Chubby&#35748;&#20026;&#26368;&#36866;&#23452;&#30340;&#25968;&#30446;&#26159;5&#65292;&#26368;&#22823;&#25968;&#30446;&#20026;7&#12290;</p>\n<p>&#8203; &#21442;&#32771;&#25991;&#26723;15#Should I add a member before removing an unhealthy member#&#19968;&#33410;&#25552;&#21040;&#65292;&#24403;&#38598;&#32676;&#20986;&#29616;unhealthy&#33410;&#28857;&#30340;&#26102;&#20505;&#65292;&#24212;&#35813;&#20808;&#19979;&#32447;&#36825;&#20010;&#33410;&#28857;&#65292;&#28982;&#21518;&#21450;&#26102;&#28155;&#21152;&#26032;&#33410;&#28857;&#20197;&#20445;&#35777;quorum&#12290;</p>\n</li>\n<li>\n<p>7 Go: <a href=\"https://github.com/coreos/etcd/blob/master/Documentation/v2/admin_guide.md\">&#21442;&#32771;&#25991;&#26723;16</a>#Best Practices#&#19968;&#33410;&#35201;&#27714;Go&#30340;&#26368;&#20302;&#29256;&#26412;&#26159;1.4&#12290;</p>\n</li>\n</ul>\n<h3 id=\"toc_18\">5.1 &#19982;&#36816;&#34892;&#29615;&#22659;&#26377;&#20851;&#30340;faq</h3>\n<hr>\n<p>&#21442;&#32771;&#25991;&#26723;15&#21015;&#20986;&#20102;&#19968;&#20123;&#19982;&#36816;&#34892;&#29615;&#22659;&#26377;&#20851;&#30340;faq&#65292;&#21015;&#20986;&#22914;&#19979;&#12290;</p>\n<h4 id=\"toc_19\">5.1.1 &ldquo;apply entries took too long&rdquo;</h4>\n<hr>\n<p>etcd&#38598;&#32676;&#25509;&#21463;&#19968;&#20010;&#20889;&#35831;&#27714;&#21518;&#65292;&#27599;&#20010;etcd&#25104;&#21592;&#37117;&#38656;&#35201;&#25226;&#20889;&#35831;&#27714;&#25968;&#25454;&#22266;&#21270;&#21040;cores/bbolt&#20043;&#20013;&#65292;&#25972;&#20010;&#36807;&#31243;&#19981;&#35201;&#36229;&#36807;50ms&#12290;&#22914;&#26524;&#36229;&#36807;100ms&#65292;&#21017;etcd&#23601;&#20250;&#25171;&#21360;&#27492;&#26465;log&#36827;&#34892;&#35686;&#21578;&#12290;&#36890;&#24120;&#24773;&#20917;&#19979;&#26159;&#22240;&#20026;&#30913;&#30424;&#24930;&#65292;&#27604;&#22914;&#30913;&#30424;&#31454;&#20105;&#25110;&#32773;&#35692;&#22914;&#34394;&#25311;&#22359;&#30913;&#30424;&#36825;&#31181;&#28866;&#35774;&#22791;&#12290;etcd&#26292;&#38706;&#32473;Prometheus&#30340;metrics&#25351;&#26631;backend<em>commit</em>duration_seconds&#23601;&#26174;&#31034;&#20102;commit&#30340;&#29942;&#39048;&#26102;&#38388;&#65292;&#36825;&#20010;&#25351;&#26631;&#20302;&#20110;25ms&#21363;&#21487;&#35748;&#20026;&#26381;&#21153;&#27491;&#24120;&#65292;&#22914;&#26524;&#30913;&#30424;&#26412;&#36523;&#30830;&#23454;&#24930;&#21017;&#35774;&#32622;&#19968;&#20010;etcd&#19987;&#29992;&#30913;&#30424;&#25110;&#32773;&#26356;&#25442;&#25104;SSD&#36890;&#24120;&#23601;&#33021;&#35299;&#20915;&#38382;&#39064;&#12290;</p>\n<p>&#31532;&#20108;&#20010;&#21407;&#22240;&#26159;CPU&#35745;&#31639;&#21147;&#19981;&#36275;&#12290;&#22914;&#26524;&#26159;&#36890;&#36807;&#30417;&#25511;&#31995;&#32479;&#21457;&#29616;CPU&#21033;&#29992;&#29575;&#30830;&#23454;&#24456;&#39640;&#65292;&#23601;&#24212;&#35813;&#25226;etcd&#31227;&#21040;&#26356;&#22909;&#30340;&#26426;&#22120;&#19978;&#65292;&#28982;&#21518;&#36890;&#36807;cgroups&#20445;&#35777;etcd&#36827;&#31243;&#29420;&#20139;&#26576;&#20123;&#26680;&#30340;&#35745;&#31639;&#33021;&#21147;&#65292;&#25110;&#32773;&#25552;&#39640;etcd&#30340;priority&#12290;</p>\n<p>&#25110;&#32773;&#26377;&#21035;&#30340;&#19968;&#20123;&#20302;&#36895;&#35831;&#27714;&#22914;&#26377;&#20154;&#35201;&#33719;&#21462;&#25152;&#26377;&#30340;key&#20063;&#20250;&#23548;&#33268;&#20889;&#35831;&#27714;&#21463;&#24433;&#21709;&#12290;</p>\n<h4 id=\"toc_20\">5.1.2 &ldquo;failed to send out heartbeat on time&rdquo;</h4>\n<hr>\n<p>etcd&#20351;&#29992;&#20102;raft&#31639;&#27861;&#65292;leader&#20250;&#23450;&#26102;&#22320;&#32473;&#27599;&#20010;follower&#21457;&#36865;&#24515;&#36339;&#65292;&#22914;&#26524;leader&#36830;&#32493;&#20004;&#20010;&#24515;&#36339;&#26102;&#38388;&#27809;&#26377;&#32473;follower&#21457;&#36865;&#24515;&#36339;&#65292;etcd&#20250;&#25171;&#21360;&#36825;&#20010;log&#20197;&#32473;&#20986;&#21578;&#35686;&#12290;&#36890;&#24120;&#24773;&#20917;&#19979;&#36825;&#20010;issue&#26159;disk&#36816;&#34892;&#36807;&#24930;&#23548;&#33268;&#30340;&#65292;leader&#19968;&#33324;&#20250;&#22312;&#24515;&#36339;&#21253;&#37324;&#38468;&#24102;&#19968;&#20123;metadata&#65292;leader&#38656;&#35201;&#20808;&#25226;&#36825;&#20123;&#25968;&#25454;&#22266;&#21270;&#21040;&#30913;&#30424;&#19978;&#65292;&#28982;&#21518;&#25165;&#33021;&#21457;&#36865;&#12290;&#20889;&#30913;&#30424;&#36807;&#31243;&#21487;&#33021;&#35201;&#19982;&#20854;&#20182;&#24212;&#29992;&#31454;&#20105;&#65292;&#25110;&#32773;&#22240;&#20026;&#30913;&#30424;&#26159;&#19968;&#20010;&#34394;&#25311;&#30340;&#25110;&#32773;&#26159;SATA&#31867;&#22411;&#30340;&#23548;&#33268;&#36816;&#34892;&#36807;&#24930;&#65292;&#27492;&#26102;&#21482;&#26377;&#26356;&#22909;&#26356;&#24555;&#30913;&#30424;&#30828;&#20214;&#25165;&#33021;&#35299;&#20915;&#38382;&#39064;&#12290;etcd&#26292;&#38706;&#32473;Prometheus&#30340;metrics&#25351;&#26631;wal<em>fsync</em>duration_seconds&#23601;&#26174;&#31034;&#20102;wal&#26085;&#24535;&#30340;&#24179;&#22343;&#33457;&#36153;&#26102;&#38388;&#65292;&#36890;&#24120;&#36825;&#20010;&#25351;&#26631;&#24212;&#20302;&#20110;10ms&#12290;</p>\n<p>&#31532;&#20108;&#31181;&#21407;&#22240;&#23601;&#26159;CPU&#35745;&#31639;&#33021;&#21147;&#19981;&#36275;&#12290;&#22914;&#26524;&#26159;&#36890;&#36807;&#30417;&#25511;&#31995;&#32479;&#21457;&#29616;CPU&#21033;&#29992;&#29575;&#30830;&#23454;&#24456;&#39640;&#65292;&#23601;&#24212;&#35813;&#25226;etcd&#31227;&#21040;&#26356;&#22909;&#30340;&#26426;&#22120;&#19978;&#65292;&#28982;&#21518;&#36890;&#36807;cgroups&#20445;&#35777;etcd&#36827;&#31243;&#29420;&#20139;&#26576;&#20123;&#26680;&#30340;&#35745;&#31639;&#33021;&#21147;&#65292;&#25110;&#32773;&#25552;&#39640;etcd&#30340;priority&#12290;</p>\n<p>&#31532;&#19977;&#31181;&#21407;&#22240;&#23601;&#21487;&#33021;&#26159;&#32593;&#36895;&#36807;&#24930;&#12290;&#22914;&#26524;Prometheus&#26174;&#31034;&#26159;&#32593;&#32476;&#26381;&#21153;&#36136;&#37327;&#19981;&#34892;&#65292;&#35692;&#22914;&#24310;&#36831;&#22826;&#39640;&#25110;&#32773;&#20002;&#21253;&#29575;&#36807;&#39640;&#65292;&#37027;&#23601;&#25226;etcd&#31227;&#21040;&#32593;&#32476;&#19981;&#25317;&#22581;&#30340;&#24773;&#20917;&#19979;&#23601;&#33021;&#35299;&#20915;&#38382;&#39064;&#12290;&#20294;&#26159;&#22914;&#26524;etcd&#26159;&#36328;&#26426;&#25151;&#37096;&#32626;&#30340;&#65292;&#38271;&#24310;&#36831;&#23601;&#19981;&#21487;&#36991;&#20813;&#20102;&#65292;&#37027;&#23601;&#38656;&#35201;&#26681;&#25454;&#26426;&#25151;&#38388;&#30340;RTT&#35843;&#25972;heartbeat-interval&#65292;&#32780;&#21442;&#25968;election-timeout&#21017;&#33267;&#23569;&#26159;heartbeat-interval&#30340;5&#20493;&#12290;</p>\n<h4 id=\"toc_21\">5.1.3 &ldquo;snapshotting is taking more than x seconds to finish ...&rdquo;</h4>\n<hr>\n<p>etcd&#20250;&#25226;kv snapshot&#21457;&#36865;&#32473;&#19968;&#20123;&#27604;&#36739;&#24930;&#30340;follow&#25110;&#32773;&#36827;&#34892;&#25968;&#25454;&#22791;&#20221;&#12290;&#24930;&#30340;snapshot&#21457;&#36865;&#20250;&#25302;&#24930;&#31995;&#32479;&#30340;&#24615;&#33021;&#65292;&#20854;&#33258;&#36523;&#20063;&#20250;&#38519;&#20837;&#19968;&#31181;&#27963;&#38145;&#29366;&#24577;&#65306;&#22312;&#24456;&#24930;&#22320;&#25910;&#23436;&#19968;&#20010;snapshot&#21518;&#36824;&#27809;&#26377;&#22788;&#29702;&#23436;&#65292;&#21448;&#22240;&#20026;&#36807;&#24930;&#32780;&#25509;&#25910;&#26032;&#30340;snapshot&#12290;&#24403;&#21457;&#36865;&#19968;&#20010;snapshot&#36229;&#36807;30s&#24182;&#19988;&#22312;1Gbps(&#21315;&#20806;)&#32593;&#32476;&#29615;&#22659;&#19979;&#20351;&#29992;&#26102;&#38388;&#36229;&#36807;&#19968;&#23450;&#26102;&#38388;&#26102;&#65292;etcd&#23601;&#20250;&#25171;&#21360;&#36825;&#20010;&#26085;&#24535;&#36827;&#34892;&#21578;&#35686;&#12290;</p>\n<h4 id=\"toc_22\">5.1.4 &ldquo;request ignored (cluster ID mismatch)&rdquo;</h4>\n<hr>\n<p>etcd cluster&#21551;&#21160;&#30340;&#26102;&#20505;&#36890;&#36807;&ldquo;initial-cluster-token&rdquo;&#21442;&#25968;&#25351;&#23450;&#38598;&#32676;&#30340;&#21517;&#31216;&#12290;&#22914;&#26524;&#19968;&#20010;&#32769;&#38598;&#32676;&#24050;&#32463;tear down&#65292;&#20294;&#26159;&#36824;&#26377;&#37096;&#20998;&#25104;&#21592;&#27963;&#30528;&#65292;&#27492;&#26102;&#22312;&#32769;&#38598;&#32676;&#20043;&#19978;&#21448;&#37096;&#32626;&#26032;&#30340;&#38598;&#32676;&#20043;&#21518;&#65292;&#37027;&#20123;&#36824;&#27963;&#30528;&#30340;&#32769;&#25104;&#21592;&#20250;&#23581;&#35797;&#36830;&#25509;&#26032;&#38598;&#32676;&#30340;&#21508;&#20010;&#25104;&#21592;&#65292;&#22240;&#20026;cluster token&#19981;&#19968;&#33268;&#26032;&#25104;&#21592;&#25509;&#25910;&#21040;&#35831;&#27714;&#21518;&#20250;&#25253;&#20986;&#36825;&#20010;warning&#12290;</p>\n<p>&#36991;&#20813;&#36825;&#20010;&#38169;&#35823;&#30340;&#26041;&#27861;&#23601;&#26159;&#19981;&#35201;&#20351;&#29992;&#32769;&#38598;&#32676;&#30340;&#22320;&#22336;&#12290;</p>\n<h3 id=\"toc_23\">5.2 &#36816;&#33829;&#29615;&#22659;&#21442;&#25968;&#35843;&#20248;</h3>\n<hr>\n<p>&#19979;&#38754;&#20869;&#23481;&#26469;&#33258;&#20110;&#21442;&#32771;&#25991;&#26723;20&#12290;etcd&#22312;&#32593;&#32476;&#24310;&#36831;&#20302;&#30340;&#31283;&#23450;&#29615;&#22659;&#19979;&#65292;&#37319;&#29992;etcd&#30340;&#40664;&#35748;&#21442;&#25968;&#23601;&#21487;&#20197;&#31283;&#23450;&#36816;&#34892;&#12290;&#20294;&#22914;&#26524;&#30828;&#20214;&#21407;&#22240;&#25110;&#32773;&#36328;IDC&#20250;&#23548;&#33268;&#32593;&#32476;&#24310;&#36831;&#36807;&#22823;&#65292;&#24433;&#21709;&#24515;&#36339;&#26102;&#38388;&#36229;&#26102;&#25110;&#32773;&#36873;&#20030;&#36229;&#26102;&#12290;</p>\n<p>&#24403;cluster&#20013;&#26576;&#33410;&#28857;&#21345;&#27515;&#25110;&#32773;&#22833;&#32852;&#26102;&#65292;cluster&#20381;&#38752;&#20004;&#20010;&#21442;&#25968;&#37325;&#26032;&#36798;&#25104;consensus&#65306;Heartbeat Interval&#21644;Election Timeout&#12290;Heartbeat Interval&#26159;leader&#32473;follower&#21457;&#36865;&#24515;&#36339;&#30340;&#26102;&#38388;&#38388;&#38548;&#65292;&#36825;&#20010;&#26102;&#38388;&#20540;&#24212;&#35813;&#26159;&#20004;&#20010;peer&#20043;&#38388;&#30340;RTT(round-trip time)&#20540;&#65292;&#20854;&#40664;&#35748;&#20540;&#26159;100ms&#12290;Election Timeout&#21017;&#26159;&#24515;&#36339;&#36229;&#26102;&#26102;&#38388;&#65292;&#22914;&#26524;&#36825;&#20010;&#26102;&#38388;&#36229;&#26102;&#21518;follower&#36824;&#27809;&#26377;&#25910;&#21040;leader&#21457;&#26469;&#30340;&#24515;&#36339;&#65292;&#21017;follower&#23601;&#35748;&#20026;leader&#22833;&#32852;&#65292;&#28982;&#21518;&#21457;&#36215;election&#65292;&#40664;&#35748;&#20540;&#26159;1000ms&#12290;</p>\n<p>Heartbeat Interval&#19968;&#33324;&#21462;&#20540;&#38598;&#32676;&#20013;&#20004;&#20010;peer&#20043;&#38388;RTT&#26368;&#22823;&#20540;&#65292;&#21462;&#20540;&#33539;&#22260;&#26159;[0.5 x RTT, 1.5 x RTT)&#12290;&#22914;&#26524;&#36825;&#20010;&#20540;&#36807;&#22823;&#65292;&#21017;&#20250;&#23548;&#33268;&#24456;&#26202;&#25165;&#20250;&#21457;&#29616;leader&#22833;&#32852;&#65292;&#24433;&#21709;&#38598;&#32676;&#31283;&#23450;&#24615;&#12290;Election Timeout&#21017;&#20381;&#36182;Heartbeat Interval&#21644;&#38598;&#32676;&#20869;&#25152;&#26377;RTT&#20540;&#30340;&#24179;&#22343;&#20540;&#65292;&#19968;&#33324;&#21462;&#20540;&#24179;&#22343;RTT&#30340;&#21313;&#20493;&#65292;&#36825;&#20010;&#20540;&#30340;&#26368;&#22823;&#20540;&#26159;50,000ms&#65288;50s&#65289;,&#36825;&#20010;&#20540;&#21482;&#26377;&#22312;&#20840;&#29699;&#33539;&#22260;&#20869;&#37096;&#32626;&#30340;&#26102;&#20505;&#25165;&#20351;&#29992;&#12290;&#22312;&#20840;&#32654;&#22823;&#38470;&#65292;&#36825;&#20010;&#20540;&#24212;&#35813;&#26159;130ms&#65292;&#32780;&#32654;&#22269;&#21644;&#26085;&#26412;&#20043;&#38388;&#21017;&#24212;&#35813;&#26159;350-400ms&#65292;&#20840;&#29699;&#33539;&#22260;&#30340;RTT&#19968;&#33324;&#26159;5s&#65292;&#25152;&#20197;&#20840;&#29699;&#33539;&#22260;&#30340;Election Timeout&#21462;&#20540;50s&#20316;&#20026;&#19978;&#38480;&#20026;&#23452;&#12290;</p>\n<p>&#25972;&#20010;&#38598;&#32676;&#20869;&#25152;&#26377;peer&#30340;&#36825;&#20004;&#20010;&#20540;&#37117;&#24212;&#35813;&#21462;&#21516;&#26679;&#30340;&#20540;&#65292;&#21542;&#21017;&#20250;&#24341;&#36215;&#28151;&#20081;&#12290;&#21629;&#20196;&#34892;&#20462;&#25913;&#36825;&#20004;&#20010;&#20540;&#30340;&#26041;&#27861;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code># Command line arguments:\n$ etcd &mdash;heartbeat-interval=100 &mdash;election-timeout=500\n\n# Environment variables:\n$ ETCD_HEARTBEAT_INTERVAL=100 ETCD_ELECTION_TIMEOUT=500 etcd</code>\n</pre>\n</div>\n<p>etcd&#24213;&#23618;&#30340;&#23384;&#20648;&#24341;&#25806;boltdb&#37319;&#29992;&#20102;MVCC&#26426;&#21046;&#65292;&#20250;&#25226;&#19968;&#20010;key&#30340;&#25152;&#26377;update&#21382;&#21490;&#37117;&#23384;&#20648;&#19979;&#26469;&#65292;&#25152;&#20197;&#30456;&#20851;&#25968;&#25454;&#25991;&#20214;&#20250;&#32447;&#24615;&#22686;&#38271;&#65292;&#36825;&#20250;&#21152;&#37325;etcd&#30340;&#25968;&#25454;&#21152;&#36733;&#36127;&#25285;&#24182;&#38477;&#20302;&#38598;&#32676;&#30340;&#24615;&#33021;&#65292;&#22312;v2&#29256;&#26412;&#19979;etcd&#21019;&#24314;snapshot&#30340;&#25104;&#26412;&#20063;&#24456;&#39640;&#65292;&#25152;&#20197;&#40664;&#35748;&#24773;&#20917;&#19979;&#27809;10,000&#20010;update&#21518;etcd&#25165;&#20250;&#21019;&#24314;&#19968;&#20010;snapshot&#65292;&#22914;&#26524;&#36825;&#20010;&#21442;&#25968;&#19979;&#21333;&#26426;&#30340;&#20869;&#23384;&#21644;&#30913;&#30424;&#21344;&#29992;&#29575;&#36824;&#26159;&#24456;&#39640;&#65292;&#21017;&#21487;&#20197;&#36890;&#36807;&#21629;&#20196;&#35843;&#25972;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code># Command line arguments:\n$ etcd &mdash;snapshot-count=5000\n\n# Environment variables:\n$ ETCD_SNAPSHOT_COUNT=5000 etcd</code>\n</pre>\n</div>\n<p>&#19978;&#38754;&#20063;&#25552;&#21040;&#65292;etcd&#38656;&#35201;&#25226;log&#23454;&#26102;&#20889;&#20837;&#30913;&#30424;&#65292;&#25152;&#20197;&#20854;&#20182;&#36890;&#36807;fsync&#26041;&#24335;&#20889;&#20837;&#30913;&#30424;&#30340;&#36827;&#31243;&#20250;&#25552;&#39640;etcd&#36827;&#31243;&#30340;&#20889;&#36807;&#31243;&#30340;latency&#65292;&#21518;&#26524;&#26159;&#24515;&#36339;&#36229;&#26102;&#12289;&#22788;&#29702;&#35831;&#27714;&#36229;&#26102;&#12289;&#36319;&#38598;&#32676;&#20869;&#20854;&#20182;&#25104;&#21592;&#22833;&#32852;&#12290;&#21487;&#20197;&#36890;&#36807;&#22914;&#19979;&#21629;&#20196;&#25552;&#39640;etcd&#36827;&#31243;&#30340;&#30913;&#30424;&#25805;&#20316;&#20248;&#20808;&#32423;&#65306;</p>\n<div>\n<pre>\n<code># best effort, highest priority\n$ sudo ionice -c2 -n0 -p `pgrep etcd`</code>\n</pre>\n</div>\n<p>&#22914;&#26524;etcd&#30340;leader&#38656;&#35201;&#22788;&#29702;&#22823;&#37327;&#30340;&#23458;&#25143;&#31471;&#39640;&#24182;&#21457;&#35831;&#27714;&#65292;&#21017;etcd&#21487;&#33021;&#30001;&#20110;&#32593;&#32476;&#25317;&#22622;&#23548;&#33268;&#27599;&#20010;&#35831;&#27714;&#22788;&#29702;&#24310;&#36831;&#36807;&#39640;&#65292;&#19979;&#38754;&#26085;&#24535;&#20250;&#23545;&#36825;&#31181;&#24773;&#20917;&#26377;&#25152;&#25552;&#31034;&#65306;</p>\n<div>\n<pre>\n<code>dropped MsgProp to 247ae21ff9436b2d since streamMsg&rsquo;s sending buffer is full\ndropped MsgAppResp to 247ae21ff9436b2d since streamMsg&rsquo;s sending buffer is full</code>\n</pre>\n</div>\n<p>&#27492;&#26102;&#21487;&#20197;&#36890;&#36807;&#25552;&#20379;etcd&#30340;&#21457;&#36865;&#32531;&#20914;&#22120;&#30340;&#20248;&#20808;&#32423;&#35299;&#20915;&#38382;&#39064;&#65306;</p>\n<div>\n<pre>\n<code>tc qdisc add dev eth0 root handle 1: prio bands 3\ntc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1\ntc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1\ntc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2739 0xffff flowid 1:1\ntc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2739 0xffff flowid 1:1</code>\n</pre>\n</div>\n<h2 id=\"toc_24\">6 etcd op</h2>\n<hr>\n<p>etcd&#23448;&#26041;&#25552;&#20379;&#20102;&#19968;&#20010;&#19975;&#33021;&#30340;&#24037;&#20855;etcdctl&#65292;etcd&#30340;op&#24037;&#20855;&#37117;&#21487;&#20197;&#20511;&#21161;&#20010;&#24037;&#20855;&#23436;&#25104;&#12290;</p>\n<h3 id=\"toc_25\">6.1 snapshot</h3>\n<hr>\n<p>etcd v3&#20860;&#23481;v2&#65292;&#25152;&#20197;&#36827;&#34892;&#25968;&#25454;&#25805;&#20316;&#21069;&#65292;&#38656;&#35201;&#26816;&#26597;&#25968;&#25454;&#30340;&#29256;&#26412;&#65292;&#21442;&#32771;&#25991;&#26723;13&#32473;&#20986;&#20102;&#19968;&#31181;&#26597;&#30475;etcd&#30340;&#25968;&#25454;&#30340;&#29256;&#26412;&#26159;&#21542;&#26159;v3&#30340;&#39564;&#35777;&#26041;&#24335;&#65306;</p>\n<div>\n<pre>\n<code>ETCDCTL_API=3 etcdctl get \"\" --from-key --keys-only --limit 1 | wc -l</code>\n</pre>\n</div>\n<p>&#22914;&#26524;&#36755;&#20986;&#20026;0&#65292;&#21017;&#25968;&#25454;&#29256;&#26412;&#26159;v2&#12290;</p>\n<p>&#21442;&#32771;&#25991;&#26723;9&#24314;&#35758;&#23450;&#26399;&#23545;etcd&#25968;&#25454;&#36827;&#34892;&#20919;&#22791;&#65292;&#20854;#Snapshot backup#&#19968;&#33410;&#32473;&#20986;&#20102;&#20919;&#22791;&#30340;&#29992;&#27861;&#65306;</p>\n<div>\n<pre>\n<code>$ etcdctl snapshot save backup.db</code>\n</pre>\n</div>\n<p>&#8203; $ etcdctl --endpoints $ENDPOINT &mdash;write-out=table snapshot status backup.db &#8203; +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+ &#8203; | HASH | REVISION | TOTAL KEYS | TOTAL SIZE | &#8203; +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+ &#8203; | fe01cf57 | 10 | 7 | 2.1 MB | &#8203; +&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;+ &#8203; &#8203; &#21442;&#32771;&#25991;&#26723;10#Snapshotting the keyspace#&#19968;&#33410;&#20013;&#25552;&#21040;&#20102;&#21478;&#19968;&#31181;&#26041;&#27861;&#65306;&#30452;&#25509;&#25226;&#25968;&#25454;&#30446;&#24405;member/snap/db&#19979;&#30340;&#25968;&#25454;&#25335;&#36125;&#22791;&#20221;&#12290;</p>\n<p>&#33267;&#20110;&#29992;&#20919;&#22791;&#25968;&#25454;&#22914;&#20309;&#24674;&#22797;&#19968;&#20010;cluster&#65292;&#35831;&#21442;&#35265;&#21442;&#32771;&#25991;&#26723;10#Restoring a cluster#&#12290;</p>\n<p>snapshot&#39047;&#31867;&#20284;&#20110;Redis&#30340;rdb&#25991;&#20214;&#65292;&#26159;&#26576;&#20010;&#26102;&#21051;&#25152;&#20197;kv&#25968;&#25454;&#21508;&#33258;&#26368;&#21518;revision&#30340;&#26368;&#26032;&#20540;&#65292;&#25152;&#26377;&#21382;&#21490;&#25968;&#25454;&#37117;&#34987;compact&#25481;&#12290;&#31532;5&#33410;&#25552;&#21040;etcd&#36890;&#36807;&#30456;&#20851;&#21442;&#25968;&#25511;&#21046;&#19979;&#40664;&#35748;&#27599;10,000&#27425;update&#21518;&#20250;&#23545;&#21046;&#20316;&#19968;&#20010;snapshot&#12290;</p>\n<h3 id=\"toc_26\">6.2 data migration</h3>\n<hr>\n<p>etcd&#38598;&#32676;&#30340;&#25968;&#25454;&#36824;&#21487;&#20197;&#36827;&#34892;&#25968;&#25454;&#36801;&#31227;[migration]&#65292;&#21487;&#20197;&#37319;&#29992;&#31163;&#32447;&#25110;&#32773;&#22312;&#32447;&#20004;&#31181;&#26041;&#24335;&#65292;&#24403;&#25968;&#25454;&#37327;&#36229;&#36807;&#19968;&#23450;&#37327;&#30340;&#26102;&#20505;&#65292;&#21442;&#32771;&#25991;&#26723;13&#19981;&#24314;&#35758;&#36827;&#34892;&#22312;&#32447;&#24674;&#22797;&#65292;&#24314;&#35758;&#30452;&#25509;&#25226;etcd cluster&#20851;&#20572;&#65292;&#22791;&#20221;&#25968;&#25454;&#28982;&#21518;&#25335;&#36125;&#21040;&#30446;&#30340;&#22320;&#65292;&#20197;&#31163;&#32447;&#26041;&#24335;&#37325;&#26032;&#21551;&#21160;etcd cluster&#12290;</p>\n<h4 id=\"toc_27\">6.2.1 &#31163;&#32447;&#36801;&#31227;</h4>\n<hr>\n<p>&#39318;&#20808;&#25226;&#38598;&#32676;&#20572;&#26381;&#65292;&#28982;&#21518;&#21464;&#25442;etcd&#27599;&#20010;member&#30340;client&#26381;&#21153;&#31471;&#21475;&#20877;&#27425;&#37325;&#21551;&#65292;&#30830;&#20445;cluster&#21508;&#20010;&#25104;&#21592;&#30340;raft&#29366;&#24577;&#26426;&#36798;&#21040;&#21516;&#26679;&#30340;&#29366;&#24577;&#65292;&#36825;&#20010;&#21487;&#20197;&#36890;&#36807;&#21629;&#20196; <strong>ETCDCTL_API=3 etcdctl endpoint status</strong> &#30830;&#35748;&#65292;&#24403;&#25152;&#26377;member&#30340;raft index&#30456;&#31561;&#25110;&#32773;&#30456;&#24046;&#19981;&#36229;&#36807;1&#65288;raft&#20869;&#37096;&#30340;&#21629;&#20196;&#23548;&#33268;&#65289;&#26102;&#35748;&#20026;&#25968;&#25454;&#19968;&#33268;&#12290;</p>\n<p>&#36890;&#36807;&#21629;&#20196; <strong>ETCDCTL_API=3 etcdctl migrate</strong> &#21363;&#21487;&#23436;&#25104;&#25968;&#25454;v2&#21040;v3&#30340;&#36801;&#31227;&#65292;v3&#30340;&#25968;&#25454;&#26684;&#24335;&#26159;mvcc&#26684;&#24335;&#12290;&#25968;&#25454;&#36801;&#31227;&#23436;&#27605;&#21487;&#20197;&#36890;&#36807;&#21629;&#20196; <strong>ETCDCTL_API=3 etcdctl endpoint hashkv --cluster</strong> &#39564;&#35777;&#25968;&#25454;&#30340;&#19968;&#33268;&#24615;&#12304;&#27880;&#24847;&#36825;&#20010;&#21629;&#20196;&#21482;&#33021;&#22312;v3.3&#20197;&#19978;&#25165;&#21487;&#20351;&#29992;&#12305;&#12290;</p>\n<p>&#20294;&#26159;&#23545;&#20110;v2&#20013;&#30340;TTL&#25968;&#25454;&#65292;&#22914;&#26524;&#25968;&#25454;commited&#26102;&#25152;&#22312;&#30340;member&#30340;raft index&#27604;leader&#30340;&#30340;index&#23567;&#65292;&#21017;&#25968;&#25454;&#36801;&#31227;&#21518;&#21487;&#33021;&#23548;&#33268;&#25968;&#25454;&#19981;&#19968;&#33268;&#12290;</p>\n<h4 id=\"toc_28\">6.2.2 &#22312;&#32447;&#36801;&#31227;</h4>\n<hr>\n<p>&#22312;&#32447;&#36801;&#31227;&#30340;&#22909;&#22788;&#24403;&#28982;&#26159;&#19981;&#20572;&#26381;&#65292;&#20294;&#26159;&#21069;&#25552;&#26159;&#35201;&#27714;&#23458;&#25143;&#31471;&#20351;&#29992;v3&#29256;&#26412;&#30340;API&#12290;&#24212;&#29992;&#25903;&#25345;etcd cluster&#30340;migration mode&#21644;normal mode&#65292;etcd cluster&#36816;&#34892;&#22312;migration cluster&#26399;&#38388;&#65292;&#24212;&#29992;&#35835;&#21462;&#25968;&#25454;&#20808;&#20351;&#29992;v3 API&#65292;&#22833;&#36133;&#21518;&#20877;&#23581;&#35797;v2 API&#12290;&#32780;&#22312;normal mode&#19979;&#24212;&#29992;&#21482;&#33021;&#20351;&#29992;v3 API&#12290;&#20004;&#31181;mode&#19979;&#20889;API&#21482;&#33021;&#20351;&#29992;v3&#12290;</p>\n<p>migration mode&#19979;&#23458;&#25143;&#31471;&#20250;watch&#19968;&#20010;swtich mode key&#65292;&#24403;migration mode&#20999;&#25442;&#21040;normal mode&#21518;&#65292;&#36825;&#20010;key&#30340;value&#26159;true&#12290;&#26381;&#21153;&#31471;&#22312;migration mode&#19979;&#21017;&#20250;&#21551;&#21160;&#19968;&#20010;&#21518;&#21488;&#20219;&#21153;&#65292;&#20351;&#29992;v2 API&#35835;&#21462;&#25968;&#25454;&#28982;&#21518;&#35843;&#29992;v3 API&#20889;&#20837;mvcc&#23384;&#20648;&#24341;&#25806;&#20013;&#12290;</p>\n<p>&#21442;&#32771;&#25991;&#26723;13&#22312;&#25991;&#31456;&#26411;&#23614;&#19981;&#24314;&#35758;&#37319;&#29992;online migration&#26041;&#24335;&#65292;&#22240;&#20026;&#36825;&#20250;&#23548;&#33268;&#23458;&#25143;&#31471;&#21644;etcd cluster&#20043;&#38388;&#30340;&#32593;&#32476;&#24320;&#38144;&#22806;&#65292;&#36824;&#20250;&#23548;&#33268;etcd&#33258;&#36523;&#20887;&#20313;&#25968;&#25454;&#36807;&#22810;&#12290;</p>\n<p>&#21442;&#32771;&#25991;&#26723;14#Limitations#&#25552;&#21040;&#65306;&#24403;&#19968;&#20010;&#38598;&#32676;&#26377;&#36229;&#36807;50MB&#30340;v2&#25968;&#25454;&#26102;&#65292;&#25968;&#25454;&#21319;&#32423;&#36807;&#31243;&#21487;&#33021;&#33457;&#36153;&#20004;&#20998;&#38047;&#65292;&#22914;&#26524;&#36229;&#36807;100MB&#21017;&#21487;&#33021;&#33457;&#36153;&#26356;&#22810;&#26102;&#38388;&#12290;</p>\n<h3 id=\"toc_29\">6.3 data compaction&#21644;data defragment</h3>\n<hr>\n<p>etcd&#30340;compaction&#20165;&#20165;&#26159;&#21512;&#24182;&#19968;&#20123;&#25991;&#20214;&#24182;&#36827;&#34892;&#36807;&#21435;&#25968;&#25454;&#30340;&#21024;&#38500;&#65292;&#20294;&#26159;&#25991;&#20214;&#21344;&#29992;&#30340;&#30913;&#30424;&#21487;&#33021;&#26377;&#24456;&#22810;&#30862;&#29255;&#65292;&#21487;&#20197;&#20351;&#29992;etcdctl&#23436;&#25104;&#30862;&#29255;&#25972;&#29702;&#24037;&#20316;&#12290;</p>\n<p>&#21442;&#32771;&#25991;&#26723;9#History compaction#&#32473;&#20986;&#20102;&#30456;&#20851;compaction&#20351;&#29992;&#26041;&#27861;&#65306;</p>\n<div>\n<pre>\n<code># keep one hour of history\n$ etcd --auto-compaction-retention=1</code>\n</pre>\n</div>\n<p>&#19978;&#38754;&#36825;&#31181;&#25805;&#20316;&#26041;&#27861;&#26159;&#36890;&#36807;&#26102;&#38388;&#31383;&#21475;&#30340;&#31574;&#30053;&#35753;etcd&#33258;&#21160;&#21387;&#32553;&#25968;&#25454;&#65292;&#36824;&#21487;&#20197;&#36890;&#36807;etcdctl&#21629;&#20196;&#25163;&#24037;&#36827;&#34892;&#25968;&#25454;&#21387;&#32553;&#65306;</p>\n<div>\n<pre>\n<code># compact up to revision 3\n$ etcdctl compact 3</code>\n</pre>\n</div>\n<p>&#36890;&#36807;&#19978;&#38754;&#30340;&#21629;&#20196;&#25163;&#24037;&#21387;&#32553;&#25968;&#25454;&#20043;&#21518;&#65292;revision 3&#20043;&#21069;&#30340;&#25968;&#25454;&#23601;&#34987;&#28165;&#29702;&#25481;&#20102;&#65292;&#35692;&#22914;&#65306;</p>\n<div>\n<pre>\n<code>$ etcdctl get --rev=2 somekey\nError:  rpc error: code = 11 desc = etcdserver: mvcc: required revision has been compacted</code>\n</pre>\n</div>\n<p>&#21442;&#32771;&#25991;&#26723;9#Defragmentation#&#32473;&#20986;&#20102;&#30862;&#29255;&#25972;&#29702;&#30456;&#20851;&#20351;&#29992;&#26041;&#27861;&#65306;</p>\n<div>\n<pre>\n<code>$ etcdctl defrag\nFinished defragmenting etcd member[127.0.0.1:2379]</code>\n</pre>\n</div>\n<p>&#22914;&#26524;etcd&#27809;&#26377;&#36816;&#34892;&#65292;&#21487;&#20197;&#30452;&#25509;&#20316;&#29992;&#20110;data&#30446;&#24405;&#65306;</p>\n<div>\n<pre>\n<code>$ etcdctl defrag --data-dir &lt;path-to-etcd-data-dir&gt;</code>\n</pre>\n</div>\n<h3 id=\"toc_30\">6.4 &#35282;&#33394;&#25511;&#21046;</h3>\n<hr>\n<p>&#22914;&#26524;etcd&#34987;&#24403;&#21021;&#19968;&#20010;&#37197;&#32622;&#20013;&#24515;&#65292;&#27492;&#26102;&#35282;&#33394;&#25511;&#21046;&#23601;&#26377;&#24517;&#35201;&#20102;&#12290;&#21442;&#32771;&#25991;&#26723;11&#35814;&#32454;&#25551;&#36848;&#20102;&#22914;&#20309;&#20511;&#21161;etcdctl&#36827;&#34892;&#35282;&#33394;&#25511;&#21046;&#65292;&#19981;&#36807;&#36824;&#26377;&#19968;&#20010;&#26356;&#22909;&#29992;&#30340;&#24102;&#26377;UI&#30028;&#38754;&#30340;&#24037;&#20855;<a href=\"https://github.com/soyking/e3w\">e3w</a>&#65292;&#36825;&#20010;&#24037;&#20855;&#30340;&#30028;&#38754;&#26159;js&#23454;&#29616;&#30340;&#65292;&#36890;&#36807;&#23427;&#23601;&#21487;&#26041;&#20415;&#22320;&#36827;&#34892;&#35282;&#33394;&#21019;&#24314;&#12290;</p>\n<h2 id=\"toc_31\">7 API</h2>\n<hr>\n<p>&#21442;&#32771;&#25991;&#26723;11#Request Size Limitation#&#25552;&#21040;etcd&#20026;&#20102;&#38450;&#27490;&#19968;&#20010;&#22823;&#21253;&#35831;&#27714;&#25226;&#36830;&#25509;&#36890;&#36947;&#38459;&#22622;&#20303;&#65292;&#38480;&#21046;&#19968;&#20010;&#35831;&#27714;&#21253;&#22823;&#23567;&#22312;1MB&#20197;&#20869;&#12290;</p>\n<h3 id=\"toc_32\">7.1 Client Request Timeout</h3>\n<hr>\n<p>&#21442;&#32771;&#25991;&#26723;16#Client Request Timeout#&#25552;&#21040;&#24403;&#21069;&#21508;&#31181;&#35831;&#27714;&#30340;&#36229;&#26102;&#21442;&#25968;&#36824;&#19981;&#33021;&#34987;&#20462;&#25913;&#65292;&#36825;&#37324;&#20063;&#32473;&#20986;&#20102;&#21508;&#20010;&#31867;&#22411;&#30340;&#36229;&#26102;&#21442;&#25968;&#65306;</p>\n<ul>\n<li>1 Get: &#19981;&#21487;&#35774;&#32622;&#65292;&#24212;&#20026;get&#35831;&#27714;&#24213;&#23618;&#22788;&#29702;&#26159;&#24322;&#27493;&#30340;&#65307;</li>\n<li>2 Watch: &#19981;&#21487;&#35774;&#32622;&#65292;&#38500;&#38750;&#29992;&#25143;&#20027;&#21160;&#21462;&#28040;&#25110;&#32773;&#36830;&#25509;&#20013;&#26029;&#65307;</li>\n<li>3 Delete, Put, Post, QuorumGet: &#40664;&#35748;5s&#65292;&#23448;&#26041;&#35748;&#20026;5s&#33021;&#22815;&#28385;&#36275;&#32477;&#23545;&#37096;&#20998;&#24773;&#20917;&#19979;&#30340;&#36229;&#26102;&#35201;&#27714;&#65307;</li>\n</ul>\n<p>&#20854;&#20182;&#24773;&#20917;&#19979;&#22914;&#26524;&#21457;&#29983;&#36229;&#26102;&#30340;&#24773;&#20917;&#65292;&#21017;&#21487;&#33021;&#26377;&#20004;&#31181;&#21407;&#22240;&#65306;&#22788;&#29702;&#35831;&#27714;&#30340;server&#19981;&#33021;&#25552;&#20379;&#27491;&#24120;&#26381;&#21153;&#65292;&#25110;&#32773;&#38598;&#32676;&#22833;&#21435;&#20102;quorum&#12290;</p>\n<p>&#22914;&#26524;&#23458;&#25143;&#31471;&#35831;&#27714;&#36229;&#26102;&#22810;&#27425;&#21457;&#29983;&#65292;&#31995;&#32479;&#31649;&#29702;&#21592;&#24212;&#35813;&#21435;&#26816;&#26597;&#31995;&#32479;&#30340;&#36816;&#34892;&#24773;&#20917;&#12290;</p>\n<p>github.com/coreos/etcd/clientv3/config.go:Config::DialTimeout &#24847;&#20026;&#21019;&#24314;client&#30340;&#39318;&#27425;&#36830;&#25509;&#36229;&#26102;&#65292;Client &#21019;&#24314;&#25104;&#21151;&#21518;&#23601;&#19981;&#29992;&#20851;&#24515;&#20854;&#24213;&#23618;&#36830;&#25509;&#29366;&#24577;&#20102;&#65292;&#20854;&#24213;&#23618;&#20250;&#19981;&#26029;&#26816;&#26597;&#38142;&#25509;&#29366;&#24577;&#65292;&#22833;&#36133;&#21017;&#23581;&#35797;&#37325;&#36830;&#12290;</p>\n<h3 id=\"toc_33\">7.2 KV</h3>\n<hr>\n<p>&#21442;&#32771;&#25991;&#26723;18&#25552;&#21040;etcd&#22823;&#37096;&#20998;API&#37117;&#26159;&#23545;KV&#23545;&#30340;&#35831;&#27714;&#21644;&#25805;&#20316;&#12290;etcd kv&#30340;protobuf&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message KeyValue {\n    bytes key = 1;\n    int64 create_revision = 2;\n    int64 mod_revision = 3;\n    int64 version = 4;\n    bytes value = 5;\n    int64 lease = 6;</code>\n</pre>\n</div>\n<p>&#8203; }</p>\n<p>&#21508;&#20010;&#23383;&#27573;&#24847;&#20041;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>key&#26159;&#23383;&#33410;&#25968;&#32452;&#65292;&#19981;&#21487;&#20026;&#31354;&#65307;</li>\n<li>value&#20063;&#26159;&#23383;&#33410;&#25968;&#32452;&#65307;</li>\n<li>version&#21017;&#26159;key&#30340;&#29256;&#26412;&#65292;&#19968;&#20010;&#21024;&#38500;&#21160;&#20316;&#20250;&#25226;&#36825;&#20010;&#20540;&#28165;&#38646;&#65292;&#27599;&#27425;&#26356;&#26032;&#21017;&#20250;&#35753;&#20854;&#20540;&#22686;&#19968;&#65307;</li>\n<li>Create_Revision key&#21019;&#24314;&#26102;&#20505;&#30340;revision&#65307;</li>\n<li>Mod_Revision key&#26368;&#36817;&#19968;&#27425;&#20462;&#25913;&#26102;&#30340;revision&#65307;</li>\n<li>Lease &#19982;key&#20851;&#32852;&#30340;Lease&#65292;&#22914;&#26524;&#20854;&#20540;&#20026;0&#21017;&#35828;&#26126;&#27809;&#26377;&#20851;&#32852;&#30340;Lease&#65307;</li>\n</ul>\n<p>revision&#26159;MVCC&#20013;&#30340;&#27010;&#24565;&#65292;&#26159;etcd&#20013;cluster&#32423;&#21035;&#30340;&#35745;&#25968;&#22120;&#65292;&#27599;&#27425;&#20462;&#25913;&#25805;&#20316;&#37117;&#20250;&#35753;&#20854;&#33258;&#22686;&#65292;&#21487;&#20197;&#35748;&#20026;&#26159;&#20840;&#23616;&#36923;&#36753;&#26102;&#38047;(global logical clock)&#65292;&#23545;&#25152;&#26377;&#20462;&#25913;&#25805;&#20316;&#36827;&#34892;&#25490;&#24207;&#65306;revision&#36234;&#22823;&#35828;&#26126;&#20854;&#20540;&#36234;&#26032;&#65292;etcd&#23545;key&#32034;&#24341;&#20351;&#29992;B+&#26641;&#26041;&#24335;&#36827;&#34892;&#32452;&#32455;&#12290;etcd&#27599;&#20010;key&#37117;&#26377;&#24456;&#22810;revision&#65288;&#20462;&#35746;&#29256;&#26412;&#65289;&#65292;&#27599;&#27425;&#20107;&#21153;&#25805;&#20316;&#37117;&#20250;&#21019;&#24314;&#19968;&#20010;revision&#65292;&#32769;&#30340;revision&#22312;etcd&#36827;&#34892;compaction&#25805;&#20316;&#30340;&#26102;&#20505;&#20250;&#34987;&#28165;&#38500;&#12290;create<em>revision&#20250;&#22312;&#20351;&#29992;<a href=\"https://github.com/coreos/etcd/blob/master/clientv3/concurrency/mutex.go\">mutex lock</a>&#30340;&#26102;&#20505;&#20351;&#29992;&#65292;Mod</em>Revision&#19982;<a href=\"https://github.com/coreos/etcd/blob/master/clientv3/concurrency/stm.go\">&#20107;&#21153;</a>&#25805;&#20316;&#21644;<a href=\"https://github.com/coreos/etcd/blob/master/clientv3/concurrency/election.go\">leader&#36873;&#20030;</a>&#26377;&#20851;&#12290;</p>\n<p>revision&#20063;&#19982;watch&#26377;&#20851;&#65292;&#24403;watch&#30340;client&#19982;server&#38378;&#26029;&#37325;&#36830;&#21518;&#65292;etcd&#26681;&#25454;client&#19978;&#27425;watch&#30456;&#20851;&#30340;revision&#65292;&#25226;&#20854;&#21518;&#30340;&#20462;&#25913;&#20877;&#36890;&#30693;&#32473;client&#12290;</p>\n<h3 id=\"toc_34\">7.3 Range</h3>\n<hr>\n<p>etcd&#20801;&#35768;&#19968;&#27425;&#20197;range&#24418;&#24335;&#25805;&#20316;&#22810;&#20010;key&#12290;etcd&#23545;&#25968;&#25454;&#30340;&#32452;&#32455;&#19981;&#20687;zookeeper&#37027;&#26679;&#20197;&#30446;&#24405;&#23618;&#27425;&#32467;&#26500;&#30340;&#26041;&#24335;&#36827;&#34892;&#65292;&#32780;&#21482;&#26377;&#19968;&#20010;&#23618;&#32423;&#65292;range&#30340;&#24418;&#24335;&#26159;[a, b)&#65292;&#21363;[key, key<em>end)&#12290;&#22914;&#26524;key</em>end&#20026;&#31354;&#21017;&#35831;&#27714;&#21482;&#26377;key&#65307;&#22914;&#26524;range&#26159;[key, key+0x1)&#21017;&#26159;&#35831;&#27714;&#20197;key&#20026;&#21069;&#32512;&#30340;&#25152;&#26377;key&#65307;&#22914;&#26524;key_end&#26159;&rsquo;\\0&rsquo;&#65292;&#21017;&#35831;&#27714;&#25152;&#26377;&#22823;&#20110;&#31561;&#20110;key&#30340;&#25152;&#26377;key&#12290;</p>\n<p>Range&#35831;&#27714;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message RangeRequest {\n  enum SortOrder {\n    NONE = 0; // default, no sorting\n    ASCEND = 1; // lowest target value first\n    DESCEND = 2; // highest target value first\n  }\n  enum SortTarget {\n    KEY = 0;\n    VERSION = 1;\n    CREATE = 2;\n    MOD = 3;\n    VALUE = 4;\n  }\n\n  bytes key = 1;\n  bytes range_end = 2;\n  int64 limit = 3;\n  int64 revision = 4;\n  SortOrder sort_order = 5;\n  SortTarget sort_target = 6;\n  bool serializable = 7;\n  bool keys_only = 8;\n  bool count_only = 9;\n  int64 min_mod_revision = 10;\n  int64 max_mod_revision = 11;\n  int64 min_create_revision = 12;\n  int64 max_create_revision = 13;\n}</code>\n</pre>\n</div>\n<p>&#21508;&#20010;&#23383;&#27573;&#21547;&#20041;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>Key, Range_End - key range&#65307;</li>\n<li>Limit - &#36820;&#22238;key&#30340;&#25968;&#30446;&#30340;&#26368;&#22823;&#20540;&#65292;&#22914;&#26524;&#20026;0&#21017;&#35828;&#26126;&#27809;&#26377;&#38480;&#21046;&#65307;</li>\n<li>Revision - key&#20462;&#25913;&#30340;&#26102;&#38388;&#28857;(point-in-time)&#65292;&#22914;&#26524;&#20854;&#20540;&#20026;0&#21017;&#26159;&#33719;&#21462;&#26368;&#26032;&#30340;kv&#65292;&#22914;&#26524;&#25351;&#23450;&#30340;revision&#24050;&#32463;&#34987;compact&#25481;&#21017;etcd&#36820;&#22238;ErrCompacted&#38169;&#35823;&#65307;</li>\n<li>Sort_Order - &#35831;&#27714;&#30340;&#25490;&#24207;&#26041;&#24335;&#65307;</li>\n<li>Sort_Target - kv&#30340;&#25490;&#24207;&#26041;&#24335;&#65307;</li>\n<li>Serializable - sets the range request to use serializable member-local reads. By default, Range is linearizable; it reflects the current consensus of the cluster. For better performance and availability, in exchange for possible stale reads, a serializable range request is served locally without needing to reach consensus with other nodes in the cluster.</li>\n<li>Keys_Only - &#21482;&#36820;&#22238;key&#65292;&#26080;&#38656;&#36820;&#22238;Value&#65307;</li>\n<li>Count_Only - &#21482;&#36820;&#22238;range&#20869;key&#30340;&#25968;&#30446;&#65307;</li>\n<li>Min_Mod_Revision - &#26368;&#20302;mod revision&#20540;&#65292;Mod_Revision&#20302;&#20110;&#36825;&#20010;&#20540;&#30340;kv&#20250;&#34987;&#36807;&#28388;&#25481;&#65307;</li>\n<li>Max_Mod_Revision - &#26368;&#22823;mod revision&#20540;&#65292;Mod_Revision&#39640;&#20110;&#36825;&#20010;&#20540;&#30340;kv&#20250;&#34987;&#36807;&#28388;&#25481;&#65307;</li>\n<li>Min_Create_Revision - &#26368;&#20302;create revision&#20540;&#65292;Mod_Revision&#20302;&#20110;&#36825;&#20010;&#20540;&#30340;kv&#20250;&#34987;&#36807;&#28388;&#25481;&#65307;</li>\n<li>Max_Create_Revision - &#26368;&#39640;create revision&#20540;&#65292;Mod_Revision&#39640;&#20110;&#36825;&#20010;&#20540;&#30340;kv&#20250;&#34987;&#36807;&#28388;&#25481;&#12290;</li>\n</ul>\n<p>Range&#35831;&#27714;&#30340;&#21709;&#24212;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message ResponseHeader {\n  uint64 cluster_id = 1;\n  uint64 member_id = 2;\n  int64 revision = 3;\n  uint64 raft_term = 4;\n}\n\nmessage RangeResponse {\n  ResponseHeader header = 1;\n  repeated mvccpb.KeyValue kvs = 2;\n  bool more = 3;\n  int64 count = 4;\n}</code>\n</pre>\n</div>\n<p>&#21508;&#20010;&#23383;&#27573;&#21547;&#20041;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>Cluster_ID - etcd cluster ID&#65307;</li>\n<li>Member_ID - &#36820;&#22238;&#21709;&#24212;&#30340;cluster member&#30340;ID&#65307;</li>\n<li>Revision - &#33719;&#21462;&#24403;&#21069;&#31995;&#32479;&#26368;&#26032;&#30340;kv Revision&#65307;</li>\n<li>Raft_Term - &#36825;&#20010;&#23383;&#27573;&#21487;&#29992;&#20110;&#26816;&#27979;&#24403;&#21069;&#38598;&#32676;&#26159;&#21542;&#24050;&#32463;&#36873;&#20030;&#20986;&#19968;&#20010;&#26032;&#30340;leader&#65307;</li>\n<li>Kvs - &#35831;&#27714;&#36820;&#22238;&#32467;&#26524;&#65292;&#22914;&#26524;Count_Only&#20026;true&#65292;&#21017;&#36825;&#20010;&#32467;&#26524;&#20026;&#31354;&#65307;</li>\n<li>More - &#26159;&#21542;&#26377;&#26356;&#22810;&#20540;&#65292;&#22914;&#26524;limit&#20026;true&#65307;</li>\n<li>Count - Count_Only&#20026;true&#26102;&#20505;&#30340;&#32467;&#26524;&#12290;</li>\n</ul>\n<p><a href=\"https://yuerblog.cc/2017/12/12/etcd-v3-sdk-usage\">&#21442;&#32771;&#25991;&#26723;26</a> &#25552;&#21040; Get &#25805;&#20316;&#26102;&#30340; etcd Range &#26426;&#21046;&#65306;</p>\n<div>\n<pre>\n<code>&#25105;&#20204;&#36890;&#36807;&#19968;&#20010;&#29305;&#21035;&#30340;Get&#36873;&#39033;&#65292;&#33719;&#21462;/test&#30446;&#24405;&#19979;&#30340;&#25152;&#26377;&#23401;&#23376;&#65306;\n\nrangeResp, err := kv.Get(context.TODO(), \"/test/\", clientv3.WithPrefix())\nWithPrefix()&#26159;&#25351;&#26597;&#25214;&#20197;/test/&#20026;&#21069;&#32512;&#30340;&#25152;&#26377;key&#65292;&#22240;&#27492;&#21487;&#20197;&#27169;&#25311;&#20986;&#26597;&#25214;&#23376;&#30446;&#24405;&#30340;&#25928;&#26524;&#12290;\n\n&#25105;&#20204;&#30693;&#36947;etcd&#26159;&#19968;&#20010;&#26377;&#24207;&#30340;k-v&#23384;&#20648;&#65292;&#22240;&#27492;/test/&#20026;&#21069;&#32512;&#30340;key&#24635;&#26159;&#39034;&#24207;&#25490;&#21015;&#22312;&#19968;&#36215;&#12290;\n\nwithPrefix&#23454;&#38469;&#19978;&#20250;&#36716;&#21270;&#20026;&#33539;&#22260;&#26597;&#35810;&#65292;&#23427;&#26681;&#25454;&#21069;&#32512;/test/&#29983;&#25104;&#20102;&#19968;&#20010;key range&#65292;[&ldquo;/test/&rdquo;, &ldquo;/test0&rdquo;)&#65292;&#20026;&#20160;&#20040;&#21602;&#65311;&#22240;&#20026;&#27604;/&#22823;&#30340;&#23383;&#31526;&#26159;&rsquo;0&rsquo;&#65292;&#25152;&#20197;&#20197;/test0&#20316;&#20026;&#33539;&#22260;&#30340;&#26411;&#23614;&#65292;&#23601;&#21487;&#20197;&#25195;&#25551;&#21040;&#25152;&#26377;&#30340;/test/&#25171;&#22836;&#30340;key&#20102;&#12290;\n\n&#22312;&#20043;&#21069;&#65292;&#25105;Put&#20102;&#19968;&#20010;/testxxx&#24178;&#25200;&#39033;&#65292;&#22240;&#20026;&#19981;&#31526;&#21512;/test/&#21069;&#32512;&#65288;&#27880;&#24847;&#26411;&#23614;&#30340;/&#65289;&#65292;&#25152;&#20197;&#23601;&#19981;&#20250;&#34987;&#36825;&#27425;Get&#33719;&#21462;&#21040;&#12290;&#20294;&#26159;&#65292;&#22914;&#26524;&#25105;&#26597;&#35810;&#30340;&#21069;&#32512;&#26159;/test&#65292;&#37027;&#20040;/testxxx&#20063;&#20250;&#34987;&#25195;&#25551;&#21040;&#65292;&#36825;&#23601;&#26159;etcd k-v&#27169;&#22411;&#23548;&#33268;&#30340;&#65292;&#32534;&#31243;&#26102;&#19968;&#23450;&#35201;&#29305;&#21035;&#27880;&#24847;&#12290;</code>\n</pre>\n</div>\n<h3 id=\"toc_35\">7.4 Put</h3>\n<hr>\n<p>PutReqeust&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message PutRequest {\n  bytes key = 1;\n  bytes value = 2;\n  int64 lease = 3;\n  bool prev_kv = 4;\n  bool ignore_value = 5;\n  bool ignore_lease = 6;\n}</code>\n</pre>\n</div>\n<p>&#21508;&#20010;&#23383;&#27573;&#21547;&#20041;&#22914;&#19979;&#65306;</p>\n<ul>\n<li>Key - KV&#23545;&#30340;key&#65307;</li>\n<li>Value - KV&#23545;&#30340;value&#65307;</li>\n<li>Lease - KV&#23545;&#30340;&#36229;&#26102;lease ID&#65292;&#40664;&#35748;&#20540;&#20026;0&#65307;</li>\n<li>Prev_kv - &#22914;&#26524;&#20026;true&#65292;&#21017;response&#20250;&#36820;&#22238;update&#21069;&#30340;kv&#20540;&#65307;</li>\n<li>Ignore_Value - &#19981;&#26356;&#26032;&#24403;&#21069;key&#30340;value&#65292;&#24403;key&#19981;&#23384;&#22312;&#30340;&#26102;&#20505;&#36820;&#22238;&#19968;&#20010;error&#65307;</li>\n<li>Ignore_Lease - &#19981;&#26356;&#26032;key&#30340;lease&#65292;&#24403;key&#19981;&#23384;&#22312;&#30340;&#26102;&#20505;&#36820;&#22238;&#19968;&#20010;error&#12290;</li>\n</ul>\n<p>&#21709;&#24212;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message PutResponse {\n  ResponseHeader header = 1;\n  mvccpb.KeyValue prev_kv = 2;\n}</code>\n</pre>\n</div>\n<ul>\n<li>prev_kv&#65306;Reqeuest&#20013;&#30340; prev_kv &#34987;&#35774;&#32622;&#20026;true&#30340;&#26102;&#20505;&#65292;&#36825;&#20010;&#32467;&#26524;&#23601;&#26159;update&#21069;&#30340;kv&#20540;&#65307;</li>\n</ul>\n<h3 id=\"toc_36\">7.5 Delete Range</h3>\n<hr>\n<p>&#21024;&#38500;&#21017;&#21487;&#20197;&#21024;&#38500;&#19968;&#23450;&#33539;&#22260;&#20869;&#30340;kv&#23545;&#65292;&#35831;&#27714;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message DeleteRangeRequest {\n  bytes key = 1;\n  bytes range_end = 2;\n  bool prev_kv = 3;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Key, Range_End - key range&#65307;</li>\n<li>Prev_kv - &#22914;&#26524;&#35774;&#32622;&#20026;true&#65292;&#21017;&#36820;&#22238;&#21024;&#38500;&#21069;&#30340;kv&#32467;&#26524;&#65307;</li>\n</ul>\n<p>&#21709;&#24212;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message DeleteRangeResponse {\n  ResponseHeader header = 1;\n  int64 deleted = 2;\n  repeated mvccpb.KeyValue prev_kvs = 3;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Deleted - &#34987;&#21024;&#38500;&#30340;kv&#25968;&#30446;&#65307;</li>\n<li>Prev_kv - &#22914;&#26524;&#35831;&#27714;&#20013;&#30340;prev_kv&#34987;&#35774;&#20026;true&#65292;&#21017;&#21709;&#24212;&#20013;&#23601;&#36820;&#22238;&#34987;&#21024;&#38500;&#30340;kv&#20540;&#25968;&#32452;&#65307;</li>\n</ul>\n<h3 id=\"toc_37\">7.6 Transaction</h3>\n<hr>\n<p>&#20107;&#21153;&#26159;&#22312;kv&#23384;&#20648;&#24341;&#25806;&#20043;&#19978;&#30340;&#19968;&#31181;&#21407;&#23376;&#30340;If/Then/Else&#26500;&#24314;&#23454;&#29616;&#65292;&#23427;&#25552;&#20379;&#20102;&#19968;&#31181;&#22312;&#19968;&#32452;kv&#20043;&#19978;&#30340;&#19968;&#25209;&#35831;&#27714;&#30340;&#21407;&#23376;&#23436;&#25104;&#33021;&#21147;&#65288;&#23601;&#26159;&#19968;&#20010;&#21407;&#26469;&#22810;&#20010;&#35831;&#27714;&#29616;&#22312;&#19968;&#20010;&#20107;&#21153;&#35831;&#27714;&#20869;&#23436;&#25104;&#65289;&#65292;&#33021;&#22815;&#38450;&#27490;&#24847;&#22806;&#30340;&#24182;&#34892;&#26356;&#26032;&#65292;&#26500;&#24314;&#21407;&#23376;&#30340;compare-and-swap&#25805;&#20316;&#65292;&#25552;&#20379;&#20102;&#19968;&#31181;&#26356;&#39640;&#32423;&#30340;&#24182;&#34892;&#25511;&#21046;&#33021;&#21147;&#12290;</p>\n<p>&#20107;&#21153;&#20869;revision&#21482;&#22686;&#21152;&#19968;&#27425;&#65292;&#20294;&#26159;&#19968;&#20010;&#20107;&#21153;&#20869;&#23545;&#19968;&#20010;kv&#30340;&#20889;&#25805;&#20316;&#21482;&#33021;&#36827;&#34892;&#19968;&#27425;&#12290;&#20107;&#21153;&#35201;&#20040;&#25104;&#21151;&#65292;&#35201;&#20040;&#22833;&#36133;&#65292;&#27809;&#26377;&#20013;&#38388;&#29366;&#24577;&#65292;</p>\n<p>&#21442;&#32771;&#25991;&#26723;19&#20013;&#32473;&#20986;&#20102;&#35895;&#27468;&#23545;&#20107;&#21153;(&#35895;&#27468;&#31216;&#20026;MultiOp)&#30340;&#35299;&#37322;&#65306;</p>\n<div>\n<pre>\n<code>&#26469;&#33258; google paxosdb &#35770;&#25991;:\n&#25105;&#20204;&#30340;&#31995;&#32479;&#26377;&#19968;&#20010;&#22788;&#20110;&#26680;&#24515;&#22320;&#20301;&#30340;&#21483;&#20570;&#30340;MultiOp&#21151;&#33021;&#12290; &#38500;&#20102;&#24490;&#29615;&#30340;iteration&#25805;&#20316;&#65292;&#20854;&#20182;&#25805;&#20316;&#37117;&#21487;&#20197;&#34987;&#35748;&#20026;&#26159;&#36825;&#20010;&#25805;&#20316;&#30340;&#21333;&#19968;&#35843;&#29992;&#12290;MultiOp&#26159;&#19968;&#20010;&#21407;&#23376;&#23454;&#29616;&#65292;&#30001;&#19977;&#20010;&#37096;&#20998;&#32452;&#25104;&#65306;\n1. &#21517;&#20026;guard&#30340;&#27604;&#36739;&#31639;&#23376;&#21015;&#34920;&#12290;&#22312;guard&#20013;&#27599;&#20010;&#27979;&#35797;&#26816;&#26597;&#25968;&#25454;&#24211;&#20013;&#30340;&#21333;&#20010;&#39033;(entry)&#12290;&#23427;&#21487;&#33021;&#26816;&#26597;&#26576;&#20010;&#20540;&#30340;&#23384;&#22312;&#25110;&#32773;&#32570;&#22833;&#65292;&#25110;&#32773;&#21644;&#32473;&#23450;&#30340;&#20540;&#27604;&#36739;&#12290;&#22312;guard&#20013;&#20004;&#20010;&#19981;&#21516;&#30340;&#27979;&#35797;&#21487;&#33021;&#24212;&#29992;&#20110;&#25968;&#25454;&#24211;&#20013;&#30456;&#21516;&#25110;&#32773;&#19981;&#21516;&#30340;&#39033;&#12290;guard&#20013;&#30340;&#25152;&#26377;&#27979;&#35797;&#34987;&#24212;&#29992;&#28982;&#21518; MultiOp &#36820;&#22238;&#32467;&#26524;&#12290;&#22914;&#26524;&#25152;&#26377;&#27979;&#35797;&#26159;true&#65292;MultiOp &#25191;&#34892; t &#25805;&#20316; (&#35265;&#19979;&#38754;&#30340;&#31532;&#20108;&#39033;), &#21542;&#21017;&#23427;&#25191;&#34892; f &#25805;&#20316; (&#35265;&#19979;&#38754;&#30340;&#31532;&#19977;&#39033;).\n2. &#34987;&#31216;&#20026; t &#25805;&#20316;&#30340;&#25968;&#25454;&#24211;&#25805;&#20316;&#21015;&#34920;. &#21015;&#34920;&#20013;&#30340;&#27599;&#20010;&#25805;&#20316;&#26159;&#25554;&#20837;&#65292;&#21024;&#38500;&#65292;&#25110;&#32773;&#26597;&#25214;&#25805;&#20316;&#65292;&#24182;&#24212;&#29992;&#21040;&#21333;&#20010;&#25968;&#25454;&#24211;&#39033;&#12290;&#21015;&#34920;&#20013;&#30340;&#20004;&#20010;&#19981;&#21516;&#25805;&#20316;&#21487;&#33021;&#24212;&#29992;&#21040;&#25968;&#25454;&#24211;&#20013;&#30456;&#21516;&#25110;&#32773;&#19981;&#21516;&#30340;&#39033;&#12290;&#22914;&#26524; guard &#35780;&#20215;&#20026;true &#36825;&#20123;&#25805;&#20316;&#23558;&#34987;&#25191;&#34892;\n3. &#34987;&#25104;&#20026; f &#25805;&#20316;&#30340;&#25968;&#25454;&#24211;&#25805;&#20316;&#21015;&#34920;. &#31867;&#20284; t &#25805;&#20316;, &#20294;&#26159;&#26159;&#22312; guard &#35780;&#20215;&#20026; false &#26102;&#25191;&#34892;&#12290;</code>\n</pre>\n</div>\n<p>&#20107;&#21153;&#25805;&#20316;&#21487;&#20197;&#35748;&#20026;&#26159;&#19968;&#20010;&#27604;&#36739;&#25805;&#20316;&#38142;&#65292;&#27599;&#20010;&#27604;&#36739;&#21160;&#20316;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message Compare {\n  enum CompareResult {\n    EQUAL = 0;\n    GREATER = 1;\n    LESS = 2;\n    NOT_EQUAL = 3;\n  }\n  enum CompareTarget {\n    VERSION = 0;\n    CREATE = 1;\n    MOD = 2;\n    VALUE= 3;\n  }\n  CompareResult result = 1;\n  // target is the key-value field to inspect for the comparison.\n  CompareTarget target = 2;\n  // key is the subject key for the comparison operation.\n  bytes key = 3;\n  oneof target_union {\n    int64 version = 4;\n    int64 create_revision = 5;\n    int64 mod_revision = 6;\n    bytes value = 7;\n  }\n}</code>\n</pre>\n</div>\n<ul>\n<li>Result - &#36923;&#36753;&#27604;&#36739;&#31867;&#22411;&#65292;&#22914;&#30456;&#31561;&#12289;&#23567;&#20110;&#25110;&#32773;&#22823;&#20110;&#65307;</li>\n<li>Target - &#26377;&#24453;&#34987;&#27604;&#36739;&#30340;kv&#30340;&#26576;&#20010;&#23383;&#27573;&#65292;&#22914;key&#30340;version&#12289;&#21019;&#24314; revision&#12289;&#20462;&#25913;revision&#25110;&#32773;value&#65307;</li>\n<li>Key - &#29992;&#20110;&#27604;&#36739;&#25805;&#20316;&#30340;key&#65307;</li>\n<li>Target_Union - &#38468;&#24102;&#27604;&#36739;&#23545;&#35937;&#65292;&#22914;&#32473;&#23450;&#30340;key&#30340;&#29256;&#26412;&#12289;&#32473;&#23450;key&#30340;&#21019;&#24314;revision&#12289;&#26368;&#21518;&#30340;&#20462;&#25913;revision&#21644;key&#30340;value&#12290;</li>\n</ul>\n<p>&#23450;&#20041;&#20102;&#27604;&#36739;&#31639;&#23376;&#21518;&#65292;&#20107;&#21153;&#35831;&#27714;&#36824;&#38656;&#35201;&#19968;&#36830;&#20018;&#30340;&#23376;&#35831;&#27714;&#25805;&#20316;&#65292;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message RequestOp {\n  // request is a union of request types accepted by a transaction.\n  oneof request {\n    RangeRequest request_range = 1;\n    PutRequest request_put = 2;\n    DeleteRangeRequest request_delete_range = 3;\n  }\n}</code>\n</pre>\n</div>\n<ul>\n<li>Request_Range - &#19968;&#20010;RangeRequest&#65307;</li>\n<li>Request_Put - &#19968;&#20010;PutRequest&#65292;keys&#20013;&#27599;&#20010;key&#37117;&#24517;&#39035;&#21807;&#19968;&#19981;&#33021;&#37325;&#22797;&#65307;</li>\n<li>Request_Delete_Range - &#19968;&#20010;DeleteRangeRequest&#65292;&#20854;&#25805;&#20316;&#30340;key&#20063;&#24517;&#39035;&#22312;&#25972;&#20010;&#20107;&#21153;&#20013;&#21807;&#19968;&#12290;</li>\n</ul>\n<p>&#26368;&#32456;&#20107;&#21153;&#35831;&#27714;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message TxnRequest {\n  repeated Compare compare = 1;\n  repeated RequestOp success = 2;\n  repeated RequestOp failure = 3;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Compare - &#19968;&#20010;&#27604;&#36739;&#31639;&#23376;&#24207;&#21015;&#65307;</li>\n<li>Success - &#22914;&#26524;&#27604;&#36739;&#25104;&#21151;&#65292;&#21017;&#22788;&#29702;&#36825;&#20010;&#35831;&#27714;&#23545;&#35937;&#24207;&#21015;&#65292;&#21709;&#24212;&#30340;&#32467;&#26524;&#23601;&#26159;&#23545;&#36825;&#20123;&#23376;&#35831;&#27714;&#22788;&#29702;&#30340;&#32467;&#26524;&#65307;</li>\n<li>Failure - &#22914;&#26524;&#27604;&#36739;&#22833;&#36133;&#65292;&#21017;&#22788;&#29702;&#36825;&#20010;&#35831;&#27714;&#23545;&#35937;&#24207;&#21015;&#65292;&#21709;&#24212;&#30340;&#32467;&#26524;&#23601;&#26159;&#23545;&#36825;&#20123;&#23376;&#35831;&#27714;&#22788;&#29702;&#30340;&#32467;&#26524;&#12290;</li>\n</ul>\n<p>&#20107;&#21153;&#21709;&#24212;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message TxnResponse {\n  ResponseHeader header = 1;\n  bool succeeded = 2;\n  repeated ResponseOp responses = 3;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Succeeded - &#31639;&#23376;&#27604;&#36739;&#30340;&#32467;&#26524;&#65292;success&#21017;&#20026;true&#65292;fail&#21017;&#20026;false&#65307;</li>\n<li>Responses - &#23545;&#25152;&#26377;&#23376;&#35831;&#27714;&#30340;&#22788;&#29702;&#32467;&#26524;&#12290;</li>\n</ul>\n<p>ResponseOp&#23450;&#20041;&#22914;&#19979;:</p>\n<div>\n<pre>\n<code>message ResponseOp {\n  oneof response {\n    RangeResponse response_range = 1;\n    PutResponse response_put = 2;\n    DeleteRangeResponse response_delete_range = 3;\n  }\n}</code>\n</pre>\n</div>\n<p>ResponseOp&#30340;&#25104;&#21592;&#19982;RequestOp&#23545;&#24212;&#65292;&#27492;&#22788;&#23601;&#19981;&#20877;&#19968;&#19968;&#21015;&#20030;&#35299;&#37322;&#20102;&#12290;</p>\n<h3 id=\"toc_38\">7.7 Watch</h3>\n<hr>\n<p>Watch API&#25552;&#20379;&#20102;&#19968;&#32452;&#22522;&#20110;&#20107;&#20214;&#30340;&#25509;&#21475;&#65292;&#29992;&#20110;&#24322;&#27493;&#33719;&#21462;key&#30340;&#21464;&#21270;&#21518;&#30340;&#36890;&#30693;&#12290;etcd&#20250;&#25226;key&#30340;&#27599;&#19968;&#27425;&#21464;&#21270;&#37117;&#36890;&#30693;&#32473;&#35266;&#23519;&#32773;&#65292;&#32780;&#19981;&#20687;zookeeper&#37027;&#26679;&#21482;&#36890;&#30693;&#26368;&#36817;&#19968;&#27425;&#30340;&#21464;&#21270;&#12290;</p>\n<p>Event&#20195;&#34920;&#20102;key&#30340;&#19968;&#27425;update&#65292;&#21253;&#25324;update&#30340;&#31867;&#22411;&#21644;&#21464;&#21270;&#21069;&#21518;&#30340;&#25968;&#25454;&#65292;&#23450;&#20041;&#22914;&#19979;:</p>\n<div>\n<pre>\n<code>message Event {\n  enum EventType {\n    PUT = 0;\n    DELETE = 1;\n  }\n  EventType type = 1;\n  KeyValue kv = 2;\n  KeyValue prev_kv = 3;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Type - event type&#65292;PUT&#21017;&#19979;&#38754;&#20250;&#32473;&#20986;&#26032;&#22686;&#21152;&#30340;value&#65292;DELETE&#21017;&#25351;&#20986;key&#24050;&#34987;&#21024;&#38500;&#65307;</li>\n<li>KV - KeyValue&#26159;event&#30456;&#20851;&#30340;value&#65292;&#22914;&#26524;type&#26159;PUT&#21017;KV&#26159;&#24403;&#21069;&#26356;&#26032;&#21518;&#30340;kv&#23545;&#65292;&#22914;&#26524;kv.Version&#20540;&#20026;1&#21017;&#35828;&#26126;kv&#26159;&#26032;&#21019;&#24314;&#30340;&#12290;&#22914;&#26524;type&#26159;DELETE&#65292;&#21017;KV&#30340;revision&#23601;&#26159;delete&#21160;&#20316;&#21457;&#29983;&#26102;&#30340;revision&#65307;</li>\n<li>Prev_KV - event&#21160;&#20316;&#21457;&#29983;&#21069;&#30340;kv&#20540;&#65292;&#20026;&#20102;&#33410;&#30465;&#24102;&#23485;&#65292;&#22914;&#26524;&#35831;&#27714;&#20013;&#27809;&#26377;&#29305;&#21035;&#25351;&#26126;&#65292;&#36825;&#20010;&#20540;&#20869;&#23481;&#20026;&#31354;&#12290;</li>\n</ul>\n<p>Watch&#26159;&#19968;&#20010;&#38271;&#20037;&#36816;&#34892;&#30340;&#35831;&#27714;&#65292;&#22522;&#20110;gRPC&#30340;stream&#36827;&#34892;stream&#25968;&#25454;&#30340;&#20256;&#36755;&#12290;</p>\n<p>Watch&#23545;event&#20316;&#20986;&#20102;&#22914;&#19979;&#19977;&#39033;&#20445;&#35777;:</p>\n<ul>\n<li>&#26377;&#24207; - event&#20381;&#25454;revision&#36827;&#34892;&#25490;&#24207;&#65292;&#19968;&#20010;event&#25237;&#36882;&#19968;&#27425;&#21518;&#23601;&#19981;&#20250;&#20877;&#27425;&#34987;&#25237;&#36882;&#65307;</li>\n<li>&#21487;&#38752; - &#19968;&#31995;&#21015;event&#36890;&#30693;&#22914;a/b/c&#30340;&#21457;&#29983;&#26102;&#38388;a &lt; b &lt; c&#65292;&#21017;&#21482;&#20250;&#20381;&#27425;&#25910;&#21040;a&#12289;b&#21644;c&#65292;&#19981;&#20250;&#21482;&#25910;&#21040;a&#21644;c&#65307;</li>\n<li>&#21407;&#23376; - &#19968;&#27425;&#25805;&#20316;&#20135;&#29983;&#19968;&#20010;revision&#65292;server&#21457;&#20986;&#19968;&#20010;event&#65292;&#20107;&#21153;&#30340;&#32467;&#26524;&#20063;&#20165;&#20165;&#20135;&#29983;&#19968;&#27425;event&#36890;&#30693;&#12290;</li>\n</ul>\n<p>&#22522;&#20110;&#19968;&#27425;gRPC stream&#36830;&#25509;&#65292;&#21487;&#20197;&#21457;&#20986;&#22914;&#19979;watch&#21019;&#24314;&#35831;&#27714;&#65306;</p>\n<div>\n<pre>\n<code>message WatchCreateRequest {\n  bytes key = 1;\n  bytes range_end = 2;\n  int64 start_revision = 3;\n  bool progress_notify = 4;\n\n  enum FilterType {\n    NOPUT = 0;\n    NODELETE = 1;\n  }\n  repeated FilterType filters = 5;\n  bool prev_kv = 6;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Key, Range_End - &#34987;&#35266;&#23519;&#30340;key&#30340;range[key, range_end)&#65292;&#22914;&#26524; range_end &#27809;&#26377;&#35774;&#32622;&#65292;&#21017;&#21482;&#26377;&#21442;&#25968;key&#34987;&#35266;&#23519;&#65292;&#22914;&#26524; range_end &#31561;&#21516;&#20110;'\\0'&#65292; &#21017;&#22823;&#20110;&#31561;&#20110;&#21442;&#25968; key &#30340;&#25152;&#26377; key &#37117;&#23558;&#34987;&#35266;&#23519;&#65307;</li>\n<li>Start_Revision - &#35266;&#23519;&#30340;&#36215;&#22987;&#30340;revision&#65292;&#22914;&#26524;&#19981;&#35774;&#32622;&#21017;&#26159;&#26368;&#26032;&#30340;revision&#65307;</li>\n<li>Progress_Notify - &#22914;&#26524;&#35774;&#32622;&#20026;true&#65292;&#21017;etcd&#23558;&#23450;&#26399;&#21457;&#36865;&#19981;&#24102;&#20219;&#20309;&#20107;&#20214;&#30340;&#31354;WatchResponse&#12290;&#24403;&#19968;&#20010;watch&#36830;&#25509;&#26029;&#24320;&#21518;&#65292;&#23458;&#25143;&#31471;&#36827;&#34892;&#37325;&#36830;&#26102;&#20505;&#20250;&#25351;&#23450;&#24320;&#22987;&#30340;revision&#65292;server&#20250;&#26681;&#25454;&#24403;&#21069;&#31995;&#32479;&#30340;&#36127;&#36733;&#20915;&#23450;&#25226;&#21457;&#36865;watch event&#30340;&#39057;&#29575;&#65307;</li>\n<li>Filters - event&#36807;&#28388;&#22120;&#65292;server&#32473;watch&#23458;&#25143;&#31471;&#21457;&#36865;&#36890;&#30693;&#30340;&#26102;&#20505;&#65292;&#20250;&#20808;&#25226;&#30456;&#20851;&#20107;&#20214;&#36807;&#28388;&#25481;&#65307;</li>\n<li>Prev_kv - &#22914;&#26524;&#35774;&#32622;&#20026;true&#65292;&#21017;&#34987;&#21019;&#24314;&#30340;&#35266;&#23519;&#32773;&#22312;&#20107;&#20214;&#21457;&#29983;&#21069;&#33719;&#21462;&#19978;&#19968;&#27425;&#30340;kv&#65292;&#22914;&#26524;&#19978;&#19968;&#27425;&#30340;kv&#22312;etcd compaction&#30340;&#26102;&#20505;&#34987;&#21024;&#38500;&#25481;&#65292;&#21017;&#19981;&#20250;&#36820;&#22238;&#20219;&#20309;&#20540;&#12290;</li>\n</ul>\n<p>watch&#30340;&#21709;&#24212;&#20869;&#23481;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message WatchResponse {\n  ResponseHeader header = 1;\n  int64 watch_id = 2;\n  bool created = 3;\n  bool canceled = 4;\n  int64 compact_revision = 5;\n\n  repeated mvccpb.Event events = 11;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Watch_ID - &#21644;watch&#30456;&#20851;&#30340;watcher ID&#65307;</li>\n<li>Created - &#22914;&#26524;&#35831;&#27714;&#26159;WatchCreateRequest&#65292;&#21017;&#36825;&#20010;&#20540;&#20026;true&#65292;&#25152;&#26377;&#21457;&#36865;&#32473;&#21516;&#19968;&#20010;watch&#30340;event&#37117;&#24102;&#26377;&#21516;&#26679;&#30340;watch_id&#65307;</li>\n<li>Canceled - &#22914;&#26524;&#35831;&#27714;&#26159;WatchCancelRequest&#65292;&#21017;&#36825;&#20010;&#20540;&#20026;true&#65292;&#36825;&#20010;Response&#20043;&#21518;watcher&#19981;&#20250;&#20877;&#25910;&#21040;&#20219;&#20309;response&#65307;</li>\n<li>Compact_Revision - &#22914;&#26524;watcher&#35797;&#22270;&#35266;&#23519;&#19968;&#20010;&#26087;&#30340;&#19981;&#23384;&#22312;&#30340;revision&#26102;&#20505;&#65292;server&#20250;&#36820;&#22238;&#24403;&#21069;&#23384;&#22312;&#30340;&#26368;&#23567;&#30340;&#26377;&#25928;revision&#12290;&#22914;&#26524;watcher&#26681;&#19981;&#26159;server&#21457;&#20986;&#30340;watch&#36890;&#30693;&#30340;&#26102;&#20505;&#65292;server&#20250;&#21457;&#20986;&#36825;&#20010;&#36890;&#30693;&#24182;&#26029;&#24320;watch&#36830;&#25509;&#12290;</li>\n<li>Events - &#38024;&#23545;&#21516;&#19968;&#20010;watch ID&#36820;&#22238;&#30340;&#19968;&#25209;&#26377;&#24207;&#30340;event&#38598;&#21512;&#12290;</li>\n</ul>\n<p>&#22914;&#26524;&#19968;&#20010;watcher&#24819;&#20572;&#27490;watch&#65292;&#21017;&#21487;&#20197;&#21457;&#20986;&#22914;&#19979;&#35831;&#27714;&#65306;</p>\n<div>\n<pre>\n<code>message WatchCancelRequest {\n   int64 watch_id = 1;\n}</code>\n</pre>\n</div>\n<ul>\n<li>Watch_ID - &#35201;&#21462;&#28040;&#30340;watcher&#30340;ID&#65292;server&#21518;&#38754;&#23601;&#19981;&#20250;&#20877;&#26356;&#22810;&#30340;event&#12290;</li>\n</ul>\n<h3 id=\"toc_39\">7.8 Lease</h3>\n<hr>\n<p>Lease&#25552;&#20379;&#20102;&#23545;&#31199;&#32422;&#30340;&#25903;&#25345;&#12290;cluster&#20445;&#35777;&#20102;lease&#26102;&#38388;&#20869;kv&#30340;&#26377;&#25928;&#24615;&#65292;&#24403;lease&#21040;&#26399;&#32780;&#23458;&#25143;&#31471;&#27809;&#26377;&#23545;lease&#36827;&#34892;&#32493;&#32422;&#26102;&#65292;lease&#23601;&#36229;&#26102;&#20102;&#12290;&#27599;&#20010;kv&#21482;&#33021;&#32465;&#23450;&#21040;&#19968;&#20010;lease&#20043;&#19978;&#65292;&#24403;lease&#36229;&#26102;&#21518;&#65292;&#30456;&#20851;&#30340;&#25152;&#26377;kv&#37117;&#20250;&#34987;&#21024;&#38500;&#65292;&#27599;&#20010;key&#30340;&#27599;&#20010;watcher&#37117;&#20250;&#25910;&#21040;delete event&#12290;</p>\n<p>&#21019;&#24314;&#19968;&#20010;lease&#35831;&#27714;&#20307;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message LeaseGrantRequest {\n  int64 TTL = 1;\n  int64 ID = 2;\n}</code>\n</pre>\n</div>\n<ul>\n<li>TTL - &#19968;&#20010;&#20197;&#31186;&#20026;&#21333;&#20301;&#30340;&#36229;&#26102;&#26102;&#38388;&#65307;</li>\n<li>ID - Lease ID&#65292;&#22914;&#26524;&#20540;&#20026;0&#65292;&#21017;etcd&#20250;&#36827;&#34892;&#36171;&#20540;&#12290;</li>\n</ul>\n<p>server&#21019;&#24314;lease&#25104;&#21151;&#21518;&#65292;&#20250;&#36820;&#22238;&#22914;&#19979;&#30340;&#21709;&#24212;&#65306;</p>\n<div>\n<pre>\n<code>message LeaseGrantResponse {\n  ResponseHeader header = 1;\n  int64 ID = 2;\n  int64 TTL = 3;\n}</code>\n</pre>\n</div>\n<ul>\n<li>ID - etcd&#20026;lease&#20998;&#37197;&#30340;ID&#65307;</li>\n<li>TTL - &#20197;&#31186;&#20026;&#21333;&#20301;&#30340;lease&#26102;&#38388;&#65307;</li>\n</ul>\n<p>&#25764;&#38144;&#31199;&#32422;&#35831;&#27714;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message LeaseRevokeRequest {\n  int64 ID = 1;\n}</code>\n</pre>\n</div>\n<ul>\n<li>ID - &#23558;&#35201;&#25764;&#38144;&#30340;lease ID&#65292;&#35831;&#27714;&#25104;&#21151;&#21518;&#65292;&#25152;&#26377;ID&#30456;&#20851;&#30340;key&#37117;&#20250;&#34987;&#21024;&#38500;&#12290;</li>\n</ul>\n<p>&#22914;&#26524;&#23458;&#25143;&#31471;&#24819;&#35201;&#23545;&#19968;&#20010;lease&#36827;&#34892;&#32493;&#32422;&#65292;&#21487;&#20197;&#21457;&#20986;&#22914;&#19979;&#35831;&#27714;&#65306;</p>\n<div>\n<pre>\n<code>message LeaseKeepAliveRequest {\n  int64 ID = 1;\n}</code>\n</pre>\n</div>\n<p>&#24212;&#31572;&#28040;&#24687;&#20307;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message LeaseKeepAliveResponse {\n  ResponseHeader header = 1;\n  int64 ID = 2;\n  int64 TTL = 3;\n}</code>\n</pre>\n</div>\n<ul>\n<li>ID - &#32493;&#32422;&#30340;ID&#65307;</li>\n<li>TTL - &#21097;&#20313;&#30340;TTL&#65292;&#20197;&#31186;&#20026;&#21333;&#20301;&#12290;</li>\n</ul>\n<p>github.com/coreos/etcd/clientv3/lease.go:Lease &#25509;&#21475;&#25552;&#20379;&#20102;&#20197;&#19979;&#19968;&#20123;&#21151;&#33021;&#20989;&#25968;&#65306;</p>\n<ul>\n<li>Grante: &#21019;&#24314;&#19968;&#20010; lease &#23545;&#35937;&#65307;</li>\n<li>Revoke: &#37322;&#25918;&#19968;&#20010; lease &#23545;&#35937;&#65307;</li>\n<li>TimeToLive: &#33719;&#21462; lease &#21097;&#20313;&#30340; TTL &#26102;&#38388;&#65307;</li>\n<li>Leases: &#21015;&#20030; etcd &#20013;&#30340;&#25152;&#26377; lease&#65307;</li>\n<li>KeepAlive: &#33258;&#21160;&#23450;&#26102;&#23545; lease &#32493;&#32422;&#65307;</li>\n<li>KeepAliveOnce: &#20026; lease &#32493;&#32422;&#19968;&#27425;&#65292;&#20195;&#30721;&#27880;&#37322;&#20013;&#35828;&#22823;&#37096;&#20998;&#24773;&#20917;&#19979;&#37117;&#24212;&#35813;&#20351;&#29992; KeepAlive&#65307;</li>\n<li>Close: &#20851;&#38381;&#24403;&#21069;&#23458;&#25143;&#31471;&#24314;&#31435;&#30340;&#25152;&#26377; lease&#65307;</li>\n</ul>\n<p>Put &#20989;&#25968;&#21644; KeepAlive &#20989;&#25968;&#37117;&#26377;&#19968;&#20010; Lease &#23545;&#35937;&#65292;&#22914;&#26524;&#22312;&#36827;&#34892; Put &#25110;&#32773; KeepAlive &#20043;&#21069; Lease &#24050;&#32463;&#36807;&#26399;&#65292;&#21017; etcd &#20250;&#36820;&#22238; error&#12290;</p>\n<h3 id=\"toc_40\">7.9 Compact</h3>\n<hr>\n<p>&#21487;&#20197;&#36890;&#36807;api&#36827;&#34892;&#36807;&#24448;&#25968;&#25454;&#65288;&#21382;&#21490;&#25968;&#25454;&#65289;&#30340;&#25972;&#29702;&#65288;compaction&#65289;&#65292;&#21542;&#21017;&#19968;&#30452;&#22686;&#38271;&#19979;&#21320;&#30913;&#30424;&#20250;&#34987;&#27838;&#28385;&#19988;&#24433;&#21709;etcd&#24615;&#33021;&#21644;&#38598;&#32676;&#30340;&#31283;&#23450;&#24615;&#65292;&#35831;&#27714;&#28040;&#24687;&#20307;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message CompactionRequest {\n  int64 revision = 1;\n  bool physical = 2;\n}</code>\n</pre>\n</div>\n<ul>\n<li>revision: &#23567;&#20110;revision&#20540;&#30340;&#21382;&#21490;&#25968;&#25454;&#37117;&#20250;&#34987;&#28165;&#29702;&#65307;</li>\n<li>physical: &#36825;&#20010;&#26631;&#35760;&#20026;true&#30340;&#26102;&#20505;&#65292;RPC server&#31471;&#20250;&#31561;&#24453;&#30452;&#21040;&#29289;&#29702;&#30913;&#30424;&#30340;&#21382;&#21490;&#25968;&#25454;&#34987;&#25972;&#29702;&#23436;&#27605;&#20877;&#32473;&#23458;&#25143;&#31471;&#21709;&#24212;&#12290;</li>\n</ul>\n<p>&#21709;&#24212;&#28040;&#24687;&#20307;&#23450;&#20041;&#22914;&#19979;&#65306;</p>\n<div>\n<pre>\n<code>message CompactionResponse {\n  ResponseHeader header = 1;\n}</code>\n</pre>\n</div>\n<h2 id=\"toc_41\">&#21442;&#32771;&#25991;&#26723;</h2>\n<hr>\n<h2 id=\"toc_42\">&#25170;&#31914;&#32773;-&#20110;&#38632;&#27663;</h2>\n<blockquote>\n<p>2018/01/09&#65292;&#20110;&#38632;&#27663;&#65292;&#21021;&#20316;&#27492;&#25991;&#20110;&#28023;&#28096;&#12290;</p>\n<p>2018/01/14&#26085;&#20940;&#26216;&#65292;&#20110;&#38632;&#27663;&#65292;&#21442;&#32771;etcd&#23448;&#26041;&#25991;&#26723;&#37325;&#26500;&#27492;&#25991;&#20110;&#28023;&#28096;&#12290;</p>\n<p>2018/04/03&#65292;&#20110;&#38632;&#27663;&#65292;&#19982;&#28023;&#28096;&#34917;&#20805; zetcd <code>Cross-checking</code> &#23567;&#33410;&#12290;</p>\n<p>2018/04/09&#65292;&#20110;&#38632;&#27663;&#65292;&#19982;&#28023;&#28096;&#34917;&#20805; <code>MVCC</code> &#23567;&#33410;&#12290;</p>\n<p>2018/04/10&#65292;&#20110;&#38632;&#27663;&#65292;&#19982;&#28023;&#28096;&#34917;&#20805; <code>v2 &amp; v3</code> &#23567;&#33410;&#12290;</p>\n<p>2018/06/22&#65292;&#20110;&#38632;&#27663;&#65292;&#19982;&#28023;&#28096;&#32473; <code>Raft</code> &#23567;&#33410;&#34917;&#20805; <code>learner &#20197;&#21450; Pipeline &amp; Batch &amp; leader Append</code> &#30456;&#20851;&#20869;&#23481;&#12290;</p>\n</blockquote>\n<p id=\"gitalk-container\"></p>\n</div>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\nvia alexstocks.github.io https://ift.tt/2AnfXZl<br>\n<br>\nNovember 26, 2018 at 05:35PM"}}
{"actor":{"display_login":"guevara"}}