Prometheusを使ってRedisを監視する方法

By 清水 孝郎 - SEPTEMBER 24, 2021

SHARE:

本文の内容は、2021年9月23日にDavid de Torres Huertaが投稿したブログ(https://sysdig.com/blog/redis-prometheus)を元に日本語に翻訳・再構成した内容となっております。

Redisは、シンプルだが非常によく最適化されたキーバリューオープンソースデータベースで、クラウドネイティブなアプリケーションで広く使われています。この記事では、PrometheusでRedisを監視する方法と、見るべき最も重要なメトリクスを学びます。

Redisはそのシンプルさにもかかわらず、多くのKubernetesやクラウドアプリケーションの重要なコンポーネントとなっています。その結果、パフォーマンスの問題やそのリソースの問題は、アプリケーションの他のコンポーネントの障害を引き起こす可能性があります。

Prometheusを使ってRedisを監視する方法を知り、トップメトリクスや主要なパフォーマンス指標についてアラートを出すことで、Redisデータベースが正しく機能していることを確認し、潜在的な問題をトラブルシューティングすることができるようになります。

Cute redis logo (with a smile, arms and legs) is laid on a doctor's chair, while having a checkupお医者さんの椅子に寝そべって診察を受けているかわいいRedisのロゴ(笑顔、手足付き)

Redis Prometheus エクスポーターのインストール方法

Prometheusは、Kubernetes環境でアプリケーションを監視するためのデファクトスタンダードとなっています。PrometheusでRedisを監視するには、Redis Exporterを使用します。

まず、Redisでエクスポーター用のユーザーを、統計情報を取得するのに十分な権限で作成し、メトリクスを生成できるようにする必要があります。これは、redis cliを使って以下のコマンドを実行し、USERNAMEとPASSWORDをエクスポーターユーザーのユーザー名とパスワードに置き換えて行います。

ACL SETUSER USERNAME +client +ping +info +config|get +cluster|info +slowlog +latency +memory +select +get +scan +xinfo +type +pfcount +strlen +llen +scard +zcard +hlen +xlen +eval allkeys on >PASSWORD

次に、先ほどRedisで作成したユーザーとパスワードで、エクスポーターをインストールするSecretをKubernetesのネームスペースに作成します:

kubectl create -n redis-exporter-namespace secret generic redis-exporter-auth \
  --from-literal=user=USER \
  --from-literal=password=PASSWORD

あとは、エクスポーター用のデプロイメントを作成するだけです。以下の例を参考にして作成してください:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: redis-exporter
spec:
 selector:
   matchLabels:
     app: redis-exporter
 replicas: 1
 template:
   metadata:
     labels:
       app: redis-exporter
     annotations:
       prometheus.io/port: "9121"
       prometheus.io/scrape: "true"
   spec:
     containers:
     - name: redis-exporter
       image: oliver006/redis_exporter:latest
       ports:
         - containerPort: 9121
       env:
       - name: REDIS_ADDR
         value: 'redis://redis:6379'
       - name: REDIS_USER
         valueFrom:
           secretKeyRef:
             name: redis-exporter-auth
             key: user
       - name: REDIS_PASSWORD
         valueFrom:
           secretKeyRef:
             name: redis-exporter-auth
             key: password
       resources:
         limits:
           memory: "256Mi"
           cpu: "256m"

ディプロイメントマニフェストの環境変数 REDIS_ADDR の値を、Redis サーバーのエンドポイントに合わせて編集することを忘れないでください。


エクスポーターのデプロイメントを適用すると、Prometheusはすでに標準的なアノテーションを持っているので、自動的にRedisのメトリクスのスクレイピングを開始します。

Redisのパフォーマンスメトリクス トップ5

#1 可用性

PrometheusでRedisをモニターする最初のステップは、サーバーの稼働時間です。メトリクスのredis_uptime_in_secondsは、サーバーにおいて最後の再起動がいつ行われたかという情報を提供します。このメトリクスのアラートは、予定外の再起動を特定するのに役立ちます。

redis_uptime_in_seconds < 300

#2 接続の使用状況とエラー

redis_rejected_connections_totalという指標で拒否された接続を検出するPromQLクエリーを書いてみましょう。

(rate(redis_rejected_connections_total[5m])) > 0

拒否された接続は、Redisがクライアント接続の最大数に達したために発生する可能性があります。redis_connected_clientsとredis_config_maxclientsメトリクスを使用して、Redisサーバーで利用可能な接続数を計算することができます。

redis_config_maxclients - redis_connected_clients

また、ネットワーク接続の使用率が85%を超えたときに検知するアラートを作成することもできます。

(redis_connected_clients / redis_config_maxclients) > 0.85

Prometheusのクエリの書き方についてもっと詳しく知りたいですか?
PromQL getting started guide をご覧ください。PromQL cheatsheet もあります!

#3 レイテンシー

Redis サーバーに高いレイテンシーの問題があることを検出するには、さまざまな方法があります。その1つは、redis_slowlog_lengthメトリクスを監視することです。redis_slowlog_lengthは、他のデータベースと同様に、実行に時間がかかりすぎたクエリーを登録します。このメトリクスを監視するには、以下のPromQLクエリを使用します:

rate(redis_slowlog_length[5m])

また、redis_commands_duration_seconds_totalおよびredis_commands_processed_totalメトリクスを使用して、Redisサーバーの平均応答時間を計算することができます。以下のクエリーは、平均応答時間が250msを超えたときにアラートを発します:

(rate(redis_commands_duration_seconds_total[5m]) /  rate(redis_commands_processed_total[5m]) ) > 0.250 

#4 キャッシュヒット率

ほとんどのデータベースと同様に、Redisは応答時間を短縮し、パフォーマンスを向上させるためにインメモリキャッシュを使用しています。ヒット率が低いと、Redisデータベースの応答時間が長くなってしまうことがあります。キャッシュヒット率を計算するには、以下のPromQLクエリを使用します。

(rate(redis_keyspace_hits_total[5m])
  / (rate(redis_keyspace_misses_total[5m])
    + rate(redis_keyspace_hits_total[5m])))

一般的な数値は0.9以上になるはずです。また、redis_evicted_keys_totalメトリクスを監視することで、インメモリーキャッシュからディスクに退避されているキーの数を評価することができます:

rate(redis_evicted_keys_total[5m])

#5 メモリ使用量

キャッシュのヒット率が高かったり、消去されるキーの数が多かったりすることは、利用可能なメモリが少ないことを示しています。Redis_memory_max_bytesとredis_memory_used_bytesメトリクスを使って、Redisサーバのメモリ使用量を計算することができます。

100 * redis_memory_used_bytes / redis_memory_max_bytes

また、Redisが利用可能なメモリをどのように使用するかを最適化するために、redis_mem_fragmentation_ratioメトリクスを使用してフラグメンテーション比率を確認することができます。1.5以上の値は、メモリを最適に使用するために、Redisサーバーを再起動する必要があることを意味します。このようにアラートを作成することができます。

redis_mem_fragmentation_ratio > 1.5

Redis監視ダッシュボード

この記事では、オープンソースのエクスポーターを使用してPrometheusでRedisを監視する方法を学びました。また、Redis インスタンスが正しく機能しているかどうかを確認し、データベースに起こりうる問題をトラブルシューティングするために、どのような Redis のトップパフォーマンスメトリクスを見るべきかについても学びました。

是非、GrafanaとSysdig Monitorの両方に対応した、無料のRedis監視ダッシュボードをお試しください。



Prometheusサーバをセットアップしたくありませんか?

今すぐSysdig Monitorの無料トライアルに登録して、SysdigのマネージドPrometheusサービスでRedisサーバのモニタリングを開始してください。いくつかのPrometheusモニタリング・インテグレーションと、インフラストラクチャーの監視やトラブルシューティングのガイドとなる多くのダッシュボードが用意されています。