满亦工作室 网站建设深圳做网站哪里最好

当前位置: 首页 > news >正文

满亦工作室 网站建设,深圳做网站哪里最好,北京专业网站建设网站,哪个网站注册域名文章目录一 AOF(Append Only File) 持久化二 AOF 基础配置2.1 AOF的开启2.2 文件名配置2.3 混合式持久化开启2.4 AOF 文件目录配置三 AOF 文件格式3.1 Redis 协议3.2 查看 AOF 文件3.3 清单文件3.4 Rewrite 机制3.4.1 rewrite简介3.4.2 rewrite 计算策略3.4.3 手动开启 rewrite… 文章目录一 AOF(Append Only File) 持久化二 AOF 基础配置2.1 AOF的开启2.2 文件名配置2.3 混合式持久化开启2.4 AOF 文件目录配置三 AOF 文件格式3.1 Redis 协议3.2 查看 AOF 文件3.3 清单文件3.4 Rewrite 机制3.4.1 rewrite简介3.4.2 rewrite 计算策略3.4.3 手动开启 rewrite3.4.4 自动开启 rewrite四 AOF 优化配置4.1 appendfsync4.2 no-appendfsync-on-rewrite4.3 aof-rewrite-incremental-fsync4.5 aof-load-truncated4.6 aof-timestamp-enabeld4.7 AOF 持久化过程五 总结5.1 RDB 与 AOF 对比5.2 持久化技术建议一 AOF(Append Only File) 持久化 AOF指 Redis 将每一次的写操作都以日志的形式记录到一个 AOF文件中的持久化技术。当需要恢复内存数据时将这些写操作重新执行一次便会恢复到之前的内存数据状态。 二 AOF 基础配置 2.1 AOF的开启 默认情况下 AOF 持久化是没有开启的通过修改配置文件redis.conf中的 appendonly 属性为 yes开启 默认情况下Redis异步将数据集转储到磁盘上。这个模式在许多应用程序中已经足够好了但是Redis进程或停电可能会导致几分钟的写入丢失(取决于配置的保存点)。断电可能会导致几分钟的写入丢失(取决于配置的保存点)。仅追加文件是另一种持久性模式它提供了更好的持久性。例如使用默认的数据fsync策略(参见后面的配置文件)Redis可以在一个突发的事件中丢失一秒钟的写比如服务器断电或者如果Redis进程本身发生了一些错误那么一个写但操作系统仍然正常运行。AOF和RDB持久性可以同时启用没有问题。如果启动时启用AOF, Redis将加载AOF这是具有更好的持久性保证的文件。更多信息请登录https://redis.io/topics/persistence 2.2 文件名配置 附加文件的基本名称。Redis 7和更新版本使用一组只能追加的文件来持久化数据集和应用于它的更改。使用的文件有两种基本类型: 基本文件这是一个快照表示文件创建时数据集的完整状态。基本文件可以是RDB(二进制序列化)或AOF(文本命令)的形式。增量文件其中包含应用于前一个文件之后的数据集的额外命令。 此外清单文件用于跟踪文件及其创建和应用的顺序。只能追加的文件名是由Redis按照特定的模式创建的。文件名的前缀基于’appendfilename’配置参数后面跟着关于序列和类型的附加信息。例如如果appendfilename设置为appendonly。附加文件可以推导出以下文件名: appendonly.aof.1.base.rdb作为基本文件。appendonly.aof.1.incr. aof appendonly.aof.2.incr作为增量文件。appendonly.aof.manifest作为清单文件。 基本文件可以是 RDF 格式也可以是 AOF 格式。其存放的内容是由 RDB 转为 AOF 当时内存的快照数据该文件可以有多个。增量文件以操作日志形式记录转为 AOF 后的写入操作。该文件可以有多个。清单文件用于维护 AOF 文件的创建顺序保障激活时的应用顺序。该文件只有一个 2.3 混合式持久化开启 对于基本文件可以是 RDF 格式也可以是 AOF 格式。通过 aof-use-rdb-preamble 属性可以选择。其默认值为 yes即默认 AOF 持久化的基本文件为 rdb 格式文件也就是默认采用混合式持久化 2.4 AOF 文件目录配置 为了方便Redis将所有持久的仅追加文件存储在专用目录中。目录的名称由appenddirname配置参数决定。存放在 redis.conf 配置文件的 dir 属性指定的目录默认为 Redis 安装目录 三 AOF 文件格式 AOF 文件包含三类文件基本文件、增量文件与清单文件。 3.1 Redis 协议 增量文件扩展名为.aof采用 AOF 格式。AOF 格式其实就是 Redis 通讯协议格式AOF持久化文件的本质就是基于 Redis 通讯协议的文本将命令以纯文本的方式写入到文件中。Redis 协议规定Redis 文本是以行来划分每行以\r\n 行结束。每一行都有一个消息头以表示消息类型。消息头由六种不同的符号表示其意义如下 符号解释表示一个正确的状态信息-表示一个错误信息*表示消息体总共有多少行不包括当前行\(表示下一行消息数据的长度不包括换行符长度\r\n空表示一个消息数据:表示返回一个数值 3.2 查看 AOF 文件 启动Redis打开客户端后执行以下代码select 0 set key1 value1打开 appendonly.aof.1.incr.aof 文件 *2 -- 表示当前命令包含 2 个参数 \)6 – 表示第 1 个参数包含 6 个字符 SELECT – 第 1 个参数 \(1 -- 表示第 2 个参数包含 1 个字符 0 -- 第 2 个参数 *3 --表示当前命令包含 3 个参数 \)3 – 表示第 1 个参数包含 3 个字符 set – 第 1 个参数 \(3 -- 表示第 2 个参数包含 3 个字符 keys -- 第 2 个参数 \)3 – 表示第 3 个参数包含 2 个字符 value1 – 第 3 个参数3.3 清单文件 打开清单文件appendonly.aof.manifes 该文件首先会按照 seq 序号列举出所有基本文件基本文件 type 类型为 b然后再按照seq 序号再列举出所有增量文件增量文件 type 类型为 i。对于 Redis 启动时的数据恢复也会按照该文件由上到下依次加载它们中的数据。 3.4 Rewrite 机制 为了防止 AOF 文件由于太大而占用大量的磁盘空间降低性能Redis 引入了 Rewrite 机制来对 AOF 文件进行压缩。 3.4.1 rewrite简介 Rewrite 就是对 AOF 文件进行重写整理。当 Rewrite 开启后主进程 redis-server创建出一个子进程 bgrewriteaof由该子进程完成 rewrite 过程。其首先对现有 aof 文件进行rewrite 计算将计算结果写入到一个临时文件写入完毕后再 rename 该临时文件为原 aof文件名覆盖原有文件。 3.4.2 rewrite 计算策略 rewrite 计算也称为 rewrite 策略。rewrite 计算遵循以下策略 读操作命令不写入文件无效命令不写入文件过期数据不写入文件多条命令合并写入文件
3.4.3 手动开启 rewrite Rewrite 过程的执行有两种方式。一种是通过 bgrewriteaof 命令手动开启另一种是通过设置条件自动开启。以下是手动开启方式bgwriteaof该命令会使主进程 redis-server 创建出一个子进程 bgrewriteaof由该子进程完成 rewrite过程。而在 rewrite 期间redis-server 仍是可以对外提供读写服务的。 3.4.4 自动开启 rewrite 手动方式需要人办干预所以一般采用自动方式。由于 Rewrite 过程是一个计算过程需要消耗大量系统资源会降低系统性能。所以Rewrite 过程并不是随时随地任意开启的而是通过设置一些条件当满足条件后才会启动以降低对性能的影响。配置文件中对于 Rewrite 自动启动条件的设置 auto-aof-rewrite-percentage开启 rewrite 的增大比例默认 100%。指定为 0表示禁用自动 rewrite。auto-aof-rewrite-min-size开启 rewrite 的 AOF 文件最小值默认 64M。该值的设置主要是为了防止小 AOF 文件被 rewrite从而导致性能下降。 自动重写 AOF 文件。当 AOF 日志文件大小增长到指定的百分比时Redis 主进程redis-server 会 fork 出一个子进程 bgrewriteaof 来完成 rewrite 过程。其工作原理如下Redis 会记住最新 rewrite 后的 AOF 文件大小作为基本大小如果从主机启动后就没有发生过重写则基本大小就使用启动时 AOF 的大小。 如果当前 AOF 文件大于基本大小的配置文件中指定的百分比阈值且当前 AOF 文件大于配置文件中指定的最小阈值则会触发 rewrite。 四 AOF 优化配置 4.1 appendfsync fsync()调用告诉操作系统实际将数据写入磁盘而不是在输出缓冲区中等待更多数据。有些操作系统真的会刷新磁盘上的数据有些操作系统只会尽快这么做。Redis支持三种不同的模式 no:不要fsync让操作系统在需要的时候刷新数据。得更快。always:每次写入只追加日志后进行fsync。缓慢的,安全的。everysec:每秒只同步一次。妥协。 默认是“everysec”因为这通常是速度和数据安全之间的正确妥协。这取决于您是否可以将其放宽为“no”从而让操作系统在需要时刷新输出缓冲区以获得更好的性能(但如果您可以接受一些数据丢失的想法请考虑默认的持久性模式快照)或者相反使用“always”这非常慢但比“always”更安全 当客户端提交写操作命令后该命令就会写入到 aof_buf 中而 aof_buf 中的数据持久化到磁盘 AOF 文件的过程称为数据同步。 采用不同的数据同步策略同步的时机是不同的有三种策略 always写操作命令写入 aof_buf 后会立即调用 fsync()系统函数将其追加到 AOF 文件。 该策略效率较低但相对比较安全不会丢失太多数据。最多就是刚刚执行过的写操作在尚未同步时出现宕机或重启将这一操作丢失。 no写操作命令写入 aof_buf 后什么也不做不会调用 fsync()函数。 而将 aof_buf 中的数据同步磁盘的操作由操作系统负责。Linux 系统默认同步周期为 30 秒。效率较高。 everysec默认策略。写操作命令写入 aof_buf 后并不直接调用 fsync()而是每秒调用一次 fsync()系统函数来完成同步。 该策略兼顾到了性能与安全是一种折中方案
4.2 no-appendfsync-on-rewrite 当 AOF fsync 策略设置为 always 或 everysec当主进程创建了子进程正在执行 bgsave 或 bgrewriteaof 时主进程是否不调用 fsync()来做数据同步。设置为 no双重否定即肯定主进程会调用 fsync()做同步。而 yes 则不会调用 fsync()做数据同步。如果调用 fsync()在需要同步的数据量非常大时会阻塞主进程对外提供服务即会存在延迟问题。如果不调用 fsync()则 AOF fsync 策略相当于设置为了 no可能会存在 30 秒数据丢失的风险。 4.3 aof-rewrite-incremental-fsync 当 bgrewriteaof 在执行过程也是先将 rewrite 计算的结果写入到了 aof_rewrite_buf 缓存中然后当缓存中数据达到一定量后就会调用fsync()进行刷盘操作即数据同步将数据写入到临时文件。该属性用于控制 fsync()每次刷盘的数据量最大不超过 4MB。这样可以避免由于单次刷盘量过大而引发长时间阻塞。 4.5 aof-load-truncated 在进行 AOF 持久化过程中可能会出现系统突然宕机的情况此时写入到 AOF 文件中的最后一条数据可能会不完整。当主机启动后Redis 在 AOF 文件不完整的情况下是否可以启动取决于属性 aof-load-truncated 的设置。 yesAOF 文件最后不完整的数据直接从 AOF 文件中截断删除不影响 Redis 的启动。noAOF 文件最后不完整的数据不可以被截断删除Redis 无法启动。
4.6 aof-timestamp-enabeld 该属性设置为 yes 则会开启在 AOF 文件中增加时间戳的显示功能可方便按照时间对数据进行恢复。但该方式可能会与 AOF 解析器不兼容所以默认值为 no不开启。 4.7 AOF 持久化过程 AOF 详细的持久化过程如下 Redis 接收到的写操作命令并不是直接追加到磁盘的 AOF 文件的而是将每一条写命令按照 redis 通讯协议格式暂时添加到 AOF 缓冲区 aof_buf。根据设置的数据同步策略当同步条件满足时再将缓冲区中的数据一次性写入磁盘的AOF 文件以减少磁盘 IO 次数提高性能。当磁盘的 AOF 文件大小达到了 rewrite 条件时redis-server 主进程会 fork 出一个子进程bgrewriteaof由该子进程完成 rewrite 过程。子进程 bgrewriteaof 首先对该磁盘 AOF 文件进行 rewrite 计算将计算结果写入到一个临时文件全部写入完毕后再 rename 该临时文件为磁盘文件的原名称覆盖原文件。如果在 rewrite 过程中又有写操作命令追加那么这些数据会暂时写入 aof_rewrite_buf缓冲区。等将全部 rewrite 计算结果写入临时文件后会先将 aof_rewrite_buf 缓冲区中的数据写入临时文件然后再 rename 为磁盘文件的原名称覆盖原文件。
五 总结 5.1 RDB 与 AOF 对比 持久化技术优势不足RDBRDB 文件较小数据恢复较快数据安全性较差写时复制会降低性能RDB 文件可读性较差AOF数据安全性高AOF 文件可读性强AOF 文件较大写操作会影响性能数据恢复较慢 5.2 持久化技术建议 官方推荐使用 RDB 与 AOF 混合式持久化。若对数据安全性要求不高则推荐使用纯 RDB 持久化方式。不推荐使用纯 AOF 持久化方式。若 Redis 仅用于缓存则无需使用任何持久化技术