Kua tohatohahia ma te whakamahi i te Redis

Hei Habr!

I tenei ra ka kawea mai e matou ki a koe he whakamaoritanga o tetahi tuhinga matatini mo te whakatinanatanga o te raka tohatoha ma te whakamahi i a Redis me te tono ki a koe ki te korero mo nga tumanako o Redis hei kaupapa. Ko te tātaritanga o te Redlock algorithm e patai ana na Martin Kleppmann, te kaituhi o te pukapuka "Tono Uta Nui", hoatu konei.

Ko te maukati toha he tino whaihua i whakamahia i roto i te maha o nga taiao me mahi nga tikanga rereke i runga i nga rauemi tiritahi i roto i nga tikanga motuhake.

He maha nga wharepukapuka me nga pou kei reira e whakaatu ana me pehea te whakatinana i te DLM (Kaiwhakahaere Maukati Tohaina) ma te whakamahi i a Redis, engari he rereke te huarahi o ia whare pukapuka me nga whakapumautanga e whakaratohia ana he tino ngoikore ki te whakataurite ki nga mea ka taea te whakatutuki me te hoahoa paku ake.

I roto i tenei tuhinga ka ngana tatou ki te whakaahua i tetahi algorithm canonical here e whakaatu ana me pehea te whakatinana i te raka tohatoha ma te whakamahi i a Redis. Ka korero tatou mo te algorithm e kiia ana Karaka Whero, ka whakatinanahia he kaiwhakahaere raka kua tohatohahia, a, ki ta matou whakaaro, he haumaru ake tenei algorithm i te huarahi kotahi-atahi. Ko te tumanako ka wetewetehia e te hapori, ka tuku urupare, ka whakamahia hei timatanga mo nga kaupapa uaua ake, kaupapa rereke ranei.

Whakatinana

I mua i te neke ki te whakaahuatanga o te algorithm, ka whakaratohia e matou etahi hononga ki nga whakatinanatanga kua rite. Ka taea te whakamahi hei tohutoro.

  • Karaka-rb (whakamahinga mo Ruby). Kei reira ano marau Redlock-rb, e taapiri ana i te kete (kohatu) mo te ngawari o te tohatoha, a ehara mo tera anake.
  • Whero-py (Python whakatinanatanga).
  • Maukati (whakatinana mo Asyncio Python).
  • Whero-php (whakatinana mo PHP).
  • PHPRedisMutex (tetahi atu whakatinanatanga mo PHP)
  • cheprasov/php-redis-raka (Ptakataka PHP mo nga kati)
  • Redsync (whakatinana mo te Haere).
  • Redisson (whakatinana mo Java).
  • Redis::DistLock (whakatinana mo Perl).
  • Whero-cpp (whakamahinga mo C++).
  • Whero-cs (whakatinana mo C#/.NET).
  • RedLock.net (whakatinana mo C#/.NET). Ma te tautoko mo te tukutahi me nga toronga raka.
  • Maukati (whakamahinga mo C# .NET me te toa raraunga ka taea te whirihora)
  • Redlock4Net (whakamahinga mo C# .NET)
  • node-whero (whakamahinga mo NodeJS). Kei roto ko te tautoko mo te whakaroa raka.

Whakaaetanga Haumarutanga me te waatea

Ka whakatauira matou i to maatau hoahoa me nga taonga e toru noa e whakaaro ana matou he iti rawa nga taurangi e hiahiatia ana hei whakamahi tika i te raka toha.

  1. Taonga haumarutanga: Te whakakore tahi. I nga wa katoa, kotahi anake te kaihoko ka taea te pupuri raka.
  2. Rawa Wātea A: Karekau he kati. I nga wa katoa ka taea te whiwhi raka, ahakoa ka rahua te kiritaki nana i maukati te rauemi, ka tau ranei ki tetahi wahanga kōpae rereke.
  3. Rawa Wātea B: Whakaaetanga Hapa. I te wa e rere ana te nuinga o nga node Redis, ka taea e nga kaihoko te tiki me te tuku raka.

He aha te whakatinanatanga i runga i te whakaoranga kore e ranea i tenei keehi
Kia mohio ai tatou ki nga mea ka whakapai ake, me tirotirohia te ahuatanga o naianei me te nuinga o nga whare pukapuka kati kua tohatohahia i runga i a Redis.

Ko te huarahi ngawari ki te maukati i tetahi rauemi ma te whakamahi i a Redis ko te hanga i tetahi ki roto i te tauira. I te nuinga o te wa, ka hangaia he kii me te iti o te oranga, ka tutuki tenei ma te whakamahi i te waahanga paunga e whakaratohia ana i Redis, no reira ka roa ka tukuna tenei ki (taonga 2 kei roto i ta maatau rarangi). Ina hiahia te kiritaki ki te tuku i te rauemi, ka mukua e ia te matua.

I te titiro tuatahi, he pai te mahi o tenei otinga, engari he raru: ko ta maatau hoahoanga ka hanga i tetahi waahi o te kore. Ka aha mena ka rahua te tauira Redis kaihautu? Me tapiri he taurekareka! A ka whakamahia e matou ki te kore te kaiwhakataki i te waatea. Kia aroha mai, kare e taea e tenei whiringa. Ma te mahi i tenei, kare e taea e taatau ki te whakatinana tika i nga taonga wehe tahi e tika ana hei whakarite i te haumarutanga, na te mea ko te tukuruatanga i Redis he koretake.

Ma te mohio, i roto i tenei tauira ka puta he ahuatanga o te iwi:

  1. Ka whiwhi raka a Kiritaki A ki te rangatira.
  2. Ka taka te rangatira i mua i te whakawhiti i te urunga matua ki te taurekareka.
  3. Ka whakanuia te kaiwhai ki te rangatira.
  4. Ka whiwhi raka a te Kiritaki B i runga i te rauemi ano kua mauhia e A. HEI WHAKAMAHI!

I etahi wa he mea tino noa i roto i nga ahuatanga motuhake, penei i te kore, he maha nga kaihoko ka taea te pupuri i te raka i te wa ano. I roto i nga ahuatanga penei, ka taea te whakamahi i te otinga e pa ana ki te tukurua. Ki te kore, ka tūtohu matou i te otinga e whakaahuatia ana i tenei tuhinga.

Te whakatinana tika me te tauira kotahi

I mua i te ngana ki te hinga i nga ngoikoretanga o te whirihoranga kotahi-tauira kua whakaahuatia i runga ake nei, kia mohio tatou me pehea te whakahaere tika i tenei keehi ngawari, na te mea ka whai mana tenei otinga i roto i nga tono ka whakaaetia te ahuatanga o te iwi i ia wa, i ia wa, me te aukati i runga i te Ko te tauira kotahi te turanga e whakamahia ana i roto i te algorithm tohatoha kua whakaahuatia i konei.

Ki te whiwhi raka, mahia tenei:

SET resource_name my_random_value NX PX 30000

Ka whakaurua e tenei whakahau he taviri mena karekau ano (kowhiringa NX), me te waa whaimana o te 30000 milliseconds (kowhiringa PX). Kua whakaritea te kī ki “myrandomvalue" Me ahurei tenei uara puta noa i nga kiritaki katoa me nga tono maukati katoa.
Ko te tikanga, ka whakamahia he uara matapōkere ki te tuku haumaru i te raka, me te tuhinga e kii ana ki a Redis: me tango noa te kī mena kei te noho me te uara kei roto ko te mea e tika ana. Ka tutuki tenei ma te whakamahi i te tuhinga Lua e whai ake nei:

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

He mea nui tenei kia kore e tangohia tetahi raka e mau ana i tetahi atu kiritaki. Hei tauira, ka whiwhi raka tetahi kaihoko, katahi ka maukati i etahi mahi ka roa ake i te raka tuatahi (kia whai taima ki te paunga o te ki), a muri iho ka tango i te raka i whakatakotoria e tetahi atu kaihoko.
Ko te whakamahi i te DEL ngawari kaore i te haumaru na te mea ka taea e te kaihoko te tango raka e mau ana i tetahi atu kaihoko. Engari, i te wa e whakamahi ana i te tuhinga i runga ake nei, ka "haina" ia raka me te aho matapōkere, na ko te kiritaki nana i whakatakoto i mua ka taea te tango.

Me aha tenei aho matapōkere? Ki taku whakaaro me 20 paita mai i /dev/urandom, engari ka kitea e koe etahi huarahi iti ake te utu kia pai ai te aho mo o kaupapa. Hei tauira, he pai ki te rui i te RC4 me te /dev/urandom ka whakaputa i te awa pseudo-tupurangi mai i a ia. Ko te otinga ngawari ake ko te whakakotahitanga o te wa unix i roto i te taumira microsecond me te ID kiritaki; ehara i te mea tino pai, engari ko te mahi i roto i te nuinga o nga horopaki.

Ko te wa e whakamahia ana hei ine mo te roanga o te kii ka kiia ko te "ora maukati". Ko tenei uara ko te roanga o te wa i mua i te tuku aunoa i te raka me te nui o te wa hei whakaoti i te mahi a tetahi atu kiritaki i mua i te wa e taea ai e tetahi atu kaihoko te maukati i taua rauemi, me te kore e takahia nga taurangi whakawehe tahi. He iti noa tenei taurangi ki tetahi matapihi o te waa, ka timata mai i te wa i hokona ai te raka.

Na kua korerohia e matou he huarahi pai ki te tango me te tuku raka. Ko te punaha (mehemea kei te korero tatou mo te punaha kore-tuhatu kei roto he tauira kotahi me te waatea tonu) he haumaru. Kia whakawhänuihia tënei ariä ki tëtahi pünaha tohatoha, i reira karekau he taurangi pera.

Redlock algorithm

Ko te putanga tohatoha o te algorithm e kii ana kei a matou nga rangatira o N Redis. He tino motuhake enei pona tetahi ki tetahi, no reira kaore matou e whakamahi i te tukurua, i tetahi atu punaha ruruku huna ranei. Kua korerohia e matou me pehea te tango me te tuku raka i runga i te waa kotahi. Ka whakaarohia e matou ko te algorithm, i te wa e mahi ana me te tauira kotahi, ka whakamahi tika i tenei tikanga. I roto i o maatau tauira ka tautuhia te N ki te 5, he uara whaitake. No reira, me whakamahi tatou i nga rangatira Redis e 5 i runga i nga rorohiko rereke, i nga miihini mariko ranei hei whakarite kia mahi motuhake ratou tetahi ki tetahi.

Ki te whiwhi raka, ka mahia e te kaihoko nga mahi e whai ake nei:

  1. Ka whiwhi i te wa onāianei i roto i nga mitamano.
  2. Ka ngana ki te tiki raka mo nga tauira N katoa, ma te whakamahi i te ingoa matua me nga uara matapōkere i roto i nga keehi katoa. I te Wāhanga 2, ina whakaritea e te kiritaki he raka i runga i ia tauira, ka whakamahia e te kiritaki he whakaroa ki te tiki i te mea he poto rawa te whakataurite ki te wa i muri mai ka tukuna aunoatia te raka. Hei tauira, ki te 10 hēkona te roa o te aukati, ka tae pea te roa ki te awhe ~5-50 manomano. Ka whakakorehia te ahuatanga ka taea e te kiritaki te aukati mo te wa roa e ngana ana ki te toro atu ki tetahi node Redis i rahua: mena kaore i te waatea te tauira, katahi ka ngana taatau ki te hono atu ki tetahi atu tauira ka taea.
  3. Hei tango raka, ka tatauhia e te kiritaki te nui o te wa kua pahemo; Ki te mahi i tenei, ka tangohia mai i te uara o te wa tuturu te tohu wa i riro mai i te taahiraa 1. Mena ka taea e te kiritaki te raka i te nuinga o nga wa (e 3 neke atu), me te tapeke o te waa ki te whiwhi te raka, iti iho i te roa raka, te raka whakaaro kua riro.
  4. Mena kua riro mai he raka, ka kiia ko te roanga maukati ko te roanga maukati taketake haunga te wa kua pahemo i tatauhia i te taahiraa 3.
  5. Ki te kore e taea e te kiritaki te tiki raka mo etahi take (kaore i taea e ia te maukati i nga wa N/2+1, he kino ranei te roanga maukati), katahi ka ngana ki te iriti i nga waa katoa (ahakoa te hunga i whakaaro kare e taea e ia te aukati. ).

He tukutahi te algorithm?

I ahu mai tenei algorithm i runga i te whakapae, ahakoa karekau he karaka tukutahi e mahi ai nga mahi katoa, ka rere tonu te wa rohe o ia tukanga ki te rite tonu te tere, a he iti te hapa ki te whakaritea ki te tapeke o te wa ka mutu te raka. tukuna aunoa. He tino rite tenei whakaaro ki te ahuatanga o nga rorohiko noa: he karaka rohe to ia rorohiko, a ka taea e taatau te whakaaro he iti te rereketanga o te waa i waenga i nga rorohiko rereke.

I tenei wa, me ata hanga e tatou ta tatou ture whakakore tahi: ka whakamanahia te whakakorenga tahi ki te puta noa te kaihoko e pupuri ana i te raka i te wa e whai mana ana te raka (ko tenei uara i whiwhi i te taahiraa 3), ka iti ake te wa (katoa he torutoru mirihakona hei utu mo te rereketanga o te wa i waenga i nga tukanga).

Ko te tuhinga whakamere e whai ake nei he korero ake mo nga punaha penei e hiahia ana kia rurukuhia nga waahi wa: Nga Riihi: he tikanga pai-whakaaro hara mo te riterite keteroki konae kua tohatohahia.

Ngana ano i te rahua

Ki te kore te kiritaki e whiwhi raka, me ngana ano i muri i te whakaroa ohorere; Ka mahia tenei ki te whakakore i te tukutahi i nga kiritaki maha e ngana ana ki te whiwhi raka i runga i te rauemi kotahi i te wa kotahi (ka puta he ahuatanga "waha-roro" kaore he toa). I tua atu, ko te tere o te kiritaki ki te whai raka ki te nuinga o nga tauira Redis, ka whaiti te matapihi e puta ai he ahuatanga wehe-roro (me te iti ake o te hiahia mo te whakamatautau ano). No reira, ko te tikanga, me ngana te kaihoko ki te tuku whakahau SET ki nga waa N i te wa kotahi ma te whakamahi i te maha.

He mea tika ki te whakanui i konei he mea nui mo nga kaihoko karekau i te whiwhi i te nuinga o nga raka ki te tuku i nga raka (he wahanga) kua riro mai, kia kore ai ratou e tatari kia pau te ki i mua i te tango ano i te raka o te rauemi. (ahakoa mena ka puta te wehewehenga whatunga, ka ngaro te hononga o te kiritaki ki nga tauira Redis, me utu e koe he utu mo te wa e tatari ana kia pau te ki).

Tukua te raka

Ko te tuku raka he mahi ngawari e hiahia ana ki te wetewete i nga wa katoa, ahakoa te ahua o te kiritaki kua raka pai tetahi tauira.

Nga Whakaaro Haumarutanga

He haumaru te algorithm? Me ngana ki te whakaaro he aha nga mea ka tupu i roto i nga ahuatanga rereke.

Hei timata, me whakaaro kua taea e te kaihoko te whiwhi raka mo te nuinga o nga wa. Kei roto i ia tauira he kī he rite te roa o te ora mo te katoa. Heoi, i whakauruhia enei ki i tetahi wa rereke, no reira ka pau i nga wa rereke. Engari, ki te whakauruhia te taviri tuatahi i te wa kaore i kino atu i te T1 (te wa i whiriwhiria e maatau i mua i te whakapiri atu ki te tūmau tuatahi), ka whakauruhia te kī whakamutunga i te wa kaore i kino atu i te T2 (te wa i tae mai ai te whakautu. mai i te tūmau whakamutunga), katahi ka whakapono matou ko te matua tuatahi o te huinga ka pau ka ora tonu MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT. Ko etahi atu mau taviri ka pau i muri mai, no reira ka mohio tatou ka whai mana nga ki katoa mo tenei wa.

I te wa e whai mana tonu ana te nuinga o nga ki, kare e taea e tetahi atu kaihoko te raka, i te mea kaore e taea e nga mahinga N/2+1 SET NX te angitu mena kei te noho tonu nga taviri N/2+1. No reira, ina riro mai he raka, kare e taea te tiki ano i taua wa ano (ka takahi tenei i te taonga wehe tahi).
Heoi, e hiahia ana matou ki te whakarite kia maha nga kaihoko e ngana ana ki te whiwhi raka i te wa kotahi e kore e angitu i te wa kotahi.

Mena kua maukatihia e te kiritaki te nuinga o nga wa mo te neke atu ranei i te roanga maukati morahi, ka kiia he muhu te raka ka iriti i nga waa. Na reira, me whai whakaaro noa tatou ki te keehi i taea e te kaihoko te aukati i te nuinga o nga keehi i roto i te waa iti iho i te ra paunga. I tenei keehi, mo te tautohetohe i runga ake nei, i roto i te waa MIN_VALIDITY kia kore e taea e te kiritaki te tiki ano i te raka. Na reira, ka taea e te maha o nga kaihoko te maukati i nga wahanga N/2+1 i te wa kotahi (ka mutu i te mutunga o te atamira 2) ina he nui ake te wa ki te maukati i te nuinga i te wa TTL, ka muhu te raka.

Ka taea e koe te whakarato i tetahi tohu okawa mo te haumarutanga, te tohu i nga algorithm rite tonu, ka kitea ranei he pepeke kei runga ake nei?

Nga Whakaaro Whakaaetanga

Ko te waatea o te punaha ka whakawhirinaki ki nga ahuatanga matua e toru:

  1. Tukua aunoatia nga raka (ka pau nga kii): Ka watea ano nga ki hei whakamahi mo nga raka.
  2. Ko te tikanga ka awhina nga kiritaki tetahi ki tetahi ma te tango i nga raka i te mea kaore ano kia riro te raka e hiahiatia ana, kua riro ranei, kua oti te mahi; no reira kare pea tatou e tatari mo te paunga o nga ki ki te tiki ano i te raka.
  3. Ko te mea ka hiahia te kaihoko ki te ngana ano ki te tiki raka, ka tatari mo te wa roa atu i te waa e hiahiatia ana kia whiwhi te nuinga o nga raka. Ma tenei ka whakaiti i te tupono ka puta mai he waahi wehe-roro i te wa e whakataetae ana mo nga rawa.

Heoi ano, he whiunga watea e rite ana ki te TTL o nga waahanga whatunga, na mena he waahanga taapiri, ka kore pea te whiunga. Ka puta tenei i nga wa ka whiwhi raka te kaihoko katahi ka tihorea ki tetahi atu waahanga i mua i tana tukunga.

Ko te tikanga, na te mea he waahanga whatunga piripono mutunga kore, ka kore e waatea te punaha mo te waa mutunga kore.

Te mahi, te ngoikore me te fsync

He maha nga tangata e whakamahi ana i a Redis na te mea e hiahia ana ratou ki te mahi tūmau maukati teitei i runga i te roanga e hiahiatia ana ki te whiwhi me te tuku raka, me te maha o nga hoko / tuku ka taea te whakaoti i ia hēkona. Hei whakatutuki i tenei whakaritenga, he rautaki ki te whakawhitiwhiti korero ki nga kaitoro N Redis ki te whakaiti i te roa. He rautaki whakareatanga tenei (he "whakanuia te tangata rawakore", ka tuu te turanga ki roto i te aratau aukati-kore, ka tukuna nga whakahau katoa, ka panuihia nga whakahau a muri ake nei, me te whakaaro he rite te wa haere-a-huri i waenga i te kiritaki me ia tauira) .

Engari, me whai whakaaro ano tatou ki te whakaaro e pa ana ki te rokiroki raraunga mo te wa roa mena ka tohe tatou ki te hanga tauira me te whakaora pono mai i nga rahunga.

Ko te tikanga, ki te whakamarama i te take, me whakaaro tatou ka whirihorahia e matou a Redis me te kore rawa he rokiroki raraunga mo te wa roa. Ka taea e te kiritaki te aukati i te 3 mai i te 5 nga wa. Ko tetahi o nga waahi i taea e te kiritaki te aukati ka timata ano, a i tenei wa e 3 ano mo te rauemi kotahi, ka taea e matou te aukati, ka taea e tetahi atu kaihoko te aukati i te tauira kua timata ano, ka takahi i te taonga haumarutanga. ka mau ki te motuhake o nga raka.

Mena ka taea e koe te raraunga kei mua (AOF), ka pai ake te ahuatanga. Hei tauira, ka taea e koe te whakatairanga i tetahi tūmau ma te tuku i te whakahau KAUTA me te whakaara ano. I te mea ko nga mahi paunga i Redis kua whakatinanahia i roto i te huarahi e rere tonu ana te waa ahakoa kua whakawetohia te tūmau, he pai o taatau whakaritenga katoa. He mea noa tenei mena ka whakawetohia i nga wa katoa. He aha te mahi ina mate te hiko? Mena kua whirihorahia a Redis ma te taunoa, me te tukutahi a fsync i runga i te kōpae i ia hēkona, katahi ka taea pea i muri i te tiimata ka kore to maatau ki. Ko te tikanga, ki te pirangi matou ki te whakapumau i te haumarutanga maukati i nga wa ka timata ano, me whakaahei fsync=always i roto i nga tautuhinga mo te rokiroki raraunga mo te wa roa. Ma tenei ka tino mate te mahi, tae noa ki te taumata o nga punaha CP e whakamahia ana i mua ki te whakatinana i nga raka kua tohatohahia.

Engari he pai ake te ahuatanga i te ahua o te titiro tuatahi. Ko te tikanga, ka tiakina te haumarutanga o te algorithm na te mea ka timata ano te tauira i muri i te rahua, kua kore e uru atu ki tetahi raka e hohe ana i tenei wa.

Hei whakarite i tenei, me whakarite noa i muri i te korenga ka kore e waatea te tauira mo tetahi waa neke atu i te TTL morahi e whakamahia ana e matou. Ma tenei ka tatari tatou ki te ra paunga me te tuku aunoa o nga taviri katoa i kaha i te wa o te kore.

Ma te whakamahi i nga tiimata kua roa, ka taea te whakatutuki i te haumarutanga ahakoa te kore o te tohe mo te wa roa i Redis. Kia mahara, tera pea he whaina mo te takahi i te urunga. Hei tauira, ki te rahua te nuinga o nga tauira, ka kore e waatea te punaha mo te TTL puta noa i te ao (kaore he rauemi e taea te aukati i tenei waa).

Ka whakanuia e matou te waatea o te algorithm: ka whakawhānuihia e matou te aukati

Mena he iti nga mahi a nga kaihoko, ka taea te whakaiti i te roanga raka taunoa me te whakatinana i tetahi tikanga mo te whakaroa raka. Ko te tikanga, mena kei te pukumahi te kiritaki ki te mahi rorohiko me te iti rawa o te uara paunga raka, ka taea e koe te tuku he tuhi Lua ki nga wa katoa ka toro atu te TTL o te ki mena kei te noho tonu te ki, a he uara matapōkere tonu ka riro mai i te wa i whiwhi raka.

Me whakaaro noa te kaihoko ki tetahi raka ka riro mai mena kua taea e ia te maukati te nuinga o nga waa i roto i te waa whaimana.

Ae, ma te hangarau kaore e rereke te huringa, no reira me iti te maha o nga nganatanga ki te tiki raka, ki te kore ka takahia nga waahi urunga.

Source: will.com

Tāpiri i te kōrero