Arifa Zinazotoka Mara Moja, Si Mara Moja kwa Kila Server
Mojawapo ya arifa zetu za uendeshaji — "credits zinakaribia kuisha" kwa app iliyochapishwa ya mjenzi — inakusudiwa kutufikia mara moja kwa siku. Alasiri moja ilifika mara tano. Sababu: kila nakala ya API yetu ilikumbuka arifa zipi ilishazituma kwenye kumbukumbu yake yenyewe, kwa hiyo servers mbili zilizituma mara mbili, na kila deploy ilifuta kumbukumbu hiyo na kuwaruhusu kuzituma tena. Mtindo huo huo ulisababisha kazi ya usuli kufanyika mara mbili. Zote sasa zinaratibiwa kupitia hifadhi ya pamoja, na zote zinashindwa upande salama endapo hifadhi hiyo haipatikani.
Dalili
Mythex hutuma arifa zake za timu pale kitu kinahitaji kuangaliwa: huduma imeshuka, kazi imekwama, au salio la credits la mjenzi liko chini wakati app yake imechapishwa. Kila arifa ina dirisha la dedupe — kipindi ambacho arifa hiyo hiyo hutumwa mara moja tu. Kwa arifa ya credits, dirisha hilo ni saa 24.
Nakala tano za arifa hiyo hiyo kwa alasiri moja zilimaanisha dirisha halikuwa likishikilia. Kibaya zaidi, zilifika kwa jozi, takriban dakika 11 kati yake.
Kwa nini ilitokea
Pakiti yetu ya arifa ilihifadhi dedupe yake kwenye kumbukumbu: jedwali la "ufunguo wa arifa → ilitumwa lini mara ya mwisho", ndani ya mchakato unaoendelea. Hilo hufanya kazi pale kuna mchakato mmoja usiowahi kuanzishwa upya. Production haina hali yoyote kati ya hizo:
- Replicas mbili za API. Production inaendesha nakala mbili za API. Kila moja ilikuwa na jedwali lake, kwa hiyo kila moja ilituma arifa mara moja. Hiyo ndiyo jozi.
- Deploys. Kila deploy inabadilisha replicas zote mbili kwa michakato mipya yenye majedwali matupu. Baada ya deploy, arifa ilitoka tena, kana kwamba haijawahi kutumwa.
Pengo la takriban dakika 11 kati ya arifa mbili za kila jozi lilitoka kwenye kazi inayoinua arifa hii. Inaendeshwa kwenye replicas zote mbili na inachukua lock, kwa hiyo replicas huishinda zamu kwa zamu, na kila moja iliinua arifa wakati wake ulipofika.
Kulikuwa na hitilafu ya pili, tulivu zaidi, kwenye msimbo huo huo. Ili kuzuia jedwali likue milele, lilijisafisha lenyewe lilipofikia funguo 500 — likifuta kila ingizo lililozidi dakika 15, bila kujali dirisha lake. Chini ya mzigo, dedupe ya saa 24 ingeweza kudumu robo saa tu.
Marekebisho
Rekodi moja ya pamoja kwa kila arifa
Kabla API haijatuma arifa, sasa inadai ufunguo wa dedupe wa arifa hiyo kwenye Redis — hifadhi ya pamoja ya kumbukumbu ambayo replicas zote mbili huizungumzia na ambayo haianzishwi upya API inapoanzishwa upya. Dai lenyewe ni operesheni moja ya "weka ufunguo huu tu kama haupo, na uuishe baada ya dirisha". Replica ya kwanza kudai ndiyo hutuma arifa; nyingine inakuta ufunguo umechukuliwa na kukaa kimya. Mchakato mpya baada ya deploy unakuta ufunguo bado upo.
Ufunguo na dirisha vinatoka kwenye kanuni ile ile ambayo pakiti ya arifa hutumia, sasa imeshirikiwa kati ya tabaka hizo mbili, kwa hiyo hazitofautiani kuhusu kinachohesabika kuwa "arifa ile ile".
Shindwa upande wazi, si wa kufungwa
Uamuzi muhimu zaidi ulikuwa tufanye nini Redis isipofikika. Tulichagua kutuma arifa hata hivyo. Redis ikiwa chini, au isipojibu ndani ya sekunde 1.5, arifa inatoka. Arifa ya nakala ni kelele. Arifa iliyopotea ni mtu asiyeambiwa.
Arifa kali kabisa, P0, kwa kawaida hazizuiliwi na dedupe kabisa.
Kila ingizo linashika dirisha lake
Katika dedupe ya kwenye kumbukumbu ya pakiti ya arifa, sasa kila ingizo linahifadhi wakati dirisha lake linapoishia, na kusafisha kunaondoa tu maingizo ambayo dirisha lake limeisha. Ufunguo wa saa 24 unadumu kwa saa 24, bila kujali arifa ngapi nyingine zinafika.
Hitilafu hiyo hiyo, mahali pengine
Mtindo huo huo ulikuwa umeongeza mara mbili kazi moja ya usuli: kazi ya upatanisho inayoweka rekodi yetu ya hali ya kila workspace sawa na ile ya mtoa huduma wetu wa sandbox. Kila mzunguko unaorodhesha kila sandbox kwenye akaunti — maelfu kwenye production, takriban sekunde tano — pamoja na kila mradi unaoendeshwa au umelala. Replicas zote mbili ziliiendesha kila dakika mbili.
Andiko zake ni idempotent — kuziendesha mara mbili kunatoa matokeo sawa na mara moja — kwa hiyo hakuna kilichovunjika. Ilikuwa kazi mara mbili tu. Sasa kila dirisha la dakika mbili linadaiwa kwenye Redis kwa njia ile ile ambayo mita zetu za matumizi zilishadai zao, na replica pekee iliyodai ndiyo huendesha mzunguko. Redis isipofikika, mzunguko unaendeshwa hata hivyo: kufanya kazi mara mbili haina madhara, lakini kutoifanya kabisa kuna madhara.
Jinsi tulivyojaribu
Majaribio yanaiga usanidi halisi. Yanapakia moduli ya arifa mara mbili, kama "replicas" mbili tofauti, zikielekezwa kwenye hifadhi moja ya pamoja, kisha kila moja inainua arifa ile ile. Kisha yanapakia nakala ya tatu mpya kuiga "baada ya deploy" na kuinua tena. Arifa moja tu ndiyo hutumwa. Majaribio mengine yanathibitisha kwamba arifa ya mjenzi mwingine bado inatoka, kwamba P0 inatumwa kutoka replicas zote mbili, na kwamba arifa bado inatumwa hifadhi ikiwa chini au ikichelewa zaidi ya muda wa kusubiri. Marekebisho ya kusafisha yana jaribio lake: ufunguo wa saa 24 unanusurika arifa 600 nyingine zinazofika dakika 20 baadaye.
Kwa kazi ya upatanisho, replicas mbili zikidunda kwa wakati mmoja, pamoja na dunda la tatu ndani ya dirisha lilelile, husababisha orodha moja tu.
Tulichojifunza
- Hali iliyo kwenye kumbukumbu ni ya kila mchakato. Kitu chochote kinachopaswa kuwa kweli kwenye servers zote — "kimetumwa mara moja", "kimeendeshwa mara moja" — kinahitaji kuishi mahali wanapoishiriki.
- Deploys ni kuanzishwa upya. Hali inayodumu tu hadi kuanzishwa upya kunafuata haidumu kupitia siku ya kawaida ya kazi.
- Amua ni upande upi wa kushindwa. Kwa arifa, hifadhi ya pamoja ikiwa chini inapaswa kumaanisha arifa zaidi, si chache.
- Tafuta mtindo, si tukio pekee. Arifa ndiyo kesi iliyokuwa kubwa; kazi ya upatanisho iliyoongezeka mara mbili ilikuwa hitilafu ile ile, ikigharimu kazi kimyakimya.
Hakuna kati ya haya linaloonekana kutoka ndani ya Mythex. Kwa zaidi kuhusu jinsi tunavyoweka jukwaa thabiti, angalia jinsi tulivyofikia deploys zenye makosa 502 sifuri na faili la swap lililokosekana. Ikiwa wewe ni mgeni kwa wazo la kuendesha nakala zaidi ya moja ya huduma, mwongozo wetu wa server ni nini unaeleza misingi.