zab
ڹ
ZabҁZookeeper Atomic Broadcast҂ฎԅZooKeeperܐᦡᦇጱૄმ௩ܻ॔ৼଠඎܐᦓ҅ਙכᦤ
zookeeperᵞᗭහഝጱӞᛘեጱقੴํଧ̶
༷ஷՕᕨ
ࣁՕᕨzabܐᦓԏڹḒضᥝᎣ᭲zookeeperፘىጱپӻ༷ஷ҅ᚆๅঅጱԧᥴzabܐᦓ̶
ᵞᗭᜋ
1. LeaderғݶӞᳵᵞᗭݝ꧋ᦜํӞӻLeader҅׀ਮಁᒒጱٟۑᚆ҅ᨮᨱਖ਼හഝݶྍᛗݱӻ
ᜓᅩҔ
2. Followerғ׀ਮಁᒒۑᚆٟ҅᧗ڞݎᕳLeader॒ቘ҅୮Leaderૄმ०ᘶԏݸ݇ӨLeader
ᭌԈҔ
3. ObserverғӨFollowerӧݶጱฎ֕ӧ݇ӨLeaderᭌԈ̶
๐ۓᇫா
1. LOOKINGғ୮ᜓᅩᦊԅᗭᵞӾဌํLeader҅๐ۓտᬰفLOOKINGᇫா҅ፓጱฎԅԧັತᘏᭌ
ԈLeaderҔ
2. FOLLOWINGғfollowerᜋҔ
3. LEADINGғleaderᜋҔ
4. OBSERVINGғobserverᜋҔ
ݢզᎣ᭲Zookeeperฎ᭗ᬦᛔጱᇫா܄ړᛔ૩ಅંጱᜋ҅ಗᤈᛔ૩ଫᧆጱձۓ̶
ZABᇫா ZookeeperᬮᕳZABਧԎጱ4Ӿᇫா҅ݍଫZookeeperᭌԈکक़׀๐ۓጱᬦᑕӾጱࢥ
ӻྍṈ̶ ᇫாຍԈਧԎғ
1. ELECTION: ᵞᗭᬰفᭌԈᇫா҅ྌᬦᑕտᭌڊӞӻᜓᅩ֢ԅleaderᜋҔ
2. DISCOVERYғᬳളӤleader҅ߥଫleaderஞ᪡҅ଚӬ༄ၥleaderጱᜋฎވๅද҅᭗ᬦྌྍṈԏݸ
ᭌԈڊጱleaderᚆಗᤈ፥ྋᘳۓҔ
3. SYNCHRONIZATIONғෆӻᵞᗭ᮷Ꮯᦊleaderԏݸ҅ਖ਼տleaderጱහഝݶྍکݱӻᜓᅩ҅כᦤෆ
ӻᵞᗭጱහഝӞᛘҔ
4. BROADCASTғᬦჁکଠඎᇫா҅ᵞᗭতक़׀๐ۓ̶
public enum ZabState {
ELECTION,
DISCOVERY,
SYNCHRONIZATION,
BROADCAST
}
ZXID
Zxidฎຄԅ᯿ᥝጱ༷ஷ҅ਙฎӞӻlongࣳҁ64֖҂ෆහ҅ړԅӷ᮱ړғᕉزҁepoch҂᮱ړᦇහ
ҁcounter҂᮱ړ҅ฎӞӻقੴํଧጱහਁ̶
epochդᤒ୮ڹᵞᗭಅંጱߺӻleader҅leaderጱᭌԈ੪ᔄ֒Ӟӻ๖դጱๅ๊֦҅ڹ๖ጱڻӧᚆ๖ጱ
ਥ҅አepochդᤒ୮ڹեጱํප҅counterฎӞӻ᭓ीጱහਁ̶
ᭌԈ
चᏐ༷ஷՕᕨਠԧ҅ӥᶎতՕᕨzabܐᦓฎெԍඪ೮leaderᭌԈጱ̶
ᬰᤈleaderํӣӻᳯ᷌҅ՋԍײᬰᤈҘᭌԈᥢڞҘᭌೠၞᑕҘ
ӥᶎ౯տӞӞᥴᒼᬯӣӻᳯ᷌ғ
1. ᭌԈݎኞጱ LeaderݎኞᭌԈํӷӻ҅Ӟӻฎ๐ۓސۖጱײ୮ෆӻᵞᗭ᮷ဌํleaderᜓᅩ
տᬰفᭌԈᇫா҅ইຎleader૪ᕪਂࣁ੪տޞᦫᧆᜓᅩleaderጱמ௳҅ᛔ૩ᬳളӤleader҅ෆӻᵞᗭ
ӧአᬰفᭌԈᇫா̶
ᬮํӞӻ੪ฎࣁ๐ۓᬩᤈӾ҅ݢᚆտڊሿݱᐿఘ٭҅๐ۓਣ̵ෙኪ̵ᗑᕶ᬴உṛጱײleader
᮷ӧᚆٚक़׀๐ۓԧ҅ಅํ୮ٌ՜پᅩ᭗ᬦஞ᪡༄ၥکleader०ᘶԏݸ҅ᵞᗭԞտᬰفᭌԈᇫ
ா̶
2. ᭌԈᥢڞ ᬰفಭᐥᭌԈၞᑕ҅ெԍᚆᭌԈڊleaderҘᘏ᧔ೲᆙՋԍᥢڞᦏٌ՜ᜓᅩ᮷ᚆᭌԈ
֦୮leader̶
3. zabܐᦓฎೲᆙپӻྲᥢڞᬰᤈಭᐥጱᓀᭌ҅ইຎ֦ጱᐥྲ౯ๅঅ҅੪ץදᛔጱಭᐥמ௳҅
දಭ֦୮leader̶
ӥᶎդᎱฎzookeeperಭᐥྲᥢڞғ
/*
higher
*/
return ((newEpoch > curEpoch)
|| ((newEpoch == curEpoch)
&& ((newZxid > curZxid)
|| ((newZxid == curZxid)
&& (newId > curId)))));
୮ٌ՜ᜓᅩጱᕉزྲᛔṛಭਙ҅ইຎᕉزፘݶྲᛔጱzxidጱय़ੜ҅ᭌԈzxidय़ጱᜓᅩ҅ᬯ᯾ጱ
zxidդᤒᜓᅩಅԻԪۓ๋य़ጱid҅zxid᩼य़դᤒᧆᜓᅩጱහഝ᩼ਠෆ̶
๋ݸইຎepochzxid᮷ፘᒵ҅ڞྲ๐ۓጱserverId҅ᬯӻIdฎᯈᗝzookeeperᵞᗭಅᯈᗝጱ҅ಅզ౯
ժᯈᗝzookeeperᵞᗭጱײݢզ๐ۓᚆๅṛጱᵞᗭጱserverIdᯈᗝय़Զ҅ᦏᚆঅጱձ
leaderᜋ̶
3. ᭌԈၞᑕ
ᥢڞ᮷ํԧ҅ӥᶎ੪ฎleaderጱᭌԈၞᑕғ
ಅํᜓᅩᒫӞᐥضᭌԈᛔ૩୮leader҅ਖ਼ಭᐥמ௳ଠඎڊ݄Ҕ
ᴚڜӾളݑಭᐥמ௳Ҕ
ೲᆙᥢڞڣෙฎވᵱᥝๅදಭᐥמ௳҅ਖ਼ๅදݸጱಭᐥמ௳ེٚଠඎڊ݄Ҕ
ڣෙฎވํ᩻ᬦӞጱಭᐥᭌԈݶӞӻᜓᅩ҅ইຎฎᭌԈᕮ໑ഝಭᐥᕮຎᦡᗝᛔ૩ጱ๐ۓᇫா҅
ᭌԈᕮ҅ވڞᖀᖅᬰفಭᐥၞᑕ̶
4. Ԉֺ
Ӥࢶᛔ̽ZooKeeperғړୗᬦᑕܐݶದᧇᥴ̾҅ෆ֛ၞᑕᬮฎྲᓌܔ҅ᬯ᯾੪ӧٍ֛ړຉԧ̶
ଠඎ
ᵞᗭࣁᕪᬦleaderᭌԈԏݸᬮտํᬳളleaderݶྍӷӻྍṈ҅ᬯ᯾੪ӧٍ֛ړຉᬯӷӻྍṈጱၞᑕ
ԧ҅ԆᥝՕᕨᵞᗭक़׀๐ۓই֜כᦤݱӻᜓᅩහഝጱӞᛘ̶
zabࣁଠඎᇫாӾכᦤզӥᇙ
ݢᶌփ᭓: ইຎၾ௳mኧӞݣ๐ۓփ᭓҅ᮎԍਙ๋ᕣਖ਼ኧಅํ๐ۓփ᭓̶
قੴํଧ: ইຎӞӻၾ௳aࣁၾ௳bԏڹᤩӞݣ๐ۓԻ՞҅ᮎԍಅํ๐ۓ᮷Ի՞ԧab҅ଚӬaض
ԭb̶
ࢩຎํଧ: ইຎၾ௳aࣁࢩຎӤضԭၾ௳bଚӬԫᘏ᮷ᤩԻ՞҅ᮎԍaᶳഭࣁbԏڹ̶
ํଧฎzabܐᦓᶳᥝכᦤጱӞӻஉ᯿ᥝጱં҅ࢩԅzookeeperฎզᔄ֒ፓ୯ᕮጱහഝᕮਂؙහ
ഝጱ҅ᶳᥝݷጱํଧ̶
ྲইӞӻݷaڠୌ᪠ஆԅ/test҅ᆐݸݷbڠୌ᪠ஆԅ/test/123҅ইຎӧᚆכᦤํଧbݷࣁaԏڹ҅
bետࢩԅᆿᜓᅩӧਂࣁᘒڠୌ०ᨳ̶
ইӤࢶಅᐏ҅ෆӻٟ᧗ᔄ֒ӞӻԫᴤྦྷጱԻ̶
୮තکਮಁᒒጱٟ᧗ጱײտᕪܲզӥپӻྍṈғ
1. Leaderතکਮಁᒒጱٟ᧗҅ኞ౮ӞӻԪۓҁProposal҂ٌ҅Ӿ۱ތԧzxidҔ
2. LeaderতଠඎᧆԪۓ҅ᵱᥝဳጱฎಅํᜓᅩጱ᭗ᦔ᮷ฎኧӞӻFIFOጱᴚڜᖌಷጱҔ
3. FollowerളݑکԪۓԏݸ҅ਖ਼Ԫۓٟفࣈᏺፏٟ҅ف౮ۑԏݸᬬࢧLeaderӞӻACKҔ
4. LeaderතکᬦጱACKԏݸ҅তԻԪۓ҅ଚଠඎԪۓԻמ௳
5. ᜓᅩতԻԪۓ̶
ํզӤၞᑕݢᎣ҅zookeeper᭗ᬦԫᴤྦྷԻכᦤᵞᗭӾහഝጱӞᛘ҅ࢩԅݝᵱᥝතکᬦጱACK
੪ݢզԻԪۓ҅ಅզzookeeperጱහഝଚӧฎ୩Ӟᛘ̶
zabܐᦓጱํଧכᦤฎ᭗ᬦپӻොᶎ֛ሿጱ҅ᒫӞฎ҅๐ۓԏڹአTCPܐᦓᬰᤈ᭗ᦔ҅כᦤࣁᗑᕶ
փᬌӾጱํଧҔᒫԫ҅ᜓᅩԏڹ᮷ᖌಷԧӞӻFIFOጱᴚڜ҅כᦤقੴํଧҔᒫӣ҅᭗ᬦقੴ᭓ीጱ
zxidכᦤࢩຎํଧ̶
ᇫாၞ
ڹᶎՕᕨԧzookeeper๐ۓᇫாํࢥᐿ҅ZABᇫாԞํࢥᐿ̶ᬯ᯾੪ᓌܔՕᕨӞӻ՜ժԏᳵጱᇫாၞ
҅ๅᚆےႮzabܐᦓࣁzookeeperૡ֢ၞᑕӾጱ֢አ̶
1. ๐ۓࣁސۖᘏleader०ᘶԏݸ๐ۓᇫாԅLOOKINGҔ
2. ইຎleaderӧਂࣁᭌԈleader҅ইຎਂࣁፗളᬳളleader҅ྌzabܐᦓᇫாԅELECTIONҔ
3. ইຎํ᩻ᬦහጱಭᐥᭌೠݶӞݣserver҅ڞleaderᭌԈᕮ҅ᤩᭌԈԅleaderጱserver๐ۓᇫாԅ
LEADINGٌ҅՜server๐ۓᇫாԅFOLLOWING/OBSERVINGҔ
4. ಅํserverᬳളӤleader҅ྌzabܐᦓᇫாԅDISCOVERYҔ
5. leaderݶྍහഝᕳlearnerֵ҅ݱӻᜓᅩහഝleaderכ೮Ӟᛘ҅ྌzabܐᦓᇫாԅ
SYNCHRONIZATIONҔ
6. ݶྍ᩻ᬦӞጱserverԏݸ҅ᵞᗭक़׀๐ۓ҅ྌzabᇫாԅBROADCAST̶
ݢզᎣ᭲ෆӻzookeeper๐ۓጱૡ֢ၞᑕᔄ֒Ӟӻᇫாጱഘ҅ᘒzabܐᦓ੪ฎḝۖ๐ۓᇫாၞጱى
Ძ҅ቘᥴԧzab੪ቘᥴԧzookeeperૡ֢ጱىᲫܻቘ
ᕮ
zabܐᦓࣁzookeeperጱૡ֢ၞᑕӾ؉ԧᓌܔጱՕᕨ҅๕य़ਹቘᥴԟzookeeperํಅଆ̶ۗ
݇ᘍ
̽ZooKeeperғړୗᬦᑕܐݶದᧇᥴ̾ ̽Zab: A simple totally ordered broadcast protocol̾
本文整理自实践经验,如有问题欢迎交流讨论。