Heim >Datenbank >Redis >Detaillierte Analyse des Persistenzmechanismus in Redis

Detaillierte Analyse des Persistenzmechanismus in Redis

青灯夜游
青灯夜游nach vorne
2021-12-29 10:11:461799Durchsuche

Dieser Artikel wird Ihnen helfen, den Persistenzmechanismus in Redis: RDB und AOF zu verstehen und RDB und AOF zu vergleichen. Ich hoffe, er wird Ihnen hilfreich sein!

Detaillierte Analyse des Persistenzmechanismus in Redis

Redis-Persistenzmechanismus

Warum Persistenz

Wenn erneut auf Redis zugegriffen wird und festgestellt wird, dass die Redis-Daten leer sind, kommt es zu einer Cache-Penetration. Noch wichtiger ist, dass es aufgrund der leeren Redis-Daten keine Schlüssel gibt, auf die der Client zugreifen möchte, was dazu führt, dass eine große Anzahl von Anforderungen sofort die Datenbank erreicht und eine Cache-Lawine auslöst (eine kleine Anzahl von Schlüsseln dringt ein, eine große Anzahl von Schlüsseln dringt ein). Anzahl der Der Schlüssel ist Avalanche).

Zu diesem Zeitpunkt kann die Datenbank hängen bleiben. Es gibt keine Garantie dafür, dass Redis nicht ausfällt. Wenn also Redis ausfällt, müssen die darin enthaltenen Inhalte schnell wiederhergestellt werden. Daher ist Beharrlichkeit gefragt. Persistenz dient der Wiederherstellung von Daten, nicht der Speicherung von Daten. [Verwandte Empfehlungen: Redis-Video-Tutorial]

RDB

RDB (Redis DataBase) ist die Standardspeichermethode von Redis. Die RDB-Methode wird durch Snapshotting abgeschlossen.

... ). save 300 10 # Zeigt an, dass ein Snapshot erstellt wird, wenn innerhalb von 5 Minuten (300 Sekunden) mindestens 10 Schlüssel geändert werden.

Save 60 10000 # zeigt an, dass bei mindestens 10000 Tasten innerhalb von 1 Minute schnell

  • den Befehl speichern oder bgSave

  • den Befehl speichern oder bgSave zum Generieren eines Müllkopos ausführen .rdb-Datei, bei jeder Befehlsausführung wird ein Snapshot des gesamten Redis-Speichers in eine neue RDB-Datei erstellt und die ursprüngliche RDB-Snapshot-Datei überschrieben.

    save vs. bgsave-Vergleich:

N秒内数据集至少有M个改动”这一条件被满足时,自动保存一次数据集。

Befehl

save

bgsave

IO-Typob Redis andere Befehle blockiert ja Blockieren von Client-Befehlen
synchron asynchron
nein ( Wenn der untergeordnete Prozess ausgeführt wird, um die Fork-Funktion aufzurufen, kommt es zu einer kurzen Blockierung Blockiert keine Client-Befehle Nachteile
Untergeordnete Prozesse müssen gegabelt werden und Speicher verbrauchen

配置自动生成rdb文件后台使用的是bgsave方式。

Führen Sie den Befehl „flushall“ aus.

flushall

Bevor Sie Redis löschen, speichern Sie den aktuellen Redis-Snapshot.

Führen Sie den Master-Slave-Replikationsvorgang durch (erstmals). was gespeichert wird Aktueller Redis-Snapshot

RDB-Ausführungsprozess

Detaillierte Analyse des Persistenzmechanismus in Redis

Prozessanalyse
    • Der übergeordnete Redis-Prozess ermittelt zunächst: ob er gerade die Datei „save“ oder „bgsave/bgrewriteaof“ ausführt Schreiben Befehl) untergeordneter Prozess. Wenn er ausgeführt wird, kehrt der Befehl bgsave direkt zurück.
    • Der übergeordnete Prozess führt einen Fork-Vorgang (Aufruf einer Betriebssystemfunktion zum Kopieren des Hauptprozesses) aus, um einen untergeordneten Prozess zu erstellen. Während dieses Prozesses ist der übergeordnete Prozess blockiert und Redis kann keine Befehle vom Client ausführen .
    • Nach der Verzweigung des übergeordneten Prozesses gibt der Befehl bgsave die Meldung „Hintergrundspeicherung gestartet“ zurück und blockiert den übergeordneten Prozess nicht mehr und kann auf andere Befehle reagieren.
    • Der untergeordnete Prozess erstellt eine RDB-Datei, generiert eine temporäre Snapshot-Datei basierend auf dem Speicher-Snapshot des übergeordneten Prozesses und ersetzt nach Abschluss die Originaldatei atomar. (RDB ist immer abgeschlossen)
    • Der untergeordnete Prozess sendet ein Signal an den übergeordneten Prozess, um den Abschluss anzuzeigen, und der übergeordnete Prozess aktualisiert die Statistiken.
    • Nachdem der übergeordnete Prozess den untergeordneten Prozess gegabelt hat, funktioniert er weiter.
RDB-Dateistruktur

Detaillierte Analyse des Persistenzmechanismus in Redis1. Der 5-Byte-Header ist auf die Zeichenfolge „REDIS“ festgelegt

    2. Die 4-Byte-Versionsnummer „RDB“ (nicht Die Redis-Versionsnummer ist derzeit 9 und lautet nach dem Ausfüllen des Hilfsfelds
  • 4. Abgelaufener Schlüssel
  • 7 . Primärdaten, gespeichert in Form von Schlüsselwert
  • 8, Endflag
  • 9, Prüfsumme, mit der überprüft wird, ob die Datei beschädigt oder geändert ist
  • Vor- und Nachteile von RDB
  • Vorteile

RDB ist eine binär komprimierte Datei, die wenig Platz beansprucht und einfach zu übertragen ist (an Slave übergeben)

Der Hauptprozess verzweigt den untergeordneten Prozess, um die Redis-Leistung zu maximieren . Der Hauptprozess wird während des Kopiervorgangs blockiert

  • Nachteile

  • Die Datenintegrität ist nicht garantiert und alle nach dem letzten Snapshot geänderten Daten gehen verloren

AOF

  • AOF (nur anhängen). Datei) ist eine weitere Persistenzmethode von Redis. Redis ist standardmäßig nicht aktiviert. Nach dem Einschalten der AOF-Persistenz zeichnet Redis alle in die Datenbank geschriebenen Befehle (und ihre Parameter) (RESP) in der AOF-Datei auf, um den Zweck der Aufzeichnung des Datenbankstatus zu erreichen
Auf diese Weise muss Redis nur neu gestartet werden werden der Reihe nach abgespielt. Diese Befehle werden in ihren ursprünglichen Zustand zurückversetzt. AOF zeichnet den Prozess auf, RDB kümmert sich nur um die Ergebnisse Die AOF-Datei Der gesamte Prozess kann in drei Phasen unterteilt werden:

Befehlsweitergabe: Redis sendet den ausgeführten Befehl, Befehlsparameter, Befehlsparameternummer und andere Informationen an das AOF-Programm.

Cache-Anhängen: Das AOF-Programm konvertiert den Befehl basierend auf den empfangenen Befehlsdaten in das Format des Netzwerkkommunikationsprotokolls und hängt dann den Protokollinhalt an den AOF-Cache des Servers an.

Schreiben und Speichern von Dateien: Der Inhalt im AOF-Cache wird an das Ende der AOF-Datei geschrieben. Wenn die festgelegten AOF-Speicherbedingungen erfüllt sind, wird die Funktion fsync oder fdatasync aufgerufen, um den geschriebenen Inhalt tatsächlich zu schreiben. Auf Datenträger speichern.

BefehlsweitergabeWenn ein Redis-Client einen Befehl ausführen muss, sendet er den Protokolltext über die Netzwerkverbindung an den Redis-Server. Nachdem der Server die Anfrage des Clients empfangen hat, wählt er basierend auf dem Inhalt des Protokolltexts die entsprechende Befehlsfunktion aus und konvertiert jeden Parameter von einem Zeichenfolgentext in ein Redis-Zeichenfolgenobjekt (StringObject). Immer wenn die Befehlsfunktion erfolgreich ausgeführt wird, werden die Befehlsparameter an das AOF-Programm weitergegeben.

Cache Append
  • Wenn der Befehl an das AOF-Programm weitergegeben wird, konvertiert das Programm den Befehl vom String-Objekt zurück in den ursprünglichen Protokolltext, basierend auf dem Befehl und den Parametern des Befehls. Nachdem der Protokolltext generiert wurde, wird er am Ende von aof_buf in der Struktur redis.h/redisServer angehängt.

  • Die redisServer-Struktur verwaltet den Status des Redis-Servers und das Feld aof_buf speichert alle Protokolltexte (RESP), die darauf warten, in die AOF-Datei geschrieben zu werden
  • Schreiben und Speichern von Dateien
  • 每当服务器常规任务函数被执行、或者事件处理器被执行时,aof.c/flushAppendOnlyFile 函数都会被调用,这个函数执行以下两个工作:

    • WRITE:根据条件将aof_buf中的缓存写入到AOF文件。

    • SAVE:根据条件调用fsync或 fdatasync函数将AOF文件保存到磁盘中。

    AOF保存模式

    Redis 目前支持三种 AOF 保存模式,它们分别是:

    • AOF_FSYNC_NO :不保存。

    • AOF_FSYNC_EVERYSEC :每一秒钟保存一次。(默认)

    • AOF_FSYNC_ALWAYS :每执行一个命令保存一次。(不推荐)

    AOF_FSYNC_NO

    从不fsync,将数据交给操作系统来处理。更快,也更不安全的选择。

    SAVE只会在以下任意一种情况中被执行:

    • Redis被关闭

    • AOF功能被关闭

    • 系统的写缓存被刷新(可能是缓存已经被写满,或者定期保存操作被执行)

    这三种情况下的SAVE操作都会引起Redis主进程阻塞。

    AOF_FSYNC_EVERYSEC

    SAVE原则上每隔一秒钟就会执行一次,因为SAVE操作是由后台子线程(fork)调用的, 所以它不会引起服务器主进程阻塞,并且在故障时只会丢失1秒钟的数据。

    AOF_FSYNC_ALWAYS

    每次执行完一个命令之后,WRITE和SAVE都会被执行。每次有新命令追加到AOF文件时就执行一次fsync,非常慢,也非常安全。

    因为SAVE是由Redis主进程执行的,所以在SAVE执行期间,主进程会被阻塞,不能接受命令请求。

    AOF保存模式对性能和安全性的影响

    三种模式的比较

    Detaillierte Analyse des Persistenzmechanismus in Redis

    AOF重写

    AOF记录数据的变化过程,越来越大,需要重写“瘦身”

    Redis可以在AOF体积变得过大时,自动地在后台(Fork子进程)对AOF进行重写。

    重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合。

    所谓的“重写”其实是一个有歧义的词语,实际上,AOF重写并不需要对原有的AOF文件进行任何写入和读取,它针对的是数据库中键的当前值。

    举例说明

    set s1 11
    set s1 22
    set s1 33
    
    lpush list1 1 2 3
    lpush list1 4 5 6

    AOF重写后

    set s1 33
    
    lpush list1 1 2 3 4 5 6

    Redis不希望AOF重写造成服务器无法处理请求,所以Redis决定将AOF重写程序放到(后台)子进程里执行,

    • 1、子进程进行AOF重写期间,主进程可以继续处理命令请求。

    • 2、子进程带有主进程的数据副本,使用子进程而不是线程,可以在避免锁的情况下,保证数据的安全性。

    不过,使用子进程也有一个问题需要解决:因为子进程在进行AOF重写期间,主进程还需要继续处理命令,而新的命令可能对现有的数据进行修改,这会让当前数据库的数据和重写后的AOF文件中的数据不一致。

    为了解决这个问题,Redis增加了一个AOF重写缓存,这个缓存在fork出子进程之后开始启用,Redis主进程在接到新的写命令之后,除了会将这个写命令的协议内容追加到现有的AOF文件之外,还会追加到这个缓存中。

    重写过程分析

    Detaillierte Analyse des Persistenzmechanismus in Redis

    Redis在创建新AOF文件的过程中,会继续将命令追加到现有的AOF文件里面,即使重写过程中发生停机,现有的AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新AOF文件,并开始对新AOF文件进行追加操作。

    当子进程在执行AOF重写时,主进程需要执行以下三个工作:

    • 处理命令请求。
    • 将写命令追加到现有的AOF文件中。
    • 将写命令追加到AOF重写缓存中

    。这样一来可以保证:现有的AOF功能会继续执行,即使在AOF重写期间发生停机,也不会有任何数据丢失。所有对数据库进行修改的命令都会被记录到AOF重写缓存中。

    当子进程完成AOF重写之后,它会向父进程发送一个完成信号,父进程在接到完成信号之后,会调用一个信号处理函数,并完成以下工作:

    • 将AOF重写缓存中的内容全部写入到新AOF文件中。
    • 对新的AOF文件进行改名,覆盖原有的AOF文件。

    Redis数据库里的+AOF重写过程中的命令------->新的AOF文件---->覆盖老的当步骤1执行完毕之后,现有AOF文件、新AOF文件和数据库三者的状态就完全一致了。

    当步骤2执行完毕之后,程序就完成了新旧两个AOF文件的交替。这个信号处理函数执行完毕之后,主进程就可以继续像往常一样接受命令请求了

    。在整个AOF后台重写过程中,只有最后的写入缓存和改名操作会造成主进程阻塞,在其他时候,AOF后台重写都不会对主进程造成阻塞,这将AOF重写对性能造成的影响降到了最低。

    AOF重写触发方式

    • 1、配置触发
    #表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以启动时aof文件大小为准
    auto-aof-rewrite-percentage 100
    
    #限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化
    auto-aof-rewrite-min-size 64mb
    • 2、执行bgrewriteaof命令
    127.0.0.1:6379>bgrewriteaof‘
    Backgroundappendonlyfilerewritingstarted

    AOF重写总结

    Detaillierte Analyse des Persistenzmechanismus in Redis

    混合持久化

    RDB和AOF各有优缺点,Redis 4.0开始支持rdb和aof的混合持久化。

    如果把混合持久化打开,aofrewrite的时候就直接把rdb的内容写到aof文件开头。

    RDB的头+AOF的身体---->appendonly.aof

    开启混合持久化

    aof-use-rdb-preambleyes

    AOF文件的载入与数据还原

    如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。

    于是在Redis重启的时候,可以先加载RDB的内容,然后再重放增量AOF日志就可以完全替代之前的AOF全量文件重放,因此重启效率大幅得到提升。

    • 1、创建一个不带网络连接的伪客户端(fake client)

    因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样

    • 2、从AOF文件中分析并读取出一条写命令

    • 3、使用伪客户端执行被读出的写命令

    • 4、一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止

    Detaillierte Analyse des Persistenzmechanismus in Redis

    Redis数据备份策略

    • 1.写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份

    • 2.每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份

    • 3.每次copy备份的时候,都把太旧的备份给删了

    • 4.每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏

    RDB和AOF对比

    • 1、RDB存某个时刻的数据快照,采用二进制压缩存储,AOF存操作命令,采用文本存储(混合)

    • 2、RDB性能高、AOF性能较低

    • 3、RDB在配置触发状态会丢失最后一次快照以后更改的所有数据,AOF设置为每秒保存一次,则最多丢2秒的数据

    • 4、Redis以主服务器模式运行,RDB不会保存过期键值对数据,Redis以从服务器模式运行,RDB会保存过期键值对,当主服务器向从服务器同步时,再清空过期键值对。AOF写入文件时,对过期的key会追加一条del命令,当执行AOF重写时,会忽略过期key和del命令。

    更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonDetaillierte Analyse des Persistenzmechanismus in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen