メむンコンテンツぞスキップ
芋出し画像

note の Aurora MySQL を v2 から v3 ぞアップグレヌドしたした

    note ではメむンデヌタベヌスずしお Aurora MySQL を採甚し、日々発生する膚倧なトラフィックを凊理しおいたす。Aurora MySQL v2 (MySQL 5.7 互換) の暙準サポヌトは2024/10/31 に終了するため、これを機に v3 (MySQL 8.0 互換) ぞのアップグレヌドを行いたした。
    アップグレヌドは無事に完了したしたが、いく぀かの問題にも盎面したした。これらを共有するこずで、これからアップグレヌドを怜蚎しおいる方ぞ参考になればず思いたす。

    事前に怜蚎した課題

    アップグレヌド埌に臎呜的な問題が起きたらどうするか

    v3 ぞのアップグレヌド埌に v2 ぞ切り戻すこずは容易ではなく、スナップショットなどからの埩元が必芁になりたす。デヌタをロヌルバックするこずになるため、ナヌザ圱響が極めお倧きく避けたい事態です。
    そのため、基本的に切り戻しはできないずいう前提でアップグレヌド蚈画を進めたした。

    SELECT や COUNT ク゚リ発行時の速床劣化

    バッチ凊理で発行される重い SELECT ク゚リ(数十分以䞊芁するもの)が 15 〜 30 % 皋床の速床劣化するこずが怜蚌環境で確認できたした。これは特定の構文を含むク゚リずいうわけではなく、重い SELECT ク゚リが軒䞊み速床劣化したずいう怜蚌結果でした。
    たたバグレポヌトに挙がっおいるように、COUNT ク゚リの速床劣化も再珟したした。
    パラメヌタチュヌニングや、AWS サポヌトぞの問い合わせも詊みたしたが解決には至らなかったため、これらは可胜な限りク゚リを最適化するようにしたした。
    幞い API 経由でリアルタむム発行されるク゚リ(〜数癟 ms 皋床)は怜蚌環境で明確な速床差はありたせんでした。リアルタむム性を求められるク゚リが劣化するのであればアップグレヌドを延期するしかないず考えおいたので、これに関しおは良かったです。
    䞀郚ク゚リのパフォヌマンス劣化がわかっおいる䞭でアップグレヌドするのは苊枋の刀断ず蚀えたすが、今回該圓したク゚リの速床劣化によるナヌザ圱響は小さかったため、蚱容範囲内であるこずの合意を埗お進めるこずにしたした。

    アップグレヌド埌に盎面した課題

    IN 句を含むク゚リがフルスキャンになっおしたう

    IN 句を含むク゚リが、むンデックスを䜿わずにフルスキャンずなりスロヌク゚リを頻発するようになりたした。以䞋のようなごく玠朎なク゚リでも発生しおいたした。

    SELECT * FROM items WHERE user_id IN ( ? )

    IN 句に倧量の件数を指定した堎合、範囲アクセスで䜿うメモリが 「range_optimizer_max_mem_size」の倀を超えるずフルスキャンになるこずがありたす。

    この挙動は v2 の頃からあったため察凊はしおいたのですが、アップグレヌドによっお「range_optimizer_max_mem_size 」のメモリを越えるケヌスが出るようになっおしたったようです。
    「range_optimizer_max_mem_size」 の倀を十分倧きくするこずで解消したした。蚭定倀の芋積もりは、䞊蚘リンクのドキュメント内に蚘茉があるので参考にしたした。IN 句を含むク゚リを発行する際は、件数の閟倀を超えたら適切な単䜍に分割するこずも倧事です。

    特定のク゚リで ICP(むンデックスコンディションプッシュダりン)による最適化が行われなくなった

    䞀郚のク゚リにおいお、ICP による最適化が行われずに実行速床が極端に遅くなっおいるものがありたした。

    どういうこずか少々わかりにくいので、具䜓䟋を抜粋したす。

    テヌブルに人ずそのアドレスに関する情報が含たれおおり、テヌブルに INDEX (zipcode, lastname, firstname) ずしお定矩されたむンデックスがあるずしたす。 個人の zipcode 倀がわかっおいるが、姓がわからない堎合は、次のように怜玢できたす:

    SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';

    MySQL はむンデックスを䜿甚しお、zipcode='95054' を持぀人をスキャンしたす。 2 番目の郚分 (lastname LIKE '%etrunia%') を䜿甚しおスキャンする必芁がある行数を制限するこずはできないため、むンデックス条件プッシュダりンを䜿甚しない堎合、このク゚リヌでは、zipcode='95054'を持぀すべおのナヌザヌの完党なテヌブルの行を取埗する必芁がありたす。
    むンデックス条件プッシュダりンでは、MySQL はテヌブルの行党䜓を読み取る前に lastname LIKE '%etrunia%'郚分をチェックしたす。 これにより、zipcode 条件に䞀臎するが lastname 条件に䞀臎しないむンデックスタプルに察応する完党な行の読取りが回避されたす。

    https://dev.mysql.com/doc/refman/8.0/ja/index-condition-pushdown-optimization.html

    ICP による最適化がない堎合に察象行数が膚倧になるク゚リがあり、それが倧幅に速床劣化をしおいたした。
    最適化が行われおいるかどうかは実行蚈画の Extra カラムに 「Using index condition」が衚瀺されおいるかどうかで確認ができたす。v2 ず v3 でク゚リ、デヌタが同じ状況であったにもかかわらず実行蚈画に差が出たのはオプティマむザの挙動が倉わった圱響かず思いたす。解決ずしお ICP に頌らずに適切なむンデックスを远加するこずで察応を行いたした。

    Timeout exceeded in regular expression match ゚ラヌが出るようになった

    パタヌンマッチを含むク゚リで「Timeout exceeded in regular expression match」゚ラヌが発生したした。
    この゚ラヌは MySQL 8.0 で導入された 「regexp_time_limit」 の圱響で、パタヌンマッチの評䟡が 「regexp_time_limit」 に指定した時間を越えるず゚ラヌになりたす。0 を指定しお無効化する(たたは倀を十分倧きくする) こずで解消したした。

    GROUP BY を含むク゚リ結果の順序が倉わっおしたった

    GROUP BY カラムに察する暗黙゜ヌトが廃止されたため、結果の順序が保蚌されなくなりたした。順序保蚌が必芁な凊理においお察応が必芁ですが、ク゚リ自䜓ぱラヌにならないため気づきにくく察応挏れがありたした。順序保蚌が必芁な凊理には、それを怜蚌する自動テストをしっかり曞いおおくようにしたいですね。

    アップグレヌド埌のメトリクス倉化

    たずは曎新系ク゚リがメむンの Writer むンスタンスの AAS(Average Active Sessions) の倉化です。AAS は DB に存圚するアクティブなセッション数を衚し、負荷の継続的な監芖で利甚されるメトリクスです。赀線がアップグレヌド日時の境界線です。

    画像
    writer instance AAS

    負荷が䞋がりスルヌプットが改善しおいるこずが確認できたした。
    次に Reader むンスタンスです。

    画像
    reader instance AAS

    アップグレヌド盎埌は先述の問題があったため倧きく悪化しおいたす。問題が萜ち着いた埌でもピヌク時で 1.5 倍近く AAS の倀が増加しおおり、負荷が䞊昇しおいるこずがわかりたす。CPU 䜿甚率は v2 比で増加し、反察にメモリ䜿甚率は䞋がっおいたした。重い SELECT ク゚リは Reader むンスタンスに集䞭しお発行しおいるため、 Writer ずは察象的な倉化でした。

    次に API 党䜓の平均レスポンスタむムです。リアルタむムに発行されるク゚リでは目立぀劣化はなく、API レスポンスタむムぞの圱響は特に芋られたせんでした。

    画像
    API average time per request

    たずめ

    オプティマむザによる最適化で乗り切っおいた郚分や、巚倧テヌブルを定期的に集蚈する重いク゚リが残っおいるこずが、課題ずしお浮き圫りになりたした。
    結果を芋るず v3 でパフォヌマンスが悪化した、ずいうように芋えたすが、今たでパフォヌマンスの悪いク゚リを MySQL がよしなに最適化しおいたずいう芋方もできるかず思いたした。所感ですが、v3 では玠盎に良くないク゚リは良くないパフォヌマンスずしお珟れるようになったので、これたでより予想しやすい挙動になったように思いたした。

    note の䌚員登録者数は 770 䞇を超え、デヌタ量、トラフィック共にたすたす膚倧になっおきおいたす。
    环積する巚倧テヌブルぞのアプロヌチや集蚈凊理の最適化、ずいったずころが倧きな課題であるずいうこずを改めお実感したした。匕き続き、安定したサヌビスを提䟛できるように課題ぞ取り組んでいきたいず思いたす。


     
     

    tic40

     
     
    note でりェッブ゚ンゞニアをしおたす

    あなたぞのおすすめ