CLUSTERDOWN The cluster is down ir atbilde, ko Redis Cluster mezgls sniedz, kad tas nolēmis, ka klasteris nav pietiekami vesels, lai apkalpotu vaicājumus. Tā nav kļūda kodā un nav viena mezgla nepareiza uzvedība: klasteris aizsargā jūsu datus. Lai to salabotu, jāzina, kurš no diviem nosacījumiem to izraisīja, un tam pietiek ar vienu komandu.
Redis sadala atslēgu telpu 16384 hash slotos, un katram slotam jāpieder sasniedzamam primārajam mezglam. Redis Cluster dokumentācijā skaidri teikts, ka klasteris turpina darbu nelielu kļūmju laikā, bet kļūst nepieejams lielāku kļūmju gadījumā, piemēram, ja vairākums primāro nav sasniedzami. Valkey, kas atzarots no Redis, izmanto tos pašus trīs kļūdu ziņojumus un tos pašus noteikumus.
Trīs CLUSTERDOWN kļūdas, trīs nozīmes
CLUSTERDOWN The cluster is down: mezgls uzskata klastera stāvokli parfailun noraida komandu.CLUSTERDOWN The cluster is down and only accepts read commands: tas pats stāvoklis, betcluster-allow-reads-when-downiryes, tāpēc lasīšana joprojām darbojas un šī rakstīšana tika atteikta.CLUSTERDOWN Hash slot not served: atslēga pieder slotam, kuram nav neviena īpašnieka. To bieži redz tikko izveidotā klasterī, kur sloti nekad netika piešķirti, vai pēc tam, kad mezgls noņemts, iepriekš nepārvietojot tā slotus.
Kāpēc klasteris apstājas
Redis pirmkodā mezgls pārslēdz klastera stāvokli uz fail viena no diviem iemesliem:
- Slotu pārklājums ir bojāts. Ar
cluster-require-full-coverage yes(noklusējums), ja kādam no 16384 slotiem nav īpašnieka vai tas pieder mezglam ar karoguFAIL, viss klasteris pārstāj pieņemt vaicājumus, ne tikai atslēgas šajos slotos. Tipisks stāsts: primārais mezgls nomirst, un tam nav strādājošas replikas, kas pārņemtu darbu, tāpēc tā sloti paliek nepārklāti. - Mezgls ir mazākumā. Ja mezgls nevar sasniegt vairākumu primāro, kas apkalpo slotus, tas atzīmē klasteri kā bojātu. Dokumentācija to apraksta kā mezglu, kas ilgāk par node timeout nesajūt vairākumu citu primāro un pāriet kļūdas stāvoklī. To var izraisīt tīkla sadalījums, drošības grupas izmaiņas vai pārslogots hosts.
Diagnostika ar CLUSTER INFO
$ redis-cli -c -h 10.0.3.11 -p 6379 SET user:42 x
(error) CLUSTERDOWN The cluster is down
$ redis-cli -h 10.0.3.11 -p 6379 CLUSTER INFO | head -7
cluster_state:fail
cluster_slots_assigned:16384
cluster_slots_ok:10923
cluster_slots_pfail:0
cluster_slots_fail:5461
cluster_known_nodes:6
cluster_size:3
CLUSTER INFO lauki pasaka, kurš gadījums ir jūsējais. cluster_slots_fail virs nulles nozīmē, ka sloti pieder mezglam stāvoklī FAIL: pārklājuma problēma. cluster_slots_assigned zem 16384 nozīmē, ka dažiem slotiem vispār nav īpašnieka. Ja visi sloti izskatās labi, bet cluster_state joprojām ir fail, uzdodiet to pašu jautājumu mezglam tīkla otrā pusē: visticamāk, runājat ar mezglu mazākuma sadalījumā. cluster_slots_pfail skaita slotus, kuru īpašnieks tikai tiek turēts aizdomās par nedarbošanos; tie joprojām strādā, līdz aizdomas tiek apstiprinātas.
# kuram mezglam pieder kļūdainie sloti un vai tam ir replika?
$ redis-cli -h 10.0.3.11 -p 6379 CLUSTER NODES | grep -E "master|fail"
# pilna konsekvences pārbaude no jebkura mezgla
$ redis-cli --cluster check 10.0.3.11:6379
Atgriešanās darbā
- Atgrieziet bojāto primāro, ja varat. Bieži tas ir restartēts process vai pilns disks. Kad tas pievienojas atpakaļ un tā sloti ir pārklāti, klasteris pats atgriežas stāvoklī
ok. Restartēts primārais īsu brīdi nogaida, pirms pieņem rakstīšanu, lai vispirms saņemtu konfigurācijas atjauninājumu, tāpēc neuztraucieties par pirmo sekundi vai divām. - Paaugstiniet repliku manuāli, ja automātiskais failover nenotika. Palaidiet
CLUSTER FAILOVER FORCEuz replikas, kuru vēlaties paaugstināt, kad tās primārais nav sasniedzams.FORCEjoprojām prasa, lai vairākums primāro apstiprina jauno konfigurāciju. Replika, kas bijusi atvienota pārāk ilgi, var atteikties no automātiskā failovercluster-replica-validity-factordēļ, un tieši tad manuāls failover palīdz. - Piešķiriet vai pārvietojiet trūkstošos slotus. Kļūdai "Hash slot not served"
redis-cli --cluster checkparāda nepārklātos slotus, unredis-cli --cluster fixvar tos piešķirt. Vispirms pārbaudiet: ja šajos slotos bija dati mezglā, kura vairs nav, pārklājuma labošana dod tukšus slotus, nevis atgriež jūsu datus.
CLUSTER FAILOVER TAKEOVER paaugstina repliku bez jebkādas klastera piekrišanas. Dokumentācijā teikts, ka tas pārkāpj principu "uzvar pēdējais failover" un jālieto uzmanīgi, piemēram, lai pārslēgtu datu centrus, kad visi primārie nedarbojas. Ja to izmanto mazākuma sadalījumā, divi mezgli var pieprasīt vienus un tos pašus slotus.Iestatījumi, kas maina uzvedību
cluster-require-full-coverage noļauj veselajām šķembām turpināt apkalpot savas atslēgas, kamēr daži sloti nedarbojas. Labi kešatmiņām, kur daļēja pieejamība ir labāka nekā nekāda; riskanti, ja lietotne pieņem, ka visas atslēgas ir sasniedzamas.cluster-allow-reads-when-down yesapkalpo lasīšanu, kamēr klasteris nedarbojas, ja vien mezgls uzskata, ka tam pieder slots. redis.conf komentāri to iesaka kešatmiņām un klasteriem ar mazāk nekā trim šķembām, pieņemot, ka lasītie dati var būt novecojuši.cluster-node-timeout(15000 ms noklusējuma redis.conf) nosaka, cik ātri primārais tiek atzīts par bojātu un aizstāts. Mazāka vērtība nozīmē ātrāku failover un vairāk viltus trauksmju noslogotā tīklā.cluster-migration-barrier(noklusējums 1) ļauj liekām replikām pāriet pie primārā, kuram to nav, tāpēc viena papildu replika var aizsargāt vairākas šķembas.
Ja klienti pēc failover ārpus klastera režīma turpina rakstīt vecajā mezglā, tā ir cita kļūda; skatiet mūsu Redis READONLY ceļvedi.
Kas mainās ar lielām datu kopām
- Katrai šķembai vajag vismaz vienu repliku. Ar lieliem mezgliem miruša primārā atgriešana var aizņemt daudz ilgāk nekā replikas paaugstināšana. Šķemba bez replikas noklusējuma pilnā pārklājuma noteikuma dēļ pārvērš viena hosta kļūmi par visa klastera dīkstāvi.
- Restarti ir lēni. Lielam mezglam pirms apkalpošanas jāielādē sava datu kopa, un ielādes laikā tas atbild LOADING, skatīt Redis LOADING dataset in memory. Ja primārais un tā replika restartējas vienlaikus, piemēram, neuzmanīgas pakāpeniskas jaunināšanas laikā, sloti paliek nepārklāti, līdz viens no tiem pabeidz ielādi.
- Pēc failover gaidiet pārsinhronizācijas trafiku. Vecais primārais pievienojas atpakaļ kā replika, un tam var būt vajadzīga pilna desmitiem gigabaitu sinhronizācija. Pielāgojiet replikācijas backlog un izvades buferus, lai tas neieciklotos, un nesāciet nākamo apkopes soli, līdz replikācija ir stabila.
- Pārdalīšana pārvieto reālus datus. Slotu pārvietošana kopē atslēgas starp mezgliem, un ļoti lielas atslēgas padara slotu migrāciju lēnu. Plānojiet pārdalīšanu klusajās stundās un sekojiet latentumam abos mezglos.
- Izkārtojiet mezglus pa kļūmju domēniem. Novietojiet primāro un tā repliku dažādos statīvos vai pieejamības zonās un nenovietojiet vairākumu primāro vienā zonā, citādi vienas zonas kļūme var atstāt izdzīvojušos mazākumā.
- Mēģiniet iepriekš. Testa vidē pilnā izmērā nogaliniet primāro un izmēriet, cik ilgi klasteris paliek stāvoklī
fail. Šis skaitlis, nevis node timeout, ir jūsu reālais atjaunošanas laiks.
Galvenās atziņas
- CLUSTERDOWN nozīmē, ka mezgls redz nepārklātus slotus vai nevar sasniegt vairākumu primāro.
CLUSTER INFOpasaka, kurš no tiem: skatietiescluster_slots_fail,cluster_slots_assigneduncluster_state.- Atjaunojiet darbību, atgriežot primāro vai ar
CLUSTER FAILOVER FORCEuz tā replikas;TAKEOVERir pēdējais līdzeklis. --cluster fixatjauno pārklājumu, nevis datus; pārbaudiet pirms palaišanas.- Lielos klasteros dodiet katrai šķembai repliku, izkārtojiet mezglus pa zonām un mēģiniet kļūmes pilnā izmērā.