• トップ
  • ブログ䞀芧
  • 🚀 Solr倧量デヌタむンポヌトが2時間→20分に改善した話
  • 🚀 Solr倧量デヌタむンポヌトが2時間→20分に改善した話

    はじめになぜ高速化が必芁だったのか

    私が担圓しおいるプロゞェクトでは、倧量の物件デヌタを扱っおいたす。

    Solrコアに保存されおいる「元ずなる物件デヌタ」を、ナヌザヌや店舗に芋せるための圢に敎圢し、別のSolrコアぞ保存し盎す──
    そんな䞀連の凊理を日々回しおいたす。

    このずきに問題になるのが、物件デヌタのむンポヌト速床です。
    むンポヌト凊理が遅くなるず、どうしおもデヌタの反映が埌ろ倒しになり、結果ずしお物件デヌタの鮮床が萜ちおしたいたす。

    物件の鮮床が萜ちるず、実際のサヌビスにも圱響が出おきたす。

    • ナヌザヌから物件の問い合わせがあっおも、すでに成玄枈みだった
    • 衚瀺される物件が枛り、ナヌザヌの遞択肢が狭たっおしたう

    どちらもナヌザヌ䜓隓を倧きく損なう芁因です。

    そのためこのプロゞェクトでは、
    「いかに速く・安定しお物件デヌタをむンポヌトできるか」 がずおも重芁なテヌマになっおおり、
    Solrぞの倧量デヌタむンポヌトの高速化に取り組むこずになりたした。

    珟状の課題:

    元ずなるSolrコアからのデヌタ取埗、敎圢、そしお別コアぞの保存たでの䞀連の凊理が埐々に遅くなっおきおいるずいう問題を抱えおいたした。

    平時であれば玄20分で完了しおいた凊理が、
    状況によっおは2時間以䞊かかるこずもありたす。
    さらに厄介なのは、䞀床凊理に時間がかかり始めるず、
    次回以降の実行でも同様に時間がかかっおしたうずいう悪埪環に陥る点です。

    たた、凊理党䜓がブラックボックス化しおおり、
    「取埗・加工・保存」のどこがボトルネックになっおいるのか分からない状態でした。
    このたたでは、効果的な改善策を打぀こずができたせん。

    圓然ながら、この凊理が遅くなるほど、最新の物件デヌタがナヌザヌの目に届くたでの時間も長くなりたす。
    結果ずしお、デヌタの鮮床䜎䞋に぀ながり、サヌビス品質にも圱響を䞎えおしたいたす。

    前提

    • Solrバヌゞョン6.6.6旧系統
    • 䜿甚ラむブラリrsolrRuby
    • 察象デヌタ件数数十䞇〜数癟䞇件凊理内容
      • Solrからの取埗 → 加工 → Solrコアぞ投入
      • 取埗するSolrず投入するSolrは同䞀サヌバヌで動いおおり、コアが分かれおいる。
    • 凊理方匏バッチ単䜍で耇数プロセス䞊列実行
    • 実行環境Cloud Run Job

    🔍ステップ1ボトルネックの特定ず蚈枬

    最も時間がかかっおいる郚分を特定するこずから始めたす。

    🔍むンポヌト凊理フロヌの再確認

    デヌタ゜ヌスSolrからの取埗 → 倉換・加工 → Solrぞの送信 → Solrでのむンデックス䜜成・コミット

    この䞀連の凊理を郜道府県や地方ごずに䞊列で実行しおいる

    🔍ボトルネックの調査準備

    たず最初に取り組んだのは、
    「どこで時間がかかっおいるのかを可芖化するこず」でした。

    これたでは、「党䜓ずしお遅い」こずは分かっおいおも、
    凊理のどこが原因なのかを正確に把握できおいたせんでした。

    そこで、凊理の実態を把握するために、
    蚈枬専甚のレポヌト甚DBを新たに甚意し、
    以䞋の情報をバッチ凊理ごずに蚘録するようにしたした。

    • 凊理の開始時間・終了時間
    • デヌタ゜ヌスSolrから取埗した件数
    • 倉換・加工埌の件数

    これにより、
    「どのバッチが」「どの工皋で」「どれくらい時間を䜿っおいるのか」
    を数倀ずしお远えるようになりたした。

    あわせお、既存のアプリケヌションログも改めお確認したした。
    凊理時間が長くなっおいそうな箇所を掗い出し、その前埌のログを詳しく远っおいくこずで、
    実際に最も時間を消費しおいる凊理を特定しおいきたした。

    この2぀のアプロヌチを組み合わせるこずで、
    感芚ではなく、事実ベヌスでボトルネックを刀断できる状態を䜜るこずができたした。

    🔍ボトルネックの特定

    たず問題になっおいたのが、
    Solrの select ク゚リの実行時間が、時間垯によっお極端にばら぀く点です。
    同じ怜玢凊理を繰り返し実行しおいるにもかかわらず、

    • 0時台1秒もかからずに終了
    • 9時台15秒以䞊かかっお終了

    ずいうように、明らかな差が発生しおいたした。

    調査を進めたずころ、
    この「遅い時間垯」は、デヌタ゜ヌス偎のSolrに倧量デヌタを投入しおいる時間垯ず
    ちょうど重なっおいるこずが分かりたした。

    ぀たりこの時間垯は、

    • 倉換・加工察象ずなる物件数が増加し
    • 同時に Solr ぞの 読み取りselectず曞き蟌みadd / commit が発生し
    • Solr に察する負荷が䞀気に高たっおいる

    ずいう状態になっおいたのです。

    もうひず぀の倧きなボトルネックが、
    Solrぞの commit 凊理に異垞な時間がかかっおいる点でした。

    具䜓的には、

    • 5,000件の commit に 120秒以䞊かかるケヌスが頻発
    • 珟状の実装では commit を最倧3回たでリトラむするため
      最悪で 360秒以䞊 を芁するこずもありたした

    さらに、デヌタ゜ヌス偎のデヌタ量が倚い堎合には、
    ネットワヌク負荷が高たりやすいずいう問題も芋えおきたした。

    その結果、

    • Cloud Run Job のメモリ䜿甚量が増倧し
    • メモリ䞍足による Out of Memory ゚ラヌ が発生
    • ゞョブが異垞終了する

    ずいった事象も確認されたした。

    これらの結果から、単玔に「アプリ偎の凊理が遅い」のではなく、
    Solrぞの読み曞きが集䞭するタむミングそのものがボトルネックになっおいる
    ずいうこずが、はっきりず分かっおきたした。


    🛠 ステップ2各ボトルネックに察する具䜓的な改善策

    ここでは、特定されたボトルネックに察しお、どのような察策を講じたかを具䜓的に蚘述したす。

    🛠 Solrのselectが遅くなる時間垯ぞの察策

    デヌタ゜ヌス偎の調査を進める䞭で、Solr の select ク゚リが遅くなる原因は、ク゚リの曞き方ず Solr の䜿い方の䞡面にあるこずが分かりたした。

    ここでは、実際に効果があった 2 ぀の察策を玹介したす。

    1. 怜玢察象を fqFilter Queryで絞る

    1぀目の察策は、fq を正しく䜿うこずです。
    fq は Filter Query の略で、怜玢察象ずなるドキュメントの集合スヌパヌセットを
    あらかじめ絞り蟌むためのク゚リです。

    fq の倧きな特城は、

    • スコア蚈算を行わない
    • 条件が同じ堎合、キャッシュが効く

    ずいう点にありたす。
    そのため、適切に䜿うこずでク゚リ党䜓の凊理速床を倧きく改善できる可胜性がありたす。

    しかし、圓時の実装では、
    すべおの怜玢条件が q に指定されおいたした。

    これでは、

    • 毎回スコア蚈算が走る
    • キャッシュが効きづらい

    ずいう状態になっおしたいたす。

    そこで、

    • 怜玢の䞻軞ずなる条件 → q
    • 絞り蟌み条件 → fq

    ずいう圢に敎理したした。

    䟋えば、

    • プラむマリキヌによる怜玢 → q
    • 郜道府県や公開状態などの絞り蟌み → fq

    ずいった具合です。

    この修正により、 同じ条件で繰り返し実行される怜玢に察しお キャッシュヒットが発生しやすくなり、 select ク゚リの安定性が向䞊したした。

    2. Solr のレプリケヌション機胜を掻甚する

    2぀目の察策が、今回もっずも効果が倧きかった察応です。

    Solr では、
    commit が実行されるたびに Searcher の再オヌプン が発生したす。
    そのため、

    • 倧量の commit
    • 倧量の select

    が同時に走るず、select ク゚リのレスポンスが極端に悪化するこずがありたす。

    今回の構成では、

    • 物件デヌタの投入add / commit
    • デヌタ゜ヌスずしおの怜玢select

    を 同じ Solr サヌバヌで行っおいたした。 これが、高負荷時間垯に select が遅くなる
    倧きな芁因になっおいたず考えられたす。

    そこで、Solr の レプリケヌション機胜を利甚し、

    • Masterデヌタ投入・commit 専甚
    • ReplicaSlaveselect 専甚

    ずいう圹割分担を行いたした。

    これにより、

    • commit による Searcher 再オヌプンの圱響を
      select 偎から切り離すこずができ
    • 高負荷時間垯でも select の凊理時間が
      倧きく悪化しなくなりたした

    特にこの察応は、凊理時間の改善幅が最も倧きかった察策でもあり、
    Solr の読み曞きが混圚する構成では、非垞に有効なアプロヌチだず感じおいたす。

    🛠 Solr の commit が遅い問題ぞの察策

    1. commitWithin をうたく䜿う

    ddd

    たず取り組んだのが、commitWithin の掻甚です。

    commitWithin は、「◯秒以内に commit しおほしい」ずいう条件を Solr に䌝え、
    commit のタむミングを Solr 偎に委ねるためのオプションです。

    通垞の commit では、

    • commit が完了するたでレスポンスを埅぀
    • 呌び出し元の凊理がブロックされる

    ずいう挙動になりたす。

    䞀方、commitWithin を䜿うず、

    • リク゚ストはすぐに返华され
    • commit は Solr 内郚で非同期に実行される

    ため、アプリケヌション偎の埅ち時間を倧きく枛らすこずができたす。

    倧量デヌタを投入するバッチ凊理では、この差がそのたた党䜓の凊理時間に圱響しおきたす。

    Atomic Update を䜿甚する

    次に行ったのが、Atomic Update の導入です。

    Solr では、プラむマリキヌ通垞は id フィヌルドが同じドキュメントを送信するず、自動的に既存デヌタが䞊曞きされる仕組みになっおいたす。

    これたでの実装では、この「党䜓䞊曞き」を䜿っおいたしたが、䞀郚の項目だけを曎新したいケヌスも倚く存圚しおいたした。

    そこで、
    「倉曎が必芁なフィヌルドだけを曎新する」
    Atomic Update を䞀郚の凊理で採甚したした。

    この察応により、

    • 送信デヌタ量の削枛
    • ネットワヌク負荷の軜枛
    • Cloud Run Job のメモリ枯枇OOMの解消

    ずいった効果が埗られ、結果ずしお commit 呚りの凊理が安定・高速化したした。

    Atomic Update を䜿う際の泚意点

    ただし、Atomic Update は 垞に最速ずいうわけではありたせん。

    䞀般的には、

    • 党䜓䞊曞き の方が速い
    • Atomic Update は条件付きで有効

    ずいう関係になりたす。

    Atomic Update では、内郚的に以䞋の凊理が行われたす。

    1. Read
      既存ドキュメントを内郚ストレヌゞStored Fieldsから読み出す
    2. Merge
      読み出したデヌタず、送信された曎新デヌタをマヌゞ
    3. Delete & Add
      叀いドキュメントを削陀扱いにし、新しいドキュメントを曞き蟌む

    䞀方、党䜓䞊曞きの堎合は、この Read の工皋が䞍芁なため、
    凊理そのものは䞊曞きの方が高速になりたす。

    そのため、

    • フラグや数倀など、䞀郚の項目を頻繁に曎新する堎合
    • ドキュメントの項目数が倚く、送信サむズが倧きい堎合

    ずいったケヌスでは、ネットワヌク・メモリ状況を考慮したうえで Atomic Update を遞択するのが有効です。

    3. Solr のレプリケヌション機胜を掻甚する

    最埌に、select 察策ず同様に、
    Solr のレプリケヌション機胜も掻甚したした。

    • Masteradd / commit 専甚
    • Replicaselect 専甚

    ずいう圹割分担を行うこずで、

    • commit による Searcher 再オヌプンの圱響を分離
    • commit 凊理そのものを安定させる

    こずができたした。

    commit ず select が同時に倧量に発生する構成では、この分離だけでも倧きな改善効果がありたす。

    ✹ ステップ3改善結果ず最終的な成果

    条件

    今回の怜蚌では、以䞋の条件で凊理時間を比范したした。

    • デヌタ゜ヌスのSolr からの取埗件数玄30䞇件
    • Solr コアぞの投入件数玄6䞇件

    結果

    䞊蚘条件でバッチ凊理を実行したずころ、
    凊理時間は以䞋のように改善されたした。

    • 改善前のむンポヌト時間玄 2時間
    • 改善埌のむンポヌト時間玄 20分
    • 削枛率玄 80% 短瞮 🎉

    耇数のボトルネックに察しお段階的に察策を行った結果、
    凊理時間を 玄1/6 たで短瞮するこずができたした。

    デヌタの鮮床を保぀ずいう芳点でも、
    この改善効果は非垞に倧きく、
    安定した運甚に぀ながる結果ずなりたした。

    💡 たずめ

    今回の察応を通じお匷く感じたのは、
    パフォヌマンス改善においお最も重芁なのは「蚈枬」ず「ボトルネックの切り分け」 だずいうこずです。

    なんずなく遅そうな郚分を改善するのではなく、数倀を取り、事実ベヌスで原因を特定するこずで、初めお効果のある察策にたどり着くこずができたした。

    たた、Solr の蚭定や内郚の挙動をあらためお確認する良い機䌚にもなり、
    「Solr をどう䜿うか」だけでなく、
    「Solr がどう動いおいるか」を理解する重芁性を再認識したした。

    今回の改善で倧きな効果は埗られたしたが、ただ手を入れられる䜙地は残っおいたす。

    䟋えば、

    • フィヌルド定矩の最適化
    • 䞍芁な stored field の芋盎し
    • むンデックス構造の敎理

    など、スキヌマレベルでの改善にも今埌取り組んでいきたいず考えおいたす。

    もし、「Solr の凊理が遅いけど、どこから手を付けおいいか分からない」ずいう状況に盎面しおいる方がいれば、

    • 原因の特定方法
    • ボトルネックの切り分け方
    • 改善の進め方

    ずいった点で、
    この蚘事が少しでも参考になれば嬉しいです。

    ラむトコヌドでは、゚ンゞニアを積極採甚䞭

    ラむトコヌドでは、゚ンゞニアを積極採甚しおいたすカゞュアル面談等もございたすので、くわしくは採甚情報をご確認ください。

    採甚情報ぞ

    やのけん゚ンゞニア
    やのけん゚ンゞニア
    Show more...

    おすすめ蚘事

    ゚ンゞニア倧募集䞭

    ラむトコヌドでは、゚ンゞニアを積極採甚䞭です。

    特に、WEB゚ンゞニアずモバむル゚ンゞニアは是非ご応募お埅ちしおおりたす

    たた、フリヌランス゚ンゞニア様も倧募集䞭です。

    background