2019.04.18
実践!Elasticsearch + Sudachi 全文検索エンジン
こんにちは。次世代システム研究室のS.T.です。
今回は、トークイベントにて紹介した「Elasticsearch の実業務への適用例」を、時間の都合上お話できなかった部分の補足などを交えて取り上げたいと思います。
[slideshare id=141064968&doc=2019-1q-2g-blog-190417060750]
概要
実業務で Elasticsearch を使った全文検索エンジンを構築した際に苦労した点や工夫した点をまとめたものです。
Elasticsearch の基本的なアーキテクチャの解説をはじめ、シングルノードでの検証から複数台を用いたクラスタ構成の例の紹介、複数フィールドを持つデータの検索をするための工夫、パフォーマンスチューニングなどを取り上げています。
初学者~実運用を考えている人向けの内容で、特に「いままで Elasticsearch を使ったことはないが、これから使ってみたいと考えている人」を対象にしています。
今回は日本語全文検索エンジンを主題に据えていますが、クラスタ構成やパフォーマンスチューニングはログ集積基盤などにも応用できるかと思います。
補足
コーディネータノード
本編では詳しく触れなかった API リクエストを受け付けるためのコーディネータノードですが、実は公式にそういった名前のノードはありません。
公式に用いられているのは「コーディネータ専用ノード」という名称で、データノードやマスタ適格ノードのフラグを false としてコーディネータとしての仕事に専念させるノードをこのように呼んでいます。
大規模なクラスタでは複数台のコーディネータ専用ノードを設けて、アプリケーションからのリクエストはこのノードにロードバランシングすることで良好なパフォーマンスが得られるようです。
CMS-GC について
本編では簡単な紹介に留めるため無視していましたが、Concurrenet Cycle は複数のフェイズで構成されており、一部のフェイズでは STW が発生します。
そのため、Concurrenet Cycle は頻発しても良いというわけではなく、やはりバランスが重要です。
(そもそも Concurrenet Cycle が頻発するということは Young GC も同じ回数以上は発生していますよね)
また、Concurrenet Cycle を実施しても十分な空き領域が得られない場合は、全領域の不要なオブジェクトの解放とコンパクションを行う Full GC が発生します。これは最も長い時間を要する GC なので、できる限り避けたいものです。
※文献によっては Concurrenet Cycle を Full GC と呼称している場合もあります。
2g-analyzer の用途
2g-analyzer を使用すると、スライド中にあるように 2 文字ずつに区切った解析結果が得られます。
もちろんこれを使うだけでは良い検索結果は得られないので、Sudachi で解析したフィールドと組み合わせて使います。
2g-analyzer のフィールドの重みを小さく設定することで、出品数の少ない珍しい商品を検索した際に、低順位に少しでも関連がありそうな商品を出すことを狙っています。
Snapshot API
効率的にバックアップを取ることができる仕組みであり、大変便利な API ですが、若干の制約があります。
それは、クラスタに参加している全ノードが共用できるストレージ(NFS や外部のオブジェクトストレージなど)を使用しなければならないという点です。
クラスタ全体で同じデータを管理しているため、ある意味自然な制約ですが、小規模なクラスタで検証したい場合などは少し手間ですね。
CMS-GC / G1GC
Java 9 から G1GC がデフォルトというお話は本編でも触れましたが、実は同時に CMS-GC が非推奨になっています。
今後ElasticsearchのデフォルトもG1GCになるかと思いますが、執筆時点では CMS-GC がデフォルトとなっているようです。
継続して使う予定がある方は、リリースノートなどをウォッチしていただければと思います。
参考ドキュメント
Elasticsearch 公式ドキュメント
API や 設定などを網羅したドキュメントです。非常に多くの情報が書かれており、過去バージョンの情報も参照することができますが、これ単体で Elasticsearch を使いこなすのは至難の業かと思います。Elasticsearch はブログなどで知見を公開している方がたくさんいらっしゃるため、それらの情報を参照しつつ、キーワードをもとに公式ドキュメントで自分が使っているバージョンの正確な情報を調べるような使い方がオススメです。
Elasticsearch 実践ガイド, 惣道 哲也(インプレス)
Elasticsearch を網羅的に解説した書籍です。アーキテクチャの解説から導入・設定、API やクエリによる操作まで網羅されています。
Elasticsearch は柔軟なクエリが使える反面、慣れるまでやや複雑に感じる上、公式ドキュメントは個々の機能に散らばって記載されているため、この書籍のようなまとまった解説は非常に重宝します。
Java パフォーマンス, Scott Oaks(O’Reilly Japan)
パフォーマンスを意識した Java のコードを書く際の指針が中心的な内容の書籍ですが、ガベージコレクタの解説も詳しく記載されています。直接 Elasticsearch のパフォーマンスチューニングに役立てるというよりは、自分が変更した GC のパラメータがどの仕組みに作用するのかを理解して、より効果的なチューニングを実施できるかと思います。
さいごに
今回紹介したのは特定のサービスの例ですが、ベーシックな日本語全文検索エンジンを構築したい場合は近い構成で実現できるのではないでしょうか。
Elasticsearch は10年近い歴史のあるアプリケーションですが、Type の廃止という大きな変更が入るこのタイミングで、まずはシングルノードから試してみませんか?
次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。アプリケーション開発の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD