RDB
- RDB Redis数据备份文件 也被叫做Redis数据快照 简单来说就是 把内存中的所有数据记录到磁盘中 当Redis实例故障实例重启后从磁盘读取快照文件恢复数据 快照文件称为RDB文件 默认时保存在当前运行目录
- 执行时机
- 执行save命令
127.0.0.1:6379> save
OK
127.0.0.1:6379> 4428:M 02 Aug 2024 19:56:52.391 * Ready to accept connections tcp
4428:M 02 Aug 2024 19:57:51.494 * DB saved on disk
4428:M 02 Aug 2024 19:58:10.097 * DB saved on disk
- 执行bgsave命令
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> 4428:M 02 Aug 2024 19:59:22.611 * Background saving started by pid 4460
4460:C 02 Aug 2024 19:59:22.614 * DB saved on disk
4460:C 02 Aug 2024 19:59:22.615 * Fork CoW for RDB: current 2 MB, peak 2 MB, average 2 MB
4428:M 02 Aug 2024 19:59:22.650 * Background saving terminated with success
- Redis停机的时候
[root@CentOS7 ~]# ps -ef|grep redis
root 4428 3846 0 19:56 pts/2 00:00:00 redis-server *:6379
root 4499 4097 0 20:00 pts/4 00:00:00 grep --color=auto redis
[root@CentOS7 ~]# kill -9 4428
[root@CentOS7 ~]# 4428:M 02 Aug 2024 19:59:22.650 * Background saving terminated with success
已杀死
[root@CentOS7 ~]#
- 触发RDB条件时
# save ""
#
# Unless specified otherwise, by default Redis will save the DB:
# * After 3600 seconds (an hour) if at least 1 change was performed
# * After 300 seconds (5 minutes) if at least 100 changes were performed
# * After 60 seconds if at least 10000 changes were performed
#
# You can set these explicitly by uncommenting the following line.
# 当3600秒有一次修改 300秒有100次修改 60 秒有10000修改
# save 3600 1 300 100 60 10000
- RDB文件内容
REDIS0011ú redis-ver^E7.2.0ú
redis-bitsÀ@ú^EctimeÂ^Zʬfú^Hused-memÂÈ^Q^O^@ú^Haof-baseÀ^@þ^@û^A^@^@^Bk1^Bv2ÿ¦<84>MYÑ<85><8e>X
~
"dump.rdb" [noeol][已转换] 2L, 120C [root@CentOS7 ~]# cat dump.rdb
REDIS0011 redis-ver7.2.0
- 关闭RDB
# Snapshotting can be completely disabled with a single empty string argument
# as in following example:
#
save ""
#
# Unless specified otherwise, by default Redis will save the DB:
# * After 3600 seconds (an hour) if at least 1 change was performed
# * After 300 seconds (5 minutes) if at least 100 changes were performed
# * After 60 seconds if at least 10000 changes were performed
- RDB原理
bgsave开始时会fork主进程得到子进程 子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件
fork采用copy-on-write
- 当主进程执行读操作时访问共享内存
- 当主进程执行写操作时则会拷贝一份数据执行写操作
AOF
- AOF Append Only File 追加文件 Redis处理每一个写命令都会记录在AOF文件 可以看作时命令日志文件
- AOF刷盘策略
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
- 开启AOF
# Please check https://redis.io/topics/persistence for more information.appendonly yes# The base name of the append only file.
#
# Redis 7 and newer use a set of append-only files to persist the dataset
# and changes applied to it. There are two basic types of files in use:
- AOF auto-aof-rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
主从同步原理
- 全量同步
- 执行时机
- 第一次建立连接时
- 流程
- salve 执行replicaof命令建立连接
- salve请求数据同步(会发送自己的replication id 和offset)
- master判断是否是第一次同步(判断以及根据replcation id是否相等)
- master是第一次同步返回master的replication id 和offset
- slave保存版本信息
- master 执行bgsave 生成RDB文件 RDB文件记录RDB期间的所有命令
- master 发送RDB文件给salve
- slave清空数据加载RDB文件
- master 发生repl_baklog中的命令
- slave收到并执行命令
- slave节点请求增量同步
- master节点判断replid,发现不一致,拒绝增量同步
- master将完整内存数据生成RDB,发送RDB到slave
- slave清空本地数据,加载master的RDB
- master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
- slave执行接收到的命令,保持与master之间的同步
- slave停机时间过长 导致主节点的offset在环形缓冲区覆盖了从节点的时offset
- 增量同步
- 执行流程
- salve异步发送replication id和offset 到master
- master 判断replication id 是否相等
- 相等 去repl_baklog中获取offset后的数据
- 发生offset后的命令
repl_backlog原理
- repl_backlog是一个固定大小的环形数组
- repl_backlog会记录redis中redis处理过的命令日志级offset包括master当前offset和slave已经拷贝到的offset slave和master的offset差异就是slave需要增亮拷贝的数据
- 随着不断有数据写入 master的offset逐渐变大 slave也不断的拷贝追赶master的offset
- 直到数组被填满
- 此时 如果有新的数据写入 就会覆盖数组中的旧数据 旧数据只要是绿色 说明已经被同步到slave覆盖也无伤大雅红色是未同步的数据
- 当slave出现网络阻塞导致master的offset远远超过salve的offset
- 如果master继续写入新数据 其offset就会覆盖旧的数据 直到salve现在也覆盖
- 棕红色的部分就是尚未同步但是 却已经被覆盖的数据如果此时slave恢复需要同步就会发现自己的offset都没有了 无法完成增量同步 只能做全量同步