NoSQL之Redis配置与优化(2)
一、Redis高可用
Redis 高可用性
1. 持久化
- 目的:避免数据因进程退出等原因而丢失,通过将数据从内存保存到硬盘,实现数据备份。
- 主要方式:
- RDB 持久化:将内存中的数据生成快照保存到磁盘。适合定期备份数据,数据恢复较快。
- AOF 持久化:将每次写命令记录到日志文件。提供更高的实时性,减少数据丢失。
2. 主从复制
- 目的:实现数据备份和读操作的负载均衡。
- 特点:
- 主节点将数据同步到从节点。
- 从节点可以处理读取请求。
- 不支持写操作负载均衡,存储能力受限于主节点。
3. 哨兵
- 目的:自动化故障恢复。
- 特点:
- 自动检测主节点故障。
- 自动将从节点提升为主节点。
- 不支持写操作负载均衡,存储能力仍然受限于单机。
4. Cluster 集群
- 目的:解决写操作负载均衡和存储能力限制问题。
- 特点:
- 数据分片到多个节点。
- 支持水平扩展。
- 提供高可用性和高性能。
二、Redis持久化
Redis 持久化机制
RDB 持久化
- 原理:在指定时间间隔内生成内存数据快照并保存到磁盘。
- 触发条件:
- 手动触发:使用
SAVE
或BGSAVE
命令。推荐使用BGSAVE
,因为它不会阻塞主进程。 - 自动触发:通过配置
save m n
条件自动触发BGSAVE
。 - 其他触发机制:主从复制场景下或执行
SHUTDOWN
命令时也会触发 RDB 持久化。
- 手动触发:使用
- 执行流程:
- 主进程执行
fork
创建子进程。 - 子进程创建 RDB 文件,并在完成后替换原有文件。
- 主进程执行
- 启动时加载:
- Redis 启动时优先加载 AOF 文件,如果 AOF 关闭才加载 RDB 文件。
AOF 持久化
- 原理:将每次写操作记录到日志文件中,重启时重新执行这些操作来恢复数据。
- 开启配置:
- 在配置文件中设置
appendonly yes
和其他相关参数。
- 在配置文件中设置
- 执行流程:
- 命令追加:写命令追加到缓冲区
aof_buf
。 - 文件写入和同步:
- 策略:
appendfsync always
:每次写命令后立即同步,性能较低。appendfsync everysec
:每秒同步一次,兼顾性能和数据安全。appendfsync no
:不进行同步,由操作系统控制,数据安全性较低。
- 策略:
- 文件重写:
- 定期重写 AOF 文件以减少文件大小。
- 手动触发:使用
BGREWRITEAOF
命令。 - 自动触发:配置
auto-aof-rewrite-min-size
和auto-aof-rewrite-percentage
。
- 命令追加:写命令追加到缓冲区
- 启动时加载:
- Redis 启动时优先加载 AOF 文件,如果 AOF 文件不存在才会加载 RDB 文件。
- 如果 AOF 文件损坏且
aof-load-truncated
开启,则会忽略损坏部分并继续启动。
RDB 和 AOF 优缺点对比
- RDB:
- 优点:文件紧凑,恢复速度快,对性能影响小。
- 缺点:实时性差,可能丢失较新数据。
- AOF:
- 优点:支持秒级持久化,数据丢失少。
- 缺点:文件较大,恢复速度慢,对性能影响大。
三、Redis性能管理
Redis 内存使用与管理
查看 Redis 内存使用
使用命令 info memory
查看 Redis 实例的内存使用情况。
内存碎片率
- 计算方法:
used_memory_rss
(操作系统分配的内存值)除以used_memory
(Redis 实际使用的内存总量)。 - 含义:
used_memory_rss
包含内存碎片的开销。内存碎片是由于操作系统低效的内存分配/回收导致的(例如不连续的内存块分配)。 - 正常范围:
- 稍大于1:内存碎片率较低,Redis 使用的内存较为合理。
- 超过1.5:内存碎片较高,Redis 消耗了实际需要物理内存的150%。建议执行
shutdown save
命令保存数据并重启 Redis 实例。 - 低于1:Redis 内存使用超出物理内存,操作系统进行内存交换。建议增加物理内存或减少 Redis 内存占用。
内存使用率
- 内存交换:当 Redis 实例的内存使用率超过可用最大内存时,操作系统会开始进行内存与 swap 空间的交换。
- 避免内存交换:
- 根据缓存数据大小选择合适的 Redis 实例。
- 尽量使用 Hash 数据结构来存储数据。
- 设置 key 的过期时间。
内存回收策略
当 Redis 达到设置的最大内存阀值时,需要选择一种 key 的回收策略。默认情况下,回收策略是禁止删除。
-
配置文件:
/etc/redis/6379.conf
,修改maxmemory-policy
属性值。
maxmemory-policy noeviction
-
可用策略:
- volatile-lru:从已设置过期时间的数据集合中使用 LRU 算法淘汰数据(移除最近最少使用的 key,针对设置了 TTL 的 key)。
- volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰(移除即将过期的 key)。
- volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰(在设置了 TTL 的 key 里随机移除)。
- allkeys-lru:使用 LRU 算法从所有数据集合中淘汰数据(移除最少使用的 key,针对所有的 key)。
- allkeys-random:从数据集合中任意选择数据淘汰(随机移除 key)。
- noeviction:禁止淘汰数据(当内存满时会报错)。
说明
- 内存碎片率:用于评估 Redis 实例的内存效率。
- 内存使用率:管理 Redis 实例的内存分配,避免内存交换。
- 内存回收策略:确保 Redis 实例在达到最大内存时的合理数据淘汰策略。