Open-Falcon 之自定义 Redis Cluster 监控

目录

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

二、采集指标说明

三、汇报指标(图表)

四、设置监控告警项

五、Redis延迟时间排查


Version : Redis 4.0.10

一、采集脚本:Open-Falcon 之 Redis Cluster 监控指标采集脚本

二、采集指标说明:

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

举个栗子

 

自定义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_versionGAUGE原始值Redis 服务器版本4.0.10
redis_git_sha1GAUGE原始值Git SHA100000000
redis_git_dirtyGAUGE原始值Git dirty flag0
redis_build_idGAUGE原始值Git dirty flag11292dc1b967716d
redis_modeGAUGE原始值运行模式,单机或者集群cluster
osGAUGE原始值Redis 服务器的宿主操作系统Linux 2.6.32-888.el6.x86_64 x86_64
arch_bitsGAUGE原始值架构(32 或 64 位)64
multiplexing_apiGAUGE原始值Redis 所使用的事件处理机制epoll
atomicvar_apiGAUGE原始值原子处理apisync-builtin
gcc_versionGAUGE原始值编译 Redis 时所使用的 GCC 版本4.4.7
process_idGAUGE原始值服务器进程的 PID10857
run_idGAUGE原始值Redis 服务器的随机标识符(用于 Sentinel 和集群)ea90c4af7d0628667b461312bff5a51a20262656
tcp_portGAUGE原始值TCP/IP 监听端口7101
uptime_in_secondsGAUGE原始值自 Redis 服务器启动以来,经过的秒数4923393
uptime_in_daysGAUGE原始值自 Redis 服务器启动以来,经过的天数56
hzGAUGE原始值redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次10
lru_clockGAUGE原始值以分钟为单位进行自增的时钟,用于 LRU 管理9633114
executableGAUGE原始值执行文件/home/work/redis_cluster/redis-server
config_fileGAUGE原始值配置文件路径/home/work/redis_cluster/redis-pandora/redis_7101/conf/redis.conf

Clients

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

connected_clientsGAUGE原始值已连接客户端的数量(不包括通过从属服务器连接的客户端)4
client_longest_output_listGAUGE原始值当前连接的客户端当中,最长的输出列表0
client_biggest_input_bufGAUGE原始值当前连接的客户端当中,最大输入缓存0
blocked_clientsGAUGE原始值正在等待阻塞命令(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_memoryGAUGE原始值由 Redis 分配器分配的内存总量,以字节(byte)为单位20854496
used_memory_humanGAUGE原始值以人类可读的格式返回 Redis 分配的内存总量19.89M
used_memory_rssGAUGE原始值从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps等命令的输出一致31076352
used_memory_rss_humanGAUGE原始值

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

29.64M
used_memory_peakGAUGE原始值redis的内存消耗峰值(以字节为单位)21218384
used_memory_peak_humanGAUGE原始值以人类可读的格式返回redis的内存消耗峰值20.24M
used_memory_peak_percGAUGE原始值(used_memory/ used_memory_peak) *100%98.29%
used_memory_overheadGAUGE原始值Redis为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog7293454
used_memory_startupGAUGE原始值Redis服务器启动时消耗的内存1445088
used_memory_datasetGAUGE原始值used_memory—used_memory_overhead13561042
used_memory_dataset_percGAUGE原始值100%*(used_memory_dataset/(used_memory—used_memory_startup))69.87%
total_system_memoryGAUGE原始值整个系统内存67502866432
total_system_memory_humanGAUGE原始值以人类可读的格式,显示整个系统内存62.87G
used_memory_luaGAUGE原始值Lua脚本存储占用的内存37888
used_memory_lua_humanGAUGE原始值以人类可读的格式,显示Lua脚本存储占用的内存37.00K
maxmemoryGAUGE原始值Redis实例的最大内存配置20000000000
maxmemory_humanGAUGE原始值以人类可读的格式,显示Redis实例的最大内存配置18.63G
maxmemory_policyGAUGE原始值当达到maxmemory时的淘汰策略noeviction
mem_fragmentation_ratioGAUGE原始值used_memory_rss/ used_memory1.49
mem_allocatorGAUGE原始值内存分配器jemalloc-4.0.3
active_defrag_runningGAUGE原始值表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行(defrag:表示内存碎片整理)0
lazyfree_pending_objectsGAUGE原始值0表示不存在延迟释放(也有资料翻译未惰性删除)的挂起对象0

Persistence

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

Stats

记录了一般统计信息

total_connections_receivedCOUNTER计数器新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置2693024
total_commands_processedCOUNTER计数器redis处理的命令数,每秒执行的命令数,比较准确的QPS25061418
instantaneous_ops_per_secGAUGE原始值redis当前的qps,redis内部较实时的每秒执行的命令数8
total_net_input_bytesCOUNTER计数器redis网络入口流量字节数5903756385
total_net_output_bytesCOUNTER计数器redis网络出口流量字节数7136132562
instantaneous_input_kbpsGAUGE原始值redis网络入口kps0.51
instantaneous_output_kbpsGAUGE原始值redis网络出口kps2.73
rejected_connectionsCOUNTER计数器拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数0
sync_fullGAUGE原始值主从完全同步成功次数1
sync_partial_okGAUGE原始值主从部分同步成功次数0
sync_partial_errGAUGE原始值主从部分同步失败次数1
expired_keysCOUNTER计数器运行以来过期的key的数量21727
expired_stale_percGAUGE原始值过期的比率0.00
expired_time_cap_reached_countGAUGE原始值过期计数0
evicted_keysCOUNTER计数器运行以来剔除(超过了maxmemory后)的key的数量0
keyspace_hitsCOUNTER计数器命中次数1722349
keyspace_missesCOUNTER计数器没命中次数33033
pubsub_channelsGAUGE原始值当前使用中的频道数量0
pubsub_patternsGAUGE原始值当前使用的模式的数量0
latest_fork_usecGAUGE原始值最近一次fork操作阻塞redis进程的耗时数,单位微秒611
migrate_cached_socketsGAUGE原始值是否已经缓存了到该地址的连接0
slave_expires_tracked_keysGAUGE原始值从实例到期key数量0
active_defrag_hitsGAUGE原始值主动碎片整理命中次数0
active_defrag_missesGAUGE原始值主动碎片整理未命中次数0
active_defrag_key_hitsGAUGE原始值主动碎片整理key命中次数0
active_defrag_key_missesGAUGE原始值主动碎片整理key未命中次数0

Replication

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

 

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

CPU

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

used_cpu_sysGAUGE原始值将所有redis主进程在核心态所占用的CPU时求和累计起来3044.23
used_cpu_userGAUGE原始值将所有redis主进程在用户态所占用的CPU时求和累计起来2051.84
used_cpu_sys_childrenGAUGE原始值将后台进程在核心态所占用的CPU时求和累计起来0.00
used_cpu_user_childrenGAUGE原始值将后台进程在用户态所占用的CPU时求和累计起来0.00

Commandstats

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

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

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

cmdstat_commandCOUNTER计数器Command命令统计calls=35,usec=22479,usec_per_call=642.26
cmdstat_keysCOUNTER计数器Keys命令统计calls=66,usec=19287,usec_per_call=292.23
cmdstat_incrbyCOUNTER计数器Incrby命令统计calls=5,usec=81,usec_per_call=16.20
cmdstat_hexistsCOUNTER计数器Hexists命令统计calls=3689,usec=6033,usec_per_call=1.64
cmdstat_lindexCOUNTER计数器Lindex命令统计calls=16,usec=110,usec_per_call=6.88
cmdstat_sismemberCOUNTER计数器Sismember命令统计calls=3254,usec=4200,usec_per_call=1.29
cmdstat_lrangeCOUNTER计数器Lrange命令统计calls=350,usec=5852,usec_per_call=16.72
cmdstat_replconfCOUNTER计数器Replconf命令统计calls=8703340,usec=10757057,usec_per_call=1.24
cmdstat_dbsizeCOUNTER计数器Dbsize命令统计calls=10,usec=29,usec_per_call=2.90
cmdstat_lpushCOUNTER计数器Lpush命令统计calls=720,usec=5361,usec_per_call=7.45
cmdstat_rpushCOUNTER计数器Rpush命令统计calls=13797,usec=32706,usec_per_call=2.37
cmdstat_clusterCOUNTER计数器Cluster命令统计calls=1131,usec=182483,usec_per_call=161.35
cmdstat_hgetallCOUNTER计数器Hgetall命令统计calls=4,usec=22,usec_per_call=5.50
cmdstat_rpopCOUNTER计数器Rpop命令统计calls=64727,usec=226536,usec_per_call=3.50
cmdstat_setnxCOUNTER计数器Setnx命令统计calls=7765,usec=43709,usec_per_call=5.63
cmdstat_flushdbCOUNTER计数器Flushdb命令统计calls=1,usec=51,usec_per_call=51.00
cmdstat_spopCOUNTER计数器Spop命令统计calls=3,usec=16,usec_per_call=5.33
cmdstat_typeCOUNTER计数器Type命令统计calls=10,usec=36,usec_per_call=3.60
cmdstat_pingCOUNTER计数器Ping 命令统计calls=8,usec=12,usec_per_call=1.50
cmdstat_infoCOUNTER计数器Info命令统计calls=5234,usec=154843,usec_per_call=29.58
cmdstat_expireCOUNTER计数器Expire命令统计calls=45,usec=170,usec_per_call=3.78
cmdstat_smembersCOUNTER计数器Smembers命令统计calls=6,usec=2010,usec_per_call=335.00
cmdstat_llenCOUNTER计数器Llen命令统计calls=50,usec=211,usec_per_call=4.22
cmdstat_delCOUNTER计数器Del命令统计calls=9519,usec=34725,usec_per_call=3.65
cmdstat_setexCOUNTER计数器Setex命令统计calls=372,usec=4018,usec_per_call=10.80
cmdstat_setCOUNTER计数器Set 命令统计calls=15,usec=206,usec_per_call=13.73
cmdstat_mgetCOUNTER计数器Mget命令统计calls=3,usec=7,usec_per_call=2.33
cmdstat_getCOUNTER计数器Get命令统计calls=1633,usec=5007,usec_per_call=3.07
cmdstat_ttlCOUNTER计数器Ttl命令统计calls=13,usec=66,usec_per_call=5.08
cmdstat_hgetCOUNTER计数器Hget命令统计calls=13,usec=70,usec_per_call=5.38
cmdstat_psyncCOUNTER计数器Psync命令统计calls=1,usec=2304,usec_per_call=2304.00
cmdstat_hdelCOUNTER计数器Hdel命令统计calls=4,usec=45,usec_per_call=11.25
cmdstat_hsetCOUNTER计数器Hset命令统计calls=3690,usec=17646,usec_per_call=4.78
cmdstat_hmsetCOUNTER计数器Hmset命令统计calls=533,usec=4731,usec_per_call=8.88
cmdstat_saddCOUNTER计数器Sadd命令统计calls=3252,usec=5472,usec_per_call=1.68
cmdstat_lremCOUNTER计数器Lrem命令统计calls=14482,usec=740914,usec_per_call=51.16

Cluster

集群有关的信息

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

Keyspace

数据库相关的统计信息

db0GAUGE原始值

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

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

keys=80965,expires=11020,avg_ttl=739143519

User-Defined

自定义信息

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

三、汇报指标(图表):

keytagtypenode
hgrc_connected_clientsportGAUGE已连接客户端的数量
hgrc_blocked_clientsportGAUGE正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
hgrc_used_memoryportGAUGE由 Redis 分配器分配的内存总量,以字节(byte)为单位
hgrc_used_memory_rssportGAUGE从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)
hgrc_mem_fragmentation_ratioportGAUGE内存碎片率,used_memory_rss/used_memory
hgrc_total_commands_processedportCOUNTER采集周期内执行命令总数,比较准确的QPS
hgrc_rejected_connectionsportCOUNTER采集周期内拒绝连接总数
hgrc_expired_keysportCOUNTER采集周期内过期key总数
hgrc_evicted_keysportCOUNTER采集周期内踢出key总数
hgrc_keyspace_hitsportCOUNTER采集周期内key命中总数
hgrc_keyspace_missesportCOUNTER采集周期内key拒绝总数
hgrc_keyspace_hit_ratioportGAUGE访问命中率
hgrc_db0_keysportGAUGEkey的数量
hgrc_db0_expiresportGAUGE带有生存期的key的数量
hgrc_cmdstat_*portCOUNTER采集周期内各种命令执行次数

四、设置监控告警项

五、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共享目录,那这延时会让你崩溃。所以,如果系统不需要持久化,关了吧。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值