はじめに
はじめまして、データ本部検索チームの小山です。
DMMでは検索エンジンのSolrを用いた検索システムを運用しています。検索チームでは主にこの検索エンジンの管理と、検索・更新のデータフローの管理を行っています。
今回、この検索システムのうち検索エンジンと、検索に関わるデータフロー部分をAWS上に移行しました。
そこでここでは以下の項目について紹介したいと思います。
- 既存のシステム構成
- なぜAWSへの移行を行ったか
- 新しいシステムの構成
- 今後の課題
既存のシステム構成について
既存のシステムは全てオンプレ上で動作していました。
下図は検索チームの管理しているシステム群です。
説明に必要な部分のみを抜粋したため、これが全体図ではなく、今回のAWS化に直接関わらない部分は簡略したものを載せています。
ここで特に大きな問題を挙げると以下のものが挙げられます。
- 検索チームで管理できないサーバがある
- 検索エンジンのSolrのバージョンが古く、かつ複数バージョンのSolrの管理をしている
- テスト用の環境がなく、既存環境のスケールもできない
- SolrのデータのバックアップがDBにしか存在しない
- デプロイが全て手動で時間もかかっている
以降、内容の補足をしていきます。
検索チームで管理できないサーバ
基本的なサーバはすべてインフラ部の管理化にあり、事業部から新たに検索システムを使用したいという依頼があった場合には検索チームからインフラ部にIP開放依頼を出し、そこで承認が下りればインフラチームに作業してもらい、事業部に連絡するという手順になっています。
この一連の流れには一週間ほどかかり、事業部は検索システムのテストをするだけでも時間を要してしまい、検索チームとしても複数の部署とのやり取りをすることに余計な時間を取られてしまい、開発効率が下がっていました。
サーバの管理をインフラ部のようなプロに任せることは大きなメリットではありますが、一方で部署をまたいで連絡をすることはそれだけで管理コストの増加につながってしまいます。
また、図には記載がありませんが、サーバ管理だけでなくDBからデータ管理用のHiveへのデータフローや辞書管理フローなども別事業部の管理システムに相乗りしています。
これらのシステムは今回の移行対象ではありませんが、いずれも管理コストの増加につながっています。
複数バージョンのSolrの管理
オンプレで管理・運用されているSolrはバージョン4/5/6の3つが動いている状況でした。また、構成も異なり、Solr4/6はSolrCloud構成で動いているのに対し、Solr5はmaster/slave構成で動いている状況でした。
そして、AWSへの移行検討時点ですでにSolrの最新バージョンは8であり、バージョンの大きな乖離がありました。
Solrのバージョンが低いこと自体は運用には大きく影響していませんでしたが、これでは、今後の検索改善などの際に最新の機能を使うこともできず、Solr単体の性能としても低いものを使い続けることになります。
また、Solrで何か問題が起きた時にドキュメントを見つけることが難しく、調査が困難ということもありました。
テスト環境がなく、スケールもしない
検索エンジンのような大きなシステムはそれだけでも管理コストが大きくかかります。それを普段は使わないテスト環境のために常に用意しておくことは非常に難しく、同じように既存の環境のSolrをスケールアップ/アウトするということも難しいため、性能に大きく関わるような改修はできず、機能レベルのテストを開発環境で行っていました。
SolrのバックアップがDBにしか存在しない
既存のシステムではSolrのバックアップを取っておらず、データ更新の際にDBにも一緒にデータを入れることでDBにバックアップデータを入れています。これはSolr4時点でSolrCloudにバックアップの機能が存在しないためです。
もしSolrのデータを失うようなことがあれば、バックアップのDBから大量のデータをFullDIHでSolrに戻す必要があり、この作業には数日というとてつもない時間がかかってしまいます。
手動デプロイ
スキーマやSolrの設定を変更する際にSolrの再起動を行うことがしばしばあります。基本的にはJettyでプロセスレベルでの再起動を行っているのですが、検索チームで管理しているSolrは全部で10台あり、それらを1つずつ前段のLBから外し、再起動してLBにつけ直すということをやっていました。
本番での作業はミスのないように2人以上で行っているため、Solr全台の再起動に1時間以上2人の開発者のリソースを割いて対応していたことになります。
途中からは、作業時間とミスを少しでも減らそうとシェルスクリプトでSolrのステータスを監視しながら順次デプロイをするようなものを作りました。しかし、それでもデプロイにかかるコストが大きすぎて、他作業に注力できないという問題を抱えている状況には変わりありませんでした。
以上のような問題から、チーム全体の開発効率の大きな低下を招いていたため、今後の検索改善を行いやすいよう、チーム管理のシステムをAWS上に構築し直すことになったわけです。
最新のシステム構成について
AWSに構築した検索システムは下図のようになっています。
AWS上のシステムは全てTerraformで構築しており、コード管理しています。これによってテスト環境を作りたい時にも簡単に構築でき、現行のシステムの把握もしやすくなっています。
EFSはSolrのバックアップの入れ先として利用しており、緊急時にすぐに復旧できるようにしています。Solr8のAPIを利用し、バックアップ・レストアは数分で完了します。
また、Solrの構築先にはEKSを選択しました。
- StatefulSetを採用できるため、ステートを持つ検索エンジンにも適している
- コンテナ管理にすることで、想定外のアプリケーション停止の際などにセルフヒーリングで自動復旧可能
- よりモダンなデプロイ方法の採用
などが理由として挙げられます。
今回Solrのバージョンは最新の8系を使用しており、今後はバージョン追従を定期的に行っていく予定です。
StatefulSetとは
Kubernetesでは、ステートを持つシステムをコンテナ管理するためにStatefulSetというリソースが存在します。PersistentVolumeというストレージをPodにアタッチすることで、データの永続化を行います。EKSではEBSがPersistentVolumeにあたります。
Solrのコンテナ管理
上記のStatefulSetを使用することでSolrやZookeeperなどのステートを持つシステムもコンテナ管理でき、コンテナ運用の恩恵にあずかることができます。
例えば、先に記載した自動復旧などです。KubernetesではReadinessProbeやLivenessProbeという死活監視の仕組みが存在し、問題のあったPodを前段のServiceから自動的に切り離して再起動してくれます。これによって想定外のアプリケーション停止の際に自動で復旧してくれるため、耐障害性を向上できます。
また、StatefulSetはデプロイ時にローリングアップデートを行ってくれ、LBから切り離して再起動して、LBにつけ直す作業が全て自動化されました。これによって、本番作業におけるオペミスや2人体制でのデプロイ作業による開発効率の低下を防ぐことができます。
一方で、これまでプロセスレベルの再起動をしていた部分がOSレベルでの再起動となり、Solrのwarm upが必要になったため、再起動にかかる時間自体は長くなりました。ここは今後の課題となっています。
新システムのまとめ
上記の新システムで、既存システムのいくつかの課題が解消されました。
まず、インフラ部に管理を任せていたサーバのうち、Solrと検索APIについては検索チームの管理となったため、事業部とのやり取りが円滑になりました。Solrのバージョンについても、オンプレ側のSolr4と6で運用されていたものをSolr8に統一したことで、最新のバージョンのSolrを1つ管理するだけとなりました。
テスト環境については、全てのリソースをコード管理し、使いたい時に使いたいスペックのシステムを簡単に構築できるようになったため、必要に応じて作成可能となりました。
バックアップからの復旧は、DBからのFullDIHをして数日かけなければいけなかったのが、Solrのバージョンを上げたことにより数分で完了するようになりました。
デプロイについては手動で行っていたものが、Githubにpushするだけ・slackで専用のデプロイコマンドを発行するだけとなっており、運用コストはかなり減りました。一方でデプロイにかかる時間はSolrについてはwarm upの時間もあり、改善には至っておりません。
今後の課題
ここまでAWS化に伴うシステムの変更とメリットについて主にお伝えしてきました。ここからは、現状の課題と今後の方針について説明します。
上に挙げたとおり、デプロイ方法自体はすごくシンプルになりましたが、Solrの再起動にかかる時間は改善していないため、この時間を短縮する方法は今後も考えていかなければいけません。
また、コンテナ管理化に置いてはいるものの、SolrCloud構成でクラスタを組んでいるためにネットワーク障害に非常に弱くなってしまっています。特定AZでの障害時、EBSを別AZのEC2ノードにアタッチできず、障害復旧が遅れるなどの課題が残っています。
これまで自分たちでサーバの管理を行ったこともなく、AWSやKubernetesの知見もなかったため、運用するだけでも分からないことも多く苦労しているのが現状ですが、1つ1つのシステムを少しずつ理解し、より良い運用を検討していくつもりです。
現在は、更新のデータフロー部分のAWS化を行っており、その後サジェストなど全てのシステムをAWSに移行する予定となっています。
おわりに
今回は検索システムのうち、特に検索のデータフロー部分をAWSに移行した話をさせていただきました。今後も検索チームでは、引き続きAWS化とシステムの運用改善などを行っていく予定です。また、他にもDMMでは検索改善なども行っています。
今回の記事を読んで、技術的に気になった点や話を聞いてみたいことなどがあればぜひ気軽に聞きにきていただければと思います。