当前位置: 首页 > 网络应用技术

由持久性原则和叉子亚矛盾的过程引起的潜在风险

时间:2023-03-08 18:30:03 网络应用技术

  在采访中,面试官可以让您谈论Redis的耐用机制,直接携带八股股份:持久性有两种类型,一种是AOF,另一个是RDB,AOF IS。

  庸俗,您必须知道,聊天耐用时,AOF和RDB可能与操作系统和底部IO有关,并且RDB也可以在哨兵机构中使用。

  要回答有关REDIS的任何问题,您必须考虑高性能注意事项,以创建如此多的数据结构以进行快速度,而多路重用IO也适用于快速。有人在想。表现之间的关系是什么?因为redis的诞生是为了高性能,如果添加功能时无法维持高性能,那么此功能不愿意,因此我们可以分析中的持久机制细节。在绩效的前提下,以确保持久性,因此我建议您可以将其用作学习持久性的起点。

  正式答案:实际上,AOF是一种与操作系统叉和其他系统调用密切接触的机制。有许多非常详细的知识点值得精心品尝。在学习的过程中,我还考虑了两个灵魂的灵魂。为什么有AOF重写缓冲区和AOF缓冲区?叉子解决方案保持了Redis的高性能,但是它真的很好吗?有兴趣与您分享一段时间,让我首先谈论该原则。AOF是一种持续的策略。写作命令以文本协议格式添加到AOF缓冲区中,然后以文件的形式同步到磁盘。文件中的命令要更快地使REDIS执行。与MySQL不同,Redis使用了一个邮政-LOGO方法。同时,它还避免了记录错误指令的情况,并且不会阻止当前的写作操作。但这将带来两个风险。第一个风险是,在REDIS执行命令之后,它在您有时间之前就会倒退。如果Redis是一个数据库,则不会恢复。第二个风险是可能会阻止下一个操作,因为AOF AOFREDIS的主线程在主线程中执行,因此,一旦编写了大实例数据,当AOF日志写入磁盘时,磁盘就会太大,导致写入磁盘非常慢,这使得后续操作无法执行解决上述两个问题的根本原因是,我们需要一份指令来控制AOF文件的时机以回写磁盘。因此,有三种同步策略。在控制写作命令执行控件之后,回写磁盘以解决上述问题的时间。额外的效率将降低,它可能会超过文件系统本身大小的限制。 他将以一个人执行命令。该文件太大,恢复时间会太长,因此有一个重写机制。可以将重写机制汇总为副本,两个日志,一个副本是指重写父进程fork.old log。

  打开AOF函数时,服务器执行写作命令后,将在文本协议格式中以服务器状态中的AOF_BUF缓冲区的末尾添加它。

  *3

  $ 3

  放

  $ 5

  你好

  $ 5

  世界德

  AOF不像数据库WAL。AOF是帖子-log,首先执行命令,将数据写入内存,然后记录日志。

  原因:

  但是有两种持久性的风险:

  以上两个风险与AOF写回磁盘的时机有关。这意味着,如果我们可以控制执行命令执行后的AOF日志的时间来记录磁盘,则将解决这两个问题。

  同步策略有三种类型:

  始终同步高可靠性,并且数据基本上不会丢失每个写作命令。性能会影响每秒记录的大巨头。数据丢失了更多的数据。其中,Elway被写入AOF_BUF,呼叫系统呼叫Fsync。他操作一个文件(例如AOF文件)来同步硬盘。Fsync将阻止数据,直到完成硬盘完成,以确保数据的持久性。

  每个人都不使用系统来调用写入操作。将触发延迟写作机制。linux在内核中提供页面缓冲区以改善硬盘io performance。编写系统缓冲区后直接返回Write。相关硬盘操作取决于操作系统调度机制。例如:缓冲区空间已满或达到了特定的时间周期。

  当AOF持续打开并存在于AOF文件中时,将优先考虑AOF文件;如果AOF关闭或不存在AOF文件,请加载RDB文件,并且在AOF/RDB文件成功后,REDIS成功启动。如果AOF/RDB文件不正确,则REDIS失败并打印错误消息。

  服务器仅需要读取并重新执行保存在AOF文件中的写作命令即可在关闭之前还原服务器的数据库状态。

  重复上述2和3个进程,直到处理所有写作命令

  问题

  随着AOF的增加,它将带来性能问题,因为AOF接受文件形式的所有写作订单,因此在收到越来越多的文件后,AOF越来越大,并且恢复时间将越来越长。

  重写是解决通过aof.reduce文件职业空间的增加带来的性能问题,恢复时的存储较小和更快。本质基于redis过程中的数据,以及将数据转换为写作的过程命令与新的AOF文件同步。无需读取,分析或编写任何现有的AOF文件。通过读取服务器的当前数据库状态来实现此功能。首先读取数据库中的键的当前值,然后使用命令记录键值对,而不是以前记录键值对的多个命令。

  为什么重写AOF文件较小?

  在这里应该注意的是,为了避免执行命令时的客户端输入缓冲区溢出,重写程序可能具有多个元素,这些元素在处理列表,哈希表,聚会和有序集合时可能会带来多个元素。将首先检查键锁中的包含。如果元素的数量超过redis.h/redis_aof_rewrite_items_per_cmd的值超过64个元素,因此重写程序将使用多个SADD命令记录此集合。每个命令中设置的元素的数量也为64。

  另一方面,如果列表键包含超过64个项目,则将使用多个rpush命令来保存此列表,并且每个命令中设置的项目数为64

  可以手动触发重写(bgrewriteaof)或自动触发(自动 - AOF-AFRITE-MIN-Size,Auto-Aof-Aof-Rewrite-Stentage-Lescentage参数,以确定自动触发的时间)。

  一个是重写时的最小音量,另一个是当前的AOF文件空间和上次重写后AOF文件空间的比率。

  在整个AOF的重写过程中,仅当执行信号处理函数时,仅信号处理功能会阻止服务器进程(父进程)。在其他时候,AOF背景重写不会阻止父进程。

  原理:从数据库中读取密钥的当前值,使用命令记录键值对,而不是以前记录键值对的多个命令。

  但是,此功能将执行很多写作操作,因此调用此功能的线程将被阻止很长时间,因为Redis Server使用单个线程来处理命令,因此,如果服务器直接调用AOF_REWRITE函数,则服务器无法在重写期间处理服务器,并且服务器无法处理。

  但是,还有另一个问题可能导致服务器当前数据库的状态,并重写AOF文件保存的数据库状态的状态。在求解数据中存在不一致问题的顺序中,REDIS设置了AOF重写缓冲区。在服务器创建的创建过程之后,此缓冲区开始使用。当Redis执行命令时,他会将此写作命令发送到AOF缓冲区,并同时将AOF重重。

  改进措施是:

  首先,RDB是数据的快照,一个压缩的二进制文件。通过此文件

  命令:阻止当前的Redis服务器进程,在RDB进程完成之前,服务器无法处理任何命令请求,因为大量内存会导致长期障碍,因此不建议使用在线环境。

  该命令是上一个命令的优化。创建过程过程。RDB流程负责该过程。完成后

  两个命令之间的连接和差异:创建RDB文件的实际工作是完成该函数,该命令将以不同的方式调用此函数。

  在执行BGSAVE期间,服务器的状态:服务器正常接受命令,但是处理方法和三个命令是不同的

  有以下场景

  通过选项设置多个保存条件。只要满足任何条件,服务器将执行命令。

  格式:

  这意味着服务器将在900秒内执行数据库至少执行一次,并将执行

  原理周期性操作功能检查是否满足了保存选项中设置的保存条件。如果您感到满意,请执行命令以遍历并检查数组中的所有保存条件。

  在此处的示例中,当执行至1378271101时,即301秒,该服务器将自动执行一次,因为已经满足了数组保存的第二个条件。

  当服务器启动时,将自动启动RDB文件的加载。实际工作由RDB.C/RDBLOAD函数完成。服务器将始终在加载期间阻止,直到负载完成为止。但是同时有RDB和AOF,有订单

  序列:当服务器启动时,您将首先检查是否打开AOF持续功能。如果打开,它将优先使用AOF恢复数据库状态。

  在RDB快照过程中,无法修改数据,也就是说,主线程目前无法执行写作操作,并且只能执行阅读操作。这是不允许的。因此,REDIS使用了编写时复制的想法。RDB正在snaph snaph。目前,修改了主线程,然后将复制此数据以生成数据的副本。然后,BGSAVE子过程将将此复制数据写入RDB文件,在此过程中,主线程仍然可以修改原始数据。

  缺点:

  在写作操作的情况下,RDB会持续耐用和潜在的风险。由于RDB在写作时使用复制方法,因此系统需要复制数据以将其分配给内存,因此可能会出现整个系统内存的使用量。

  重新启动REDIS时,我们很少使用RDB恢复内存状态,因为它将丢失很多数据。我们通常使用AOF,但AOF比RDB慢得多。如果AOF文件很大,则需要很长时间才能启动Redis。

  因此,Redis 4.0引入了混合耐用性,即记忆快速照片以一定频率执行。在两个快照之间,使用AOF日志在此期间记录所有命令操作。这可以避免频繁的叉子对RDB快照中的主过程的影响。同时,AOF仅需要两次记录快照之间的操作,这意味着您无需记录所有操作,因此不会存在太大文件的情况。RDB的内容,然后执行增加的AOF文件,从而大大提高了重新启动效率。

  “重新设计和实施”

  “重新开发和运营”

  “ Redis核心技术和实际战斗”(Geek Time Compart)

  “ Redis in -Depth Adventure”

  原始:https://juejin.cn/post/710187539943239492