こんにちは。
Web・iOSエンジニアの三浦です。
今回は、DBと全文検索エンジン間でデータを同期する方法について紹介していきます。
はじめに
今日、データ・ログ分析や、文字通り検索機能を実現するため、SolrやElasticsearchなどの全文検索エンジンが使われることは珍しくありません。
その際、特にデータ分析や検索機能を実現するときは、全文検索エンジンのみにデータが入っているのではなく、DBなどにデータが入っており、それと同期する形で全文検索エンジンにデータを入れることも多いのではないでしょうか。
そうしたとき、現状ではDBと全文検索エンジン間でデータを同期する方法にデファクトスタンダートなどがあまりないように感じます。
そこで今回は、DBと全文検索エンジン間でデータを同期する方法を複数紹介し、適切な選択ができる手助けができればと思っています。
方法
1. バッチ
概要
PHPやPythonなど、好きな言語で書いたプログラムとサーバのcronなどを組み合わせ、定期的にDBと全文検索エンジン間でデータを同期する方法です。
利点
- すでに慣れている言語を使えるため、学習コストが低いです。
- 柔軟性が高く、好きに処理を書くことができます。
- 実装方法や言語にもよりますが、メモリ使用量は比較的少なくなります。
欠点
- 実装方法や言語にもよりますが、膨大なデータには対応しづらく、スケールしにくいことが多いです。
- cronでの実行の場合、完全なリアルタイムの実現は厳しいでしょう。
- 基本的にクラウドのマネージドサービスはありません。
- 柔軟性が高い一方で、細かいハンドリングまで自分で行う必要があります。
使い所
- 比較的データ量が少ないとき
- 使用可能なメモリが少ないとき
- 開発期間が短いとき
2. Logstash
概要
全文検索エンジンの一つであるElasticsearchの開発元であるElastic社が開発している、パイプラインアプリケーションです。
利点
- Javaで構築されていて、比較的動作が高速です。
- Elasticsearchの開発元が開発しているため、Elasticsearchとの親和性が高いです。
- 失敗したときのリトライ処理や最後に取得したデータの保持など、便利な機能がデフォルトで備わっています。
欠点
- 学習コストが高いです。
- Javaで構築されているため、メモリをそれなりに使用します。
- マネージドサービスがほぼないなど、あまり利用されている場所が多くありません。
使い所
- ある程度のデータがあるとき
- Elasticsearchとの同期処理
Apache Spark
概要
大規模データを分散処理できる、分散処理基盤です。
ビッグデータの解析などにも利用されます。
利点
- 分散処理ができ、非常に高速です。
- hadoopの枯れた技術を使用できます。
- AWSのglue、EMRで使われるなど、主要な技術と言えます。
- 今後ますます重要になると考えられるビッグデータの処理など、大規模データ処理に応用できます。
欠点
- 学習コストが高いです。
- かなりメモリを使います。
使い所
- データ量が非常に多いとき
サーバーレス
概要
AWSにおけるglueやfirehoseなど、自前でサーバーを用意せずに使用できるアプリケーションです。
利点
- 簡単な処理であれば、生のアプリケーションを使うよりも面倒事が少ないです。
- マネージングされているため、管理コストが少ないです。
- 機能が提供されていれば、リアルタイム処理が簡単にできます。
- 同じクラウド内のサービスと連携がしやすいです。
欠点
- 複雑な処理をしようとすると柔軟性が低くなります。
- 複雑な処理をしようとすると学習コストが高くなります。
- 使った分だけスケールするので、コストの見積もりが難しくなります。
使い所
- データの整形処理などが簡単なとき
- 同クラウド内のサービス間の連携
さいごに
どんなデータをどのように同期するかはもちろん、使用できる環境や開発期間によっても使うべきツールが異なることがわかりました。
ここに上げた以外にも、例えばDB自体にinsertやupdateが走ったときに動くhookをつけ、それをもとに処理させるなどの方法もありますが、自分の開発内容によって適切に変えていきたいところです。