btn_arrowcmn-facebookcmn-tiktokcmn-twittercmn-xcmn-youtubecorroborationengineerEngineerhamburgericon-angleicon-arrow-bottom-lineicon-arrow-diagonal-01icon-arrow-diagonal-02icon-arrow-next-01icon-arrow-next-02icon-arrow-strokeicon-arrowicon-close-btnicon-externalicon-facebookicon-fukidashi-01icon-fukidashi-02icon-fukidashi-03icon-fukidashi-04icon-fukidashi-05icon-fukidashi-06icon-fukidashi-07icon-fukidashi-08icon-fukidashi-09icon-fukidashi-10icon-fukidashi-11icon-fukidashi-12icon-fukidashi-13icon-fukidashi-14icon-fukidashi-15icon-fukidashi-16icon-fukidashi-17icon-fukidashi-18icon-fukidashi-19icon-hatebuicon-instagramicon-is-index-illust-01icon-is-index-illust-02icon-is-index-illust-03icon-lineicon-linked_inicon-pinteresticon-rank-dash-offseticon-rank-frameicon-rank-no-frameicon-rank-trophy-item-01icon-rank-trophy-item-02icon-rank-trophy-staricon-triangle-01icon-triangle-02icon-twittericon-xicon-youtubeis-bg-book-01is-bg-book-02is-bg-book-03is-bg-book-04is-bg-book-05is-bg-book-06is-bg-boxis-bg-cupis-bg-desktopis-bg-flagis-bg-glassis-bg-hatenais-bg-human-01is-bg-human-02is-bg-human-03is-bg-human-04is-bg-pcis-bg-plusis-bg-smartphoneis-feature-01-lineis-font-daiis-font-gokuis-font-jiis-font-senis-footer-illust-01is-footer-illust-02is-nav-arrowis-prologue-boxlicense-foreignlicenselogo-gree

【TECH BLOG #40】DB構成変更とMySQLアップデート

グリーエンターテインメント株式会社 エンジニア部 TFです。

今回は運用中のタイトルで行ったDBテーブルの構成変更とMySQLアップデートについてお話しいたします。

DBテーブルの構成変更

今回実施した一つ目の対応がDBテーブルの構成変更となります。

データベースの負荷分散のためシャーディング分割を行っていますが、
データ量が増加してきたため、今後の運用でのアプリ速度低下を未然に防ぐ目的でシャーディング数を4倍にする対応を行いました。
主にプレイヤーのデータを保存しているテーブルのシャーディングに変更が入るため慎重に実施する必要があります。

全プレイヤーのデータを現状の4倍に分割するため作業時間が多くなることが予想されます。

どのくらいの作業時間が必要となるか概算を出すために、本番DBコピーを作成し実際にシャーディング変更を実施したところ、全てのテーブルのシャーディング変更を完了させるためには9時間程度必要なことがわかりました。

大幅なDB構成変更となるため長時間のメンテナンスが必要なことは覚悟していましたが9時間作業し続けるのは体力が必要そうです。
さらに今回のメンテナンスはシャード変更だけではなく後述するMySQLのバージョンアップも含まれるものとなります。

各種作業はDBのバックアップをとってから実施する必要があり・・・
何か問題が発生した場合のバッファをとり・・・
万が一のロールバック発生も考慮すると・・・

20時間以上必要になりそうなため想定していたメンテナンス日時では時間が足りなくなってしまいました。

運用スケジュールを見直してみましたが、メンテナンス日付の変更が難しい状況であったため、作業時間を少しでも短縮させる方向で方法を模索します。
そこで、シャーディング変更作業を各テーブル順に実行するのではなく作業を4タスク並行実行する方法を取ることにしました。
これにより作業時間を大幅に短縮できるため、諸々含めた最終的なメンテナンス時間を12時間まで短縮することができました。(それでも12時間・・・)

4タスク並行実行できるようにシャーディング変更スクリプトを作成し本番を迎えます。

MySQLバージョン変更

今回実施したもう一つの対応がMySQLのバージョン変更です。

MySQLについては5.6を利用中でしたが、サポート期限の終了が迫っているため5.7へのアップデートを実施しました。

アップデートによりsql_modeの指定が必要となったためNO_ENGINE_SUBSTITUTIONを指定します。

また、メモリ上限を設定するrange_optimizer_max_mem_sizeについては、上限値を超えてしまった場合予期せぬスロークエリが発生するため上限なしの0としました。

本番メンテナンスでの実施

開発・stagingでのテストを経ていよいよ本番メンテナンスを行う日がやってきました。

はじめにMySQLのバージョンアップ作業を行います。
この作業は想定通り進行し、予定していた時間的にも問題なく進行できました。

次にシャーディング変更作業を行います。
本番データのコピーで実施したテストでも利用したスクリプトを実行するだけなのですが、本番で実施するというのはやはり緊張するものです。

恐る恐る実行すると・・・

パケットエラーが発生しました。

たとえバッファ時間を取っていて余裕があるとしても本番でのエラー画面ほど心にくるものはありません。

内容を確認するとMySQLへ送るデータ量が大きすぎることと処理のタイムアウトが原因で発生していることがわかりました。
本番環境での設定を確認したところ以下のようになっていたため大量のレコードコピーに耐えきれていない状態でした。

設定を直して再度実行したところエラーなく進行できるようになりました。
あとはひたすら予定している作業を実施していくのみです。

シャーディング変更を終え、メンテナンス開け前の動作確認を行ったところ、一部動作でタイムアウトが発生することが発覚しました。
確認すると一部のテーブルがシャーディング変更後にはパーティションが機能しておらずスロークエリが発生している状態でした。
こちらの問題は該当テーブルにANALYZE TABLEを実行することで解消しました。

まとめ

・大量のデータコピーを行う場合は事前にパケット・タイムアウト設定の見直しを行う
・DB更新時にはANALYZE TABLEを実行する

最後に

なんとかメンテナンスを終えることができましたが12時間のメンテナンスは非常に体力を使うため今後は実施しないでも済むようにしていきたいと思います。

大規模なデータ移行を終えて、保留していた改善タスク等を進めたいので今回はこの辺りで締めたいと思います。
メンテは3時間程度の可愛げのあるものが良いですね。

それでは失礼いたします。

グリーエンターテインメント株式会社 広報担当

東京都港区六本木6-11-1 六本木ヒルズゲートタワー

E-mail:info-ent@ml.gree.net