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/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

发表回复

登录后才能评论