Table of Contents
目次
- はじめに
- 主なポイント
- Redis について
- Redis のパフォーマンス監視オプション
- Prometheus について
- Prometheus の仕組み
- Redis の監視設定
- データを送信するための Prometheus のセットアップ
- ホストされた Grafana で可視化をプロットする
- Redis Exporter が公開するメトリクス一覧
- まとめ
はじめに
本記事では、Prometheus を使って Redis のパフォーマンスを監視する方法を見ていきます。これにより、Redis 管理者は監視用のインフラを追加設定することなく、すべての Redis クラスタを一元管理できるようになります。
本記事でご紹介する手順を行うには、Graphite と Grafana をプラットフォームで直接使うことができる MetricFire の無料トライアルにサインアップしてください。MetricFire は、オープンソースツールである Graphite と Grafana のセットアップと管理を代行するホスティングサービスです。
主なポイント
- Redis は、データベース、メッセージブローカー、キャッシュなど様々な用途に使われる人気のインメモリデータベースであり、様々なデータ構造やレプリケーションに対応している。
- Redis パフォーマンス監視は Redis 管理者にとって極めて重要であり、Redis Enterprise の内蔵モニタリング、Redis Enterprise ユーザー向けの REST API、Prometheus Metrics Exporter など、複数のオプションがある。
- Redis Exporter のセットアップは、Docker コンテナ、スタンドアロン実行可能ファイル、または Linux SystemD サービスとして実行でき、本番環境でのデプロイには、後者が推奨される。
- Prometheus は、Redis Exporter からメトリクスを取得し、定期的に時系列データベースに保存するように設定されている。
- Redis Exporter は、メモリ使用量、レプリケーション、接続、CPU 使用量などに関するメトリクスなど、幅広いメトリクスを公開する。
Redis について
Redis は最もよく使われているインメモリデータベースの1つであり、データベース、メッセージブローカー、キャッシュとしてよく使われています。また、リスト、セット、ハッシュ、文字列データ型など、様々なデータ構造に対応しており、レプリケーションや LRU(Least Recently Used:最近使用された最小のデータ)消去スキームも標準装備されています。
Redis のパフォーマンス監視オプション
Redis の公式ブログでは、Redis インスタンスを監視する方法について以下のようなオプションが挙げられています:
- Redis Enterprise の内蔵監視機能:Redis Enterprise のクラスタ管理 UI は良い選択肢であり、さまざまなメトリクスの可視化や、アラートメカニズムを提供する。ただし、Redis Enterprise の内蔵監視機能は Redis のエンタープライズユーザーのみが利用できることに留意が必要であり、オープンソースの Redis を使っている場合は、利用可能なオプションではない。
- REST API:ここでも、このオプションは、クライアントが使える Redis メトリクスを提供するのに一連の REST API が公開されている Redis Enterprise ユーザーしか利用できない。この API からデータを消費するには、カスタム開発が必要。
- Prometheus Metrics Exporter:Prometheus Metrics Exporter の使用は、Redis 監視の別のアプローチの1つであり、企業全体で監視ソリューションとして Prometheus が広く採用されていることを考えると、最良の選択肢となる。この選択肢は、ホスティングされた Prometheus とホスティングされた Grafana を使ってこのソリューションをカスタマイズし、無料のオープンソース版などのあらゆる Redis インスタンスを監視するため、最も効果的。
Prometheus について
Prometheus は、もともと SoundCloud によって開発されたオープンソースの監視ソリューションであり、それ以来、多くの組織で監視とアラートのソリューションとして採用されている。Prometheusの利点の1つに、データベースや OS(オペレーティングシステム)など、監視したいシステムのほとんどすべてに対応しているという点が挙げられます。
Redis と Redis のエンタープライズについては、こちらの記事 に詳しく載っていますのでぜひご覧ください。
本記事では、Prometheus を使って、Grafana でデータを可視化します。
Prometheus の仕組み
Prometheus を使った Redis のパフォーマンス監視に入る前に、Redis のアーキテクチャと Prometheus の仕組みについて少し理解しておくことが重要です。Prometheus はプラグイン可能なエクスポータで動作するように設計されています。エクスポータとは基本的に、監視対象のアプリケーションからメトリクスを取得し、Prometheus にデータを供給するスクリプトやサービスのことであり、Prometheus の統合ページには、サードパーティーのシステムで最もよく使われているエクスポータのリストがあります。例えば、今回は Redis Exporter というサービスを使いますが、Redis Exporter サービス は Redis からデータを取得し、ネットワークポート(デフォルトでは 9121)に公開します。
そして Redis exporter が Redis のメトリクスを公開したら、Prometheus にこのポートに接続してデータを読み込み、定期的に時系列データベースに保存するよう指示します。
監視用の Redis の設定
前述のように、Redis Exporter を使って Redis インスタンスからメトリクスを取得し、それを Prometheus インスタンスにフィードします。
Redis Exporter は、Docker コンテナ、スタンドアロン実行可能ファイル、または Linux SystemD サービスとして実行できます。スタンドアロン実行可能ファイルとして実行するのはテストには有効ですが、実稼働環境でのデプロイにはソリューションとしておすすめしません。Docker や Kubernetes などの製品でコンテナのテクノロジーをすでに実行している場合は、コンテナとして実行し、それ以外の場合は、Linux SystemD サービスとして実行するのが一番い方法です。
Redis Exporter を Docker、Kubernetes 上で、またはサービスとして実行する方法の詳細については、Redis Exporter のドキュメントをご参照ください。
エクスポータが起動して実行されると、prometheus.yml に以下の設定を追加するだけで、Prometheus が Redis Exporter サービスを呼び出してメトリックを読み取るようになります。
scrape_configs:
- job_name: redis_exporter
static_configs:
- targets: ['<<REDIS-EXPORTER-HOSTNAME>>:9121']
ここで、<<REDIS-EXPORTER-HOSTNAME>> は、Redis Exporter が実行されているホストを指します。Redis と同じインスタンスで Redis Exporter を実行することもできますし、複数の Redis インスタンスがある場合は、専用のインスタンスで Redis Exporter を実行して、各 Redis インスタンスのメトリックを公開する方がいいですね。
複数の Redis インスタンスがある場合は、以下のように設定を調整する必要があります:
scrape_configs:
## config for the multiple Redis targets that the exporter will scrape
- job_name: 'redis_exporter_targets'
static_configs:
- targets:
- redis://first-redis-host:6379
- redis://second-redis-host:6379
- redis://second-redis-host:6380
- redis://second-redis-host:6381
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: <<REDIS-EXPORTER-HOSTNAME>>:9121
## config for scraping the exporter itself
- job_name: 'redis_exporter'
static_configs:
- targets:
- <<REDIS-EXPORTER-HOSTNAME>>:9121
ターゲットの下にリストされているホスト名は、監視するさまざまな Redis インスタンスを指します。
設定が全部できたら、http://localhost:9121/metrics を参照して、Redis Exporter が Redis からメトリクスを正常に取得していることを確認できます。その際、次のような出力が表示されるはずです:
データ送信のための Prometheus の設定
メトリクスの長期データストレージとして Prometheus を使います。Prometheus にデータを送るには、次のように新しい remote_write セクションと remote_read セクションを追加します。
API キーを取得するには、ブラウザで Hosted Graphite -> Addons -> Prometheus ページにアクセスします。このページには、ローカル Prometheus からメトリックを送るのに使われる安全な API キーが表示されます。
Hosted Grafana で視覚化をプロットする
Prometheus が Redis からメトリクスを受信するようになったので、次はそれを視覚化しましょう。業界をリードする視覚化プラットフォームである Grafana 上に構築された Hosted Grafana を使います。Grafana には、グラフ、ゲージ、単一のメトリクスなどの多くの視覚化オプションと、そのメトリクスに基づくアラート機能が付いています。
remote_write:
- url: https://prod.promlts.metricfire.com/write
bearer_token: Your-API-key-goes-here
remote_read:
- url: https://prod.promlts.metricfire.com/read
bearer_token: Your-API-key-goes-here
Hosted Grafana はすでに Hosted Prometheus と統合されているため、視覚化の作成は、事前構築済みの Redis Grafana ダッシュボードをインポートするのと同じくらい簡単です。
では、https://www.hostedgraphite.com/app で Hosted Graphite にログインし、[Dashboard(ダッシュボード)]→[Grafana]に移動して、Hosted Grafana のアプリケーション ページを開きましょう。
Grafana のダッシュボードサイト自体から利用可能な Prometheus Redis Exporter 1.x 用の Redis ダッシュボードを使います。
「Download JSON(JSON をダウンロード)」のリンクからダッシュボードをダウンロードし、インポートのオプションを使って Hosted Grafana にインポートします。その際、以下に示すように、Prometheus データ ソースとして「metricfire-prometheus-v2」を選択してください:
インポートすると、以下のようにメトリックが視覚化されて表示されます。
Hosted Grafana は、Grafana 上に構築された非常に強力な視覚化ツールであり、これで独自の視覚化を作成できるほか、メトリクスの値が特定のしきい値を超えたときのアラートを設定することもできます。
Grafana アラートを設定し、カスタム ダッシュボードを構築する方法については、こちらの記事(英語)をご覧ください。
また、Kubernetes によって公開されるメトリクスに基づいて、他の種類の視覚化を作成することもできます。より高度なダッシュボードを作成する方法については、こちらの記事をご覧ください。
Redis Exporter によって公開されるメトリクス一覧
Redis Exporter は非常に総合的で、Redis から多くのメトリクスを公開します。主なメトリクスの一覧を以下に挙げてみましょう:
- 稼働時間(秒)
- プロセス ID
- 接続中のクライアント
- ブロックされたクライアント
- 追跡中のクライアント
- クライアントの最近の最大出力バッファ
- クライアントの最近の最大入力バッファ
- アロケータ アクティブ バイト
- 割り当てられた割り当てバイト
- アロケータ レジデントバイト
- アロケータ フラグ比
- アロケータ フラグバイト
- アロケータ RSS 比
- アロケータ RSS バイト
- 使用メモリ
- 使用メモリ RSS
- 使用メモリ ピーク
- 使用メモリ LUA
- 使用メモリ オーバーヘッド
- 使用メモリ スタートアップ
- 使用メモリ データセット
- 使用メモリ スクリプト
- 最大メモリ
- 最大メモリ予約
- 最大メモリ希望予約
- メモリ断片化比率
- メモリ断片化バイト
- メモリ クライアント スレーブ
- メモリ クライアント 正常
- 遅延解放待機中のオブジェクト
- アクティブデフラグ実行中
- キャッシュされたソケットの移動
- アクティブデフラグのヒット数
- アクティブデフラグのミス数
- アクティブデフラグのキーヒット数
- アクティブデフラグのキーミス数
- 期限切れの上限に達した回数
- Pub/Sub チャネル
- Pub/Sub パターン
- 接続されているスレーブ
- レプリケーションバックログのバイト数
- レプリケーションバックログの最初のバイトオフセット
- レプリケーションバックログの履歴バイト数
- マスターのレプリケーションオフセット
- スレーブが追跡しているキーの期限切れ数
- スレーブの優先度
- レプリケーション再同期 完全
- レプリケーション部分再同期 承認
- レプリカ部分再同期 拒否
- クラスタメッセージ送信総数
- クラスタメッセージ受信総数
- サーバスレッド総数
- 長時間ロック待機総数
- 現在のクライアントスレッド
- 受信した接続総数
- 処理したコマンド総数
- 拒否された接続総数
- ネット入力バイト総数
- ネット出力バイト総数
- 期限切れキー総数
- 追い出されたキー総数
- キー空間ヒット総数
- キー空間ミス総数
- 使用中のCPU(システム)
- 使用中のCPU(ユーザー)
- 使用中のCPU(システム 子プロセス)
- 使用中のCPU(ユーザー 子プロセス)
まとめ
本記事では、Prometheus と Hosted Grafana を使って、あまり色々と設定せずに Redis のパフォーマンス監視を行う方法について見てきました。
Hosted Graphite および Grafana の無料トライアルをご希望の場合は、こちらからぜひご登録ください。また、当社の製品について、または MetricFire をどのように活用できるかについてのお問い合わせは、こちらからデモをご予約ください。