zdq0394.github.com

Tech study and research.

Follow me on GitHub

Redis高可用-持久化

高可用概述

Redis高可用主要包括一下几种方式:

  • 持久化:严格意义上只有持久化不能称为高可用,主要是通过将数据存盘保证了数据的可靠性。Redis数据持久化包括两种:rdb和aof。
  • 复制:复制是高可用的基础。对数据系统来说只有一份是无法实现高可用的。Redis通过master-slave实现数据主从复制(一主多从),可以实现读高可用,由于写入操作只能通过master节点,master宕机后写操作仍不可用。
  • 哨兵:哨兵模式解决master宕机后自动选主。实现读写都可以高可用
  • 集群:严格意义上,集群也不是高可用的范畴。集群模式实现的是redis系统的扩展问题:scale-out。

持久化

Redis持久化分为RDB持久化AOF持久化

  • RDB持久化:将当前数据保存到硬盘
  • AOF持久化:将执行的写命令保存到硬盘(类似于MySQL的Binlog)

由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地。

RDB持久化

RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb。 当Redis重新启动时,可以读取快照文件恢复数据。

RBD持久化的触发:

  • 手动触发:save命令(生产中避免使用)和bgsave命令。
  • 自动触发:配置文件中save m n指定当m秒内发生n次变化时,会触发bgsave。
  • 主从复制场景下:如果从节点执行全量复制,主节点会执行bgsave命令,并将rdb文件发送给从节点。
  • 执行shutdown命令时:自动执行rdb持久化。

RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。 但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入AOF文件来恢复数据。 只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。 服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。

AOF持久化

AOF持久化(即Append Only File持久化),是将Redis执行的写命令记录到单独的日志文件中(类似于MySQL的binlog)。 当Redis重启时再次执行AOF文件中的命令来恢复数据。 与RDB相比,AOF的实时性更好,因此已经成为主流的持久化方案。

Redis服务器默认开启RDB,关闭AOF

要开启AOF,需要在配置文件中配置:

appendonly yes

AOF开启后,不需要明确的触发。

AOF执行过程: 当一个写命令到达Redis服务器时:

  1. 执行命令,命令执行成功后发送给AOF过程。
  2. AOF过程将命令转换为文本,并添加到AOF缓冲区(aof_buf)末尾,这个称为命令追加。
  3. 缓冲区中的命令每隔一段时间会被写入到AOF文件中,这个称为命令写入。命令写入是由操作系统的系统调用write函数实现的,并不会把数据直接写入磁盘。要把数据写入磁盘,还要调用fsync函数,这个称为文件同步。 appendfsync配置选项指定了文件同步的频率。
    • always: 命令写入aof_buf之后,调用fsync函数,同步写入磁盘。
    • no:命令写入aof_buf之后,调用write函数,不调用fsync操作。fsync由操作系统负责,通常是每隔30秒调用一次fsync。
    • everysec:命令写入aof_buf之后,调用write函数。每隔一秒中,再调用fsync函数。

AOF文件重写

Redis不断地将被执行的命令记录到AOF文件里面,所以随着Redis不断运行,AOF文件的体积会越来越大。所以需要将进行rewrite操作。

Rewrite过程:

  • 父进程fork一个子进程,然后继续响应外部命令,并将写命令写入aof_buf,将命令写入旧的aof文件。
  • 子进程使用写时复制技术,只保存了fork时的内存数据,所以,父进程除了将后续的写命令发送到aof_buf中,还会发送到AOF重写缓冲区
  • 子进程根据内存快照,将写入命令写入到新的aof文件中。
  • 子进程完成新的aof文件后,发命令给父进程。
  • 父进程阻塞操作,把AOF重写缓冲区中的命令写入到新的AOF文件。
  • 父进程使用新的AOF文件代替旧的AOF文件。

RDB和AOF比较

| 持久化 | 优点 | 缺点 | | - | :- | :- | | RDB | RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。与AOF相比,对性能的影响相对较小。 | 其数据快照的持久化方式决定了必然做不到实时持久化;RDB文件需要满足特定格式,兼容性差 | | AOF | AOF的优点在于支持秒级持久化;兼容性好; | 缺点是文件大、恢复速度慢、对性能影响大。|

参考

https://www.cnblogs.com/kismetv/p/9137897.html