NoSQL之Redis配置与优化(2)

一、Redis高可用

Redis 高可用性

1. 持久化

  • 目的:避免数据因进程退出等原因而丢失,通过将数据从内存保存到硬盘,实现数据备份。
  • 主要方式
    • RDB 持久化:将内存中的数据生成快照保存到磁盘。适合定期备份数据,数据恢复较快。
    • AOF 持久化:将每次写命令记录到日志文件。提供更高的实时性,减少数据丢失。

2. 主从复制

  • 目的:实现数据备份和读操作的负载均衡。
  • 特点
    • 主节点将数据同步到从节点。
    • 从节点可以处理读取请求。
    • 不支持写操作负载均衡,存储能力受限于主节点。

3. 哨兵

  • 目的:自动化故障恢复。
  • 特点
    • 自动检测主节点故障。
    • 自动将从节点提升为主节点。
    • 不支持写操作负载均衡,存储能力仍然受限于单机。

4. Cluster 集群

  • 目的:解决写操作负载均衡和存储能力限制问题。
  • 特点
    • 数据分片到多个节点。
    • 支持水平扩展。
    • 提供高可用性和高性能。

二、Redis持久化

Redis 持久化机制

RDB 持久化

  • 原理:在指定时间间隔内生成内存数据快照并保存到磁盘。
  • 触发条件
    • 手动触发:使用 SAVEBGSAVE 命令。推荐使用 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-sizeauto-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 实例在达到最大内存时的合理数据淘汰策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值