Incidentu reaģēšana

Redis "READONLY You can't write against a read only replica": cēloņi un risinājumi

Šī kļūda gandrīz nekad nenozīmē, ka Redis ir salūzis. Tā nozīmē, ka lietotne raksta mezglā, kas vairs nav vai nekad nav bijis primārais. Lūk, kā noskaidrot iemeslu un to novērst, neriskējot ar datiem.

· 12 min lasīšanai · AG Data komanda

READONLY You can't write against a read only replica ir Redis atbilde, kad rakstīšanas komanda nonāk replikā. Pēc noklusējuma replikas pieņem tikai lasīšanu, tāpēc serveris rakstīšanu noraida. Gandrīz katrā incidentā datubāze ir kārtībā. Problēma ir tā, ka lietotne ir pieslēgta nepareizajam mezglam, parasti tūlīt pēc failover.

Redis kļūdu aprakstā tas pateikts vienkārši: rakstīšanu pieņem tikai primārais. Valkey, kas atdalījās no Redis, uzvedas tāpat un izmanto to pašu ziņojumu. Tātad jautājums nav "kas vainas Redis", bet "kāpēc mans klients uzskata šo repliku par primāro?"

Vispirms pārbaudiet, kas mezgls patiesībā ir

$ redis-cli -h cache-01 SET k v
(error) READONLY You can't write against a read only replica.

$ redis-cli -h cache-01 ROLE
1) "slave"
2) "10.0.2.15"          # primārais, kam šis mezgls seko
3) (integer) 6379
4) "connected"
5) (integer) 3167038

$ redis-cli -h cache-01 INFO replication | head -5
# Replication
role:slave
master_host:10.0.2.15
master_port:6379
master_link_status:up

ROLE replikā kā pirmo elementu atgriež slave (vārds protokolā saglabāts atpakaļsaderībai), tad primārā adresi, savienojuma stāvokli un replikācijas nobīdi. INFO replication dod to pašu ainu teksta veidā. Ja mezgls ir replika, paskatieties, kuram primārajam tas seko. Tas pasaka, kur rakstīšanai vajadzēja nonākt.

Biežākie cēloņi

Skripti un "lasīšanas" komandas, kas patiesībā ir rakstīšana

Kļūdu aprakstā norādīts, ka Lua funkcija vai skripts, kas sākas ar rindu #!lua, replikā saņem READONLY jau pirms palaišanas, ja tam nav karoga no-writes. Parasts skripts saņem kļūdu, kad izsauc rakstīšanas komandu. Replikācijas dokumentācija arī norāda, ka EVAL, EVALSHA un SORT nav tikai lasīšanas komandas. Ja vēlaties tās izpildīt replikās, lietojiet EVAL_RO, EVALSHA_RO un SORT_RO, bet SUNIONSTORE vai ZINTERSTORE pagaidu atslēgās aizstājiet ar SUNION vai ZINTER.

Labojiet klientu, nevis repliku

  1. Ar Sentinel ļaujiet klientam pašam atrast primāro. Sentinel klientu specifikācija apraksta procedūru: pajautāt Sentinel ar SENTINEL get-master-addr-by-name, pieslēgties un ar ROLE pārliecināties, ka mezgls tiešām ir master. Pie katras atkārtotas pieslēgšanās klientam jājautā Sentinel no jauna. Kad Sentinel pārkonfigurē instanci, tas nosūta CLIENT KILL type normal, kas liek klientiem pārslēgties un adresi noskaidrot no jauna. Klients, kas atkal pieslēdzas kešotai adresei, šo mehānismu izjauc.
  2. ElastiCache rakstiet tikai primārajā galapunktā (vai klastera režīmā konfigurācijas galapunktā) un pārliecinieties, ka izpildes vide nekešo DNS ilgāk par failover logu.
  3. Uztveriet READONLY kā signālu pārslēgties. Daudzus klientus var konfigurēt tā, lai, to saņemot, tie pārtrauc savienojumu un no jauna atrod primāro. Atkārtojot to pašu rakstīšanu tajā pašā savienojumā, tā neizdosies nekad.
  4. Atdaliet rakstīšanas un lasīšanas galapunktus. Kubernetes vidē dodiet rakstīšanai Service, kas atlasa tikai pašreizējo primāro. To nodrošina Sentinel atbalstoši klienti vai operators, kas marķē primāro. Service pār visiem podiem to nedara.
# pajautājiet Sentinel, kurš tagad ir primārais
$ redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
1) "10.0.2.21"
2) "6379"

# pēc tam pārbaudiet šo mezglu, pirms tam uzticaties
$ redis-cli -h 10.0.2.21 ROLE
1) "master"
...
Neiestatiet replica-read-only no, lai kļūda pazustu. Redis dokumentācijā teikts, ka rakstāmas replikas pastāv tikai vēsturisku iemeslu dēļ un var radīt atšķirības starp replikas un primārā datiem. Rakstījumi replikā tiek atmesti pēc pārsinhronizācijas vai restarta, tie netiek nodoti apakšreplikām, un, ja šo mezglu kādreiz paaugstina, jūs sākat ar nekonsekventu datu kopu.

Līdzīgas kļūdas

Kas mainās ar lielām datu kopām

Ar desmitiem gigabaitu atmiņā tieši minūtes pēc failover ir tās, kad READONLY pārvēršas ilgākā dīkstāvē:

Tie paši noteikumi attiecas uz Valkey, ja esat pārgājuši vai plānojat pāriet, skatiet mūsu rakstu Redis uz Valkey migrācija: replikas pēc noklusējuma ir tikai lasāmas, un klientiem jāseko primārajam.

Galvenās atziņas

Redis Valkey Replikācija Sentinel
Sadarbība ar mums

Rakstīšana neizdodas ar READONLY?

Mēs risinām Redis un Valkey failover problēmas, labojam klientu atklāšanu Sentinel, Cluster un ElastiCache vidēs un padarām failover paredzamu lielām datu kopām.

Sazināties Vairāk no emuāra