zoukankan      html  css  js  c++  java
  • redis 简易监控的几种方法

    简介

    针对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的打开方式。

    1. 下载Jar包,点击这里
    2. 执行启动脚本
    java -jar redis-stat-0.4.14.jar 127.0.0.1:6380 3 --server=63800 > monitor.log &
    
    1. 控制台输出
    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-live等若干开源项目

    三、自研工具

    工具简介
    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
  • 相关阅读:
    redis在实践中的一些常见问题以及优化思路(包含linux内核参数优化)
    分库分表基本概念
    产品经理黑话
    在linux虚拟机中安装部署MySQL数据库
    计算机专业本科自考
    在项目中重新搭建一套读写分离+高可用+多master的redis cluster集群
    扔掉工具类,Mybatis一个简单配置搞定数据加密解密!
    两台Linux系统之间传输文件使用scp的解决方案
    博客园积分排名前3000名
    内网穿透在家远程连接公司电脑<强烈收藏,早晚用得上>
  • 原文地址:https://www.cnblogs.com/littleatp/p/8419744.html
Copyright © 2011-2022 走看看