Redis Cluster监控

目录

一、采集脚本:Redis数据采集脚本

二、采集指标说明

三、汇报指标(图表)

四、设置监控告警项

五、Redis延迟时间排查


Version : Redis 4.0.10

一、采集脚本:Redis数据采集脚本

二、采集指标说明:

  参数 采集指标 采集类型 是否采集 详解

举个栗子

 

自定义push数据到open-falcon2:

不仅仅是falcon2-agent采集的数据可以push到监控系统,一些场景下,我们自定义的一些数据指标,也可以push到open-falcon中。

指标说明:收集指标里的COUNTER表示每秒执行次数,GAUGE表示直接输出值(暂留100参数指标)。

所有参数统一前缀:hgrc_

API详解:

metric: 最核心的字段,代表这个采集项具体度量的是什么, 比如是cpu_idle呢,还是memory_free, 还是qps

endpoint: 标明Metric的主体(属主),比如metric是cpu_idle,那么Endpoint就表示这是哪台机器的cpu_idle

timestamp: 表示汇报该数据时的unix时间戳,注意是整数,代表的是秒

value: 代表该metric在当前时间点的值,float64

step: 表示该数据采集项的汇报周期,这对于后续的配置监控策略很重要,必须明确指定。60代表每分钟上报一次

counterType: 只能是COUNTER或者GAUGE二选一,前者表示该数据采集项为计时器类型,后者表示其为原值 (注意大小写)GAUGE:即用户上传什么样的值,就原封不动的存储

COUNTER:指标在存储和展现的时候,会被计算为speed,即(当前值 - 上次值)/ 时间间隔 

tags: 一组逗号分割的键值对, 对metric进一步描述和细化, 可以是空字符串. 比如idc=lg,比如service=xbox等,多个tag之间用逗号分割 

说明:这7个字段都是必须指定

Server

服务器的信息

 

redis_version GAUGE 原始值 Redis 服务器版本 4.0.10
redis_git_sha1 GAUGE 原始值 Git SHA1 00000000
redis_git_dirty GAUGE 原始值 Git dirty flag 0
redis_build_id GAUGE 原始值 Git dirty flag 11292dc1b967716d
redis_mode GAUGE 原始值 运行模式,单机或者集群 cluster
os GAUGE 原始值 Redis 服务器的宿主操作系统 Linux 2.6.32-888.el6.x86_64 x86_64
arch_bits GAUGE 原始值 架构(32 或 64 位) 64
multiplexing_api GAUGE 原始值 Redis 所使用的事件处理机制 epoll
atomicvar_api GAUGE 原始值 原子处理api sync-builtin
gcc_version GAUGE 原始值 编译 Redis 时所使用的 GCC 版本 4.4.7
process_id GAUGE 原始值 服务器进程的 PID 10857
run_id GAUGE 原始值 Redis 服务器的随机标识符(用于 Sentinel 和集群) ea90c4af7d0628667b461312bff5a51a20262656
tcp_port GAUGE 原始值 TCP/IP 监听端口 7101
uptime_in_seconds GAUGE 原始值 自 Redis 服务器启动以来,经过的秒数 4923393
uptime_in_days GAUGE 原始值 自 Redis 服务器启动以来,经过的天数 56
hz GAUGE 原始值 redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次 10
lru_clock GAUGE 原始值 以分钟为单位进行自增的时钟,用于 LRU 管理 9633114
executable GAUGE 原始值 执行文件 /home/work/redis_cluster/redis-server
config_file GAUGE 原始值 配置文件路径 /home/work/redis_cluster/redis-pandora/redis_7101/conf/redis.conf

Clients

记录了已连接客户端的信息

connected_clients GAUGE 原始值 已连接客户端的数量(不包括通过从属服务器连接的客户端) 4
client_longest_output_list GAUGE 原始值 当前连接的客户端当中,最长的输出列表 0
client_biggest_input_buf GAUGE 原始值 当前连接的客户端当中,最大输入缓存 0
blocked_clients GAUGE 原始值 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 0

Memory

记录了服务器的内存信息

 

备注:

在理想情况下, used_memory_rss 的值应该只比 used_memory 稍微高一点儿。

1、当 rss > used 时,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。内存碎片的比率可以通过 mem_fragmentation_ratio的值看出。

2、当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟

当 Redis 释放内存时,分配器可能会,也可能不会,将内存返还给操作系统。

如果 Redis 释放了内存,却没有将内存返还给操作系统,那么 used_memory  的值可能和操作系统显示的 Redis 内存占用并不一致。

查看 used_memory_peak 的值可以验证这种情况是否发生。

used_memory GAUGE 原始值 由 Redis 分配器分配的内存总量,以字节(byte)为单位 20854496
used_memory_human GAUGE 原始值 以人类可读的格式返回 Redis 分配的内存总量 19.89M
used_memory_rss GAUGE 原始值 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps等命令的输出一致 31076352
used_memory_rss_human GAUGE 原始值

以人类可读的格式,从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps等命令的
输出一致

29.64M
used_memory_peak GAUGE 原始值 redis的内存消耗峰值(以字节为单位) 21218384
used_memory_peak_human GAUGE 原始值 以人类可读的格式返回redis的内存消耗峰值 20.24M
used_memory_peak_perc GAUGE 原始值 (used_memory/ used_memory_peak) *100% 98.29%
used_memory_overhead GAUGE 原始值 Redis为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog 7293454
used_memory_startup GAUGE 原始值 Redis服务器启动时消耗的内存 1445088
used_memory_dataset GAUGE 原始值 used_memory—used_memory_overhead 13561042
used_memory_dataset_perc GAUGE 原始值 100%*(used_memory_dataset/(used_memory—used_memory_startup)) 69.87%
total_system_memory GAUGE 原始值 整个系统内存 67502866432
total_system_memory_human GAUGE 原始值 以人类可读的格式,显示整个系统内存 62.87G
used_memory_lua GAUGE 原始值 Lua脚本存储占用的内存 37888
used_memory_lua_human GAUGE 原始值 以人类可读的格式,显示Lua脚本存储占用的内存 37.00K
maxmemory GAUGE 原始值 Redis实例的最大内存配置 20000000000
maxmemory_human GAUGE 原始值 以人类可读的格式,显示Redis实例的最大内存配置 18.63G
maxmemory_policy GAUGE 原始值 当达到maxmemory时的淘汰策略 noeviction
mem_fragmentation_ratio GAUGE 原始值 used_memory_rss/ used_memory 1.49
mem_allocator GAUGE 原始值 内存分配器 jemalloc-4.0.3
active_defrag_running GAUGE 原始值 表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行(defrag:表示内存碎片整理) 0
lazyfree_pending_objects GAUGE 原始值 0表示不存在延迟释放(也有资料翻译未惰性删除)的挂起对象 0

Persistence

记录了跟 RDB 持久化和 AOF 持久化有关的信息
loading GAUGE 原始值 服务器是否正在载入持久化文件 0
rdb_changes_since_last_save GAUGE 原始值 离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化 17646277
rdb_bgsave_in_progress GAUGE 原始值 服务器是否正在创建rdb文件 0
rdb_last_save_time GAUGE 原始值 离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件 1548214031
rdb_last_bgsave_status GAUGE 原始值 最近一次rdb持久化是否成功 ok
rdb_last_bgsave_time_sec GAUGE 原始值 最近一次成功生成rdb文件耗时秒数 0
rdb_current_bgsave_time_sec GAUGE 原始值 如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数 -1
rdb_last_cow_size GAUGE 原始值 RDB过程中父进程与子进程相比执行了多少修改(包括读缓冲区,写缓冲区,数据修改等) 8577024
aof_enabled GAUGE 原始值 是否开启了aof 0
aof_rewrite_in_progress GAUGE 原始值 标识aof的rewrite操作是否在进行中 0
aof_rewrite_scheduled GAUGE 原始值 rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof>变为计划任务,待aof子进程结束后执行rewrite 0
aof_last_rewrite_time_sec GAUGE 原始值 最近一次aof rewrite耗费的时长 -1
aof_current_rewrite_time_sec GAUGE 原始值 如果rewrite操作正在进行,则记录所使用的时间,单位秒 -1
aof_last_bgrewrite_status GAUGE 原始值 上次bgrewriteaof操作的状态 ok
aof_last_write_status GAUGE 原始值 上次aof写入状态 ok
aof_last_cow_size GAUGE 原始值 AOF过程中父进程与子进程相比执行了多少修改(包括读缓冲区,写缓冲区,数据修改等) 0

Stats

记录了一般统计信息

total_connections_received COUNTER 计数器 新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置 2693024
total_commands_processed COUNTER 计数器 redis处理的命令数,每秒执行的命令数,比较准确的QPS 25061418
instantaneous_ops_per_sec GAUGE 原始值 redis当前的qps,redis内部较实时的每秒执行的命令数 8
total_net_input_bytes COUNTER 计数器 redis网络入口流量字节数 5903756385
total_net_output_bytes COUNTER 计数器 redis网络出口流量字节数 7136132562
instantaneous_input_kbps GAUGE 原始值 redis网络入口kps 0.51
instantaneous_output_kbps GAUGE 原始值 redis网络出口kps 2.73
rejected_connections COUNTER 计数器 拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数 0
sync_full GAUGE 原始值 主从完全同步成功次数 1
sync_partial_ok GAUGE 原始值 主从部分同步成功次数 0
sync_partial_err GAUGE 原始值 主从部分同步失败次数 1
expired_keys COUNTER 计数器 运行以来过期的key的数量 21727
expired_stale_perc GAUGE 原始值 过期的比率 0.00
expired_time_cap_reached_count GAUGE 原始值 过期计数 0
evicted_keys COUNTER 计数器 运行以来剔除(超过了maxmemory后)的key的数量 0
keyspace_hits COUNTER 计数器 命中次数 1722349
keyspace_misses COUNTER 计数器 没命中次数 33033
pubsub_channels GAUGE 原始值 当前使用中的频道数量 0
pubsub_patterns GAUGE 原始值 当前使用的模式的数量 0
latest_fork_usec GAUGE 原始值 最近一次fork操作阻塞redis进程的耗时数,单位微秒 611
migrate_cached_sockets GAUGE 原始值 是否已经缓存了到该地址的连接 0
slave_expires_tracked_keys GAUGE 原始值 从实例到期key数量 0
active_defrag_hits GAUGE 原始值 主动碎片整理命中次数 0
active_defrag_misses GAUGE 原始值 主动碎片整理未命中次数 0
active_defrag_key_hits GAUGE 原始值 主动碎片整理key命中次数 0
active_defrag_key_misses GAUGE 原始值 主动碎片整理key未命中次数 0

Replication

主/从复制信息(主/从节点信息略有不同,由于Redis Cluster的特殊机制,从节点相关不同信息可忽略)

 

role GAUGE 原始值 实例的角色,是master or slave master
connected_slaves GAUGE 原始值 连接的slave实例个数 1
slave0 GAUGE 原始值 slave实例连接详情 ip=xxx,port=xxx=online,offset=5594467791,lag=1
master_replid GAUGE 原始值 主实例启动随机字符串 2e09454e93fbc2ab5c9fe77b690c275d686d6036
master_replid2 GAUGE 原始值 主实例启动随机字符串2 0000000000000000000000000000000000000000
master_repl_offset GAUGE 原始值 主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟,与master_replid可被用来标识主实例复制流中的位置 5594467791
second_repl_offset GAUGE 原始值 主从同步偏移量2,此值如果和上面的offset相同说明主从一致没延迟 -1
repl_backlog_active GAUGE 原始值 复制积压缓冲区是否开启 2
repl_backlog_size GAUGE 原始值 复制积压缓冲大小 1048576
repl_backlog_first_byte_offset GAUGE 原始值 复制缓冲区里偏移量的大小 5593419216
repl_backlog_histlen GAUGE 原始值 此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小 1048576

CPU

记录了CPU的计算量统计信息

used_cpu_sys GAUGE 原始值 将所有redis主进程在核心态所占用的CPU时求和累计起来 3044.23
used_cpu_user GAUGE 原始值 将所有redis主进程在用户态所占用的CPU时求和累计起来 2051.84
used_cpu_sys_children GAUGE 原始值 将后台进程在核心态所占用的CPU时求和累计起来 0.00
used_cpu_user_children GAUGE 原始值 将后台进程在用户态所占用的CPU时求和累计起来 0.00

Commandstats

记录了各种不同类型的命令的执行统计信息:

命令执行的次数、命令耗费的 CPU 时间、执行每个命令耗费的平均 CPU 时间

(只取命令执行的次数calls的值)

cmdstat_command COUNTER 计数器 Command命令统计 calls=35,usec=22479,usec_per_call=642.26
cmdstat_keys COUNTER 计数器 Keys命令统计 calls=66,usec=19287,usec_per_call=292.23
cmdstat_incrby COUNTER 计数器 Incrby命令统计 calls=5,usec=81,usec_per_call=16.20
cmdstat_hexists COUNTER 计数器 Hexists命令统计 calls=3689,usec=6033,usec_per_call=1.64
cmdstat_lindex COUNTER 计数器 Lindex命令统计 calls=16,usec=110,usec_per_call=6.88
cmdstat_sismember COUNTER 计数器 Sismember命令统计 calls=3254,usec=4200,usec_per_call=1.29
cmdstat_lrange COUNTER 计数器 Lrange命令统计 calls=350,usec=5852,usec_per_call=16.72
cmdstat_replconf COUNTER 计数器 Replconf命令统计 calls=8703340,usec=10757057,usec_per_call=1.24
cmdstat_dbsize COUNTER 计数器 Dbsize命令统计 calls=10,usec=29,usec_per_call=2.90
cmdstat_lpush COUNTER 计数器 Lpush命令统计 calls=720,usec=5361,usec_per_call=7.45
cmdstat_rpush COUNTER 计数器 Rpush命令统计 calls=13797,usec=32706,usec_per_call=2.37
cmdstat_cluster COUNTER 计数器 Cluster命令统计 calls=1131,usec=182483,usec_per_call=161.35
cmdstat_hgetall COUNTER 计数器 Hgetall命令统计 calls=4,usec=22,usec_per_call=5.50
cmdstat_rpop COUNTER 计数器 Rpop命令统计 calls=64727,usec=226536,usec_per_call=3.50
cmdstat_setnx COUNTER 计数器 Setnx命令统计 calls=7765,usec=43709,usec_per_call=5.63
cmdstat_flushdb COUNTER 计数器 Flushdb命令统计 calls=1,usec=51,usec_per_call=51.00
cmdstat_spop COUNTER 计数器 Spop命令统计 calls=3,usec=16,usec_per_call=5.33
cmdstat_type COUNTER 计数器 Type命令统计 calls=10,usec=36,usec_per_call=3.60
cmdstat_ping COUNTER 计数器 Ping 命令统计 calls=8,usec=12,usec_per_call=1.50
cmdstat_info COUNTER 计数器 Info命令统计 calls=5234,usec=154843,usec_per_call=29.58
cmdstat_expire COUNTER 计数器 Expire命令统计 calls=45,usec=170,usec_per_call=3.78
cmdstat_smembers COUNTER 计数器 Smembers命令统计 calls=6,usec=2010,usec_per_call=335.00
cmdstat_llen COUNTER 计数器 Llen命令统计 calls=50,usec=211,usec_per_call=4.22
cmdstat_del COUNTER 计数器 Del命令统计 calls=9519,usec=34725,usec_per_call=3.65
cmdstat_setex COUNTER 计数器 Setex命令统计 calls=372,usec=4018,usec_per_call=10.80
cmdstat_set COUNTER 计数器 Set 命令统计 calls=15,usec=206,usec_per_call=13.73
cmdstat_mget COUNTER 计数器 Mget命令统计 calls=3,usec=7,usec_per_call=2.33
cmdstat_get COUNTER 计数器 Get命令统计 calls=1633,usec=5007,usec_per_call=3.07
cmdstat_ttl COUNTER 计数器 Ttl命令统计 calls=13,usec=66,usec_per_call=5.08
cmdstat_hget COUNTER 计数器 Hget命令统计 calls=13,usec=70,usec_per_call=5.38
cmdstat_psync COUNTER 计数器 Psync命令统计 calls=1,usec=2304,usec_per_call=2304.00
cmdstat_hdel COUNTER 计数器 Hdel命令统计 calls=4,usec=45,usec_per_call=11.25
cmdstat_hset COUNTER 计数器 Hset命令统计 calls=3690,usec=17646,usec_per_call=4.78
cmdstat_hmset COUNTER 计数器 Hmset命令统计 calls=533,usec=4731,usec_per_call=8.88
cmdstat_sadd COUNTER 计数器 Sadd命令统计 calls=3252,usec=5472,usec_per_call=1.68
cmdstat_lrem COUNTER 计数器 Lrem命令统计 calls=14482,usec=740914,usec_per_call=51.16

Cluster

集群有关的信息

cluster_enabled GAUGE 原始值 实例是否启用集群模式 1

Keyspace

数据库相关的统计信息

db0 GAUGE 原始值

db0的key的数量,以及带有生存期的key的数,平均存活时间

(一般情况下默认均为db0,不支持SELECT 命令,集群只使用数据库 0)

keys=80965,expires=11020,avg_ttl=739143519

User-Defined

自定义信息

db0_keys GAUGE 原始值 db0的key的数量 80965
db0_expires GAUGE 原始值 db0带有生存期的key的数量 11020
hgrc_keyspace_hit_ratio GAUGE 原始值 计算key值命中率:keyspace_hits / (keyspace_hits + keyspace_misses) 0.9811

三、汇报指标(图表):

key tag type node
hgrc_connected_clients port GAUGE 已连接客户端的数量
hgrc_blocked_clients port GAUGE 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
hgrc_used_memory port GAUGE 由 Redis 分配器分配的内存总量,以字节(byte)为单位
hgrc_used_memory_rss port GAUGE 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)
hgrc_mem_fragmentation_ratio port GAUGE 内存碎片率,used_memory_rss/used_memory
hgrc_total_commands_processed port COUNTER 采集周期内执行命令总数,比较准确的QPS
hgrc_rejected_connections port COUNTER 采集周期内拒绝连接总数
hgrc_expired_keys port COUNTER 采集周期内过期key总数
hgrc_evicted_keys port COUNTER 采集周期内踢出key总数
hgrc_keyspace_hits port COUNTER 采集周期内key命中总数
hgrc_keyspace_misses port COUNTER 采集周期内key拒绝总数
hgrc_keyspace_hit_ratio port GAUGE 访问命中率
hgrc_db0_keys port GAUGE key的数量
hgrc_db0_expires port GAUGE 带有生存期的key的数量
hgrc_cmdstat_* port COUNTER 采集周期内各种命令执行次数

四、设置监控告警项

Redis Cluster监控

五、Redis延迟时间排查:

如果数据量越来越多,并发写操作很多的情况下,Redis出现响应慢的情况;

可以使用 Redis命令来测试一下redis的响应速度:

redis-cli --latency -h xxx  -c -p xxx

这条命令会向Redis插入示例数据来检查平均延时。 Ctrl+C可以随时结束测试;

下面我们列一下会出现延时的可能:

  • 硬件,系统:硬件问题是所有问题最底层的问题了,如果硬件慢,例如CPU主频低,内存小,磁盘IO慢,这些会让所有运行在上面的系统响应慢;另外,使用虚拟机会让系统运行的性能太为下降;当然,有钱的话,这问题很容易解决;系统方面,Linux本身的系统资源调度也会产生一定的延时。这些一般不会很大,可以忽略不计;

  • 网络:如果客户端和redis在同一台服务器上,使用socket建立连接会比监听 TCP/IP 端口快很多;

  • Redis命令:一些时间复杂度比较高的命令,如 lrem,sort,sunion等命令会花比较长时间;另外,大量的重复连接也会造成延时,重用连接是一种很好的品质;如果有大量写操作,可以使用 pipeline 管道的方式(类似mysql事务),一次性提交,这样数据量也少了,连接次数也少了,不用每次都返回数据,速度自然会快很多;

  • 持久化:Redis持久化需要fork出一个进程来进行持久化操作,这本身就会引发延时,如果数据变化大,RDB配置时间短,那这个代价还是挺大的;再加上,硬盘这东西真有点不靠谱,如果还是虚拟机上的虚拟硬盘,如果还是NFS共享目录,那这延时会让你崩溃。所以,如果系统不需要持久化,关了吧。