docker恢复redis备份文件rdb被覆盖

目录

遇到的问题

docker里安装redis  

执行命令

检查镜像

 创建Redis配置文件

创建Redis容器并启动

docker远程访问 

 开放端口

Redis自启动

查看Redis是否运行 

进入Redis容器

退出容器

RDB AOF

RDB 

AOF 持久化



遇到的问题

  • 替换rdb文件后执行 命令重启redis, rdb被覆盖;
    docker restart redis 
  • 注意事项: 
  1. 一定要先停止redis容器再替换rdb, 最后启动
  2. 除此之外还要检查redis.config文件有没有开启aof备份, 如果开启了会优先加载文件夹下的aop文件 

docker stop redis 
# 替换rdp文件 
docker start redis

docker里安装redis  

执行命令

docker pull redis下载最新版Redis镜像 (其实此命令就等同于 : docker pull redis:latest )
docker pull redis:xxx下载指定版本的Redis镜像 (xxx指具体版本号)

检查镜像

 docker images

 创建Redis配置文件


启动前需要先创建Redis外部挂载的配置文件 ( /mydata/redis/conf/redis.conf )
之所以要先创建 , 是因为Redis本身容器只存在 /etc/redis 目录 , 本身就不创建 redis.conf 文件
当服务器和容器都不存在 redis.conf 文件时, 执行启动命令的时候 docker 会将 redis.conf 作为目录创建 , 这并不是我们想要的结果 .

## 创建目录
mkdir -p /mydata/redis/conf
## 创建文件
touch /mydata/redis/conf/redis.conf

创建Redis容器并启动

docker run \
-d \
--name redis \
-p 6379:6379 \
--restart unless-stopped \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf 
redis:buster 


docker远程访问 

 编辑docker.service

vi /usr/lib/systemd/system/docker.service

添加注释掉下面内容 

#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

 开放端口

### 开放端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent

### 关闭端口
firewall-cmd --zone=public --remove-port=2375/tcp --permanent

### 配置立即生效
firewall-cmd --reload   


###查看防火墙所有开放的端口
firewall-cmd --zone=public --list-ports

###关闭防火墙
systemctl stop firewalld.service

###查看防火墙状态
firewall-cmd --state

Redis自启动

  • docker update redis --restart=always设置redis镜像自动启动

查看Redis是否运行 

### 查看Docker运行中的容器
docker ps 
docker ps | grep redis

进入Redis容器

### 通过 Docker 命令进入 Redis 容器内部
docker exec -it redis /bin/bash
docker exec -it redis bash

### 进入 Redis 控制台
redis-cli

### 添加一个变量为 key 为 name , value 为 bella 的内容
> set name bella

### 查看 key 为 name 的 value 值
> get name


### 或者也可以直接通过Docker Redis 命令进入Redis控制台 (上面两个命令的结合)
docker exec -it redis redis-cli

### 查看rdp文件名称
config get dbfilename

退出容器

exit

RDB AOF

RDB 

具体过程:

  1. Redis调用fork创建一个子进程。(父子进程共享内存,直至其中一个进程对内存进行了写操作)
  2. 子进程负责将数据写入一个临时文件,父进程则继续处理数据库读写请求。
  3. 完全写入成功后,调用rename将新的RDB文件替换原来的RDB文件
  •  save调用SAVE命令时,Redis会执行同步保存,阻塞所有客户端,不再响应客户端发送的请求。SAVE命令一般来说只用于没有足够内存执行.如果内存中的数据非常大,可能会花费很多的时间,这样客户端的请求都会被阻塞!
  • bgsave:(background save) 命令,会fork出一个子进程,同时使用写时复制,将内存中的数据复制一份,写到一个新的rdb文件中。此时客户端的命令依然可以被正常执行,查询命令依然查询旧的数据,如果是修改命令,要同时修改原数据和复制出来的这份数据。对于等待保存占用的时间不敏感时才会使用。调用SHUTDOWN命令关闭服务器时也会先执行一次SAVE命令。

AOF 持久化

将修改的每一条指令记录进文件appendonly.aof中(先写入os cache,每隔一段时间fsync到磁盘)

生产环境可以都启用,redis启动时如果既有rdb文件又有aof文件则优先选择aof文件恢复数据(数据恢复的更多,应为AOF方式丢失数据最小),因为aof一般来说数据更全一点。

AOF持久化方式的缺点是如果数据比较大的话,这个aof文件本身会比较大,而且恢复起来的速度比较慢。

AOF持久化方式的优点是可以将丢失的数据控制在1s中内,我们可以配置1s中同步一次。

#启动docker
service docker start

#停止docker
service docker stop

#重启docker
service docker restart

# 开机自启
systemctl enable docker


版权声明:本文为qq_30934923原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。