Қулфи тақсимшуда бо истифода аз Redis

Эй Ҳабр!

Имрӯз мо тарҷумаи мақолаи мураккабро дар бораи татбиқи қулфи тақсимшуда бо истифода аз Redis пешкаш менамоем ва шуморо даъват менамоем, ки дар бораи дурнамои Redis ҳамчун мавзӯъ сӯҳбат кунед. Таҳлили алгоритми Redlock аз ҷониби Мартин Клепманн, муаллифи китоб "Барномаҳои сарбории баланд", дода шудааст дар ин ҷо.

Қулфи тақсимшуда як примитиви хеле муфид аст, ки дар бисёр муҳитҳое истифода мешавад, ки равандҳои гуногун бояд дар захираҳои муштарак ба таври мутақобилан истисноӣ кор кунанд.

Дар он ҷо як қатор китобхонаҳо ва мақолаҳо мавҷуданд, ки чӣ гуна татбиқи DLM (Менеҷери қулфбанди тақсимшуда) -ро бо истифода аз Redis тавсиф мекунанд, аммо ҳар як китобхона равиши дигарро мегирад ва кафолатҳои онҳо дар муқоиса бо он чизе, ки бо тарҳи каме мураккабтар дастрас аст, хеле заифанд.

Дар ин мақола, мо кӯшиш хоҳем кард, ки алгоритми шартии каноникиро тавсиф кунем, ки чӣ тавр амалӣ кардани қулфи тақсимшуда бо истифода аз Redis-ро нишон медиҳад. Мо дар бораи алгоритме сӯҳбат хоҳем кард Redlock, он менеҷери қулфи тақсимшударо амалӣ мекунад ва ба андешаи мо, ин алгоритм нисбат ба равиши оддии як-инстансия бехатартар аст. Мо умедворем, ки ҷомеа онро таҳлил мекунад, фикру мулоҳизаҳо пешниҳод мекунад ва онро ҳамчун нуқтаи ибтидоӣ барои лоиҳаҳои мураккабтар ё алтернативӣ истифода мебарад.

Татбиқи

Пеш аз гузаштан ба тавсифи алгоритм, мо якчанд истинодҳоро ба татбиқи омода пешниҳод мекунем. Онҳо метавонанд барои истинод истифода шаванд.

  • Redlock-rb (амалӣ барои Ruby). Инчунин вуҷуд дорад чангак Redlock-rb, ки барои осонии тақсимот бастаи (гем) илова мекунад, на танҳо барои он.
  • Redlock-py (Татбиқи Python).
  • Aioredlock (амалӣ барои Asyncio Python).
  • Redlock-php (амалӣ барои PHP).
  • PHPRedisMutex (иҷрои дигар барои PHP)
  • cheprasov/php-redis-lock (Китобхонаи PHP барои қуфлҳо)
  • Redsync (амалӣ барои Go).
  • Редиссон (амалӣ барои Java).
  • Redis :: DistLock (амалӣ барои Perl).
  • Redlock-cpp (амалӣ барои C++).
  • Redlock-cs (амалӣ барои C#/.NET).
  • RedLock.net (амалӣ барои C#/.NET). Бо дастгирии васеъшавии асинхронӣ ва қулф.
  • ScarletLock (амалӣ барои C# .NET бо анбори додаҳои танзимшаванда)
  • Redlock4Net (амалӣ барои C# .NET)
  • блоки гиреҳ (амалӣ барои NodeJS). Дастгирии васеъ кардани қулфҳоро дар бар мегирад.

Кафолатҳои амният ва дастрасӣ

Мо тарҳи худро танҳо бо се хосият моделсозӣ хоҳем кард, ки ба фикри мо кафолатҳои ҳадди ақалро барои самаранок истифода бурдани қулфи тақсимшуда таъмин мекунанд.

  1. Амволи амният: Истиснои мутақобила. Дар вақти дилхоҳ танҳо як муштарӣ метавонад қулфро нигоҳ дорад.
  2. Амволи мавҷудияти A: Монеа нест. Ҳамеша имконпазир аст, ки дар ниҳоят қулфро ба даст оред, ҳатто агар муштарӣ, ки манбаро қуфл кард, ноком шавад ё ба сегменти дигари диск фуруд ояд.
  3. Амволи мавҷудияти B: Таҳаммулпазирии хато. То он даме, ки аксарияти гиреҳҳои Redis кор мекунанд, муштариён метавонанд қуфлҳоро ба даст оранд ва озод кунанд.

Чаро татбиқи дар асоси барқарорсозии нокомӣ дар ин ҳолат кофӣ нест
Барои фаҳмидани он ки мо чиро беҳтар карданӣ ҳастем, биёед вазъияти кунунии корҳоро бо китобхонаҳои қулфбандии паҳншуда дар асоси Redis таҳлил кунем.

Роҳи соддатарини қулф кардани захира бо истифода аз Redis ин сохтани калид дар мисол мебошад. Одатан, калид бо мӯҳлати маҳдуд сохта мешавад, ин бо истифода аз хусусияти ба охир расидани мӯҳлати дар Redis пешниҳодшуда ба даст оварда мешавад, бинобар ин дер ё зуд ин калид озод карда мешавад (амволи 2 дар рӯйхати мо). Вақте ки муштарӣ бояд захираро озод кунад, он калидро нест мекунад.

Дар назари аввал, ин ҳалли хеле хуб кор мекунад, аммо мушкилот вуҷуд дорад: меъмории мо як нуқтаи нокомиро ба вуҷуд меорад. Агар намунаи Redis мизбон ноком шавад, чӣ мешавад? Пас биёед ғуломро илова кунем! Ва мо онро истифода мебарем, агар баранда дастрас набошад. Мутаассифона, ин вариант қобили қабул нест. Бо ин кор, мо наметавонем амволи истисноии мутақобиланро, ки барои таъмини амният лозим аст, дуруст татбиқ кунем, зеро такрорӣ дар Redis асинхронӣ аст.

Аён аст, ки дар чунин модел ҳолати мусобиқа ба амал меояд:

  1. Мизоҷи А қулфро дар усто ба даст меорад.
  2. Устод пеш аз интиқол додани вуруди калид ба ғулом ноком мешавад.
  3. Пайрав ба рохбарй пешбарй карда мешавад.
  4. Мизоҷи B қулфро дар ҳамон захирае, ки А аллакай бастааст, ба даст меорад. ВАЙРОН КАРДАНИ АМНИЯТ!

Баъзан комилан муқаррарӣ аст, ки дар ҳолатҳои махсус, ба монанди нокомӣ, бисёр муштариён метавонанд қулфро дар як вақт нигоҳ доранд. Дар чунин ҳолатҳо, ҳалли асоси такрориро истифода бурдан мумкин аст. Дар акси ҳол, мо ҳалли дар ин мақола тавсифшударо тавсия медиҳем.

Татбиқи дуруст бо як мисол

Пеш аз кӯшиши рафъи камбудиҳои конфигуратсияи якнасавӣ, ки дар боло тавсиф шудааст, биёед бифаҳмем, ки чӣ гуна ин парвандаи оддиро дуруст ҳал кардан мумкин аст, зеро ин ҳалли воқеан дар барномаҳое эътибор дорад, ки шарти мусобиқа вақт аз вақт қобили қабул аст ва инчунин аз сабаби он ки бастани мисоли ягона ҳамчун асосе хизмат мекунад, ки дар алгоритми тақсимшуда дар ин ҷо тавсиф шудааст.

Барои ба даст овардани қулф, ин корро кунед:

SET resource_name my_random_value NX PX 30000

Ин фармон калидро танҳо дар ҳолате насб мекунад, ки он аллакай вуҷуд надошта бошад (опсияи NX), бо мӯҳлати эътибораш 30000 миллисония (опсияи PX). Калид ба " таъин шудаастmyrandomvalue" Ин арзиш бояд дар тамоми муштариён ва ҳама дархостҳои қулф беназир бошад.
Асосан, барои бехатар озод кардани қулф арзиши тасодуфӣ истифода мешавад ва скрипт ба Redis мегӯяд: танҳо калидро хориҷ кунед, агар он вуҷуд дошта бошад ва арзиши дар он нигоҳ дошташуда маҳз ҳамон чизест, ки интизор мерафт. Ин бо истифода аз скрипти зерини Lua ба даст оварда мешавад:

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

Ин барои пешгирии кушодани қулфи муштарии дигар муҳим аст. Масалан, муштарӣ метавонад қулфро ба даст орад, пас дар баъзе амалиёте, ки аз қулфи аввал тӯл мекашад, баста шавад (то он ки калид ба охир мерасад) ва баъдтар қулфро, ки ягон муштарии дигар гузошта буд, хориҷ кунад.
Истифодаи DEL-и оддӣ хатарнок аст, зеро муштарӣ метавонад қулфи муштарии дигарро хориҷ кунад. Баръакс, ҳангоми истифодаи скрипти дар боло зикршуда, ҳар як қулф бо сатри тасодуфӣ "имзо карда мешавад", бинобар ин танҳо муштарие, ки қаблан онро ҷойгир карда буд, метавонад онро хориҷ кунад.

Ин сатри тасодуфӣ бояд чӣ гуна бошад? Ман гумон мекунам, ки он бояд 20 байт аз /dev/urandom бошад, аммо шумо метавонед роҳҳои арзонтареро пайдо кунед, ки сатрро барои мақсадҳои худ кофӣ беназир созед. Масалан, хуб мебуд, ки RC4-ро бо /dev/urandom пошед ва сипас аз он ҷараёни псевдо-тасодуфӣ тавлид кунед. Ҳалли соддатар омезиши вақти unix дар ҳалли микросекунд бо иловаи ID муштариро дар бар мегирад; он он қадар бехатар нест, аммо он эҳтимол дар аксари заминаҳо ба вазифа вобаста аст.

Он вақте, ки мо ҳамчун ченаки умри калид истифода мебарем, "вақти қулф" номида мешавад. Ин арзиш ҳам миқдори вақти пеш аз озод шудани қулф ба таври худкор ва ҳам миқдори вақтест, ки муштарӣ барои анҷом додани амалиёт пеш аз он ки муштарии дигар метавонад дар навбати худ, бидуни вайрон кардани кафолатҳои истисноии мутақобила, ин манбаъро қулф кунад. Ин кафолат танҳо бо равзанаи муайяни вақт маҳдуд аст, ки аз лаҳзаи хариди қулф оғоз меёбад.

Ҳамин тавр, мо роҳи хуби ба даст овардан ва озод кардани қулфро муҳокима кардем. Система (агар мо дар бораи системаи тақсимнашуда, ки аз як мисоли ягона ва ҳамеша дастрас сухан ронем) бехатар аст. Биёед ин консепсияро ба системаи тақсимшуда васеъ кунем, ки мо чунин кафолат надорем.

Алгоритми Redlock

Версияи тақсимшудаи алгоритм тахмин мекунад, ки мо устодони N Redis дорем. Ин гиреҳҳо аз ҳамдигар комилан мустақиланд, аз ин рӯ мо репликатсия ё ягон системаи дигари ҳамоҳангсозиро истифода намебарем. Мо аллакай фаҳмидем, ки чӣ тавр ба таври бехатар ба даст овардан ва озод кардани қулф дар як мисол. Мо чунин мешуморем, ки алгоритм ҳангоми кор бо як мисол маҳз ҳамин усулро истифода мебарад. Дар мисолҳои худ мо N-ро ба 5 муқаррар кардем, ки ин арзиши оқилона аст. Ҳамин тариқ, ба мо лозим меояд, ки 5 устои Redis-ро дар компютерҳои гуногун ё мошинҳои виртуалӣ истифода барем, то боварӣ ҳосил кунем, ки онҳо аз ҳамдигар новобаста амал мекунанд.

Барои ба даст овардани қулф, муштарӣ амалҳои зеринро иҷро мекунад:

  1. Вақти ҷорӣро дар миллисонияҳо мегирад.
  2. Пайдарпай кӯшиш мекунад, ки дар ҳама N мисолҳо қулф ба даст орад, бо истифода аз як номи калид ва арзишҳои тасодуфӣ дар ҳама ҳолатҳо. Дар марҳилаи 2, вақте ки муштарӣ қулфро дар асоси ҳар як мисол насб мекунад, муштарӣ барои ба даст овардани он таъхирро истифода мебарад, ки нисбат ба вақте, ки пас аз он қулф ба таври худкор озод мешавад, кӯтоҳ аст. Масалан, агар давомнокии басташавӣ 10 сония бошад, пас таъхир метавонад дар ҳудуди ~5-50 миллисония бошад. Ин вазъиятро бартараф мекунад, ки муштарӣ метавонад муддати тӯлонӣ баста шавад, то ба гиреҳи номуваффақи Redis бирасад: агар инстансия дастнорас бошад, мо мекӯшем, ки ҳарчи зудтар ба инстансияи дигар пайваст шавем.
  3. Барои гирифтани қулф, муштарӣ ҳисоб мекунад, ки чӣ қадар вақт гузашт; Барои ин, он аз арзиши воқеии вақт тамғаи вақтро, ки дар қадами 1 ба даст оварда буд, тарҳ мекунад. Агар ва танҳо агар муштарӣ тавонист қуфлро дар аксари мавридҳо (ҳадди ақал 3) ба даст орад ва вақти умумии он барои қулфро ба даст оред, камтар аз давомнокии қулф, қуфл ба даст овардашуда ҳисобида мешавад.
  4. Агар қулф ба даст оварда шуда бошад, давомнокии қулф ҳамчун давомнокии аслии қулф аз ҳисоби вақти гузаштаи дар қадами 3 ҳисобшуда гирифта мешавад.
  5. Агар муштарӣ бо ягон сабаб қулфро ба даст наоварад (ё он намунаҳои N/2+1-ро қулф карда натавонист, ё давомнокии қулф манфӣ буд), он гоҳ вай кӯшиш мекунад, ки ҳамаи инстансҳоро кушояд (ҳатто онҳое, ки гумон мекард, онро баста наметавонад) ).

Оё алгоритм асинхронӣ аст?

Ин алгоритм ба фарзия асос ёфтааст, ки гарчанде ки ягон соати ҳамоҳангшуда вуҷуд надорад, ки дар он ҳамаи равандҳо кор кунанд, вақти маҳаллӣ дар ҳар як раванд ҳоло ҳам тақрибан бо ҳамон суръат ҷараён дорад ва хато дар муқоиса бо вақти умумии пас аз баста шудани қулф хурд аст. ба таври худкор бароварда мешавад. Ин фарзия ба вазъияте, ки барои компютерҳои оддӣ хос аст, хеле монанд аст: ҳар як компютер соати маҳаллӣ дорад ва мо одатан метавонем ба он боварӣ ҳосил кунем, ки фарқияти вақти байни компютерҳои гуногун хурд аст.

Дар ин лаҳза, мо бояд қоидаи истиснои мутақобилаи худро бодиққат таҳия кунем: истиснои мутақобила танҳо дар сурате кафолат дода мешавад, ки агар муштарӣ, ки қулфро нигоҳ медорад, дар давоми вақти эътибори қулф (ин арзиш дар қадами 3 ба даст оварда шудааст) хориҷ шавад, каме вақти дигар (ҳамагӣ чанд вақт) миллисонияҳо барои ҷуброн кардани фарқияти вақти байни равандҳо).

Мақолаи ҷолиби зерин дар бораи чунин системаҳое, ки ҳамоҳангсозии фосилаҳои вақтро талаб мекунанд, бештар нақл мекунад: Иҷора: як механизми муассири таҳаммулпазирии хатогиҳо барои мувофиқати кэши файлҳои тақсимшуда.

Дар нокомӣ дубора кӯшиш кунед

Вақте ки муштарӣ қулфро ба даст наоварад, пас аз таъхири тасодуфӣ бояд дубора кӯшиш кунад; ин барои ҳамоҳангсозии чанд мизоҷ, ки кӯшиши ба даст овардани қулф дар як манбаъ дар як вақт анҷом дода мешавад (ки метавонад ба вазъияти "ҷудошавии мағзи сар" оварда расонад, ки дар он ғолибон вуҷуд надоранд). Илова бар ин, мизоҷ ҳар қадар тезтар кӯшиш кунад, ки қулфро дар аксари ҳолатҳои Redis ба даст орад, ҳамон қадар равзанаи он тангтар мешавад, ки дар он вазъияти ҷудошавии мағзи сар метавонад ба амал ояд (ва ҳамон қадар ниёз ба кӯшишҳои такрорӣ камтар аст). Аз ин рӯ, идеалӣ, муштарӣ бояд кӯшиш кунад, ки фармонҳои SET-ро ба N мисолҳо ҳамзамон бо истифода аз мултиплекс фиристад.

Дар ин ҷо қайд кардан лозим аст, ки барои муштариёне, ки аксарияти қулфҳоро ба даст намеоранд, то чӣ андоза муҳим аст, ки қуфлҳои бадастомадаро (қисман) озод кунанд, то ба онҳо лозим нашаванд, ки пеш аз дубора ба даст овардани қулф дар манбаъ то ба охир расидани мӯҳлати калид интизор нашаванд. (гарчанде ки агар тақсимоти шабака ба вуқӯъ ояд ва муштарӣ иртиботро бо инстансияҳои Redis гум кунад, шумо бояд ҳангоми интизории ба охир расидани мӯҳлати калид ҷаримаи мавҷудият пардохт кунед).

Қулфро озод кунед

Озод кардани қулф як амалиёти оддӣ аст, ки танҳо кушодани ҳама мисолҳоро талаб мекунад, новобаста аз он ки муштарӣ як мисоли мушаххасро бомуваффақият қулф кардааст.

Мулоҳизаҳои амниятӣ

Оё алгоритм бехатар аст? Биёед кӯшиш кунем, ки тасаввур кунем, ки дар сенарияҳои гуногун чӣ рӯй медиҳад.

Барои оғоз, биёед фарз кунем, ки муштарӣ тавонист дар аксари мавридҳо қулф ба даст орад. Ҳар як мисол дорои як калид бо мӯҳлати якхела барои ҳама. Аммо, ҳар яке аз ин калидҳо дар вақти дигар насб карда шудаанд, бинобар ин, мӯҳлати онҳо дар вақтҳои гуногун ба охир мерасад. Аммо, агар калиди аввал дар як вақт на бадтар аз T1 насб карда шуда бошад (вақте, ки мо пеш аз тамос бо сервери аввал интихоб мекунем) ва калиди охирин дар вақте насб карда шуда бошад, ки на камтар аз T2 (вақте, ки посух гирифта шуд). аз сервери охирин), пас мо итминон дорем, ки калиди аввал дар маҷмӯа, ки мӯҳлати эътибораш ба охир мерасад, ҳадди аққал зинда мемонад MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT. Ҳамаи калидҳои дигар дертар ба охир мерасанд, аз ин рӯ мо итминон дошта метавонем, ки ҳама калидҳо ҳадди аққал дар ин вақт ҳамзамон эътибор хоҳанд дошт.

Дар давоми вақте, ки аксари калидҳо эътибор доранд, муштарии дигар наметавонад қулфро ба даст орад, зеро амалиёти N/2+1 SET NX муваффақ шуда наметавонад, агар калидҳои N/2+1 аллакай мавҷуд бошанд. Аз ин рӯ, вақте ки қулф ба даст омад, онро дар ҳамон лаҳза дубора ба даст овардан ғайриимкон аст (ин моликияти истисноии ҳамдигарро вайрон мекунад).
Бо вуҷуди ин, мо мехоҳем боварӣ ҳосил кунем, ки муштариёни сершуморе, ки дар як вақт қулфро ба даст меоранд, наметавонанд дар як вақт муваффақ шаванд.

Агар муштарӣ аксарияти инстансияҳоро тақрибан ё бештар аз давомнокии максималии қулф баста бошад, он қулфро беэътибор меҳисобад ва мисолҳоро мекушояд. Аз ин рӯ, мо бояд танҳо ҳолатеро ба назар гирем, ки дар он муштарӣ тавонист аксари ҳолатҳоро дар муддати камтар аз санаи анҷомёбӣ маҳкам кунад. Дар ин маврид, дар бораи далели боло, дар давоми вақт MIN_VALIDITY Ҳеҷ як муштарӣ набояд қулфро дубора ба даст орад. Аз ин рӯ, бисёре аз муштариён метавонанд N/2+1-ро дар як вақт қулф кунанд (ки дар охири марҳилаи 2 ба итмом мерасад) танҳо вақте ки вақти бастани аксарият аз вақти TTL зиёдтар буд, ки қулфро беэътибор мекунад.

Оё шумо метавонед далели расмии амниятро пешниҳод кунед, алгоритмҳои мавҷудаи шабеҳро нишон диҳед ё хатогиро дар боло пайдо кунед?

Мулоҳизаҳои дастрасӣ

Дастрасии система аз се хусусияти асосӣ вобаста аст:

  1. Ба таври худкор қулфҳоро озод кунед (чун ба охир расидани мӯҳлати калидҳо): Калидҳо дар ниҳоят боз дастрас мешаванд, то барои қуфлҳо истифода шаванд.
  2. Далели он, ки мизоҷон одатан ҳангоми кушодани қулфҳо ба ҳамдигар кӯмак мекунанд, вақте қуфли дилхоҳ ба даст наомадааст, ё ба даст оварда шудааст ва кор ба анҷом расидааст; аз ин рӯ, эҳтимол дорад, ки барои дубора ба даст овардани қулф ба мо лозим нест, ки мӯҳлати мӯҳлати калидҳоро интизор шавем.
  3. Далели он, ки вақте муштарӣ бояд дубора кӯшиш кунад, ки қулфро ба даст орад, вай нисбат ба мӯҳлате, ки барои дарёфти аксари қулфҳо лозим аст, вақти нисбатан зиёдтарро интизор мешавад. Ин эҳтимолияти вазъияти тақсими мағзи сарро ҳангоми рақобат барои захираҳо коҳиш медиҳад.

Бо вуҷуди ин, ҷаримаи мавҷудият ба TTL-и сегментҳои шабака баробар аст, бинобар ин, агар сегментҳои ҳампайванд мавҷуд бошанд, ҷарима метавонад номуайян бошад. Ин ҳар вақте рух медиҳад, ки муштарӣ қулфро ба даст меорад ва сипас пеш аз он ки онро озод кунад, ба сегменти дигар канда мешавад.

Аслан, бо назардошти сегментҳои беохири шабака, система метавонад барои муддати беохир дастнорас монад.

Иҷрои, нокомӣ ва fsync

Бисёр одамон Redis-ро истифода мебаранд, зеро онҳо ба иҷрои баланди сервери қулф аз нуқтаи назари таъхир барои ба даст овардан ва озод кардани қулфҳо ва шумораи харидҳо/релизҳо, ки метавонанд дар як сония анҷом дода шаванд, ниёз доранд. Барои қонеъ кардани ин талабот, стратегияи иртибот бо серверҳои N Redis барои кам кардани таъхир вуҷуд дорад. Ин стратегияи мултиплекс аст (ё "мултиплекси одами камбағал", ки дар он васлаки ба ҳолати ғайрибандӣ гузошта мешавад, ҳама фармонҳоро мефиристад ва фармонҳоро дертар мехонад, бо назардошти он ки вақти гардиш байни муштарӣ ва ҳар як мисол шабеҳ аст) .

Бо вуҷуди ин, мо инчунин бояд баррасии марбут ба нигоҳдории дарозмуддати маълумотро ба назар гирем, агар мо кӯшиш кунем, ки модели барқарорсозии боэътимод аз нокомиҳо эҷод кунем.

Асосан, барои равшан кардани ин масъала, биёед фарз кунем, ки мо Redis-ро бидуни нигоҳдории дарозмуддати маълумот танзим мекунем. Мизоҷ аз 3 мисол 5-тоашро маҳкам мекунад. Яке аз ҳолатҳое, ки муштарӣ тавонист бастани онро боздорад, аз нав оғоз мешавад ва дар айни замон боз 3 мисол барои ҳамон захира мавҷуд аст, ки мо метавонем онҳоро маҳкам кунем ва муштарии дигар дар навбати худ метавонад инстанси аз нав оғозшударо маҳкам карда, моликияти амниятиро вайрон кунад, ки истисноии қулфҳоро дар назар дорад.

Агар шумо маълумотро дар пеш (AOF) фаъол созед, вазъият каме беҳтар мешавад. Масалан, шумо метавонед серверро тавассути фиристодани фармони ХОМӮШ ва аз нав оғоз кардани он пешбарӣ кунед. Азбаски амалиёти ба итмом расидани мӯҳлати Redis ба таври семантикӣ тавре амалӣ карда мешавад, ки вақт ҳатто ҳангоми хомӯш кардани сервер ҷараён дорад, ҳама талаботҳои мо хубанд. То он даме, ки хомӯшии муқаррарӣ таъмин карда мешавад, ин муқаррарӣ аст. Дар сурати қатъ шудани барқ ​​чӣ бояд кард? Агар Redis бо нобаёнӣ танзим карда шуда бошад, бо синхронизатсияи fsync дар диск ҳар сония, пас эҳтимол дорад, ки пас аз бозоғозӣ мо калиди худро надорем. Аз ҷиҳати назариявӣ, агар мо хоҳем, ки амнияти қулфро ҳангоми бозоғозии ҳама гуна мисолҳо кафолат диҳем, мо бояд фаъол созем fsync=always дар танзимот барои нигоҳдории маълумоти дарозмуддат. Ин то сатҳи системаҳои CP, ки ба таври анъанавӣ барои бехатар татбиқ кардани қуфлҳои тақсимшуда истифода мешаванд, иҷрои онро комилан мекушанд.

Аммо вазъият назар ба он ки дар назари аввал ба назар мерасад, беҳтар аст. Аслан, амнияти алгоритм нигоҳ дошта мешавад, зеро вақте ки инстансия пас аз нокомӣ бозоғоз мешавад, он дигар дар ягон қулф, ки ҳоло фаъол аст, иштирок намекунад.

Барои таъмини ин, мо бояд танҳо боварӣ ҳосил кунем, ки пас аз нокомӣ инстансия дар тӯли муддате аз ҳадди TTL, ки мо истифода мебарем, каме зиёд бошад, дастнорас боқӣ мемонад. Ҳамин тариқ, мо то ба охир расидани мӯҳлат ва барориши автоматии ҳамаи калидҳое, ки дар вақти нокомӣ фаъол буданд, интизор мешавем.

Бо истифода аз бозоғозии таъхиршуда, аслан метавон ба амният ноил шудан, ҳатто дар сурати мавҷуд набудани ягон истодагарии дарозмуддат дар Redis имконпазир аст. Аммо дар хотир доред, ки ин метавонад боиси ҷарима барои вайрон кардани дастрасӣ гардад. Масалан, агар аксарияти инстансияҳо ноком шаванд, система барои TTL дар саросари ҷаҳон дастнорас мешавад (ва дар ин муддат ҳеҷ гуна захираро манъ кардан мумкин нест).

Мо дастрасии алгоритмро зиёд мекунем: мо блокро васеъ мекунем

Агар коре, ки муштариён иҷро мекунанд, аз қадамҳои хурд иборат бошад, имкон дорад, ки давомнокии қулфи пешфарз кам карда шавад ва механизми дароз кардани қулфҳо татбиқ карда шавад. Аслан, агар муштарӣ бо ҳисоббарорӣ банд бошад ва арзиши мӯҳлати қулф ба таври хатарнок паст бошад, шумо метавонед скрипти Lua-ро ба ҳама ҳолатҳое фиристед, ки TTL-и калидро васеъ мекунад, агар калид мавҷуд бошад ва арзиши он ҳанӯз ҳам арзиши тасодуфӣ бошад, вақте ки қулф ба даст оварда шуд.

Муштарӣ бояд танҳо қулфро аз нав ба даст оварад, агар он тавонист дар давоми мӯҳлати эътибор аксари ҳолатҳоро қулф кунад.

Дуруст аст, ки алгоритм аз ҷиҳати техникӣ тағир намеёбад, аз ин рӯ шумораи максималии кӯшишҳои такрории ба даст овардани қулфҳо бояд маҳдуд бошад, вагарна хосиятҳои дастрасӣ вайрон карда мешаванд.

Манбаъ: will.com

Илова Эзоҳ