redis使用日志(3):如何設置持久化


Redis 持久化

Redis雖然是一種內存型數據庫,一旦服務器進程退出,數據庫的數據就會丟失,為了解決這個問題Redis提供了兩種持久化的方案,將內存中的數據保存到磁盤中,避免數據的丟失。

工作目錄(redis持久化存儲的目錄)RDB 和 AOF 公用該目錄

 

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /data/spider/Redis_Backup/   #可以自定義你的目錄,默認為當前目錄 dir ./

 

RDB持久化(redis 默認開啟的

redis提供了RDB持久化的功能,這個功能可以將redis在內存中的的狀態保存到硬盤中,它可以手動執行,也可以再redis.conf中配置,定期執行。

RDB持久化產生的RDB文件是一個經過壓縮的二進制文件,這個文件被保存在硬盤中,redis可以通過這個文件還原數據庫當時的狀態。

RDB的創建與載入

RDB文件可以通過兩個命令來生成:

  • SAVE:阻塞redis的服務器進程,直到RDB文件被創建完畢。
  • BGSAVE:派生(fork)一個子進程來創建新的RDB文件,記錄接收到BGSAVE當時的數據庫狀態,父進程繼續處理接收到的命令,子進程完成文件的創建之后,會發送信號給父進程,而與此同時,父進程處理命令的同時,通過輪詢來接收子進程的信號。

而RDB文件的載入一般情況是自動的,redis服務器啟動的時候,redis服務器再啟動的時候如果檢測到RDB文件的存在,那么redis會自動載入這個文件。

如果服務器開啟了AOF持久化,那么服務器會優先使用AOF文件來還原數據庫狀態。

RDB是通過保存鍵值對來記錄數據庫狀態的,采用copy on write的模式,每次都是全量的備份。

自動保存間隔

BGSAVE可以在不阻塞主進程的情況下完成數據的備份。可以通過redis.conf中設置多個自動保存條件,只要有一個條件被滿足,服務器就會執行BGSAVE命令。

# 以下配置表示的條件:
# 服務器在900秒之內被修改了1次
save 900 1
# 服務器在300秒之內被修改了10次
save 300 10
# 服務器在60秒之內被修改了10000次
save 60 10000

AOF持久化(默認是關閉的

AOF持久化(Append-Only-File),與RDB持久化不同,AOF持久化是通過保存Redis服務器鎖執行的寫狀態來記錄數據庫的。

具體來說,RDB持久化相當於備份數據庫狀態,而AOF持久化是備份數據庫接收到的命令,所有被寫入AOF的命令都是以redis的協議格式來保存的。

AOF持久化的文件中,數據庫會記錄下所有變更數據庫狀態的命令,除了指定數據庫的select命令,其他的命令都是來自client的,這些命令會以追加(append)的形式保存到文件中。

服務器配置中有一項appendfsync,這個配置會影響服務器多久完成一次命令的記錄:

  • always:將緩存區的內容總是即時寫到AOF文件中。
  • everysec:將緩存區的內容每隔一秒寫入AOF文件中。
  • no :寫入AOF文件中的操作由操作系統決定,一般而言為了提高效率,操作系統會等待緩存區被填滿,才會開始同步數據到磁盤。

redis默認實用的是everysec

redis在載入AOF文件的時候,會創建一個虛擬的client,把AOF中每一條命令都執行一遍,最終還原回數據庫的狀態,它的載入也是自動的。在RDB和AOF備份文件都有的情況下,redis會優先載入AOF備份文件

AOF文件可能會隨着服務器運行的時間越來越大,可以利用AOF重寫的功能,來控制AOF文件的大小。AOF重寫功能會首先讀取數據庫中現有的鍵值對狀態,然后根據類型使用一條命令來替代前的鍵值對多條命令。

AOF重寫功能有大量寫入操作,所以redis才用子進程來處理AOF重寫。這里帶來一個新的問題,由於處理重新的是子進程,這樣意味着如果主線程的數據在此時被修改,備份的數據和主庫的數據將會有不一致的情況發生。因此redis還設置了一個AOF重寫緩沖區,這個緩沖區在子進程被創建開始之后開始使用,這個期間,所有的命令會被存兩份,一份在AOF緩存空間,一份在AOF重寫緩沖區,當AOF重寫完成之后,子進程發送信號給主進程,通知主進程將AOF重寫緩沖區的內容添加到AOF文件中。

相關配置

#AOF 和 RDB 持久化方式可以同時啟動並且無沖突。  
#如果AOF開啟,啟動redis時會加載aof文件,這些文件能夠提供更好的保證。 
appendonly yes   #默認為no,開啟AOF持久化的時候,需要設置為yes

# 只增文件的文件名稱。(默認是appendonly.aof)  
# appendfilename appendonly.aof 
#redis支持三種不同的寫入方式:  
#  
# no:不調用,之等待操作系統來清空緩沖區當操作系統要輸出數據時。很快。  
# always: 每次更新數據都寫入僅增日志文件。慢,但是最安全。
# everysec: 每秒調用一次。折中。
appendfsync everysec  

# 設置為yes表示rewrite期間對新寫操作不fsync,暫時存在內存中,等rewrite完成后再寫入.官方文檔建議如果你有特殊的情況可以配置為'yes'。但是配置為'no'是最為安全的選擇。
no-appendfsync-on-rewrite no  

# 自動重寫只增文件。  
# redis可以自動盲從的調用‘BGREWRITEAOF’來重寫日志文件,如果日志文件增長了指定的百分比。  
# 當前AOF文件大小是上次日志重寫得到AOF文件大小的二倍時,自動啟動新的日志重寫過程。
auto-aof-rewrite-percentage 100  
# 當前AOF文件啟動新的日志重寫過程的最小值,避免剛剛啟動Reids時由於文件尺寸較小導致頻繁的重寫。
auto-aof-rewrite-min-size 64mb

對比

  • AOF更安全,可將數據及時同步到文件中,但需要較多的磁盤IO,AOF文件尺寸較大,文件內容恢復相對較慢, 也更完整。
  • RDB持久化,安全性較差,它是正常時期數據備份及 master-slave數據同步的最佳手段,文件尺寸較小,恢復數度較快。

建議:兩者都打開,同時用兩種方式持久化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM