<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 【Redis 系列】redis 學習八,redis 持久化 RDB 和 AOF

    Redis 持久化

    redis 是內存數據庫,如果不將內存中數據庫保存到磁盤上,那么服務器一旦宕機,或者 redis 進程退出,不僅數據會被丟失,服務器中的數據庫狀態也會被丟失

    因此 redis 提供了持久化的功能

    redis 的持久化分為 RDB 和 AOF

    RDB (Redis DatabBase)

    在主從復制中,rdb文件都作為備用的,放在從機上面

    在指定時間間隔內將內存中的數據集快照寫入到磁盤中,這就是快照 snapshot ,恢復快照的時候,是把快照文件讀入到內存中。

    redis 通過 fork 的方式創建一個子進程來專門做持久化的動作,

    • 先將數據寫入到一個臨時文件中,待持久化過程結束,再用這個臨時文件替換上一次的持久化好的文件

    整個過程中,主進程是不進行任務 IO 操作的,這就保障了極高的性能

    如果需要進行大規模的數據恢復,且對于數據的完整性要求不那么敏感和嚴格,選擇 RDB 的持久化方式比 AOF 的持久化方式更優,更加高效。

    RDB 雖然性能高,但是在 最后一次持久化后的數據可能會被丟失,redis 默認就是使用的 RDB 持久化方式,一般情況下也不需要修改

    save 60 3
    
    # The filename where to dump the DB
    dbfilename dump.rdb
    
    dir ./
    

    我們設置 60s 內若 有操作 redis 3 次,那就做一次持久化

    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> config get dir
    1) "dir"
    2) "/root"
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> set k2 v2
    OK
    127.0.0.1:6379> set k3 v3
    OK
    

    dump.db 文件是生成在 dir 目錄下的,我們這里的 dir 目錄是 /root

    進行上述操作之后,我們發現 /root 生成了 dump.rdb 文件 ,咱們將該文件刪除掉,再嘗試一次

    root@iZuf66y3tuzn4wp3h02t7pZ:~# rm dump.rdb -rf
    root@iZuf66y3tuzn4wp3h02t7pZ:~# redis-cli
    127.0.0.1:6379> set p1 1
    OK
    127.0.0.1:6379> set p2 1
    OK
    127.0.0.1:6379> set p3 3
    OK
    root@iZuf66y3tuzn4wp3h02t7pZ:~# ls
    dump.rdb
    

    果然也是正常生成的

    持久化的觸發機制

    • 按照 save 的規則滿足的情況下,就會觸發持久化,例如上述的 60s 操作 redis 3 次就會觸發 1 次持久化
    • 執行 flushall 命令的時候,也會觸發持久化,生成 dump.db 文件
    • 退出 redis 的時候, 也會觸發持久化,生成 dump.db 文件

    備份就會自動生成一個 dump.db 文件

    如何恢復持久化文件

    1、只需要將 dump.db 文件放到 redis 的啟動目錄即可,redis 啟動的時候會將該文件讀入到內存中,進行數據恢復

    2、查看 redis 的啟動目錄可以這樣做

    127.0.0.1:6379> config get dir
    1) "dir"
    2) "/root"
    

    這一塊的配置,我們基本上不需要修改太多,默認的配置基本就夠用了

    RDB 的優勢

    • 適合大規模的數據恢復
    • 對數據的完整性要求不高

    RDB 的劣勢

    • 需要在一定的時間間隔進行操作,如果 redis 意外宕機,最后一次寫入的數據就會丟失
    • fork 子進程的時候需要占用一定的空間

    AOF 持久化方式

    AOF 是什么?

    將我們的寫命令全部記錄下來,恢復的時候,將文件中的記錄全部執行一遍

    AOF 是 redis 的另外一種持久化方式,以日志的形式記錄每一個寫操作,將 redis 執行過的寫操作全部記錄下來,只允許追加文件,不允許改寫文件

    redis 啟動的時候就會讀取這個 aof 文件重建數據庫,也就是說,redis 重啟的時候,就會根據日志文件的內容將寫指令按照寫入順序執行,完成數據恢復

    aof 保存的是 appendonly.aof 文件

    # Please check https://redis.io/topics/persistence for more information.
    
    appendonly no
    
    # The name of the append only file (default: "appendonly.aof")
    
    appendfilename "appendonly.aof"
    
    # appendfsync always
    appendfsync everysec
    # appendfsync no
    
    no-appendfsync-on-rewrite no
    
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    

    auto-aof-rewrite-min-size 64mb

    當 aof 文件大于 64 mb 的時候,就會再創建一個子進程來寫一個新的 aof 文件

    關于 aof 的配置基本上其他的都是使用默認的配置即可,我們只需要把 aof 模式打開即可

    appendonly yes
    

    默認 appendonly 是不開啟的,我們修改了配置之后,重啟 redis-server 就會馬上生效

    重寫規則說明

    aof 默認是對文件無限追加,文件必然會越來越大

    修改 redis.conf 為 aof 模式后,重啟 redis-server 可以看到 appendonly.aof 文件

    redis 客戶端連接 server 進行操作 redis ,簡單的設置幾個值

    root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> set name xiaozhu
    OK
    127.0.0.1:6379> set age 19
    OK
    127.0.0.1:6379> set hobby play
    OK
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> set k2 v2
    OK
    127.0.0.1:6379> set k3 v3
    OK
    127.0.0.1:6379> shutdown
    not connected>
    

    查看 appendonly.aof 文件

    appendonly.aof 文件里面存放的就是我們操作 redis 的寫命令的記錄

    這個時候,我們認為的在 appendonly.aof 文件中修改一些值

    set
    $2
    k2
    $2
    v2
    *3
    $3
    set
    $2
    k3
    $2
    ashdkklasdjkkv3		# 修改了這一行
    

    啟動 redis-server ,查看是否可以恢復數據

    root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-server /usr/local/redis/redis-6.2.5/redis.conf
    root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-cli
    Could not connect to Redis at 127.0.0.1:6379: Connection refused
    not connected>
    root@iZuf66y3tuzn4wp3h02t7pZ:/# ps axu |grep redis
    root      1251  0.0  0.0  14436  1048 pts/0    S+   14:55   0:00 grep --color=auto redis
    root@iZuf66y3tuzn4wp3h02t7pZ:/#
    

    發現 redis-server 啟動失敗,是因為咱們的 appendonly.aof 文件被人為的修改過,此時咱們需要修復該文件,redis 有提供工具修改 aof 文件,redis-check-aof

    使用指令:

    redis-check-aof --fix appendonly.aof

    # redis-check-aof --fix appendonly.aof
    0x              ce: Expected \r\n, got: 6864
    AOF analyzed: size=223, ok_up_to=181, ok_up_to_line=47, diff=42
    This will shrink the AOF from 223 bytes, with 42 bytes, to 181 bytes
    Continue? [y/N]: y
    Successfully truncated AOF
    root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-server /usr/local/redis/redis-6.2.5/redis.conf
    root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> get k1
    "v1"
    

    修復 aof 文件后,咱們再次啟動 redis-server 來回復磁盤數據,恢復成功,nice

    aof 的優勢和劣勢

    優勢

    • 每一次操作 reids 都會被記錄,文件的完整性好
    • 每秒同步一次,可能會丟失一秒的數據
    • 從不同步,這個效率是最高的

    劣勢

    • 相對于數據文件來說,aof 文件會遠大于 rdb 文件,修復的速度也比 rdb 文件慢
    • aof 運行的效率比 rdb 慢,所以 redis 默認的配置是 rdb 持久化

    小結

    兩種持久化方式簡述

    • RDB 持久化的方式能夠在指定的時間間隔內對數據進行快照存儲

    • AOF 持久化的方式記錄每次對服務器的寫操作,當服務器重啟或者宕機的時候,會重新執行這些記錄里面的寫操作命令來恢復數據,AOF 命令以 redis 協議追加保存每次寫操作到文件末尾,redis 還能對 aof 文件進行后臺重寫,是的 AOF 文件的體積不至于過大

    • 如果需求是只做緩存,只期望服務器運行的時候數據存在,那么不用做持久化

    兩種持久化方式的開和不開

    • 可以同時開啟兩種持久化方式

      • 這種情況下,redis 重啟會先載入 aof 文件來恢復數據,因為通常情況下 aof 文件保存的數據集比 rdb 的數據集要完整
      • rdb 數據集不是實時的,同時使用兩種方式時,服務器重啟有只會找 aof 文件,那么要不要只使用 aof 文件呢?

      redis 的作者建議是不要只使用 aof 文件,因為 rdb 更加適合用于備份數據庫,因為 aof 在不斷的變化,不好備份,快速重啟的時候,rdb 不會有 aof 可能潛在的 bug,留著 rdb 做一個兜底的機制

    性能上的建議

    對于 rdb 持久化

    • 由于 rdb 文件只用于備份數據,建議只在 slave 上面持久化 rdb 文件,15 分鐘持久化一次就夠了,也就是這一條指令 save 900 1
    • 如果打開 aof 持久化,好處就是在極端情況下丟失數據也不會超過 2s 的數據,啟動腳本就簡單的加載自己的 aof 文件即可,這樣做也是有代價的
      • 代價之一就是 這樣做帶來了持續的 IO 操作
      • 代價之二就是 AOF 重寫的最后將重寫過程產生新數據寫入到新文件造成的阻塞是不可避免的,只要硬盤許可,應該要盡量的減少 aof 重寫的頻率

    對于 aof 持久化

    • aof 重寫的基礎大小值是 64 mb,我們可以設置成 5g 以上,默認超過原大小 100% 大小重寫,這個參數可以設置成一個合理的參數
    • 如果不打開 aof 模式,僅僅靠主從復制實現高可用也是可以的,能夠省掉一大筆 IO 消耗,也減少了重寫帶來系統的性能波動,這樣做仍然是有代價的
      • 代價之一就是 如果主備 redis 同時掛掉(例如斷電),會丟失十幾分鐘的數據,啟動腳本也要比較主備的 rdb 文件,載入較新的那個 rdb 文件

    參考資料:

    redis_doc

    歡迎點贊,關注,收藏

    朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力

    好了,本次就到這里

    技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

    我是小魔童哪吒,歡迎點贊關注收藏,下次見~

    posted @ 2022-03-17 23:08  小魔童哪吒  閱讀(33)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看