Arhitektūra

Redis noturība: RDB pret AOF un kas jums patiesībā vajadzīgs

Redis visu glabā atmiņā, tāpēc tas, kas pārdzīvo avāriju, pilnībā atkarīgs no noturības konfigurācijas. Lūk, ko patiesībā garantē RDB momentuzņēmumi un pievienošanas žurnāls, cik tie maksā un kā droši pārslēgties.

· 13 min lasīšanai · AG Data komanda

Redis noturība (persistence) ir viens no tiem iestatījumiem, par kuriem neviens nedomā, līdz serveris restartējas un puse datu ir pazudusi – vai visi. Redis datu kopu glabā atmiņā, un tas, kas pārdzīvo avāriju, pilnībā atkarīgs no diviem mehānismiem: RDB momentuzņēmumiem un pievienošanas žurnāla (append-only file, AOF). Tie aizsargā pret dažādām lietām, maksā atšķirīgi, un noklusējumi var neatbilst tam, ko pieņem jūsu lietotne. Šis ceļvedis, balstoties uz Redis noturības dokumentāciju, izskaidro, ko katrs no tiem patiesībā garantē.

Četri varianti

Dokumentācijas ieteikums ir īss: izmantojiet abus, ja vēlaties datu drošību, kas salīdzināma ar PostgreSQL; tikai RDB, ja katastrofas gadījumā varat samierināties ar dažu minūšu datu zudumu. Tikai AOF tā neiesaka, jo laiku pa laikam izveidots RDB momentuzņēmums noder rezerves kopijām, ātrākiem restartiem un AOF dzinēja kļūdu gadījumā.

RDB momentuzņēmumi: kompakti, ātri restartējami, bet zaudējat minūtes

Ar RDB Redis izveido bērnprocesu (fork), bērns ieraksta datu kopu pagaidu failā, un šis fails atomāri aizstāj veco dump.rdb. Vecākprocess turpina apkalpot klientus un pats diskā neraksta. Noklusējuma konfigurācija izskatās šādi:

# defaults when no "save" line is given (redis.conf, Redis 7.4)
# save 3600 1 300 100 60 10000
dbfilename dump.rdb
stop-writes-on-bgsave-error yes

Bez skaidras save rindas Redis veido momentuzņēmumu pēc stundas, ja mainījusies vismaz 1 atslēga, pēc 5 minūtēm, ja mainījušās vismaz 100, un pēc 60 sekundēm, ja mainījušās vismaz 10 000. Klusā sistēmā tas var nozīmēt stundu starp momentuzņēmumiem. Viss, kas ierakstīts pēc pēdējā momentuzņēmuma, tiek zaudēts, ja Redis apstājas bez korektas izslēgšanas: avārija, OOM process nogalināšana, strāvas pārtraukums.

Kur RDB ir labs: viens kompakts fails, ideāls rezerves kopijām un kopēšanai uz citu vietu, un ar lielām datu kopām ātrāki restarti nekā ar AOF. Un detaļa, kas pārsteidz: noklusējums ir stop-writes-on-bgsave-error yes, tāpēc, ja momentuzņēmumi ir ieslēgti un pēdējā fona saglabāšana neizdevās (pilns disks, atļaujas), Redis pārtrauc pieņemt rakstīšanu. Tas ir apzināti, bet diska problēma pārvēršas lietotnes dīkstāvē.

fork() cena

Gan RDB momentuzņēmumi, gan AOF pārrakstīšana izmanto fork(). Dokumentācija brīdina, ka ar lielu datu kopu fork var aizņemt laiku un apturēt klientu apkalpošanu uz dažām milisekundēm vai pat uz sekundi, ja datu kopa ir ļoti liela un procesors lēns. Kopēšana pie rakstīšanas (copy-on-write) arī nozīmē, ka saglabāšanas laikā mainītās lapas tiek dublētas, tāpēc instancei ar daudz rakstīšanas momentuzņēmuma laikā vajadzīga atmiņas rezerve. Atmiņas pusi aplūkojam ceļvedī par Redis OOM un maxmemory. latest_fork_usec sadaļā INFO stats rāda, cik ilgi ilga pēdējais fork.

AOF: daudz noturīgāks, ar fsync izvēli

Ar appendonly yes katra komanda, kas maina datu kopu, tiek pievienota žurnālam. Galvenais iestatījums ir appendfsync:

Tipiska AOF konfigurācija:

appendonly yes
appendfsync everysec          # default; alternatives: always, no
appenddirname "appendonlydir"
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
aof-load-truncated yes

Žurnāls aug ar katru rakstīšanu, tāpēc Redis to pārraksta fonā: auto-aof-rewrite-percentage 100 izraisa pārrakstīšanu, kad AOF kopš pēdējās pārrakstīšanas izaudzis par 100%, ja tas ir vismaz auto-aof-rewrite-min-size. To var sākt arī manuāli ar BGREWRITEAOF. Ar aof-use-rdb-preamble yes pārrakstītā bāze tiek glabāta RDB formātā, kas ielādējas ātrāk.

Kopš Redis 7.0 AOF vairs nav viens fails. Tā ir direktorija (pēc noklusējuma appendonlydir) ar vienu bāzes failu, vienu vai vairākiem inkrementāliem failiem un manifestu, kas tos sasaista. Tas ir svarīgi rezerves kopijām, skatīt zemāk. Dokumentācija divas izmaksas min tikai versijām pirms 7.0: pārrakstīšanas laikā ienākošā rakstīšana tika buferēta atmiņā un diskā rakstīta divreiz.

Kad AOF ir bojāts

Ja Redis avarēja rakstīšanas vidū vai disks piepildījās, pēdējā komanda AOF var būt nogriezta. Ar aof-load-truncated yes (noklusējums) Redis nepilnīgo komandu atmet, ieraksta brīdinājumu žurnālā un startē. Ja fails ir bojāts vidū, Redis atsakās startēt. Dokumentācija iesaka izveidot kopiju un vispirms palaist redis-check-aof bez --fix, lai redzētu, kur ir problēma: ļaujot rīkam to salabot, var tikt atmests viss no bojātās daļas līdz faila beigām.

Vēl viena noderīga īpašība: ja kāds kļūdas pēc izpilda FLUSHALL un kopš tā nav notikusi pārrakstīšana, varat apturēt serveri, izņemt pēdējo komandu no AOF un startēt Redis no jauna ar neskartiem datiem. Tas darbojas tikai tad, ja rīkojaties pirms nākamās pārrakstīšanas.

Pāreja no RDB uz AOF bez datu zaudēšanas

Šeit cilvēki zaudē datus. Ja vienkārši iestatāt appendonly yes failā redis.conf un restartējat, Redis startē ar ieslēgtu AOF, un, kad AOF ir ieslēgts, tas ielādē AOF, nevis RDB failu, jo AOF tiek uzskatīts par pilnīgāko. Dokumentācija skaidri brīdina, ka procedūras neievērošana "var izraisīt datu zudumu". Drošais veids strādājošā serverī:

  1. Izveidojiet jaunākā dump.rdb rezerves kopiju un nokopējiet to drošā vietā.
  2. Ieslēdziet AOF strādājošā serverī un ļaujiet tam izveidot AOF no atmiņas:
    redis-cli CONFIG SET appendonly yes
    redis-cli INFO persistence    # wait: aof_rewrite_in_progress:0, aof_last_bgrewrite_status:ok
    redis-cli CONFIG REWRITE      # make the change survive a restart
  3. Pārliecinieties, ka redis.conf atbilst darbojošajai konfigurācijai. Ja to izlaižat, nākamais restarts atgriezīs veco konfigurāciju.
  4. Pirms jebkura restarta pārbaudiet, ka AOF pārrakstīšana ir pabeigta (aof_rewrite_in_progress un aof_rewrite_scheduled ir 0, aof_last_bgrewrite_status ir ok). Pēc restarta salīdziniet atslēgu skaitu ar iepriekšējo.

Noturība nav rezerves kopija. RDB un AOF aizsargā pret restartu vai avāriju tajā pašā mašīnā. Tie neaizsargā pret diska, servera vai reģiona zaudēšanu, un AOF precīzi ieraksta arī kļūdainu masveida dzēšanu kopā ar visu pārējo. Kopējiet momentuzņēmumus ārpus mašīnas.

Rezerves kopijas un monitorings

Monitoringam šie INFO lauki ir tie, par kuriem jābrīdina:

redis-cli INFO persistence | grep -E \
  'rdb_last_bgsave_status|rdb_last_save_time|rdb_changes_since_last_save|aof_enabled|aof_last_write_status|aof_last_bgrewrite_status'
redis-cli INFO stats | grep latest_fork_usec

Ja rdb_last_bgsave_status vai aof_last_write_status nav ok vai ja rdb_last_save_time ir tālu pagātnē, kamēr rdb_changes_since_last_save turpina augt, jūsu noturība nedara to, ko domājat.

Galvenās atziņas

Redis Noturība Rezerves kopijas Arhitektūra
Sadarbība ar mums

Neesat pārliecināti, ka jūsu Redis pārdzīvotu restartu?

Mēs pārskatām Redis un Valkey noturību, replikāciju un rezerves kopijas un salabojam to, kas avārijā zaudētu datus. Personīgs DBA, iknedēļas atskaites, pirmā reakcija uz kritiskiem incidentiem 15 minūšu laikā, 24/7.

Sazināties Vairāk no emuāra