Redis RDB AOF持久化 主从集群同步原理

RDB
  1. RDB Redis数据备份文件 也被叫做Redis数据快照 简单来说就是 把内存中的所有数据记录到磁盘中 当Redis实例故障实例重启后从磁盘读取快照文件恢复数据 快照文件称为RDB文件 默认时保存在当前运行目录
  2. 执行时机
    1. 执行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

  1. 执行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
  1. 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 ~]# 

  1. 触发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

  1. 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

  1. 关闭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

  1. RDB原理

bgsave开始时会fork主进程得到子进程 子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件
fork采用copy-on-write

  • 当主进程执行读操作时访问共享内存
  • 当主进程执行写操作时则会拷贝一份数据执行写操作
  • image.png
AOF
  1. AOF Append Only File 追加文件 Redis处理每一个写命令都会记录在AOF文件 可以看作时命令日志文件
  2. AOF刷盘策略
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
  1. 开启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:
  1. AOF auto-aof-rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

image.png

主从同步原理
  1. 全量同步
    1. 执行时机
    2. 第一次建立连接时
      1. 流程
      2. salve 执行replicaof命令建立连接
      3. salve请求数据同步(会发送自己的replication id 和offset)
      4. master判断是否是第一次同步(判断以及根据replcation id是否相等)
      5. master是第一次同步返回master的replication id 和offset
      6. slave保存版本信息
      7. master 执行bgsave 生成RDB文件 RDB文件记录RDB期间的所有命令
      8. master 发送RDB文件给salve
      9. slave清空数据加载RDB文件
      10. master 发生repl_baklog中的命令
      11. slave收到并执行命令
- slave节点请求增量同步
- master节点判断replid,发现不一致,拒绝增量同步
- master将完整内存数据生成RDB,发送RDB到slave
- slave清空本地数据,加载master的RDB
- master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
- slave执行接收到的命令,保持与master之间的同步
  1. slave停机时间过长 导致主节点的offset在环形缓冲区覆盖了从节点的时offset
  2. 增量同步
    1. 执行流程
    2. salve异步发送replication id和offset 到master
    3. master 判断replication id 是否相等
    4. 相等 去repl_baklog中获取offset后的数据
    5. 发生offset后的命令
repl_backlog原理
  1. repl_backlog是一个固定大小的环形数组
  2. repl_backlog会记录redis中redis处理过的命令日志级offset包括master当前offset和slave已经拷贝到的offset slave和master的offset差异就是slave需要增亮拷贝的数据
  3. image.png
  4. 随着不断有数据写入 master的offset逐渐变大 slave也不断的拷贝追赶master的offset
  5. image.png
  6. 直到数组被填满
  7. image.png
  8. 此时 如果有新的数据写入 就会覆盖数组中的旧数据 旧数据只要是绿色 说明已经被同步到slave覆盖也无伤大雅红色是未同步的数据
  9. 当slave出现网络阻塞导致master的offset远远超过salve的offset
  10. image.png
  11. 如果master继续写入新数据 其offset就会覆盖旧的数据 直到salve现在也覆盖
  12. image.png
  13. 棕红色的部分就是尚未同步但是 却已经被覆盖的数据如果此时slave恢复需要同步就会发现自己的offset都没有了 无法完成增量同步 只能做全量同步
  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值