docker pull redis:6.2.6
redis版本:6.2.6
数据目录:/data
配置文件:/etc/redis/redis.conf
日志文件:/var/log/redis/redis-server.log
mkdir -p /home/redis/{data,conf,log}
# 给log目录增加写入权限
chmod 777 /home/redis/log
redis配置参考:https://redis.io/topics/config/
redis示例配置文件下载
# linux下载 redis 示例配置文件命令
wget http://download.redis.io/redis-stable/redis.conf
cat > /home/redis/conf/redis.conf <<'EOF'
# 开启AOF持久化功能 (默认no,所有信息都存储在内存[重启丢失]。设置为yes, 将存储在硬盘[重启还在])
appendonly yes
# AOF文件刷新的方式
# always 每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全。
# everysec 每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据。
# no 依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。
appendfsync everysec
# 随着持久化的不断增多,AOF文件会越来越大,这个时候就需要AOF文件重写了。AOF文件重写
# 如果该参数取值为yes,那么在重写AOF文件时能提升性能,但可能在重写AOF文件时丢失数据。
# 如果取值为no,则不会丢失数据,但较取值为yes的性能可能会降低。默认取值是no。
no-appendfsync-on-rewrite no
# AOF文件重写
# 参数能指定重写的条件,默认是100,
# 即如果当前的AOF文件比上次执行重写时的文件大一倍时会再次触发重写操作。
# 如果该参数取值为0,则不会触发重写操作。
auto-aof-rewrite-percentage 100
# AOF文件重写
# 指定触发重写时AOF文件的大小,默认是64MB。
auto-aof-rewrite-min-size 64mb
# auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 两个参数指定的重写条件是“And”的关系。
# 即只有当同时满足这两个条件时才会触发重写操作。
# Redis key 过期事件监听
notify-keyspace-events ""
# 设置redis绑定IP
# bind 0.0.0.0
# 是否以守护进程运行,默认为no, 设置为yes会与docker run -d参数冲突导致容器启动失败
# 关闭后台运行(因为docker运行就已经有后台守护,改为yes会启动不了redis)
daemonize no
# 关闭protected-mode模式,此时外部网络可以直接访问
# 默认 yes,开启保护模式,限制为只能本地访问
protected-mode no
# 设置主服务器密码(为以后redis集群做基础,无集群需求可以不添加)
#masterauth 123456
# 设置redis密码(如果以后有哨兵集群需求,主与从的redis密码必须一致)
# requirepass 123456
# 日志文件
logfile "/var/log/redis/redis-server.log"
EOF
docker run -p 6379:6379 --name redis --restart=always --privileged=true \
-v /home/redis/data:/data \
-v /home/redis/log:/var/log/redis \
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf \
-e TZ=Asia/Shanghai \
-d redis:6.2.6 redis-server /etc/redis/redis.conf
参数说明
-p 6379:6379:将容器内的 6379 端口映射到宿主机的 6379 端口上,使得可以从宿主机访问容器内运行的 Redis 服务。
–name redis:为容器设置一个名称为 redis,这样可以更容易地引用它。
–restart=always:设置docker启动时,容器跟随自启
–privileged=true:获取宿主机root权限
-v /home/redis/data:/data:将宿主机上的 /home/redis/data 目录挂载到容器内的 /data 目录。这用于持久化 Redis 数据,确保容器重启后数据不丢失
-v /home/redis/log:/var/log/redis:挂载容器日志到宿主,方便查看日志
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf:将宿主机上的 /home/redis/conf/redis.conf 文件挂载到容器内的 /etc/redis/redis.conf。这样可以让容器使用外部的配置文件来配置 Redis 服务器。
-e TZ=Asia/Shanghai 设置容器的时区为上海
-d redis:6.2.6 以守护进程模式运行容器,即在后台运行redis镜像,镜像版本是6.2.6
redis-server /etc/redis/redis.conf:容器启动后执行的命令,使用 /etc/redis/redis.conf 配置文件启动 Redis 服务器
运行redis-server可携带下面的参数,注意下面配置参数已经在/home/redis/conf/redis.conf中配置,可忽略
–appendonly yes:启用 Redis 的 AOF (Append Only File) 持久化模式,即所有写操作都会被记录到 AOF 文件,这样在重启时可以通过 AOF 文件恢复数据。
–requirepass “123456”:设置密码为123456
# 以命令行交互方式进入redis容器
docker exec -it redis bash
# 登录redis
# 在容器内使用客户端连接redis服务器 (带密码方式,如无密码可省略-a 密码部分)
redis-cli -a 密码
# 以上命令可合并为一条命令,进入redis容器并登录到redis(带密码方式,如无密码可省略-a 密码部分)
docker exec -it redis bash -c "redis-cli -a 密码"
# 查看redis版本
docker exec -it redis bash -c "redis-server --version"
# 查看 redis 存放数据文件的目录路径
config get dir
# 得到结果
127.0.0.1:6379> config get dir
1) "dir"
2) "/data"
# 查看备份的 RDB 文件的名称,默认为 `dump.rdb`
config get dbfilename
# 得到结果
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379>
# 查看备份的 aof 文件的名称,默认为 `appendonly.aof`
config get appendfilename
127.0.0.1:6379> config get appendfilename
1) "appendfilename"
2) "appendonly.aof"
# 选择数据库语法:select index,默认是序号为0的数据库
select 1
# 设置键语法:set key value
set admin 123456
# 获取键语法:get key
get admin
# 删除键语法:del key
del admin
# 命令行执行 save 手动开启 RDB 持久化
# 同步方式:将redis缓存数据写入RDB文件,会阻塞主进程
docker exec -it redis bash -c "redis-cli -a 密码 save"
# 异步方式:将redis缓存数据写入RDB文件,通过fork一个专门save的子进程,从而不会阻塞主进程
# 通过查看redis日志确认bgsave是否执行完成
docker exec -it redis bash -c "redis-cli -a 密码 bgsave"
# 将redis容器中的rdb文件拷贝到本机
docker cp redis:/data/dump.rdb /home/redis-dump.rdb
bgsave异步保存redis数据日志示例:
1:M 17 May 2024 20:25:21.063 * Background saving started by pid 39
39:C 17 May 2024 20:25:21.065 * DB saved on disk
39:C 17 May 2024 20:25:21.066 * RDB: 0 MB of memory used by copy-on-write
1:M 17 May 2024 20:25:21.162 * Background saving terminated with success
注意
:使用 RDB 文件做迁移时,需要注意需要先关闭掉目标 redis 的 aof 功能,因为如果二者同时存在的话,会优先于 aof 的方式进行数据恢复。
# 将/home/redis-dump.rdb数据文件导入容器redis中
# 直接用rdb文件覆盖redis容器中挂载到本地目录下的dump.rdb文件即可
cp /home/redis-dump.rdb /data/dump.rdb
# 重启redis容器
docker restart redis
注意
:将备份之后的 dump.rdb 文件放到 config get dir 命令得出的目录路径下,然后重启 redis 即可恢复。(建议备份的时候,可以将 redis 暂时关闭)
注意`:如果需要恢复数据,先停止运行中的Redis容器
通过命令行手动开启 AOF 持久化,上述docker启动redis已经开启了AOF持久化,本内容可跳过
# 进入redis容器并登录到redis
docker exec -it redis bash -c "redis-cli -a 密码"
# 查看生成后的 appendonly.aof 文件所在目录
127.0.0.1:6379> config get dir
1) "dir"
2) "/data"
# 查看备份的 aof 文件的名称,默认为 `appendonly.aof`
127.0.0.1:6379> config get appendfilename
1) "appendfilename"
2) "appendonly.aof"
# 将redis容器中的aof文件拷贝到本机
docker cp redis:/data/appendonly.aof /home/redis-appendonly.aof
# 备份方式一:将备份的aof文件通过命令导入到redis中
# 将 /home/redis-appendonly.aof数据文件拷贝到redis容器中
docker cp /home/redis-appendonly.aof reids:/tmp/appendonly.aof
# 执行导入aof文件命令
docker exec -it redis bash -c "redis-cli -a 密码 --pipe < /tmp/appendonly.aof"
# 备份方式二:直接用备份的aof文件覆盖redis容器中挂载到本地目录下的appendonly.aof文件即可
cp /home/redis-appendonly.aof /data/appendonly.aof
# 重启redis容器
docker restart redis
注意
:将备份之后的 appendonly.aof 文件放到 config get dir 命令得出的目录路径下,然后重启 redis 也应该可恢复。
注意`:如果需要恢复数据,先停止运行中的Redis容器
如果开启了防火墙则需配置开放redis使用的6379端口,如未开启防火墙则跳过下述内容
# 查看防火墙的状态
firewall-cmd --state
# 开放redis使用的6379端口
#–-zone 作用域
#–-add-port=6379/tcp 添加端口,格式为:端口号/通讯协议
#--permanent 标志用于使更改永久生效,如果不使用,更改将在下次重启后失效。
firewall-cmd --zone=public --add-port=6379/tcp --permanent
# 重载防火墙配置以使更改生效(无论是添加还是移除,都需要重启一遍防火墙才能生效)
firewall-cmd --reload
注意:
如果是云服务器(例:阿里云、腾讯云、华为云等),服务器在防火墙开放端口的同时还需在云服务中控台配置安全组开放相关端口,才能使最终链路打通链接。
完整错误信息如下:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
根据上面错误信息将/etc/sysctl.conf文件中vm.overcommit_memory值改为1即可。
# 永久修改vm.overcommit_memory值(需重启)
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
# 临时修改vm.overcommit_memory值
sysctl -w vm.overcommit_memory=1
# 查看vm.overcommit_memory值
sysctl -a | grep -i vm.overcommit_memory
redis数据备份与恢复参考:
5 种 Redis 数据备份与恢复方式