Redis 持久化 rdb 与 aof
简介
Redis 是一种内存型数据库, 一旦服务器进程退出, 数据库的数据就会丢失, 为了解决这个问题, Redis 提供了两种持久化的方案, 将内存中的数据保存到磁盘中, 避免数据的丢失.
RDB 持久化
Redis 提供了 RDB 持久化 的功能, 这个功能可以将 Redis 在内存中的状态保存到硬盘中, 它将手动执行.
也可以在 Redis.conf 中配置, 定期执行.
RDB 持久化产生的 RDB 文件是一个经过压缩的二进制文件, 这个文件被保存在硬盘中, Redis 可以通过这个文件还原数据库当时的状态.
实例:
1, 启动 Redis 服务端, 修改配置文件 Redis.conf(修改前先备份)
- daemonize yes
- port 6379
- logfile /data/6379/Redis.log
- dir /data/6379 #定义持久化文件存储位置
- dbfilename dbmp.rdb #rdb 持久化文件
- bind 10.0.0.10 127.0.0.1 #Redis 绑定地址
- requirepass 123 #Redis 登录密码
- save 900 1 #rdb 机制 每 900 秒 有 1 个修改记录
- save 300 10 #每 300 秒 10 个修改记录
- save 60 10000 #每 60 秒内 10000 修改记录
2. 启动 Redis 服务端
3. 登录 Redis
Redis-cli -a 123
4. 此时检查目录,/data/6379 底下还没有 dbmp.rdb 文件
5. 通过 save 触发持久化, 将数据写入 RDB 文件
- 127.0.0.1:6379> set age 18
- OK
- 127.0.0.1:6379> save
- OK
6. 此时再查看, 发现多了两个文件
AOF 持久化
AOF(append-only log file) 记录服务器执行的所有变更操作命令 (例如 set del 等), 并在服务器启动时, 通过重新执行这些命令来还原数据集 AOF 文件中的命令全部以 Redis 协议的格式保存, 新命令追加到文件末尾. 优点: 最大程序保证数据不丢 缺点: 日志记录非常大
Redis-client 写入数据 > Redis-server 同步命令 > AOF 文件
配置参数介绍:
- # AOF 持久化配置, 两条参数
- appendonly yes
- appendfsync always # 总是修改类的操作
- everysec # 每秒做一次持久化
- no # 依赖于系统自带的缓存大小机制
实例:
1. 修改配置文件 Redis.conf(先备份)
- daemonize yes
- port 6379
- logfile /data/6379/Redis.log
- dir /data/6379
- dbfilename dbmp.rdb
- requirepass 123
- save 900 1
- save 300 10
- save 60 10000
- appendonly yes
- appendfsync everysec
2. 启动 Redis 服务
Redis-server /etc/Redis.conf
3. 检查 Redis 数据目录 / data/6379 / 是否产生了 aof 文件
- [root@localhost 6379]# ls
- appendonly.aof dbmp.rdb Redis.log
4. 登录 Redis-cli, 写入数据, 实时检查 aof 文件信息
[root@localhost 6379]# tail -f appendonly.aof
5. 设置新 key, 检查 aof 信息, 然后关闭 Redis, 检查数据是否持久化
- Redis-cli -a 123 shutdown
- Redis-server /etc/Redis.conf
- Redis-cli -a 123
区别:
rdb: 基于快照的持久化, 速度更快, 一般用作备份, 主从复制也是依赖于 rdb 持久化功能
aof: 以追加的方式记录 Redis 操作日志的文件. 可以最大程度的保证 Redis 数据安全, 类似于 MySQL 的 binlog
Redis 主从同步
原理
从服务器向主服务器发送 SYNC 命令.
接到 SYNC 命令的主服务器会调用 BGSAVE 命令, 创建一个 RDB 文件, 并使用缓冲区记录接下来执行的所有写命令.
当主服务器执行完 BGSAVE 命令时, 它会向从服务器发送 RDB 文件, 而从服务器则会接收并载入这个文件.
主服务器将缓冲区储存的所有写命令发送给从服务器执行.
=====================================================
在开启主从复制的时候, 使用的是 RDB 方式的, 同步主从数据的
同步开始之后, 通过主库命令传播的方式, 主动的复制方式实现
2.8 以后实现 PSYNC 的机制, 实现断线重连
实例
环境准备
1, 创建三个文件夹
mkdir /data/ 6380 6381 6382
2, 复制三份 nginx.conf 并修改内容
- port 6380
- daemonize yes
- pidfile /data/6380/Redis.pid
- loglevel notice
- logfile "/data/6380/redis.log"
- dbfilename dump.rdb
- dir /data/6380
- protected-mode no
- 6380.conf
- port 6381
- daemonize yes
- pidfile /data/6381/Redis.pid
- loglevel notice
- logfile "/data/6381/redis.log"
- dbfilename dump.rdb
- dir /data/6381
- protected-mode no
- 6381.conf
- daemonize yes
- pidfile /data/6382/Redis.pid
- loglevel notice
- logfile "/data/6382/redis.log"
- dbfilename dump.rdb
- dir /data/6382
- protected-mode no
- 6382.conf
3, 分别启动三个实例
- Redis-server /data/6380/Redis.conf
- Redis-server /data/6381/Redis.conf
- Redis-server /data/6382/Redis.conf
主从规则:
主节点: 6380
从节点: 6381, 6382
4, 配置主从同步
- # 6381 窗口界面命令行
- Redis-cli -p 6381 # 启动 6381 客户端
- SLAVEOF 127.0.0.1 6380 #指明主的地址
- # 6382 窗口界面命令行
- Redis-cli -p 6382 # 启动 6382 客户端
- SLAVEOF 127.0.0.1 6380 #指明主的地址
5, 检测主从状态
- # 从库
- 127.0.0.1:6382> info replication
- 127.0.0.1:6381> info replication
- # 主库
- 127.0.0.1:6380> info replication
6, 测试写入数据, 主库写入数据, 检测从库数据
- # 主:
- 127.0.0.1:6380> set name peng
- # 从:
- 127.0.0.1:6381>get name
如果主库挂了!
解决方案:
1, 手动进行主从复制故障切换
- # 关闭主库 6380
- Redis-cli -p 6380
- shutdown
2, 检查从库主从信息, 此时 master_link_status:down
- Redis-cli -p 6381
- info replication
- Redis-cli -p 6382
- info replication
3, 既然主库挂, 那就在 6380 和 6382 之间选一个新的主库
a, 关闭 6381 的从库身份
- Redis-cli -p 6381
- info replication
- slaveof no one
b, 将 6382 设为 6381 的从库
- # 6382 连接到 6381:
- [root@localhost ~]# Redis-cli -p 6382
- 127.0.0.1:6382> SLAVEOF no one
- 127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
c, 检查 6382,6381 的主从信息
来源: http://www.bubuko.com/infodetail-2922166.html