Redis 可观测最佳实践
Redis 介绍
Redis 是一个开源的高性能键值对(key-value)数据库。它通常用作数据库、缓存和消息代理。Redis 支持多种类型的数据结构,Redis 通常用于需要快速访问的场景,如会话缓存、全页缓存、排行榜、实时分析等。由于其高性能和灵活性,Redis 在现代应用程序中非常流行。
随着项目对 Redis 依赖度逐渐提升,对于 Redis 的稳定性保障变得尤为重要,需要及时发现 Redis 性能是否够用,如连接数、QPS、缓存命中率、阻塞连接数、bigkey 、slowkey 等。及时发现问题对于系统的稳定性和性能优化会有极大的提升。
观测云
观测云具备完整的可观测能力,本文详细解读如何通过观测云采集器 DataKit,采集 Redis 各项指标,并配置监控器向用户主动报告 Redis 问题。
Redis 监控用户创建
创建监控用户(可选):redis 6.0+ 进入 redis-cli 命令行,创建用户并且授权:
CONFIG SET maxmemory-policy allkeys-lfu
ACL SETUSER username on +get +@read +@connection +@keyspace ~*
- 采集
hotkey
数据,maxmemory-policy
策略需要设置为volatile-lfu
或者allkeys-lfu
; - 采集
bigkey&hotkey
主机安装模式需要安装redis-cli
, 如果部署了redis-server
,则不需要重复安装redis-cli
服务。
部署 DataKit
数据通过 DataKit 采集,DataKit 是一款开源、一体式的数据集成 Agent,用于采集系统运行的各种指标、日志等数据,并将这些数据汇总给观测云。DataKit 安装方式可以参考官方手册。
主机安装方式参考:主机安装 - 观测云文档
Redis 采集器
适用于虚拟机部署的 Redis 监控,使用主机安装方式安装 DataKit 后,在 /usr/local/datakit/conf.d/db
目录下,复制 redis.conf.sample
为 redis.conf
。
cp redis.conf.sample redis.conf
调整 redis.conf
内容如下:
# {"version": "1.60.0", "desc": "do NOT edit this line"}
[[inputs.redis]]
host = "172.31.16.153"
port = 6379
password = "rediszjsj"
redis_cli_path = "/usr/bin/redis-cli"
hotkey = true
bigkey = true
[inputs.redis.log]
# #required, glob logfiles
files = ["/var/log/redis/*.log"]
## grok pipeline script path
pipeline = "redis.p"
match = '''^\S.*'''
[inputs.redis.tags]
# some_tag = "some_value"
# more_tag = "some_other_value"
...
本配置打开了 hotkey
和 big key
采集,同时开启了 Redis 运行日志采集。
配置完成后,重启 DataKit,执行命令:
datakit service -R
关键核心指标
- blocked_clients:等待阻塞调用(如 BLPOP/BRPOP 等)的客户端数量。
- connected_clients:客户端连接数(不包括从副本的连接)。
- connected_slaves:已连接的副本(replica)数量。
- evicted_clients:由于 maxmemory-clients 限制而被驱逐的客户端数量。
- evicted_keys:由于 Max-Memory 限制而被驱逐的键数量。
- expired_keys:键过期事件的总数。
- io_threaded_reads_processed:主线程和 I/O 线程处理的读事件数量。
- io_threaded_writes_processed:主线程和 I/O 线程处理的写事件数量。
- keyspace_hits:在主字典中成功查找键的次数。
- keyspace_misses:在主字典中查找键失败的次数。
- latency_percentiles_usec:基于命令类型的延迟百分位分布统计。
- maxclients:maxclients 配置指令的值,是 connected_clients、connected_slaves 和 cluster_connections 之和的上限。
- maxmemory:Max Memory 配置指令的值。
- mem_fragmentation_bytes:used_memory_rss 和 used_memory 之间的差异。
- mem_fragmentation_ratio:used_memory_rss 和 used_memory 之间的比率。
- rdb_bgsave_in_progress:正在进行 RDB 保存的标志。
- rdb_changes_since_last_save:自上次 SAVE 或 BGSAVE 调用以来数据集变化的操作数。
- rdb_current_bgsave_time_sec:正在进行的 RDB 保存操作的持续时间。
- rdb_last_bgsave_time_sec:上次 RDB 保存操作的持续时间。
- rdb_last_save_time:上次成功的 RDB 保存的基于时间戳的记录。
- rdb_saves:自启动以来执行的 RDB 快照数量。
- rejected_connections:由于 Max-Clients 限制而被拒绝的连接数。
- total_blocking_keys:阻塞键的数量。
- total_net_input_bytes:从网络读取的总字节数。
- total_net_output_bytes:写入网络的总字节数。
- total_net_repl_input_bytes:为复制目的从网络读取的总字节数。
- total_net_repl_output_bytes:为复制目的写入网络的总字节数。
- uptime_in_seconds:Redis 服务器启动以来的秒数。
- used_cpu_sys:Redis 服务器消耗的系统 CPU 时间。
- used_cpu_user:Redis 服务器消耗的用户 CPU 时间。
- used_memory:Redis 使用其分配器分配的总字节数。
- used_memory_rss:操作系统看到的 Redis 分配的字节数(常驻集大小)。
仪表板
登录观测云控制台,点击「场景」 -「新建仪表板」,输入 " Redis", 选择" Redis监控视图 ",点击"确定"。
- 性能
- 内存
- 持久化
日志
redis_bigkey
- 标签
Tag | Description |
---|---|
db_name | DB name. |
host | Hostname. |
key | Key name. |
key_type | Key type. |
server | Server addr. |
service_name | Service name. |
- 字段列表
Metric | Description | Type | Unit |
---|---|---|---|
keys_sampled | Sampled keys in the key space. | int | - |
value_length | Key length. | int | - |
redis_hotkey
- 标签
Tag | Description |
---|---|
db_name | DB name. |
host | Hostname. |
key | Key name. |
server | Server addr. |
service_name | Service name. |
- 字段列表
Metric | Description | Type | Unit |
---|---|---|---|
key_count | Key count times. | int | - |
keys_sampled | Sampled keys in the key space. | int | - |
redis_slowlog
Redis 慢查询命令历史,这里我们将其以日志的形式采集。
- 标签
Tag | Description |
---|---|
host | host |
message | log message |
server | server |
service_name | Service name |
- 字段列表
Metric | Description | Type | Unit |
---|---|---|---|
command | Slow command | int | μs |
slowlog_95percentile | Slow 95th percentile duration | int | μs |
slowlog_avg | Slow average duration | float | μs |
slowlog_id | Slow log unique id | int | - |
slowlog_max | Slow maximum duration | int | μs |
slowlog_median | Slow median duration | int | μs |
slowlog_micros | Cost time | int | μs |
备注: Redis 实例中暂无 slow log 数据。
监控器
一键开启如下监控:
Redis 节点重启
检测 Redis 启动时间小于 10 分钟,判定为 Redis 节点发生了重启。
Redis 节点失联
总结
Redis 的监控是实现可观测性建设必不可少的一环,Redis 的可用性对于业务系统起着至关重要的作用。使用观测云可以支持采集 Redis 多种部署方式,包括单机、主从、集群、哨兵等。配合观测云丰富的告警能力,及时发现 Redis 问题,处理解决对应的问题。