热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AOF持久化,aof优化

RDB持久化是通过保存数据库中的键值对来记录数据库的状态,数据库中的状态是数据库中的内容,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库的状态AOF持久化的实现分

RDB持久化是 通过保存数据库中的键值对来记录数据库的状态,数据库中的状态是 数据库中的内容,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库的状态
AOF持久化的实现分为命令追加,文件写入,文件同步三个步骤,命令追加,当AOF持久化功能打开后,会以协议的格式将被执行的命令追加到redisServer结构中的aof_buf缓冲区的末尾,文件写入与文件同步,Redis服务器进程就是一个事件循环loop,这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数(服务器周期性的执行函数,对正在运行的服务器进行维护,检查save选项所设置的保存条件是否满足)这样需要定时运行的函数,服务器
事件循环中,处理文件事件,接收命令请求,以及发送命令回复,处理命令请求时候如果有写命令将追加到aof_buf缓冲区中,处理时间事件,在一个事件循环结束之前执行flushAppendOnlyFile() 将函数将aof_buf缓冲区中的内容写入和保存到aof文件中。flushAppendOnlyFile()函数的执行内容可以通过服务器的appendfsync选项来设置 ,appendfsync是写入和同步选项,always 将aof_buf缓冲区中的所有内容写入并同步到AOF文件中,everysec 缓冲区中的所有内容写入AOF文件中,如果上次AOF文件同步时间距离现在超过1秒,则再次对AOF文件进行同步,这个同步操作由一个专门的线程负责,no 将aof_buf缓冲区中的所有内容写入到AOF文件中,但是不进行同步,没有主动设置appendfsync的时候默认为everysec,现代的操作系统,当用户调用write函数的时候,将一些数据写入到文件的时候,操作系统通常会将写入的数据暂时保存在一个内存缓冲区中,知道缓冲区满了之后,或者超过了指定的时限之后才真正的将缓冲区中的数据写入到磁盘里面,这种方式提高了效率,但是带来了数据丢失的安全性能,为此以通提供了fsync fdatasync两个同步函数可以强制让操作系统立即将数据写入到磁盘里。

AOF文件中包含重建数据库状态的所有写命令,服务器执行一遍AOF文件就能还原关闭之前的数据库状态
Redis读取AOF文件并还原数据库的状态详细的步骤是:1.创建一个不带网络连接的fake client伪客户端,因为redis命令只能在客户端上下文中执行,而载入AOF文件时候使用的命令直接来源于AOF文件而不是网络连接,所以服务器创建一个没有网络连接的为客户端来执行AOF文件保存的写命令,执行的效果和有网络连接的客户端执行的命令效果一样,2.从AOF文件中分析并读取一条写命令,3.使用伪客户端执行被读出的写命令,一直执行,直到AOF文件中所有的写命令被处理完毕,AOF文件中第一个命令就是select 0 表示选择数据库。随着时间的流逝,AOF文件中的内容越来越多,体积越来越大,对服务器是不好的影响,进行数据还原的时间就越来越多,解决AOF文件体积膨胀问题,AOF文件提供了重写的功能,Redis可以创建一个新的AOF文件,新的AOF文件保存的数据库状态相同,但是新的AOF文件中不包含任何浪费空间的命令,新的AOF文件要小的多。
AOF重写并不是将已有的AOF文件进行重新的写入和执行,而是从数据库中读取键现在的值,然后用一条命令记录键值对代替之前记录这个键值对的多条命令,比如将AOF中多条对同一个键的写操作命令,在新的AOF文件中用一条命令来实现。函数aof_rewrite实现了AOF重写,首先是遍历所有的数据库,在一个数据库中遍历所有的键,过期键不用管,根据键的类型进行重写,get命令获取键的值,set命令重写字符串中的键。AOF重写的aof_write函数不会有没有用的键,并且读取数据库的值达到了多条指令的整合。在AOF重写的过程中可能会出现某一个键的元素过多,造成了客户端输入缓冲区aof_buf溢出,redis先检查键中包含的元素的个数,如果超过了元素的个数,会使用多条命令记录键的值,就是说AOF重写的时候,读取的键的值过多的时候将会在新的AOF文件中使用多条指令。执行aof_rewrite函数的时候有大量的写操作,调用这个函数的线程将会长时间被阻塞,redis服务器是使用单个线程来处理命令请求,因此,如果reids服务器直接执行aof_rewrite函数的时候服务器将不会处理客户端发来的命令请求。Redis将AOF重写放在子进程中,这样子进程在执行AOF重写的时候,服务器进程可以继续处理命令请求,子进程带有服务器进程的数据副本,使用子进程而不是线程在避免使用锁的情况下保证数据的安全性。
子进程带有父进程的数据副本,这样的话,在子进程进行AOF重写的时候,服务器进程还是在继续处理命令,命令可能会改变现有的数据库状态,从而使得当前的数据库状态和后台重写之后保存的数据库状态不一致。解决数据不一致,redis设置了一个AOF重写缓冲区,这个缓冲区在服务器创建子进程之后开始使用,当Redis服务器执行完一个写命令之后,会同时将这个写命令发送给AOF缓冲区AOF重写缓冲区。redis服务器进程在子进程执行AOF重写的时候会进行三个操作,执行客户端发送来的命令,将执行的写命令追加到AOF缓冲区,将执行的写命令追加到AOF重写缓冲区中,AOF缓冲区中的内容会定期的被写入和同步到AOF文件中,对现有的AOF处理像正常一样,从创建子进程开始,服务器执行的写命令会被记录到AOF重写缓冲区中,子进程完成重写之后向父进程发送一个信号,之后父进程调用信号处理函数,将AOF重写缓冲区中的所有内容写入到新的AOF文件中,这时候AOF文件保存的数据库状态将会服务器当前的数据库状态保持一致,之后对新的AOF文件改名原子性的覆盖现有的AOF文件,完成新旧AOF文件的交替,信号函数执行完毕之后,父进程将会像往常一样接收新的命令请求了,在整个AOF重写的过程中,REDIS服务器只有在执行信号处理函数的时候才会阻塞,这样AOF后台重写对服务器造成的性能影响降到了最低。这就是BGREWAITAOF的实现


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • Redis 主从复制机制详解及其工作原理
    主从复制机制在 Redis 中具有重要作用,能够实现读写分离、提升系统性能并提供快速的灾难恢复能力。具体实现方面,以一主两从的架构为例,需要创建三个独立的配置文件(.conf),分别用于主节点和两个从节点的设置。通过这种方式,可以从主节点同步数据到从节点,确保数据的一致性和高可用性。此外,还可以利用从节点进行读操作,减轻主节点的压力,进一步提高系统的整体性能。 ... [详细]
  • 优化后的标题:深入解析09版Jedis客户端
    深入解析09版Jedis客户端,本文将详细介绍如何在Java项目中正确配置Jedis以操作Redis。首先,确保项目的JDK版本和编译器设置正确。接着,通过Maven或Gradle导入必要的依赖项,如 `redis.clients:jedis`。此外,文章还将探讨Jedis连接池的配置与优化,以及常见问题的解决方案,帮助开发者高效使用Jedis进行Redis操作。 ... [详细]
  • 人人租机作为国内领先的信用免押租赁平台,为企业和个人提供全方位的新租赁服务。通过接入支付宝小程序功能,该平台实现了从零到百的迅猛增长,成为全国首家推出“新租赁小程序”开发服务的阿里巴巴小程序服务商(ISV)。这一创新举措不仅提升了用户体验,还显著增强了平台的市场竞争力。 ... [详细]
author-avatar
xz7777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有