redis自学(48)服务端优化

持久化配置

Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:

① 用来做缓存的redis实例尽量不要开启持久化功能

② 建议关闭RDB持久化功能,使用AOF持久化(RDB的数据安全性一直是有问题的,两次RDB的时间比较长,又不能频繁的RDB,因为耗时久而且需要大量的磁盘IO,对性能的影响大)

③ 利用脚本定期在slave节点做RDB,实现数据备份

④ 设置合理的rewrite的阈值,避免频繁的bgrewrite

⑤ 配置no-appendfsync-on-rewrite=yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞(有可能导致数据的丢失)

 

 

部署有关建议:

① Redis实例的物理机要预留足够内存,应对forkrewrite

② 单个redis实例内存上限不要太大,例如4G8G。可以加快fork的速度、减少主从同步、数据迁移压力

③ 不要与CPU密集型应用部署在一起

④ 不要与高硬盘负载应用一起部署。例如:数据库、消息队列

 

慢查询

慢查询:在redis执行时耗时超过某个阈值的命令,称为慢查询。

 

 

慢查询的阈值可以通过配置指定:

slowlog-log-slower-than:慢查询阈值,单位是微妙。默认是10000,建议1000

慢查询会被放入慢查询日志中,日志的长度有上限,可以通过配置指定:

slowlog-max-len:慢查询日志(本质是一个队列)的长度。默认是128,建议1000(及时发现及时处理)

 

 

查看慢查询日志列表:

slowlog len:查询慢查询日志长度

slowlog get[n]:读取n条慢查询日志

slowlog reset:清空慢查询列表

 

 

命令及安全配置

Redis会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,而Redis如果没有做身份认证,会出现严重的安全漏洞。

 

 

漏洞出现的核心的原因有以下几点:

Redis未设置密码

利用了redisconfig set命令动态修改redis配置

使用了root账号权限启动redis

为了避免这样的漏洞,这里给出一些建议:

① Redis一定要设置密码,而且要复杂

② 禁止线上使用下面命令:keysflushallflushdbconfig set等命令。可以利用rename-command禁用。

 

 

③ Bind:限制网卡,禁止外网网卡访问

 

 

④ 开启防火墙

⑤ 不要使用root账户启动redis

⑥ 尽量不使用默认的端口

内存安全和配置

内存配置

Redis内存不足时,可能导致key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率高达90%以上时就需要我们警惕,并快速定位到内存占用的原因。

 

 

数据内存的问题

Redis提供一些命令,可以查看到redis目前的内存分配状态:

Info memory

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, tcmalloclibc

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 的内存使用,但应该谨慎使用,并结合其他内存管理策略一起使用。

 

内存缓冲区配置

内存缓冲区常见的有三种:

复制缓冲区:主从复制的repl_backlog_buf,如果太小可能导致频繁的全量复制,影响性能。通过repl_backlog_size来设置,默认1mb

AOF缓冲区AOF刷盘之前的缓存区域,AOF执行rewrite的缓冲区。无法设置容量上限

客户端缓冲区:分为输入缓冲区和输出缓冲区,输入缓冲区最大1G且不能设置。输出缓冲区可以设置。

 

 

客户端信息:

 

 

 

posted @ 2024-06-21 14:55  蓝海的bug本  阅读(3)  评论(0编辑  收藏  举报