您的位置:

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 数据的安全性和可靠性。