Administrator
发布于 2024-07-10 / 0 阅读
0
0

zab

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ಭᐥྲ᫾ᥢڞғ

/*

  • We return true if one of the following three cases hold:
  • 1- New epoch is higher
  • 2- New epoch is the same as current epoch, but new zxid is
  • higher

  • 3- New epoch is the same as current epoch, new zxid is the same
  • as current zxid, but server id is higher.
  • */


    return ((newEpoch > curEpoch)

    || ((newEpoch == curEpoch)

    && ((newZxid > curZxid)

    || ((newZxid == curZxid)

    && (newId > curId)))));

    ୮ٌ՜ᜓᅩጱᕉزྲᛔ᫝ṛಭਙ҅ইຎᕉزፘݶྲ᫾ᛔ᫝ጱzxidጱय़ੜ҅ᭌԈzxidय़ጱᜓᅩ҅ᬯ᯾ጱ

    zxidդᤒᜓᅩಅ൉ԻԪۓ๋य़ጱid҅zxid᩼य़դᤒᧆᜓᅩጱහഝ᩼ਠෆ̶

    ๋ݸইຎepoch޾zxid᮷ፘᒵ҅ڞྲ᫾๐ۓጱserverId҅ᬯӻIdฎᯈᗝzookeeperᵞᗭಅᯈᗝጱ҅ಅզ౯

    ժᯈᗝzookeeperᵞᗭጱ෸ײݢզ಩๐ۓ௔ᚆๅṛጱᵞᗭጱserverIdᯈᗝय़Զ҅ᦏ௔ᚆঅጱ๢࢏೅ձ

    leader᥯ᜋ̶

    3. ᭌԈၞᑕ

    ෸๢޾ᥢڞ᮷ํԧ҅ӥᶎ੪ฎleaderጱᭌԈၞᑕғ

    ಅํᜓᅩᒫӞᐥضᭌԈᛔ૩୮leader҅ਖ਼ಭᐥמ௳ଠඎڊ݄Ҕ

    ՗ᴚڜӾളݑಭᐥמ௳Ҕ

    ೲᆙᥢڞڣෙฎވᵱᥝๅදಭᐥמ௳҅ਖ਼ๅදݸጱಭᐥמ௳ེٚଠඎڊ݄Ҕ

    ڣෙฎވํ᩻ᬦӞ܎ጱಭᐥᭌԈݶӞӻᜓᅩ҅ইຎฎᭌԈᕮ๳໑ഝಭᐥᕮຎᦡᗝᛔ૩ጱ๐ۓᇫா҅

    ᭌԈᕮ๳҅ވڞᖀᖅᬰفಭᐥၞᑕ̶

    4. Ԉֺ

    Ӥࢶ๶ᛔ̽ZooKeeperғړ૲ୗᬦᑕܐݶದ๞ᧇᥴ̾҅ෆ֛ၞᑕᬮฎྲ᫾ᓌܔ҅ᬯ᯾੪ӧٍ֛ړຉԧ̶

    ଠඎ


    ᵞᗭࣁᕪᬦleaderᭌԈԏݸᬮտํᬳളleader޾ݶྍӷӻྍṈ҅ᬯ᯾੪ӧٍ֛ړຉᬯӷӻྍṈጱၞᑕ

    ԧ҅ԆᥝՕᕨᵞᗭ੒क़൉׀๐ۓই֜כᦤݱӻᜓᅩහഝጱӞᛘ௔̶

    zabࣁଠඎᇫாӾכᦤզӥᇙ஄

    ݢᶌփ᭓: ইຎၾ௳mኧӞݣ๐ۓ࢏փ᭓҅ᮎԍਙ๋ᕣਖ਼ኧಅํ๐ۓ࢏փ᭓̶

    قੴํଧ: ইຎӞӻၾ௳aࣁၾ௳bԏڹᤩӞݣ๐ۓ࢏Ի՞҅ᮎԍಅํ๐ۓ࢏᮷Ի՞ԧa޾b҅ଚӬ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̾


    本文整理自实践经验,如有问题欢迎交流讨论。


    评论