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服务器时:
- 执行命令,命令执行成功后发送给AOF过程。
- AOF过程将命令转换为文本,并添加到AOF缓冲区(aof_buf)末尾,这个称为命令追加。
- 缓冲区中的命令每隔一段时间会被写入到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