Rarraba kulle ta amfani da Redis

Hai Habr!

A yau mun kawo hankalin ku fassarar wani labari mai rikitarwa game da aiwatar da kullewa da aka rarraba ta amfani da Redis kuma muna gayyatar ku don yin magana game da abubuwan da za a yi na Redis a matsayin batu. Binciken Algorithm na Redlock da ake tambaya daga Martin Kleppmann, marubucin littafin "Babban Load Aikace-aikace", ba da a nan.

Makulli da aka rarraba shine babban fa'ida mai fa'ida da ake amfani dashi a wurare da yawa inda dole ne matakai daban-daban suyi aiki akan albarkatun da aka raba ta hanyar keɓancewa.

Akwai dakunan karatu da rubutu da yawa a can waɗanda ke bayyana yadda ake aiwatar da DLM (Maɓallin Kulle Rarraba) ta amfani da Redis, amma kowane ɗakin karatu yana ɗaukar hanya ta daban kuma garantin da suke bayarwa yana da rauni sosai idan aka kwatanta da abin da ake iya cimmawa tare da ƙira kaɗan.

A cikin wannan labarin za mu yi ƙoƙari mu bayyana yanayin canonical algorithm wanda ke nuna yadda ake aiwatar da kulle rarraba ta amfani da Redis. Za mu yi magana game da algorithm da ake kira Redlock, yana aiwatar da mai sarrafa makullin da aka rarraba kuma, a cikin ra'ayinmu, wannan algorithm ya fi aminci fiye da yadda aka saba da tsarin misali guda ɗaya. Muna fatan al'umma za su tantance ta, su ba da ra'ayi, kuma su yi amfani da shi azaman mafari don ƙarin hadaddun ayyuka ko madadin ayyuka.

Aiwatarwa

Kafin ci gaba zuwa bayanin algorithm, muna samar da hanyoyi da yawa zuwa aiwatar da shirye-shiryen da aka yi. Ana iya amfani da su don tunani.

Garantin Tsaro da Samun Samfura

Za mu ƙirƙira ƙirar mu tare da kaddarorin guda uku kawai waɗanda muke tunanin suna ba da mafi ƙarancin garantin da ake buƙata don amfani da kullewar rarraba yadda ya kamata.

  1. Kayayyakin tsaro: keɓance juna. A kowane lokaci, abokin ciniki ɗaya ne kawai zai iya riƙe makullin.
  2. Abubuwan Samuwar A: Babu makullai. Yana yiwuwa koyaushe a sami makulli, koda abokin ciniki wanda ya kulle albarkatun ya kasa ko ya sauka a wani ɓangaren diski daban.
  3. Samuwar Dukiya B: Haƙurin Laifi. Muddin yawancin nodes na Redis suna gudana, abokan ciniki suna iya siye da sakin makullai.

Me yasa aiwatarwa bisa gazawar farfadowa bai isa ba a wannan yanayin
Don fahimtar abin da za mu inganta, bari mu bincika yanayin halin yanzu tare da yawancin ɗakunan karatu da aka rarraba bisa Redis.

Hanya mafi sauƙi don kulle albarkatu ta amfani da Redis shine ƙirƙirar maɓalli a cikin misali. Yawanci, an ƙirƙiri maɓalli tare da iyakacin rayuwa, ana samun wannan ta amfani da fasalin ƙarewa da aka bayar a cikin Redis, don haka ba dade ko ba dade ana fitar da wannan maɓallin (dukiya 2 a cikin jerinmu). Lokacin da abokin ciniki yana buƙatar sakin albarkatun, yana share maɓallin.

A kallon farko, wannan maganin yana aiki sosai, amma akwai matsala: gine-ginen mu yana haifar da gazawar guda ɗaya. Me zai faru idan misalin Redis mai watsa shiri ya kasa? Mu kara bawa to! Kuma za mu yi amfani da shi idan babu mai gabatarwa. Abin takaici, wannan zaɓin ba zai yuwu ba. Ta yin wannan, ba za mu iya aiwatar da yadda ya kamata kayan keɓanta juna waɗanda muke buƙatar tabbatar da tsaro ba, saboda maimaitawa a cikin Redis ba daidai ba ne.

Babu shakka, a cikin irin wannan samfurin yanayin tsere yana faruwa:

  1. Abokin ciniki A ya sami makulli a kan maigidan.
  2. Maigidan ya gaza kafin a canza maɓallin shigarwa zuwa ga bawa.
  3. Ana ɗaukaka mabiyi zuwa jagora.
  4. Abokin ciniki B ya sami makulli akan albarkatun da A ya riga ya kulle. TAKE TSARO!

Wani lokaci yana da cikakkiyar al'ada cewa a cikin yanayi na musamman, kamar gazawa, yawancin abokan ciniki na iya riƙe kulle a lokaci guda. A irin waɗannan lokuta, ana iya amfani da maganin da ya dogara da maimaitawa. In ba haka ba, muna bada shawarar maganin da aka bayyana a cikin wannan labarin.

Daidaitaccen aiwatarwa tare da misali guda ɗaya

Kafin yunƙurin shawo kan gazawar ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun bayanai da aka bayyana a sama, bari mu fahimci yadda za a iya sarrafa wannan lamari mai sauƙi yadda ya kamata, tun da yake wannan bayani yana aiki a zahiri a aikace-aikacen da yanayin tseren ya karɓi daga lokaci zuwa lokaci, da kuma saboda toshewa akan misali guda ɗaya yana aiki azaman tushen da ake amfani dashi a cikin rarraba algorithm da aka kwatanta a nan.

Don samun makulli, yi wannan:

SET resource_name my_random_value NX PX 30000

Wannan umarnin yana shigar da maɓalli kawai idan bai riga ya wanzu ba (zaɓin NX), tare da lokacin inganci na milliseconds 30000 (zaɓin PX). An saita makullin zuwa "myrandomvalue" Dole ne wannan ƙimar ta zama ta musamman a duk abokan ciniki da duk buƙatun kullewa.
Ainihin, ana amfani da ƙimar bazuwar don sakin makullin cikin aminci, tare da rubutun yana gaya wa Redis: cire maɓallin kawai idan akwai kuma ƙimar da aka adana a ciki shine daidai abin da ake tsammani. Ana samun wannan ta amfani da rubutun Lua mai zuwa:

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

Wannan yana da mahimmanci don hana kulle da wani abokin ciniki ke riƙe daga cirewa. Misali, abokin ciniki na iya samun makulli, sannan a kulle shi a wani aiki wanda zai dade fiye da makullin farko (domin maɓalli ya sami lokacin ƙarewa), sannan daga baya ya cire makullin da wani abokin ciniki ya sanya.
Yin amfani da DEL mai sauƙi ba shi da haɗari saboda abokin ciniki na iya cire makullin da wani abokin ciniki ke riƙe. Sabanin haka, lokacin amfani da rubutun da ke sama, kowane kulle yana "sa hannu" tare da kirtani bazuwar, don haka kawai abokin ciniki wanda ya sanya shi a baya zai iya cire shi.

Menene wannan bazuwar kirtani ya zama? Ina tsammanin yakamata ya zama 20 bytes daga /dev/urandom, amma zaku iya samun hanyoyin da ba su da tsada don sanya kirtani ta zama ta musamman don dalilanku. Misali, zai yi kyau a shuka RC4 tare da /dev/urandom sannan a samar da rafi na bazuwar daga gare ta. Magani mafi sauƙi ya haɗa da haɗuwa da lokacin unix a cikin ƙudurin microsecond tare da ID na abokin ciniki; ba amintacce ba ne, amma yana yiwuwa ya kai ga aikin a yawancin mahallin.

Lokacin da muke amfani da shi azaman ma'auni na rayuwar maɓalli ana kiransa "lokacin kullewa". Wannan ƙimar ita ce adadin lokacin kafin kulle ta atomatik da adadin lokacin da abokin ciniki zai kammala aiki kafin wani abokin ciniki ya iya kulle wannan albarkatun, ba tare da keta garantin keɓance juna ba. Wannan garantin yana iyakance ne kawai ga takamaiman taga lokaci, wanda ke farawa daga lokacin da aka sayi kulle.

Don haka mun tattauna hanya mai kyau don siye da sakin kulle. Tsarin (idan muna magana ne game da tsarin da ba a rarraba ba wanda ya ƙunshi guda ɗaya kuma ko da yaushe akwai misali) yana da tsaro. Bari mu mika wannan ra'ayi zuwa tsarin da aka rarraba, inda ba mu da irin wannan garanti.

Algorithm na Redlock

Sigar algorithm da aka rarraba yana ɗauka cewa muna da masters N Redis. Waɗannan nodes ɗin sun kasance masu zaman kansu gaba ɗaya daga juna, don haka ba ma amfani da kwafi ko kowane tsarin daidaitawa a fakaice. Mun riga mun rufe yadda ake amintaccen siye da sakin kulle akan misali guda. Mun ɗauka cewa algorithm, lokacin aiki tare da misali guda ɗaya, zai yi amfani da daidai wannan hanyar. A cikin misalan mu mun saita N zuwa 5, wanda shine ma'auni mai ma'ana. Don haka, za mu buƙaci amfani da masters na Redis 5 akan kwamfutoci daban-daban ko injunan kama-da-wane don tabbatar da cewa suna aiki da kansu ba tare da juna ba.

Don samun makulli, abokin ciniki yana aiwatar da ayyuka masu zuwa:

  1. Yana samun lokacin yanzu a cikin millise seconds.
  2. A jere ana ƙoƙarin samun makulli a kan duk abubuwan N, ta amfani da sunan maɓalli iri ɗaya da ƙimar bazuwar a kowane yanayi. A mataki na 2, lokacin da abokin ciniki ya saita kulle akan kowane lokaci, abokin ciniki yana amfani da jinkiri don samun shi wanda ya isa ya isa idan aka kwatanta da lokacin da aka saki kulle ta atomatik. Misali, idan lokacin toshewa shine daƙiƙa 10, to jinkirin zai iya kasancewa cikin kewayon ~ 5-50 millise seconds. Wannan yana kawar da yanayin da abokin ciniki zai iya kasancewa cikin toshewa na dogon lokaci yana ƙoƙarin isa ga kumburin Redis da ya gaza: idan babu misalin, to muna ƙoƙarin haɗi zuwa wani misali da wuri-wuri.
  3. Don ɗaukar kulle, abokin ciniki yana ƙididdige adadin lokacin da ya wuce; Don yin wannan, yana cirewa daga ainihin ƙimar lokacin da aka samu a mataki na 1. Idan kuma kawai idan abokin ciniki ya sami damar samun kulle a yawancin lokuta (akalla 3), da jimlar lokacin da ya ɗauka. sami makullin, ƙasa da lokacin kullewa, ana ɗaukar kullewar an samu.
  4. Idan an sami makulli, ana ɗaukar tsawon lokacin kulle ya zama ainihin lokacin kullewa ban da lokacin da ya wuce da aka ƙididdige shi a mataki na 3.
  5. Idan abokin ciniki ya kasa samun makullin saboda wasu dalilai (ko dai ya kasa kulle lokuta na N/2+1, ko kuma lokacin kulle ɗin ba shi da kyau), to zai yi ƙoƙarin buɗe duk abubuwan (har ma waɗanda yake tunanin ba zai iya toshewa ba). ).

Shin algorithm bai dace ba?

Wannan algorithm yana dogara ne akan zato cewa, kodayake babu agogon da aka daidaita wanda duk matakai zasu yi aiki, lokacin gida a cikin kowane tsari har yanzu yana gudana a kusan daidai wannan taki, kuma kuskuren yana da ƙanƙanta idan aka kwatanta da jimlar lokacin da kulle yake. ta atomatik saki. Wannan zato yayi kama da yanayin kwamfutoci na yau da kullun: kowace kwamfuta tana da agogon gida, kuma yawanci zamu iya dogara da gaskiyar cewa bambancin lokaci tsakanin kwamfutoci daban-daban kadan ne.

A wannan gaba, dole ne mu ƙara tsara ƙa'idodin keɓanta junanmu a hankali: keɓancewar juna yana da garantin kawai idan abokin ciniki da ke riƙe da kulle ya fita a lokacin da kulle yake aiki (wannan ƙimar da aka samu a mataki na 3), ban da wasu ƙarin lokaci (dukadan kaɗan). milliseconds don rama bambancin lokaci tsakanin matakai).

Labari mai ban sha'awa mai zuwa yana ba da ƙarin bayani game da irin waɗannan tsarin waɗanda ke buƙatar daidaita tazarar lokaci: Leases: ingantacciyar hanyar jurewa kuskure don daidaiton cache fayil rarraba.

Sake gwada gazawar

Lokacin da abokin ciniki ya kasa samun makulli, dole ne ya sake gwadawa bayan jinkirin bazuwar; Ana yin wannan ne don daidaitawa abokan ciniki da yawa suna ƙoƙarin samun makulli akan albarkatu iri ɗaya a lokaci guda (wanda zai iya haifar da yanayin "raga-kwakwalwa" wanda babu masu nasara a cikinsa). Bugu da ƙari, da sauri abokin ciniki yayi ƙoƙarin samun makulli akan yawancin lokuta na Redis, mafi ƙarancin taga wanda yanayin rarrabuwar kwakwalwa zai iya faruwa (kuma ƙarancin buƙatar sake gwadawa). Sabili da haka, a zahiri, abokin ciniki yakamata yayi ƙoƙarin aika umarnin SET zuwa lokuta N lokaci guda ta amfani da multixing.

Yana da kyau a nanata a nan yadda yake da mahimmanci ga abokan cinikin da suka kasa samun yawancin makullai su saki makullan da aka samu (bangare), don kada su jira mabuɗin ya ƙare kafin a sake samun makullin da ke kan albarkatun. (kodayake idan rarrabuwar hanyar sadarwa ta faru, kuma abokin ciniki ya rasa lamba tare da misalin Redis, to dole ne ku biya hukuncin samuwa yayin jiran maɓallin ya ƙare).

Saki makullin

Sakin makulli aiki ne mai sauƙi wanda kawai ke buƙatar buɗe duk al'amura, ba tare da la'akari da ko abokin ciniki ya bayyana ya yi nasarar kulle wani misali ba.

La'akarin Tsaro

Shin algorithm lafiya ne? Bari mu yi ƙoƙari mu yi tunanin abin da ke faruwa a yanayi daban-daban.

Da farko, bari mu ɗauka cewa abokin ciniki ya sami damar samun kulle a yawancin lokuta. Kowane misali zai ƙunshi maɓalli mai tsawon rayuwa iri ɗaya ga kowa. Koyaya, kowane ɗayan waɗannan makullin an shigar dashi a wani lokaci daban, don haka zasu ƙare a lokuta daban-daban. Amma, idan an shigar da maɓallin farko a lokaci mafi muni fiye da T1 (lokacin da muka zaɓa kafin tuntuɓar uwar garken farko), kuma an shigar da maɓallin ƙarshe a lokacin da bai fi T2 muni ba (lokacin da aka karɓi amsa. daga uwar garken ƙarshe), sannan muna da tabbacin cewa maɓallin farko a cikin saitin da ya ƙare zai tsira aƙalla MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT. Duk sauran maɓallai za su ƙare daga baya, don haka za mu iya tabbata cewa duk maɓallan za su yi aiki a lokaci guda aƙalla wannan lokacin.

A lokacin da yawancin maɓallai suka kasance suna aiki, wani abokin ciniki ba zai iya samun makullin ba, tunda N/2+1 SET NX ayyukan ba za su yi nasara ba idan makullin N/2+1 sun riga sun wanzu. Saboda haka, da zarar an sami kulle, ba zai yiwu a sake samun shi a lokaci guda ba (wannan zai keta dukiyar warewar juna).
Koyaya, muna son tabbatar da cewa abokan ciniki da yawa waɗanda ke ƙoƙarin samun makulli a lokaci guda ba za su iya yin nasara a lokaci ɗaya ba.

Idan abokin ciniki ya kulle yawancin lokuta na kusan ko fiye da matsakaicin lokacin kullewa, zai ɗauki makullin mara inganci kuma ya buɗe al'amuran. Saboda haka, kawai dole ne mu yi la'akari da yanayin da abokin ciniki ya yi nasarar toshe yawancin lokuta a cikin lokaci ƙasa da ranar karewa. A wannan yanayin, game da hujjar da ke sama, a lokacin MIN_VALIDITY babu abokin ciniki da ya isa ya sake samun makullin. Saboda haka, yawancin abokan ciniki za su iya kulle lokuta N/2+1 a lokaci guda (wanda ya ƙare a ƙarshen mataki na 2) kawai lokacin da lokacin kulle yawancin ya fi lokacin TTL, wanda ke mayar da kulle ba daidai ba.

Shin za ku iya samar da tabbataccen tabbaci na tsaro, nuna irin wannan algorithms, ko sami kwaro a sama?

La'akari da Samun damar

Samuwar tsarin ya dogara da manyan halaye guda uku:

  1. Sakin makullai ta atomatik (kamar yadda maɓallan ke ƙarewa): A ƙarshe za a sake samun maɓallai don amfani da su don makullai.
  2. Kasancewar abokan ciniki galibi suna taimakon junansu ta hanyar cire makullai a lokacin da ba a samu makullin da ake so ba, ko kuma an samu kuma an kammala aikin; don haka yana yiwuwa ba za mu jira maɓallan su ƙare ba don sake samun makullin.
  3. Gaskiyar cewa lokacin da abokin ciniki yana buƙatar sake gwadawa don samun makulli, yana jira tsawon lokaci mai tsayi fiye da lokacin da ake buƙata don samun yawancin makullai. Wannan yana rage yuwuwar yanayin rarrabuwar kawuna ya taso lokacin fafatawa don samun albarkatu.

Duk da haka, akwai hukuncin samuwa daidai da TTL na sassan cibiyar sadarwa, don haka idan akwai sassa masu rikitarwa, hukuncin na iya zama marar iyaka. Wannan yana faruwa a duk lokacin da abokin ciniki ya sami makulli sannan ya tsaga zuwa wani sashi kafin ya iya sakin shi.

A ka'ida, da aka ba da sassan cibiyar sadarwa mara iyaka, tsarin zai iya zama babu shi har na wani lokaci mara iyaka.

Ayyukan aiki, gazawar da fsync

Mutane da yawa suna amfani da Redis saboda suna buƙatar babban aikin uwar garken kulle dangane da latency da ake buƙata don siye da sakin makullai, da adadin saye/saki wanda za'a iya kammalawa a sakan daya. Don cika wannan buƙatun, akwai dabara don sadarwa tare da sabar N Redis don rage jinkiri. Wannan dabara ce ta multixing (ko "maɓalli na matalauta", inda aka sanya soket a yanayin da ba tare da toshewa ba, aika duk umarni, kuma a karanta umarnin daga baya, ɗauka cewa lokacin tafiya tsakanin abokin ciniki da kowane misali yana kama da shi) .

Duk da haka, dole ne mu yi la'akari da la'akari da ke tattare da ajiyar bayanai na dogon lokaci idan muka yi ƙoƙari don ƙirƙirar samfuri tare da ingantaccen farfadowa daga kasawa.

Ainihin, don fayyace batun, bari mu ɗauka cewa mun saita Redis ba tare da adana bayanai na dogon lokaci kwata-kwata. Abokin ciniki yana sarrafa toshe 3 cikin 5 lokuta. Ɗaya daga cikin al'amuran da abokin ciniki ya yi nasarar toshewa an sake farawa, kuma a halin yanzu akwai lokuta 3 don wannan albarkatu, wanda za mu iya toshewa, kuma wani abokin ciniki zai iya, bi da bi, ya toshe misalin da aka sake farawa, ya keta dukiyar tsaro da ta yi. yana ɗaukar keɓancewar kullewa.

Idan kun kunna bayanai gaba (AOF), yanayin zai inganta kadan. Misali, zaku iya inganta uwar garken ta hanyar aika umarnin SHUTDOWN kuma ku sake kunna shi. Tunda ayyukan ƙarewa a cikin Redis ana aiwatar da su ta hanyar ma'ana ta yadda lokaci ya ci gaba da gudana koda lokacin da aka kashe uwar garken, duk buƙatunmu suna da kyau. Wannan na al'ada ne muddin aka tabbatar da rufewar al'ada. Me za a yi idan wutar lantarki ta katse? Idan an saita Redis ta tsohuwa, tare da aiki tare da fsync akan faifai kowane sakan, to yana yiwuwa bayan sake kunnawa ba za mu sami maɓallin mu ba. A ka'ida, idan muna so mu ba da garantin tsaro na kullewa yayin kowane misalin sake farawa, ya kamata mu kunna fsync=always a cikin saitunan don adana bayanai na dogon lokaci. Wannan zai kashe aikin gabaɗaya, har zuwa matakin tsarin CP waɗanda aka saba amfani da su don aiwatar da makullai da aka rarraba amintacce.

Amma yanayin ya fi yadda ake gani a kallo na farko. A ka'ida, ana kiyaye tsaro na algorithm saboda lokacin da aka sake kunna misalin bayan gazawar, ba ya shiga cikin kowane kulle da ke aiki a halin yanzu.

Don tabbatar da wannan, kawai muna buƙatar tabbatar da cewa bayan gazawar misalin ya kasance babu shi na ɗan lokaci kaɗan ya wuce matsakaicin TTL da muke amfani da shi. Ta wannan hanyar za mu jira har zuwa ranar karewa da sakin duk maɓallan da ke aiki a lokacin gazawar.

Yin amfani da jinkirin sake kunnawa, bisa ga ka'ida yana yiwuwa a cimma tsaro koda kuwa babu wani tsayin daka na dogon lokaci a cikin Redis. Lura, duk da haka, wannan na iya haifar da tara don keta damar shiga. Misali, idan yawancin lokuta suka gaza, tsarin zai zama babu shi a duniya don TTL (kuma ba za a iya toshe albarkatu a wannan lokacin ba).

Muna ƙara yawan samun algorithm: muna ƙaddamar da toshewa

Idan aikin da abokan ciniki ke yi ya ƙunshi ƙananan matakai, yana yiwuwa a rage tsawon lokacin kulle tsoho da aiwatar da hanyar da za a iya fadada makullin. A ka'ida, idan abokin ciniki ya shagaltu da lissafin ƙima kuma ƙimar ƙarewar kulle ta yi ƙasa da haɗari, zaku iya aika rubutun Lua zuwa duk lokuttan da ke tsawaita TTL na maɓalli idan har yanzu maɓallin yana wanzu kuma ƙimarsa har yanzu ƙimar bazuwar da aka samu lokacin kulle aka samu.

Abokin ciniki yakamata yayi la'akari da makullin da za'a samu idan ya sami nasarar kulle yawancin lokuta a cikin lokacin inganci.

Gaskiya ne, a zahiri algorithm ba ya canzawa, don haka dole ne a iyakance iyakar yawan ƙoƙarin ƙoƙarin samun makullai, in ba haka ba za a keta kaddarorin samun dama.

source: www.habr.com

Add a comment