redis自学(48)服务端优化
持久化配置
Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:
① 用来做缓存的redis实例尽量不要开启持久化功能
② 建议关闭RDB持久化功能,使用AOF持久化(RDB的数据安全性一直是有问题的,两次RDB的时间比较长,又不能频繁的RDB,因为耗时久而且需要大量的磁盘IO,对性能的影响大)
③ 利用脚本定期在slave节点做RDB,实现数据备份
④ 设置合理的rewrite的阈值,避免频繁的bgrewrite
⑤ 配置no-appendfsync-on-rewrite=yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞(有可能导致数据的丢失)
部署有关建议:
① Redis实例的物理机要预留足够内存,应对fork和rewrite
② 单个redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力
③ 不要与CPU密集型应用部署在一起
④ 不要与高硬盘负载应用一起部署。例如:数据库、消息队列
慢查询
慢查询:在redis执行时耗时超过某个阈值的命令,称为慢查询。
慢查询的阈值可以通过配置指定:
l slowlog-log-slower-than:慢查询阈值,单位是微妙。默认是10000,建议1000
慢查询会被放入慢查询日志中,日志的长度有上限,可以通过配置指定:
l slowlog-max-len:慢查询日志(本质是一个队列)的长度。默认是128,建议1000(及时发现及时处理)
查看慢查询日志列表:
l slowlog len:查询慢查询日志长度
l slowlog get[n]:读取n条慢查询日志
l slowlog reset:清空慢查询列表
命令及安全配置
Redis会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,而Redis如果没有做身份认证,会出现严重的安全漏洞。
漏洞出现的核心的原因有以下几点:
l Redis未设置密码
l 利用了redis的config set命令动态修改redis配置
l 使用了root账号权限启动redis
为了避免这样的漏洞,这里给出一些建议:
① Redis一定要设置密码,而且要复杂
② 禁止线上使用下面命令:keys、flushall、flushdb、config set等命令。可以利用rename-command禁用。
③ Bind:限制网卡,禁止外网网卡访问
④ 开启防火墙
⑤ 不要使用root账户启动redis
⑥ 尽量不使用默认的端口
内存安全和配置
内存配置
当Redis内存不足时,可能导致key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率高达90%以上时就需要我们警惕,并快速定位到内存占用的原因。
数据内存的问题
Redis提供一些命令,可以查看到redis目前的内存分配状态:
l Info memory
l Memory xxx
used_memory: Redis分配的总内存字节数。
used_memory_human: 以人类可读格式显示的used_memory。
used_memory_rss: 从操作系统角度,Redis进程占用的物理内存总量。
used_memory_peak: Redis的内存消耗峰值。
used_memory_peak_human: 以人类可读格式显示的used_memory_peak。
used_memory_lua: Lua引擎所使用的内存大小。
mem_fragmentation_ratio: 内存碎片比率,计算方式为used_memory_rss / used_memory。
mem_allocator: Redis所使用的内存分配器,如jemalloc, tcmalloc或libc。
active_defrag_running: 表示主动碎片整理是否正在运行。
lazyfree_pending_objects: 等待异步释放的对象数量。
maxmemory: 配置的最大可用内存。
maxmemory_human: 以人类可读格式显示的maxmemory。
maxmemory_policy: 当达到maxmemory时的淘汰策略。
mem_not_counted_for_evict: 不计入淘汰的内存量。
number_of_cached_scripts: 缓存的Lua脚本数量。
memory doctor 是 Redis 提供的一个诊断工具,用于分析 Redis 实例的内存使用情况并提供建议。当你运行这个命令时,它会执行一系列检查并给出相应的报告。以下是 memory doctor 可能会检查的几个方面:
1. 内存碎片率:
检查内存碎片情况,如果碎片率过高,会建议使用 MEMORY PURGE 或开启自动内存碎片整理。
2. 内存使用量:
检查当前内存使用是否接近配置的最大内存限制(maxmemory)。
3. 内存分配器:
确认使用的内存分配器(如 jemalloc)是否为推荐的版本。
4. 大键检测:
检查是否存在占用大量内存的键,这些可能需要优化。
5. 键的总数:
检查键的总数是否异常多,可能暗示存在键泄漏问题。
6. 复制积压缓冲区:
检查复制积压缓冲区的大小是否合适。
7. 客户端输出缓冲区:
检查客户端输出缓冲区是否占用过多内存。
8. AOF 重写缓冲区:
如果启用了 AOF,检查 AOF 重写缓冲区的大小。
9. Lua 脚本缓存:
检查 Lua 脚本缓存的使用情况。
10. 持久化相关:
检查 RDB 或 AOF 持久化是否可能影响内存使用。
memory doctor 会根据这些检查结果给出相应的建议,例如:
- 调整配置参数
- 优化数据结构
- 清理不必要的数据
- 考虑使用内存优化技术
需要注意的是,memory doctor 只是提供诊断和建议,并不会自动执行任何更改。具体的优化操作还需要管理员根据实际情况来执行。定期运行 memory doctor 可以帮助你及时发现和解决潜在的内存问题,保持 Redis 的健康运行。
MEMORY PURGE 命令是 Redis 用于内存优化的一个重要工具。它主要用于清理内存碎片,但并不会直接删除任何数据。以下是 MEMORY PURGE 可以帮助清理的内存类型:
1. 内存碎片:
这是 MEMORY PURGE 的主要目标。它会尝试整理和重新分配内存,减少因频繁增删改操作而产生的内存碎片。
2. 未使用的内存块:
对于一些已被释放但尚未返回给操作系统的内存块,MEMORY PURGE 会尝试将它们归还。
3. 空闲内存页:
它会尝试将一些完全空闲的内存页面返回给操作系统。
4. 内部碎片:
对于一些数据结构内部的小型碎片,MEMORY PURGE 也会尝试进行优化。
需要注意的是:
- MEMORY PURGE 不会删除任何键值对或者数据。
- 它主要针对的是由于内存分配器(如 jemalloc)的工作方式导致的内存碎片。
- 这个操作可能会暂时增加 CPU 使用率。
- 在某些情况下,可能无法显著减少内存使用,特别是当碎片化不严重时。
- 这个命令在执行时可能会短暂阻塞 Redis,因此应谨慎在生产环境中使用。
使用 MEMORY PURGE 的最佳实践:
1. 在进行此操作之前,先使用 INFO memory 命令检查内存碎片率。
2. 在低峰期执行此命令。
3. 在大量删除操作后执行,可能会有更好的效果。
4. 如果频繁需要执行 MEMORY PURGE,考虑启用自动内存碎片整理功能。
总之,MEMORY PURGE 是一个有用的工具,可以帮助优化 Redis 的内存使用,但应该谨慎使用,并结合其他内存管理策略一起使用。
内存缓冲区配置
内存缓冲区常见的有三种:
l 复制缓冲区:主从复制的repl_backlog_buf,如果太小可能导致频繁的全量复制,影响性能。通过repl_backlog_size来设置,默认1mb
l AOF缓冲区:AOF刷盘之前的缓存区域,AOF执行rewrite的缓冲区。无法设置容量上限
l 客户端缓冲区:分为输入缓冲区和输出缓冲区,输入缓冲区最大1G且不能设置。输出缓冲区可以设置。
客户端信息: