redis进阶之数据持久化

RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如AOF
系统占用资源高,大量cpu和内存低,主要是磁盘IO资源
使用场景追求更快启动速度,接收数分钟的数据丢失数据安全要求高

RDB持久化

RDB 称为Redis数据快照,通过将内存数据记录到磁盘中,以此达到备份

  1. RDB命令有两种
    • save 由redis主进程执行,会阻塞其他命令
    • bgsave 开启子线程执行,避免主进程受到影响
      Redis内部redis.conf文件有触发RDB的机制,格式如: save 900 1 ,表示当900秒内至少有 1 个key被修改就执行bgsave

AOF持久化

Redis处理的每一个写命令都会记录在AOF文件中,相当于写命令的日志文件。
AOF默认是关闭的,需要修改redis.conf文件来开启AOF : appendonly yes

  1. AOF 记录写命令由三种模式
    • appendfsync always :每执行一次写操作立即记录到AOF文件中
    • appendfsync everysec : 每隔一秒 记录一次
    • appendfsync no : 由操作系统决定记录

redis主从集群

由于一个redis的并发能力是有限的,主从集群可以提高redis的并发能力。
主从集群的特点:

  1. 读写分离,主节点负责写操作,从节点读操作
  2. 需要数据同步
    pAvgCHx.jpg

    如何设置主从集群

    首先我们需要多台redis,并选中一台作为主节点。这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
IPPORT角色
192.168.150.1017001master
192.168.150.1017002slave
192.168.150.1017003slave

三台redis运行成功截图:
pAvgQVP.png

  1. 现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
    有临时和永久两种模式:
  • 修改配置文件(永久生效)

    • 在redis.conf中添加一行配置:slaveof <masterip> <masterport>
  • 使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效):

    1
    slaveof <masterip> <masterport>
  1. 开启主从
1
2
3
4
# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 192.168.150.101 7001
1
2
3
4
# 连接 7003
redis-cli -p 7003
# 执行slaveof
slaveof 192.168.150.101 7001
  1. 然后连接 7001节点,查看集群状态:
1
2
3
4
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication

最终结果:pAvg8PS.png

设置主从后,就会默认只有主节点可以进行写操作,从节点只能读操作

主从数据同步原理

建立主从关系后会自动开启数据同步,这里介绍数据同步的原理
数据同步分为两种:

  1. 全量同步
    全量同步发生在从节点第一次连接到主节点,从节点会向主节点发送一个请求(请求包含replid和offset),所以主节点先会将一个数据版本信息发送给从节点(数据版本信息用来判断是否是第一次连接),接着主节点会执行 bgsave 生成RDB文件并发送给从节点,从节点执行RDB文件后,数据基本与主节点一致。为什么是基本?因为bgsave是异步执行的,所以在执行过程中也会有写操作,redis会将这段时间内的写操作 记录到repl_baklog(缓冲池)中并发送给从节点,从节点在执行这里面的命令即可达到数据同步
    • Replication id :简称replid,是数据集的标记,id一致说明是同一数据集。每个主节点master都由唯一的replid,slave会继承master的replid
    • offset:偏移量,随着记录在repl_baklog中的数据增多,slave完成同步时也会记录当前同步的offset,如果slave的offset小于master的offset,说明slave的数据需要更新
    pAvIl90.jpg
  2. -