2017-03-21

Redis 監控指標及監控工具

Redis (REmote DIctionary Server), 是一個 Key-Value 資料庫,跟 memcached 很類似,資料皆儲存在記憶體中,不同的是 Redis 對於資料儲存的限制比較少(memcached: key 最長 250 bytes,value 最大 1MB,時間 最長過期時間: 30 天),還可以設定定期地將資料儲存至硬碟。

而為了達成 DevOps 與提高 SLA 系統及相關資源的監控都是必要的,今天就來看看該怎麼監控 redis


Redis 監控警示的價值

  1. redis 故障快速通知,定位故障點
  2. 分析 redis 故障的 Root cause
  3. redis 容量規劃和性能管理
  4. redis 硬體資源利用率和成本

監控指標 1 (詳細資訊請參考 How to Monitor Redis)

  1. 必要程序依預期執行

    衡量指標 說明 建議警示標準
    redis process 常駐程式正確執行中 redis 執行個數 != 1.
    uptime 確保服務不會一直重複 uptime < 300s.
  2. 系統資源使用不超出限制

    衡量指標 說明 建議警示標準
    Load all-in-one 效能指標. 高 load 會直接造成效能降低 load > cpu 核心數.
    CPU usage 如果 cpu 使用率沒有滿百,可以忽略 None
    Memory usage 記憶體使用量取決於儲存的資料量,但不該影響 os 的基本運作 None
    Swap usage Swap 是為了緊急情況使用的,其他情況不應使用,如果使用量有增加表示性能正在衰退中 used swap > 128MB.
    Network bandwidth 流量與連線數及查詢量相關,通常只用來排除問題不需刻意警示 None
    Disk usage 確保有足夠的空間來儲存新資料、log、暫存檔案、snapshot 或是備份 磁碟使用率 > 85%
  3. 成功執行查詢

    衡量指標 說明 建議警示標準
    connected_clients 連線至 redis 的連線數 connected_clients < 最小 application 數
    keyspace key 總數量. 可用來與 hit_rate 比較來除錯. None
    instantaneous_ops_per_sec 每秒處理的命令數 None
    hit rate (calculated) keyspace_hits / (keyspace_hits + keyspace_misses) None
    rdb_last_save_time 上次儲存至磁碟的 timestamp(有啟用 persistence 才有用) rdb_last_save_time is > 3600 秒 (可接受的時間間隔)
    rdb_changes_since_last_save 上次儲存至磁碟後的修改量(暫存在 memory 重開後資料會不見) None
    connected_slaves 主要 redis 的 slave 數 connected_slaves != cluster 中 slave 總數.
    master_last_io_seconds_ago master 與 slaves 有多久沒互動 master_last_io_seconds_ago is > 30 秒 (可接受的時間間隔)
  4. 服務正確運作

    衡量指標 說明 建議警示標準
    latency redis 平均回應時間 latency > 200ms (最長可接受時間).
    used_memory redis 使用量
    如果超過硬體限制就開始 swap 而造成效率大幅下降
    可以使用 maxmeomry 來設定上限
    None
    mem_fragmentation_ratio memory 碎片化比例,高碎片化比例會造成 swap 及效能低落 mem_fragmentation_ratio > 1.5
    evicted_keys 因為 redis memory 使用量達到 maxmemory 時被刪除的 key 數量
    如果被刪除的 ket 太多時表 latency 會增加
    None
    blocked_clients 被 blocking 的連線數(BLPOP,BRPOP,BRPOPLPUSH 皆會造成 blocking) None
  5. 常見故障位置

    衡量指標 說明 建議警示標準
    rejected_connections 因為 maxclient 限制而被拒絕的連線數 rejected_connections > 你需要的連線數.
    keyspace_misses 尋找 key 失敗的數量 只有在非 blocking 操作(BRPOPLPUSH, BRPOP and BLPOP), 且 keyspace_misses > 0.
    master_link_down_since_seconds master 與 slave 連接中斷的時間(以秒計)
    如果重新連線會需要重新發送 sync 指令而影響效能
    master_link_down_since_seconds is > 60 秒.

監控指標 2

詳細資訊請參考 細說Redis監控和告警,內容非常豐富,又是中文的就不另外 copy and paste 了

監控工具

  1. redis-cli info command

    redis 原生提供的指令,可以提供 redis server 的重要資訊及統計資訊

    • server: redis server 相關資訊
    • clients: Client 端連線資訊
    • memory: Memory 使用狀況
    • persistence: 持久性 (RDB and AOF) 相關資訊
    • stats: 一般統計資訊
    • replication: Master/slave 複寫資訊
    • cpu: CPU 使用率資訊
    • commandstats: Redis commands 統計
    • cluster: Redis Cluster 資訊 (如果已啟動)
    • keyspace: Database (key 逾期) 相關統計資訊
  2. redis-cli monitor command

    redis 原生提供的指令,用來 debug ,會回傳所有 redis 收到的指令

    • 可以使用 QUIT 來停止 monitor 指令
    • 需要注意的是:因為回傳所有指令的關係,monitor 指令會影響 redis 執行效能
    • 未使用 monitor

      1nomonitor

    • 使用 monitor

      2withmoniotr

    • 依我自行測試的結果(如上兩張圖),並沒有非常明顯的差異,但大陸網友測試在某些特定條件,可能會降低 50% 吞吐量,如果想要仔細了解可以參考 這裡
  3. redis-stat

  4. RedisLive

    • Python 撰寫
    • 有 google jsapi dependency,會自動連線 google 線上服務,有大陸網友自製拔除 jsapi 的版本,請參考 GitHub
    • 相關使用可以參考 Redis監控工具,命令和調優
  5. opserver

參考資料

  1. How to Monitor Redis
  2. Redis監控工具—Redis-stat、RedisLive
  3. 細說Redis監控和告警

沒有留言:

張貼留言