redis 简易监控的几种方法
2018-02-05 22:50
411 查看
简介
针对Redis 实现性能监控的几种方法一、使用info命令
命令说明127.0.0.1:6380> info # Server redis_version:3.2.11 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:41a708998db14d05 redis_mode:standalone os:Linux 3.0.76-0.11-default x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.3.4 process_id:16942 run_id:e3996796aba6cff723f1e58feb42fa9ea9515b01 tcp_port:6380 uptime_in_seconds:4215152 uptime_in_days:48 hz:10 lru_clock:3786096 executable:/home/iotweb/local/redis/./bin/redis-server config_file:/home/iotweb/local/redis/redis.conf # Clients connected_clients:2 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:6392944 used_memory_human:6.10M used_memory_rss:13623296 used_memory_rss_human:12.99M used_memory_peak:12523592 used_memory_peak_human:11.94M total_system_memory:33673551872 total_system_memory_human:31.36G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:2.13 mem_allocator:jemalloc-4.0.3 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1510133670 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:2013 total_commands_processed:3129128 instantaneous_ops_per_sec:0 total_net_input_bytes:138114786 total_net_output_bytes:3167119897 instantaneous_input_kbps:0.00 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:1 keyspace_misses:1 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:1107 migrate_cached_sockets:0 # Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU used_cpu_sys:3631.63 used_cpu_user:2210.61 used_cpu_sys_children:0.20 used_cpu_user_children:1.47 # Cluster cluster_enabled:0 # Keyspace db0:keys=53500,expires=0,avg_ttl=0
指标说明
Server 指通用的服务器信息,包括版本号、监听端口、进程ID等
Clients 指客户端信息,包括接入数量、阻塞数量等
Memory 内存信息,包括虚拟内存、物理内存、碎片比例(rss/used)等
Persistence 持久化信息,包括RDB和AOF的相关信息
Stats 统计信息,包括历史命令数、键数量、网络流量等
Replication 主从复制信息,包括slave及backlog相关信息
CPU CPU使用相关信息
Cluster 集群信息
Keyspace 逻辑空间信息,包括数据库键数、超时及TTL信息
参考文档
二、使用redis-stat
项目地址https://github.com/junegunn/redis-stat
项目说明
redis-stat 是基于Ruby实现的一个简单易用的 Redis监控工具
redis-stat 的实现原理基于INFO(见上)命令,相比MONITOR命令来说其对Redis不会产生任何性能影响。
此外 redis-stat项目也提供了Console及Web界面两种展现形式。
如何搭建
redis-stat 的使用需要依赖ruby,但Jruby为我们提供了使用Java的打开方式。
下载Jar包,点击这里
执行启动脚本
java -jar redis-stat-0.4.14.jar 127.0.0.1:6380 3 --server=63800 > monitor.log &
控制台输出
Puma 2.3.2 starting... * Min threads: 0, max threads: 16 * Environment: development * Listening on tcp://0.0.0.0:63800 == Sinatra/1.3.6 has taken the stage on 63800 for production with backup from Puma ┌────────────────────────┬────────────────┐ │ │ 127.0.0.1:6380 │ ├────────────────────────┼────────────────┤ │ redis_version │ 3.2.11 │ │ redis_mode │ standalone │ │ process_id │ 16942 │ │ uptime_in_seconds │ 4216406 │ │ uptime_in_days │ 48 │ │ role │ master │ │ connected_slaves │ 0 │ │ aof_enabled │ 0 │ │ rdb_bgsave_in_progress │ 0 │ │ rdb_last_save_time │ 1510133670 │ └────────────────────────┴────────────────┘ ┌────────┬──┬──┬──┬───┬──────┬──────┬─────┬─────┬─────┬─────┬──────┬─────┬─────┬─────┐ time us sy cl bcl mem rss keys cmd/s exp/s evt/s hit%/s hit/s mis/s aofcs ├────────┼──┼──┼──┼───┼──────┼──────┼─────┼─────┼─────┼─────┼──────┼─────┼─────┼─────┤ 10:26:30 - - 1 0 6.08MB 13.0MB 53.5k - - - - - - 0B 10:26:33 0 0 1 0 6.08MB 13.0MB 53.5k 0.33 0 0 - 0 0 0B 10:26:36 0 0 1 0 6.08MB 13.0MB 53.5k 0.33 0 0 - 0 0 0B
监控效果
使用 http://127.0.0.1:63800/ 地址可以直接访问Web界面,见下图
指标说明
简写 | 指标 | 说明 |
---|---|---|
us | used_cpu_user | 用户空间占用CPU百分比 |
sy | used_cpu_sys | 内核空间占用CPU百分比 |
cl | connected_clients | 连接客户端数量 |
bcl | blocked_clients | 阻塞客户端数量(如BLPOP) |
mem | used_memory | 使用总内存 |
rss | used_memory_rss | 使用物理内存 |
keys | dbx.keys | key的总数量 |
cmd/s | command/s | 每秒执行命令数 |
exp/s | expired_keys/s | 每秒过期key数量 |
evt/s | evicted_keys/s | 每秒淘汰key数量 |
hit%/s | keyspace_hitratio/s | 每秒命中百分比 |
hit/s | keyspace_hits/s | 每秒命中数量 |
mis/s | keyspace_miss/s | 每秒丢失数量 |
aofcs | aof_current_size | AOF日志当前大小 |
三、自研工具
工具简介redis-stat提供了一种简易的方式实现对Redis实例的监控,但多数场景下可能需要进行定制,比如鉴权方式、统计指标、告警等等
为实现更灵活的控制,可利用类似的方式对INFO信息进行解析,以实现自有Redis实例的统一监控。
代码样例
调用info 命令
public String getInfo() { Jedis jedis = get(); try { String infoContent = jedis.info(); return infoContent; } finally { if (jedis != null) { jedisPool.returnResource(jedis); } } }
解析结果
for (String line : lines) { if (line.isEmpty()) { continue; } if (line.startsWith("#")) { part = line.replace("#", "").trim(); continue; } int index = line.indexOf(':'); if (index >= 0) { infoMap.put(part + "." + line.substring(0, index), line.substring(index + 1)); } }
数据转换处理
Map<String, String> infoMap = parseInfo(infoContent); stat.setUsed_cpu_sys(getIntValue(infoMap, "CPU.used_cpu_sys")); stat.setUsed_cpu_user(getIntValue(infoMap, "CPU.used_cpu_user")); stat.setBlocked_clients(getIntValue(infoMap, "Clients.blocked_clients")); stat.setConnected_clients(getIntValue(infoMap, "Clients.connected_clients")); stat.setUsed_memory(getIntValue(infoMap, "Memory.used_memory")); stat.setUsed_memory_rss(getIntValue(infoMap, "Memory.used_memory_rss")); // int cmd = getIntValue(infoMap, "Stats.total_commands_processed"); int exp = getIntValue(infoMap, "Stats.expired_keys"); int evt = getIntValue(infoMap, "Stats.evicted_keys"); int hit = getIntValue(infoMap, "Stats.keyspace_hits"); int mis = getIntValue(infoMap, "Stats.keyspace_misses"); long lastTs = stat.getTimestamp(); long thisTs = System.currentTimeMillis();
实现效果
实例名称 | 用户CPU | 系统CPU | 总连接数 | 阻塞连接 | 使用内存 | 物理内存 | 键数量 | CMD速率 | EXP速率 | EVT速率 | HIT速率 | MIS速率 | 时间 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
appdb0/100.112.56.105:26529 | 2 | 2 | 3 | 0 | 1.0M | 2.0M | 12 | 0 | 0 | 0 | 0 | 0 | 2018/2/5 18:27 |
appdb1/100.112.56.105:26520 | 2 | 3 | 4 | 0 | 1.0M | 2.0M | 8 | 16 | 0 | 0 | 4 | 0 | 2018/2/5 18:27 |
appdb2/100.112.56.105:26523 | 3 | 5 | 3 | 0 | 1.0M | 2.0M | 19 | 52 | 0 | 0 | 5 | 0 | 2018/2/5 18:27 |
相关文章推荐
- memcached监控的几种方法(nagios等)
- LoadRunner监控Tomcat的几种方法
- memcached监控的几种方法(nagios等)
- redis实现加锁的几种方法示例详解
- redis限速器的几种方法
- memcached监控的几种方法(nagios等)
- cacti 监控 mysql 的几种方法 _ 参考用
- 监控tomcat几种方法
- memcached监控的几种方法(nagios等)
- 【mysql】监控数据库和抓取慢查询的几种方法汇总
- LoadRunner监控Tomcat的几种方法
- Redis实现分布式锁的几种方法总结
- LoadRunner监控Tomcat的几种方法
- cacti 监控 mysql 的几种方法 _ 参考用
- 监控摄像机动态范围的几种测试方法
- [转]vb下载网页文件或图片的几种简易方法
- cacti 监控 mysql 的几种方法 _ 参考用
- 简易实现Redis监控自动短信告警
- Tomcat 监控的几种方法
- VB下载网页文件或图片的几种简易方法