两万字 redis.conf 7.0 配置和原理全解,生产王者必备( 七 )


5、AOF 重写
为了防止 AOF 文件过大,antirez 大佬给我搞了个 AOF 重写机制 。

auto-aof-rewrite-percentage 100 表示当前 AOF 文件大小超过上一次重写的 AOF 文件大小的百分之多少(如果没有执行过 AOF 重写,那就参照原始 AOF 文件大小),则执行 AOF 文件重写操作 。
除了这个配置,你还要配置 auto-aof-rewrite-min-size 64mb 用于指定触发 AOF 重写操作的文件大小 。
如果该 AOF 文件大小小于该值,即使文件增长比例达到 100%,我也不会触发 AOF 重写操作,这是为了防止 AOF 文件其实很小,但是满足增长百分比时的多余 AOF 重写操作 。
如果配置为
auto-aof-rewrite-percentage 0 ,表示禁用 AOF 重写功能,建议大家开启 AOF 重写,防止文件过大 。
6、aof-load-truncated

MySQL:如果 AOF 文件是损坏的,你还加载数据还原到内存中么?
加载 AOF 文件把数据还原到内存中,文件可能是损坏的,比如文件末尾是错误的 。这种情况一般是由于宕机导致,尤其是使用 ext4 文件系统挂载时没配置 data=https://www.isolves.com/it/sjk/Redis/2023-06-01/ordered 选项 。
在这种情况下,我可以直接报错,或者尽可能的读取可读的 AOF 内容 。
如果配置成 aof-load-truncated yes,我依然会加载并读取这个损坏的 AOF 文件,并记录一个错误日志通知程序员 。
配置成 aof-load-truncated no,我就会报错并拒绝启动服务,你需要使用 redis-check-aof 工具修复 AOF 文件,再启动 Redis 。如果修复后还是错误,我依然报错并拒绝启动 。
7、aof-use-rdb-preamble
这就是大名鼎鼎的 RDB-AOF 混合持久化功能,配置成 aof-use-rdb-preamble yes(必须先开启 AOF),AOF 重写生成的文件将同时包含 RDB 格式的内容和 AOF 格式内容 。
混合持久化是在 AOF 重写完成的,开启混合持久化后,fork 出的子进程先将内存数据以 RDB 的方式写入 AOF 文件,接着把 RDB 格式数据写入 AOF 文件期间收到的增量命令从重写缓冲区以 AOF 格式写到文件中 。
写入完成后通知主进程更新统计信息,并把含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的 AOF 文件 。
这样的好处是可以结合 RDB 和 AOF 的优点,实现快速加载同时避免丢失过多数据,缺点是 AOF 文件的 RDB 部分内容不是 AOF 格式,可读性差(都是程序解析读取,哪个傻瓜程序员去读这个呀),强烈推荐你使用这个来保证持久化 。
8、aof-timestamp-enabled
我在 7.0 版本新增的特性,大体就是讲 AOF 现在支持时间戳了,你可以做到基于时间点来恢复数据 。
默认是 aof-timestamp-enabled no 表示关闭该特性,你可以按照实际需求选择开启 。
八、Cluster 集群Redis Cluster 集群相关配置,使用集群方式的你必须重视和知晓 。别嘴上原理说的头头是道,而集群有哪些配置?如何配置让集群快到飞起,实现真正的高可用却一头雾水,通过下面这些配置详解也让你对集群原理更加深刻 。
1、cluster-enabled
普通的 Redis 实例是不能成为集群的一员,想要将该节点加入 Redis Cluster,需要设置 cluster-enabled yes 。
2、cluster-config-file
cluster-config-file nodes-6379.conf 指定集群中的每个节点文件 。
集群中的每个节点都有一个配置文件,这个文件并不是让程序员编辑的,是我自己创建和更新的,每个节点都要使用不同的配置文件,一定要确保同一个集群中的不同节点使用的是不同的文件 。
3、cluster-node-timeout
设置集群节点不可用的最大超时时间,节点失效检测 。集群中当一个节点向另一个节点发送 PING 命令,但是目标节点未在给定的时限内返回 PING 命令的回复时,那么发送命令的节点会将目标节点标记为 PFAIL(possible failuer,可能已失效);
如果 master 节点超过这个时间还是无响应,则用它的从节点将启动故障迁移,升级成主节点 。
默认配置是 cluster-node-timeout 15000,单位是毫秒数 。
4、cluster-port
该端口是集群总线监听 TCP 连接的端口,默认配置为 cluster-port 0,我就会把端口绑定为客户端命令端口 + 10000(客户端端口默认 6379,所以绑定为 16379 作为集群总线端口) 。每个 Redis Cluster 节点都需要开放两个端口: