写点什么

Redis--Redis 持久化方式

作者:Java学术趴
  • 2022 年 10 月 06 日
    北京
  • 本文字数:2739 字

    阅读完需:约 9 分钟

Redis--Redis持久化方式

👨‍🎓作者:Java 学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号:Java 学术趴

🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号 Java 学术趴联系小编。


☠️每日毒鸡汤:一件事你犹豫去不去做,那就是该立即动身做的。

1. Redis 持久化

  • Redis 中的数据一般存储在内存中,也可以使用持久化的方式将数据写到硬盘中。

  • Redis 提供了两种持久化数据的方式:RDB 以及 AOF。

  • 如果使用 Redis 只是作为缓存使用,那么可完全不用持久化操作。

1.1 RDB

1.1.1 RDB 介绍

  • RDB(Redis DataBase) : 在指定的 时间间隔 内将内存中的数据集快照写入到磁盘中,它恢复的时候将快照文件直接读取到内存里。

  • RDB 默认是开启的。

1.1.2 备份是如何执行的

  • Redis 会单独创建(fork),一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。

  • 如果需要进行大规模数据的恢复,且对于数据恢复是完整性不是非常的敏感,那 RDB 方式要比 AOF 方式更加的高效。

  • RDB 的缺点是最后一次持久化的数据可能丢失。因为可能存储一半数据的时候,Redis 服务器挂掉了,这就会导致数据丢失。

1.1.3 Fork

  • Fork 的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器、数值)都和原来保持一致,但是是一个全新的进程,并作为原进程的子进程。

  • 在 Linux 程序中,fork() 会产生一个和父进程完成相同的子进程,但子进程在此后多会 exec 系统调用,出于效率考虑,linux 中引入 写时复制技术

  • 一般情况下父进程和子进程共用同一段物理内存,只有进程空间的各段内容要发生变化时,才会将父进程的内容复制一份给子进程。

1.1.4 RDB 优势

  • 适合大规模的数据恢复。

  • 对数据完整性和一致性要求不高适合使用。

  • 节省磁盘空间。

  • 恢复速度快。

1.1.5 RDB 劣势

  • Fork 的时候,内存中的数据被克隆一份,大致 2 倍的膨胀性需要考虑。

  • 虽然 Redis 在 fork 的时候使用写时拷贝技术,但是如果数据庞大的时候还是比较消耗性能。

  • 在备份周期在一定间隔时间做一个备份,所有如果 Redis 在备份的时候发生意外 down 的话,就会丢失最后一次快照后的所有修改。

1.2 AOF

1.2.1 AOF 简介

  • AOF(Append Only File) : 以日志的形式来记录每个写操作(增量保存) ,将 Redis 执行过的所有写指令记录下来( 读操作不记录 ), 只允许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将指令从前到后执行一次以完成数据的恢复工作。

  • 写操作:增、删、改,会涉及到修改数据的操作。读操作:就是查询,不涉及到数据的修改。

1.2.2 AOF 持久化流程

  1. 客户端的请求写命令会被 append 追加到 AOF 缓存区内。

  2. AOF 缓冲区根据 AOF 持久化策略【always,everysec,no】将操作 sync 同步到磁盘的 AOF 文件中。

  3. AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量。

  4. Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的。

1.2.3 AOF 默认不开启

  • 在 Redis.conf 配置文件中,将 appendonly 属性设置为 yes。


  • 可以在 redis.conf 中配置文件名称,默认为 append.aof

  • AOF 文件保存的路径,同 RDB 的路径一致。


1.2.4 AOF 和 RDB 同时开启,redis 听谁的??

  • AOF 和 RDB 同时开启,系统默认会读取 AOF 的数据(AOF 中的数据不会丢失)

1.2.5 AOF 同步频率设置

  • appendfsync always : 始终同步,每次 Redis 的写入都会立刻记入日志,性能较差但数据完整性比较好。

  • appendfsync everysec : 每秒同步,每秒记入日志一次,如果宕机,本秒的数据会丢失。

  • appendfsync no : redis 不主动进行同步,把同步时机交给系统。

1.2.6 Rewrite 压缩

把复杂的命令进行简化



  • AOF 采用文件追加方式,文件会越来越大为了避免出现此种情况,新增了重写机制,当 AOF 文件的大小超过所设定的阈值时,Redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令 bgrewriteaof

1.2.7 AOF 优势

  • 备份机制更稳健,丢失数据概率更低。

  • 可读日志文本,通过操作 AOF 稳健,可以处理误操作。

1.2.8 AOF 劣势

  • 比 RDB 占用更多的磁盘空间。

  • 恢复备份速度要慢。

  • 每次读写都同步的话,有一定的性能压力。

  • 存在个别的 bug,造成不能恢复,需要进行修复。


总结:RDB 以快照的形式持久化,AOF 以日志追加的方式持久化。

2. Redis 主从复制

2.1 主从复制介绍

2.1.1 介绍

  • 主机数据更新侯根据配置和策略,自动同步到备机的 master/slaver 机制

  • Master 以写为主,slave 以读为主。

  • 相当于把数据多存储到几台机器上,主服务器主要负责写,写完之后把数据复制到从服务器中(可以有多个从服务器),当读取数据的时候不从主服务器中读取,而是在从数据库中读取,这样就减少了服务器读写的压力。

  • 只有一台主服务器,多台从服务器。 一主多从



  • 当绑定主从关系之后,主服务器可以进行读写操作。但是从服务器只能做读操作,写操作会报错。

2.1.2 主动复制的优势

  • 读写分离,性能扩展。

  • 容灾快速恢复。

2.1.3 主从复制的原理

  1. 当从服务器链接上主服务器之后,从服务器向主服务器发送进行同步数据的消息。 ( 从服务器自主发起 )

  2. 主服务器接到从服务器发送过来同步消息,把主服务器数据进行持久化,保存到 rdb 文件中,把 rdb 文件发送给从服务器,从服务器拿到 rdb 进行读取保存数据。 全量复制

  3. 每次主服务器进行写操作之后,向从服务器发送数据同步的请求。( 主服务器自主发起 )(增量复制

2.2 主从挂机的情况

2.2.1 一主二仆

从服务器挂点,主服务器还在


  • 从服务器挂掉之后,从新启动之后将不再是一个从服务器,会变为一个主服务器,需要从新绑定主从关系。

  • 当绑定到主服务器之后他会把主服务中的数据自动复制一个保存到自己本地。


主服务器挂掉,从服务器还在


  • 从服务器还是从服务器,不会变为住服务器,在从服务器中可以看到它绑定的主服务器已经挂掉了。

  • 当主服务器重启之后,还是该从服务器的主服务器。

2.2.2 薪火相传

  • 上一个 Slave 可以作为下一个 slave 的 Master ,Slave 同样可以接收其他 slave 的链接和同步请求,那么该 slave 作为了下一个链条中的 master,可以有效减轻 master 的写压力,去中心化降低风险。

  • 这个特点和一主二仆是一样的。

2.2.3 反客为主

  • 当一个 matser 宕机后,后面的 slave 可以立刻升级为 master,其后面的 slave 不用做任何的修改。

  • 这个 反客为主 的方式需要手动操作。

2.3 哨兵模式

  • 反客为主的自动版, 能够在后台监控主机是否有故障,如果发生了故障根据投票数自动将从服务器转换为主服务器。



这个 1 代表有多少个哨兵同意才可以迁移为主服务器。




在选在完从服务器作为主机之后,以前的主机重启之后会变为新主服务器的从服务器。

用户头像

Java学术趴

关注

还未添加个人签名 2022.07.02 加入

还未添加个人简介

评论

发布
暂无评论
Redis--Redis持久化方式_10月月更_Java学术趴_InfoQ写作社区