2017年6月 1日

アーキテクチャ

Prometheus: Monitoring at ABYSS

  • このエントリーをはてなブックマークに追加

2017年6月5日にYahoo! JAPANのオフィスでLucene/Solr勉強会が開催されます。(パチパチ)

「記念に何か書こう、とにかく書こう、なんかこう面白いやつ、いいから書こうぜ。俺たちよ。」という上司の笑顔に勇気をもらって書きます。(๑•̀д•́๑)

要約

Solr CloudにPrometheusを導入してシステム指標を収集した事例の紹介

背景

Yahoo! JAPANでは、Solr Cloudを利用した検索の共通基盤のABYSS2(第2世代)を社内に提供しています。2017年5月時点で、100以上のサービスに利用され、サーバー数は3000近くで、仮想サーバーや、必要に応じてベアメタルサーバーを利用して運用しています。これだけ規模になると複数のSolr Cloudを横断して指標を可視化する仕組みがあるととても捗るのでPrometheusを導入してみます。

Prometheusとは

Pull型で、直感的に動作する監視のためのソフトウエアです。CNCF(Cloud Native Computing Foundation)に仲間入りしていて、注目度の高いソフトウエアの1つではないかと思います。

なお、本記事ではPrometheus自体の導入や細かい部分については解説しませんのでご了承ください。

導入方法

今回はSolr Cloudの性能指標をJMX経由で取得します。

JMXを有効にする

Using+JMX+with+Solrを参考に設定します。例えば、Jettyの場合は、設定ファイルに以下の内容を追記することで利用できるようになると思います。

start.d/jmx.ini

#
# Initialize module jmx
#
--module=jmx

start.d/jmx-remote.ini

#
# Initialize module jmx-remote
#
--module=jmx-remote

## JMX Configuration
## Enable for an open port accessible by remote machines
jetty.jmxremote.rmihost=127.0.0.1
jetty.jmxremote.rmiport=<任意のポート番号>

JMX Exporter

jmx_exporterjmx_prometheus_httpserverを利用します。ビルドや起動手順は付属のサンプルを参考にすれば特に難しいことはありませんが、Solr CloudのJMXの指標を効率良く取得するための工夫が必要だったので以下に記載します。

configs/httpserver_sample_config.yml

hostPort: localhost:1099

whitelistObjectNames: [ "java.lang:*", "org.eclipse.jetty.util.thread:*", "org.eclipse.jetty.server.handler:*", "solr/*:type=/select,*", "solr/*:type=/update,*", "solr/*:type=searcher,*", "solr/*:type=documentCache,*", "solr/*:type=updateHandler,*"]

rules:
  - pattern: "^java(.(?!OperatingSystem))*$"
  - pattern: "^solr/([a-zA-Z0-9_]+)_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)<type=(.+), id=(.+)><>(.*):"
    name: solr_$4_$6
    labels:
      collection: $1
      shard: $2
      replica: $3
  - pattern: ".*"

whitelistObjectNamesについて

無駄な指標を収集するとPrometheusの負担にもなるのでリソースを節約する観点で設定を行っています。特にSolr Cloudでは、fieldCacheの指標の数が爆発するため、その取得処理のコストが無視できませんでした。

collection/shard/replicaのラベルへの変換について

Prometheusのクエリーで絞り込み検索を可能とすることを目的に以下のような変換処理を行います。

変換前の例

solr_keyword_collectionA_shard1_replica1_update_5minRateReqsPerSecond

変換後の例

solr_update_5minRateReqsPerSecond{collection="collectionA",shard="shard1",replica="replica1"}

Prometheusと、そのダッシュボードのGrafanaでは、クエリー本体に変数展開をすることは難しいため、複数のコレクションを扱うには変数展開が可能なラベルとして扱うのが良いと考えております。

作成したダッシュボード

Grafanaと連携することで非常にシンプルで見やすいダッシュボードが実現できることがおわかりいただけるかなと思います。

ダッシュボードの例

ダッシュボードの例

補足

CPUやメモリなど情報はnode_exporterを併用して取得しています。また、グラフの凡例や縦軸などの情報は掲載のため一部を意図的に削除しております。

今後について

SOLR-10654で、Prometheusが公式にサポートされる話があるようです。このような取り組みが進めばもっと簡単に指標が取得できるようになるかもしれません。また、「この指標を見た方が良いよ!」、「ダッシュボードのJSONよこせ。」など、勉強会の場にはいますので、お気軽に突っ込み頂ければ幸いです。

なお、小生は4月からABYSSチームに配属になったSolr歴2カ月の新人なのでお手柔らかにお願いします。

今後とも、よろしくお願いします。

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加