Redis5.x兩種持久化方式以及主從複製配置

来源:https://www.cnblogs.com/yulinfeng/archive/2020/02/22/12347559.html
-Advertisement-
Play Games

關註公眾號:CoderBuff,回覆“redis”獲取《Redis5.x入門教程》完整版PDF。 《Redis5.x入門教程》目錄 "第一章 · 準備工作" "第二章 · 數據類型" "第三章 · ​命令" "第四章 ​· 配置" 第五章 · Java客戶端(上) 第六章 · 事務 第七章 · 分佈 ...


關註公眾號:CoderBuff,回覆“redis”獲取《Redis5.x入門教程》完整版PDF。

配置

redis除了支持多種多樣的存儲類型,還有一點也非常重要,那就是儘管它是基於記憶體的存儲系統,但它也能進行數據的持久化操作。這一點,對於緩存不幸宕機想恢復緩存數據時相當有效。同樣,我們實際使用redis時,為了更高的性能和更高的可用性會將redis配置為集群主從模式。本章節重點介紹持久化和主從複製的相關配置。

持久化

redis的持久化有兩種方式:快照持久化(RDB)AOF持久化

快照持久化(RDB)

快照持久化,是在某一時刻的所有數據寫入到硬碟中持久化。顯然,這存在一個“何時”寫入硬碟的問題。如果相隔時間過長,那麼恰好在沒有持久化前宕機,這部分數據就會丟失。也就是說,無論如何配置持久化的時機,都有可能存在丟失數據的風險。所以,快照持久化適用於即使丟失一部分數據也不會造成問題的場景

配置快照持久化,既可以直接通過命令,也可以通過配置文件的方式。

配置文件

回到我們redis的安裝位置,根據第一章準備工作,redis安裝在/usr/local/redis-5.0.7路徑,修改redis.conf配置文件。在配置文件中包含了持久化的相關配置、模板插件、lua腳本等等,我們提取出關於快照持久化相關的配置信息。

################################ SNAPSHOTTING  ################################

# save [seconds] [changes] 表示在[seconds]秒內有[changes]個鍵值的變化則進行持久化。可同時配置多個,滿足一個條件則觸發。
save 900 1              #在900秒內有1次鍵值變化則進行持久化。
save 300 10             #在300秒內有10次鍵值變化則進行持久化。
save 60 10000           #在60秒內有10000次鍵值變化則進行持久化。

stop-writes-on-bgsave-error yes     #當持久化出現錯誤時,是否停止數據寫入,預設停止數據寫入。可配置為no,當持久化出現錯誤時,仍然能繼續寫入緩存數據。

rdbcompression yes      #是否壓縮數據,預設壓縮。可配置為no,不壓縮。

rdbchecksum yes             #對持久化rdb文件是否進行校驗,預設校驗。可配置為no,不校驗。

dbfilename dump.rdb     #指定rdb保存到本地的文件名。

dir ./                              #指定rdb保存的目錄,預設在本目錄下,即redis的安裝目錄。

在redis中,持久化預設使用快照持久化方式,如果想要開啟AOF持久化appendonly yes,下文會講AOF持久化的配置。

註意,儘管這是redis安裝目錄下預設的配置文件,但我們在啟動時需要制定配置文件的路徑。如果在啟動時使用redis-server則會有以下提示:

10768:C 08 Feb 2020 19:52:40.149 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

所以我們終止redis服務,併在配置文件中增加一條save 10 1“在10秒內有1次鍵值變化則持久化”配置,指定redis安裝目錄下的配置文件。

okevindeMacBook-Air:redis-5.0.7 okevin$ redis-server redis.conf 
14206:C 11 Feb 2020 23:58:52.589 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
14206:C 11 Feb 2020 23:58:52.589 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=14206, just started
14206:C 11 Feb 2020 23:58:52.589 # Configuration loaded

可以看到,安裝目錄下的配置文件載入成功。

接下來我們來驗證redis是否是“在10秒內有1次鍵值變化則持久化”,我們通過redis-cli進入redis命令行交互,並且寫入一條數據。在redis的啟動視窗出現了以下日誌內容:

14234:M 12 Feb 2020 00:02:13.016 * 1 changes in 10 seconds. Saving...
14234:M 12 Feb 2020 00:02:13.017 * Background saving started by pid 14235
14235:C 12 Feb 2020 00:02:13.020 * DB saved on disk
14234:M 12 Feb 2020 00:02:13.121 * Background saving terminated with success

這表示配置生效了。

直接修改配置文件的方式需要重啟redis服務,我們可以直接通過命令動態修改配置:

127.0.0.1:6379> config set save "5 1"
OK

此時寫入一條數據,併在redis的啟動視窗驗證:

14206:M 12 Feb 2020 00:04:26.133 * 1 changes in 5 seconds. Saving...
14206:M 12 Feb 2020 00:04:26.134 * Background saving started by pid 14237
14232:C 12 Feb 2020 00:04:26.139 * DB saved on disk
14206:M 12 Feb 2020 00:04:26.238 * Background saving terminated with success

可見,我們已經動態地修改了快照持久化的配置。不過這種動態配置的方式當在redis重啟後將會失效。

命令

除了通過配置文件的方式快照持久化,我們還可以通過命令的方式“隨時”地進行快照持久化,有兩個命令可供使用:bgsavesavebgsave,redis會創建一個子進程,通過子進程將快照寫入硬碟,父進程則繼續處理命令請求。save則是redis在快照創建完成前不會響應其他命令,也就是阻塞式的,並不常用。

在redis客戶端使用bgsave命令:

127.0.0.1:6379> bgsave
Background saving started

在redis服務端的日誌:

14234:M 12 Feb 2020 00:15:11.943 * Background saving started by pid 14245
14245:C 12 Feb 2020 00:15:11.948 * DB saved on disk
14234:M 12 Feb 2020 00:15:12.031 * Background saving terminated with success

在redis客戶端使用save命令:

127.0.0.1:6379> save
OK

在redis服務端的日誌:

14234:M 12 Feb 2020 00:16:12.922 * DB saved on disk

通過redis服務端的日誌我們就能發現,配置文件中的save配置底層調用的是bgsave命令。那麼什麼時候會用到save命令呢?

那就是在調用shutdown命令時,將會調用save命令阻塞其他命令,當執行完成後關閉伺服器。

在redis客戶端調用shutdown命令:

127.0.0.1:6379> shutdown

在redis服務端的日誌:

14234:M 12 Feb 2020 00:18:52.353 # User requested shutdown...
14234:M 12 Feb 2020 00:18:52.353 * Saving the final RDB snapshot before exiting.
14234:M 12 Feb 2020 00:18:52.356 * DB saved on disk
14234:M 12 Feb 2020 00:18:52.356 * Removing the pid file.
14234:M 12 Feb 2020 00:18:52.357 # Redis is now ready to exit, bye bye...

AOF持久化

AOF持久化的方式和MySQL中binlog主從同步類似,它記錄的是執行的命令,將被執行的寫命令寫入到AOF文件的末尾。它同樣有持久化時機的問題,通常我們會配置“每秒執行一次同步”。下麵我們仍然通過配置來直觀感受一下。

配置文件

############################## APPEND ONLY MODE ###############################

appendonly no           #是否開起AOF持久化,預設關閉,yes打開。在redis4.0以前不允許混合使用RDB和AOF,但此後允許使用混合模式,通過最後兩個參數配置。

appendfilename "appendonly.aof"         #AOF持久化數據的文件名。

appendfsync everysec        #執行AOF持久化的頻率,預設“每秒執行一次同步”。還有“always”選項,表示每個redis命令都要同步寫入硬碟,但是這樣會嚴重減低redis的速度。還有“no”選項,此時持久化的時機將有操作系統決定。redis建議如果你不知道怎麼做,就使用“everysec”配置。

no-appendfsync-on-rewrite no        #預設不重寫AOF文件。

#下麵這兩個配置是用於AOF“重寫”觸發條件。當AOF文件的體積大於64m,且AOF文件的體積比上一次重寫之後的體積至少打了一倍(100%)則執行重新命令。
auto-aof-rewrite-percentage 100     
auto-aof-rewrite-min-size 64mb  

aof-load-truncated yes          #指redis在恢復時,會忽略最後一條可能存在問題的指令,預設值yes。

aof-use-rdb-preamble yes        #是否打開RDB和AOF混合模式,預設yes打開。

我們修改配置文件中appendonly yes即打開AOF持久化,並重啟redis服務。

和快照持久化略微不同的是我們在redis-cli中寫入一條數據後,redis服務端並沒有記錄AOF的持久化日誌。但我們在啟動時,會出現從AOF文件中載入數據。

15336:M 12 Feb 2020 14:21:42.541 # Server initialized
15336:M 12 Feb 2020 14:21:42.542 * DB loaded from append only file: 0.001 seconds
15336:M 12 Feb 2020 14:21:42.542 * Ready to accept connections

如果我們此時關閉redis服務端再啟動,由於我們開啟了持久化所以仍然能獲取到剛剛寫入的值。

和快照持久化相同,我們同樣能在命令行中通過config set appendonly "yes"動態修改配置文件。

在前面的配置文件中,我們提到了“重寫”這個術語,它實際上是針對AOF文件過大,需要覆蓋掉之前的AOF文件的配置。它和bgsave類似,都是通過一個子進程操作。

主從複製

對於一個使用了redis的大型應用程式,為了保證redis的性能,我們會配置redis集群。同MySQL類似,redis的主伺服器(master)也會向多個從伺服器(slave)發送更新。主伺服器負責寫、從伺服器負責讀,以提高性能。

這一小節,我會找到另外一臺mac實體機在同一區域網內實現redis主從複製,當然你也可以在虛擬機中試驗。

修改master主伺服器的配置文件(為了更好演示主從複製,將儘可能做更少的配置):

#bind 127.0.0.1         #預設只允許本機連接redis服務,所以需要註釋掉這行配置。
protected-mode no       #預設打開了保護模式,這裡我們配置為no關閉。
daemonize no                #實際應用中,我們是通常是將redis以後臺運行,也就是會配置為yes,預設是no表示不以後臺運行。我們在這裡保持預設的配置,方便查看相關的運行日誌。

修改slave從伺服器的配置文件(只比master多一行配置):

#bind 127.0.0.1         #預設只允許本機連接redis服務,所以需要註釋掉這行配置。
protected-mode no       #預設打開了保護模式,這裡我們配置為no關閉。
daemonize no                #實際應用中,我們是通常是將redis以後臺運行,也就是會配置為yes,預設是no表示不以後臺運行。我們在這裡保持預設的配置,方便查看相關的運行日誌。

slaveof 192.168.31.125 6379

我們先啟動master主伺服器顯示以下信息:

okevindeMacBook-Air:redis-5.0.7 okevin$ redis-server redis.conf 
15702:C 12 Feb 2020 22:18:24.777 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
15702:C 12 Feb 2020 22:18:24.778 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=15702, just started
15702:C 12 Feb 2020 22:18:24.778 # Configuration loaded
15702:M 12 Feb 2020 22:18:24.781 * Increased maximum number of open files to 10032 (it was originally set to 2560).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 15702
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

15702:M 12 Feb 2020 22:18:24.801 # Server initialized
15702:M 12 Feb 2020 22:18:24.803 * DB loaded from append only file: 0.002 seconds
15702:M 12 Feb 2020 22:18:24.803 * Ready to accept connections

再啟動slave從伺服器顯示以下信息:

t4f-mbp-17346:redis-5.0.7 yulinfeng$ redis-server redis.conf 
13801:C 12 Feb 2020 22:20:08.954 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13801:C 12 Feb 2020 22:20:08.954 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=13801, just started
13801:C 12 Feb 2020 22:20:08.954 # Configuration loaded
13801:S 12 Feb 2020 22:20:08.955 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 13801
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

13801:S 12 Feb 2020 22:20:08.956 # Server initialized
13801:S 12 Feb 2020 22:20:08.956 * Ready to accept connections
13801:S 12 Feb 2020 22:20:08.957 * Connecting to MASTER 192.168.31.145:6379
13801:S 12 Feb 2020 22:20:08.965 * MASTER <-> REPLICA sync started
13801:S 12 Feb 2020 22:20:09.030 * Non blocking connect for SYNC fired the event.
13801:S 12 Feb 2020 22:20:09.034 * Master replied to PING, replication can continue...
13801:S 12 Feb 2020 22:20:09.039 * Partial resynchronization not possible (no cached master)
13801:S 12 Feb 2020 22:20:09.043 * Full resync from master: b7b0b93ea396930cc622250b959fd9eb8eb71c5f:0
13801:S 12 Feb 2020 22:20:09.138 * MASTER <-> REPLICA sync: receiving 185 bytes from master
13801:S 12 Feb 2020 22:20:09.139 * MASTER <-> REPLICA sync: Flushing old data
13801:S 12 Feb 2020 22:20:09.139 * MASTER <-> REPLICA sync: Loading DB in memory
13801:S 12 Feb 2020 22:20:09.139 * MASTER <-> REPLICA sync: Finished with success

可以看到從伺服器在啟動完成後多了一些日誌,第一行MASTER <-> REPLICA sync started向主伺服器發送了同步的命令,一直到最後同步成功。

我們回到master主服務的日誌:

15702:M 12 Feb 2020 22:20:09.010 * Replica 192.168.31.215:6379 asks for synchronization
15702:M 12 Feb 2020 22:20:09.010 * Full resync requested by replica 192.168.31.215:6379
15702:M 12 Feb 2020 22:20:09.010 * Starting BGSAVE for SYNC with target: disk
15702:M 12 Feb 2020 22:20:09.011 * Background saving started by pid 15703
15703:C 12 Feb 2020 22:20:09.014 * DB saved on disk
15702:M 12 Feb 2020 22:20:09.106 * Background saving terminated with success
15702:M 12 Feb 2020 22:20:09.106 * Synchronization with replica 192.168.31.215:6379 succeeded

可以看到,第一行表示有一臺從伺服器正在請求同步,並且觀察日誌可以發現主伺服器此時執行了bgsave命令進行了一次持久化操作。

此時,當我們在主服務寫入一條數據時,在從伺服器就可以讀取到了。但是,如果我們在從伺服器寫入數據時會出現以下錯誤:

127.0.0.1:6379> set slave master
(error) READONLY You cant't write against a read only replica.

回顧主從複製中的一些細節,除了配置文件需要有註意的地方,在底層當從伺服器連接到主伺服器時會發送一條sync同步命令,當主伺服器接收到從伺服器的sync同步命令後,會在主伺服器中執行bgsave持久化命令,執行完成後將向從伺服器發送一份快照持久化的文件以完成同步。並且從伺服器是只讀不能寫入的。

關註公眾號:CoderBuff,回覆“redis”獲取《Redis5.x入門教程》完整版PDF。
這是一個能給程式員加buff的公眾號 (CoderBuff)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為工作和其它原因,很長一段時間沒有出新的、關於OptaPlanner的文章了,但工餘時間並沒有停止對該引擎的學習。與此同時Geoffrey大神帶領的KIE項目團隊並沒有閑下來,儘管在工業可用性、易用性和使用門檻方面,OptaPlanner相對傳統的求解器已經做得相當出色;特別是在規划過程交互、和各 ...
  • 方式一: 將web項目配置到webapps以外的目錄 在conf/server.xml中配置,找到<host>標簽,<Content docBase="E:\yqs\JspProject" path=“/JspProject” />,docBase是實際路徑,path是虛擬路徑(相對於webapps ...
  • 效果圖: #奧運五環 import turtle turtle.setup(1.0,1.0) #設置視窗大小 turtle.title("奧運五環") #藍圓 turtle.penup() turtle.right(90) turtle.forward(-50) turtle.left(90) tu ...
  • 一、添加maven環境變數 添加新的系統環境變數:MAVEN_HOME 設置其值為你安裝的目錄:C:\Java\apache-maven-3.6.2 在PATH 變數中添加變數值:%MAVEN_HOME%\bin 查看是否配置成功 運行cmd,輸入mvn -v(或mvn -version),若輸出以 ...
  • python3-cookbook中每個小節以問題、解決方案和討論三個部分探討了Python3在某類問題中的最優解決方式,或者說是探討Python3本身的數據結構、函數、類等特性在某類問題上如何更好地使用。這本書對於加深Python3的理解和提升Python編程能力的都有顯著幫助,特別是對怎麼提高Py ...
  • 正常搭建配置中心,網上教程多,這裡不討論,只記坑也是為了後來者少花時間在這裡,由於是當時研究了好久才寫的文章,所以只能提供問題的原因,當然會給出印證的思路,閑話不多說進入正題! 版本spring boot2.1.6spring boot admin 2.1.6spring cloud GreenWi ...
  • 一、解決IDEA中的中文亂碼 1、首先設置idea編輯器的編碼: File-Setting設置如下 idea顯示編碼:windows預設用gbk所以idea顯示預設為gbk編碼,在 Help--Edit custom vm options 添加-Dfile.encoding=UTF-8 (其實大部分 ...
  • 開發環境: Windows操作系統開發工具: Eclipse+Jdk+Tomcat+MySql資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=47 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...