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