QassのZabbixは検索基盤としての性能を随時測定しています。性能評価指標は主に以下の2つです。
検索が100QPSで行われているときのQtimeはいくらか、Elasticsearchのチューニングを行った結果Qtimeはどれだけ増減したかなど、性能試験や通常の運用においてこれらの値を記録し可視化することは欠かせません。
従来Qassでは、各サーバー上で一定期間のログから値を抜き出して集計する、といったバッチ的な処理でQPSやQtimeを計算し、その結果をZabbixに送信することで対応していました。しかし、その方法ではサーバーのリソースを運用目的で消費したり、バースト的に負荷が上昇してしまったりするなど、効率が良くありませんでした。そこで、現在ではFluentdとNorikraを使った新方式に移行しています。
Norikraはストリームデータの処理をSQLライクな構文で実施できるミドルウエアです。一定のタイムウインドー(1分間など)の間に条件に合致したレコードや値を集計して返却する仕組みで、これはQPSやQtimeといった一定期間の平均値などを取得する場合に効率的です。Qassでもそのようなメトリクスを収集する際に用いています。
Qassでは、上記の図のように各アプリケーションサーバーからログを集約した後、「fluent-plugin-norikra」でNorikraが動作しているサーバーへ転送・集計結果を取得し、「fluent-plugin-zabbix」を利用してZabbixへメトリクスとして送信することで性能を測定しています。
Qassの検索サーバー群は巨大なインデックスを保持し、常に検索クエリや更新クエリを受け付けています。インデックスの破損・消失が発生しても速やかに復旧できるようにすることは、運用において特に重視すべきところです。
Elasticsearch 1.0.0からSnapshot And Restore APIが利用可能になりました。これを使うとREST APIでインデックスまたはクラスター全体のバックアップ(スナップショット)をリモートリポジトリに保存し、復元することができます。
スナップショットに際しては専用のリモートリポジトリ(以下「バックアップリポジトリ」と呼びます)を用意する必要がありますが、Qassではスケーラビリティを考慮してAmazon S3を利用しています。S3バケットをバックアップリポジトリとして設定し、「AWS Cloud Plugin for Elasticsearch」を検索サーバーに導入した上で次の処理を行います。
バックアップジョブが始まると、ElasticsearchはSnapshot APIを利用してバックアップリポジトリにある過去のスナップショットを分析し、最後に取得した時点からの差分を新たなスナップショットとして保存します。このとき、スナップショット名をYYYYMMDDHHMMと指定することでリストアやパージの際に対象のスナップショットを選択しやすくしています。
バックアップの仕組みは、このようにシンプルですが、リストアの手順も基本的にはインデックスをクローズしてRestore APIを実行するだけと簡潔です。また、スナップショットは障害発生時に限らず、例えば検証用のクラスターをもう一つ他のところに複製するといった使い方もできるため開発時にも役立ちます。実際にQassでも開発環境を構築する際にスナップショットを活用しています。
Qassでは検索品質の向上やアーキテクチャの改善を継続的に行ってきました。今後はどのようなエンハンスを検討しているか、最後に触れておきたいと思います。
上記のように、コアなところや重要な基盤部分については検索ユニットでしっかりと引き受け、外部のリソースを用いて実施できる箇所は外部に任せることで、更なる展開スピードの向上を目指しています。
連載第1回の「リクルート全社検索基盤のアーキテクチャ、採用技術、開発体制はどうなっているのか」でお伝えした通り、検索基盤はマッチングビジネスを展開するリクルートにとって必要不可欠な技術要素です。カスタマーが求めるものは日々変遷し、QassのコアエンジンであるElasticsearchも常に進化しています。そうしたビジネスや技術のトレンドに対応しながら、より多くのサービスにQassを展開していきたいと考えています。
SI企業で公共系Webシステムの運用などを経験後、2014年6月にリクルートテクノロジーズに入社。現在は検索ユニットでインフラ面の開発に従事している。
大手通信会社でネットワークサービスの開発を経験後、2014年10月にリクルートテクノロジーズに入社。現在は検索ユニットやプッシュ基盤のインフラ面での開発に従事。
Copyright © ITmedia, Inc. All Rights Reserved.