Docker Redis 持久化詳解

Redis是一個開源的內存數據庫,提供了豐富的數據結構和高效的操作,因此廣泛應用在緩存、隊列、計數器等場景中。然而由於 Redis 數據全部保存在內存中,一旦進程結束或服務器重啟,所有數據就會丟失。為解決這個問題,Redis支持多種持久化方式,本文將從多個方面對Docker Redis 持久化進行詳細闡述。

一、RDB持久化

Redis 支持 RDB 持久化,即將 Redis 數據庫的快照保存在硬盤上。RDB 持久化是 Redis 自帶的一種快照機制,在指定時間間隔內檢測數據集中 key 的變化情況,如果發現變化達到一定條件,就會觸發持久化操作。RDB 持久化有點類似於數據庫的備份,可以定期備份 Redis 數據庫的快照,防止 Redis 數據丟失。

通過 Docker 創建 Redis 容器時,使用 `-v` 參數指定本地目錄將 Redis 數據存儲到宿主機上,如下所示:

$ docker run --name myredis -v /path/to/redis/data:/data -d redis:latest redis-server --appendonly yes

上述命令創建了一個名為 myredis 的容器,將 Redis 數據存儲在本地 /path/to/redis/data 目錄下,並啟用了 AOF 持久化。

同時,我們可以通過配置 RDB 持久化的相關參數,更靈活地控制 Redis 的快照備份行為。通過向 Redis 發送命令,可設置 RDB 觸發方式以及備份頻率,命令如下:

$ redis-cli
127.0.0.1:6379> config set save "60 1000"

上述命令將配置 Redis 數據庫自動進行 RDB 持久化,每隔 60 秒檢查是否有至少 1000 個新的鍵值對被修改。另外,也可以通過手動執行 save 命令手動備份快照。

二、AOF持久化

除了 RDB 持久化,Redis 還支持 AOF 持久化,即將 Redis 操作持久化到硬盤上。AOF 持久化是一種追加式寫入,即將 Redis 操作以命令的形式寫入 AOF 文件,提供了更可靠的持久化方式。AOF 持久化的原理是將 Redis 所有的操作命令以 append 寫入的方式保存在 appendonly.aof 文件中,然後當 Redis 重啟時,會根據這個 AOF 文件來恢復之前的 Redis 數據。

在通過 Docker 創建 Redis 容器時,啟用 AOF 持久化相對簡單,只需要使用 –appendonly yes 參數即可。

$ docker run --name myredis -v /path/to/redis/data:/data -d redis:latest redis-server --appendonly yes

當 Redis 重啟時,會自動讀取 AOF 文件,恢複數據。但是 Redis 每次操作都要進行寫入 AOF 文件,相對於 RDB 持久化來說寫入文件的頻率更高,因此也會對 Redis 性能產生一些影響。因此,我們可以根據需求自行調整 Redis 自動保存 AOF 文件的頻率,配置命令如下:

$ redis-cli
127.0.0.1:6379> config set appendfsync always

AOF 持久化提供了非常可靠的持久化方式,因此在關注數據安全性比較高的場景下,建議選用 AOF 持久化。

三、Redis數據備份

雖然 Redis 支持 RDB 和 AOF 持久化方式,但是在某些情況下仍然會出現數據丟失的情況,比如磁盤故障、硬件損壞等。因此對 Redis 數據進行備份也是非常必要的。Redis 提供了備份命令 save 和 bgsave 來備份數據。

save 命令會阻塞Redis服務器,直到持久化操作完成後才能繼續提供服務。如果數據集較大,那麼從短期內服務的可用性來看不是很友好。因此我們可以使用 bgsave 命令,Redis 服務器會在後台創建子進程進行備份操作,不會阻塞Redis服務,也就是說不會影響客戶端的正常操作:

$ redis-cli
127.0.0.1:6379> bgsave

當 Redis 執行備份操作時,會將數據持久化到 dump.rdb 文件中。相對來說,bgsave 命令對 Redis 數據庫性能影響較小,可以比較頻繁地進行備份,保證數據的安全性。

四、自動備份定時任務

手動備份數據容易出現疏漏,為了保證 Redis 數據的安全性,我們可以藉助 Linux 自帶的 crontab 工具定時執行備份腳本。我們可以通過編寫 shell 腳本實現 Redis 備份,並定時執行 backup.sh 腳本:

#!/bin/sh
# backup.sh
DATE=$(date +%Y%m%d)
DIR="/redis-data"
FILE="dump-${DATE}.rdb"
SAVE_DIR="/backup"

[ -d ${SAVE_DIR} ] || mkdir ${SAVE_DIR}

docker exec myredis sh -c "redis-cli save"
docker cp myredis:/data/dump.rdb ${SAVE_DIR}/${FILE}

上述腳本中,我們首先獲取當前日期,然後指定 Redis 容器中 dump.rdb 文件存儲路徑 /redis-data,並在 /backup 目錄下創建以日期命名的備份文件 dump-20220725.rdb。最後藉助 docker exec 命令執行 Redis 容器中 sh -c “redis-cli save”,實現 Redis 數據的備份。

然後,在 Linux 的 crontab 中添加如下定時任務,實現每天晚上 10 點執行一次備份操作:

0 22 * * * /bin/sh /path/to/backup.sh

上述定時任務表示定時在每天的 22 點執行 /path/to/backup.sh 腳本。使用定時任務實現自動備份 Redis 數據,可以節省手動備份的時間,也可以保證數據的可靠性。

五、Docker網絡配置

在使用 Docker 運行 Redis 前,需要配置 Docker 網絡以保證容器之間的通信。如果 Redis 容器和應用程序容器在同一個 Docker 網絡中,應用程序容器就可以通過域名或IP地址訪問 Redis 服務。下面我們以創建 custom-net 網絡為例講解 Docker 網絡配置:

$ docker network create custom-net

上述命令創建了一個名為 custom-net 的 Docker 網絡。我們可以利用 `–network` 參數指定 Redis 容器使用 custom-net 網絡:

$ docker run --name myredis --network custom-net -v /path/to/redis/data:/data -d redis:latest redis-server --appendonly yes

通過上述命令,即可成功創建 Redis 容器,並將 Redis 數據存儲在本地 /path/to/redis/data 目錄下。容器會使用 custom-net 網絡,允許其他容器以容器名或IP地址的方式訪問 Redis 服務。

總結

本文對 Docker Redis 持久化進行了詳細闡述,包括 Redis RDB 和 AOF 持久化、Redis 數據備份、自動備份定時任務以及 Docker 網絡配置等方面。合理地選擇和使用 Redis 的持久化方式,制定好數據備份策略,能夠大大提高 Redis 數據的安全性和可靠性。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/197381.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 16:33
下一篇 2024-12-03 16:33

相關推薦

  • docker-ce-18.03.1.ce-1.el7.centos.x86_64需要pigz這個依賴的解決方案

    當我們在linux centos系統中安裝docker-ce-18.03.1.ce-1.el7.centos.x86_64時,有時可能會遇到“nothing provides pi…

    編程 2025-04-29
  • 在CentOS上安裝Redis

    Redis是一款非關係型數據庫,它支持多種數據結構,包括字符串、哈希、列表、集合、有序集合等。Redis運行內存內並且支持數據持久化,它還可以應用於緩存、消息隊列等場景。本文將介紹…

    編程 2025-04-28
  • ORM持久層

    ORM(對象關係映射)是一種編程技術,它將面向對象的編程語言中的對象與關係型數據庫中的表進行映射。通過ORM,我們可以用面向對象的方式操作數據庫,減少了手寫SQL語句的複雜度以及對…

    編程 2025-04-28
  • 解析spring.redis.cluster.max-redirects參數

    本文將圍繞spring.redis.cluster.max-redirects參數進行詳細闡述,從多個方面解讀它的意義與作用,並給出相應的代碼示例。 一、基礎概念 在介紹sprin…

    編程 2025-04-27
  • Redis Bitmap用法介紹

    Redis是一款高性能的內存數據庫,支持多種數據類型,其中之一便是bitmap。Redis bitmap(位圖)是一種用二進制位來表示元素是否在集合中的數據結構。由於使用了二進制位…

    編程 2025-04-27
  • Java持久層框架的複合主鍵實現

    用Java持久層框架來操作數據庫時,複合主鍵是常見的需求。這篇文章將詳細闡述javax.persistence複合主鍵的實現方式,並提供完整的示例代碼。 一、複合主鍵的定義 複合主…

    編程 2025-04-27
  • 如何解決Docker+k8s報錯413 Request Entity Too Large

    對於使用Docker容器和Kubernetes集群的開發人員,在處理HTTP請求時,常常會遇到413 Request Entity Too Large的報錯。這通常是由於請求的大小…

    編程 2025-04-27
  • docker-compose編寫用法介紹

    本文將詳細介紹docker-compose編寫的各個方面,包括語法、常見命令等等,旨在幫助讀者更好的了解如何使用docker-compose。 一、docker-compose的語…

    編程 2025-04-27
  • Docker 垃圾電腦的解決方案

    Docker 是一種輕量級的容器化技術,可以在一個操作系統中,同時運行多個獨立的應用。在使用 Docker 的過程中,可能會出現 Docker 佔用大量硬盤空間,導致電腦變得極其緩…

    編程 2025-04-27
  • Docker掛載目錄–graph用法介紹

    本文將從如下幾個方面詳細闡述Docker掛載目錄–graph: 一、基本概念 在Docker中,鏡像是由一系列只讀層組成的文件系統。當我們啟動一個容器時,Docker會…

    編程 2025-04-27

發表回復

登錄後才能評論