
【cocone TECH TALK VOL.4・前編】膨大になったDBを何とかする【イベントレポート】
-
2021年10月26日
こんにちは!cocone tech blog編集長のYです!
今回は2021年9月30日に行われた「cocone TECH TALK VOL.4」でお話した内容をまとめたものを前編・後編に分けてご紹介します!
本記事は前編として「膨大になったDBを何とかする」というテーマについての発表を記事にしたものになります。
はじめまして、『ポケコロ』サーバー開発をしている忻です。
今回は最近ポケコロチームで行ってきた取り組みについてお話していきます。
登壇者紹介
現状について
『ポケコロ』ではMariaDB、MongoDB、Redisなど様々なDBを機能によって使い分ける形となっています。
今回問題となったのはMariaDBについてです。
『ポケコロ』のMariaDBの構成はmaster-slave構成です。現在masterのディスク使用量が最大92%まで上昇しており、さらには毎月3~4%程度増え続けている状態となっています。単純計算をするとあと2ヶ月で使用量が100%に到達してしまいます。
また、容量だけではなくslow queryが出やすい状態にもなってしまっているため、slaveの遅延が酷くなるとサービスに影響が出てしまうため、こちらについても対応が必要となります。
DBの中身について
そんな『ポケコロ』のDBには何が入っているのか確認してみます。
『ポケコロ』は着せ替えアバターアプリのため、「所持しているアイテム」についてのデータが多く約50%ほどを占めています。
続いて「保存しているコーディネート」についてのデータが約15%、アイテムの獲得履歴と移動履歴が約15%程度を占めています。
アイテムの所持数に上限がないため、所持しているアイテムについてのデータ量はどんどん増えていきます。また、履歴のデータについても基本的には削除をしていないため、こちらもどんどんとデータ量が増えていきます。
問題を改善するには
この状態を改善するにはどうすれば良いのか?ということを考えるのですが、サーバースペックを上げるのにも限界があり、仮に容量を拡張できたとしてもslowqueryが解決できないなど問題は残ります。
しかし、今最も手をつけなければならない問題は、如何にしてデータ量を減らし要領を確保するかです。
データ量を減らし、容量を確保するために、これらの4つの方法を考えました。
- 必要のないデータを消す
- 履歴データに保存期間を設ける
- 格納する元データを軽量化する
- 似ているデータをひとまとめにする
2つめの方法について、履歴に関するデータは今までお客様に過去3ヶ月分のデータしか見せていないため、削除を実行することで容量を確保できると思っていたのですが、簡単に削除するわけにはいきませんでした。
理由としては大きく3つあり、1つめの理由はお問い合わせが頻繁にあり、以前のデータを調べる必要があるため、2つめの理由は『ポケコロ』はソーシャルアプリなので警察に情報の提供をする場合があるためです。そして3つめの理由は履歴データは分析をする材料でもあるので、削除してしまうと分析をすることができなくなるためです。
これらの理由を踏まえた上で各部署に確認をとり、データの削除に取り組みました。
さて、これで容量問題は解決されたように思えましたが、実際には不要なデータや期間を過ぎた履歴データを削除したのにもかかわらず使用しているディスク容量はあまり減っていませんでした。
消すことができるデータはほんの一部なので、これだけではまだ足りません。
そこでさらにデータを移動させる3つの方法を考えました。
- 同じDBの別インスタンスに移す
- 違うDBに移す
- 非アクティブユーザーデータのアーカイブ
1番の同じDBの別インスタンスに移す方法は一見簡単そうに見えるのですが、オンプレミスのためDBサーバーを用意するのに結構時間がかかります。また、RDBなので別インスタンスにする場合は分散トランザクションにする必要があり、開発コストもかかります。
なので今回は2,3番の方法を選びました。
2番の方法では、MariaDBからMongoDBへ移行をします。その時に可能な限り1User 1Documentにし、予めshardingにします。
3番の方法では、非アクティブユーザーのデータをアーカイブ用のDBに移動させ、masterからデータを削除します。この時にそのユーザーが復帰した場合に、自動的にアーカイブからデータを戻せる方法も用意しました。
結果
上記の方法を試して行った結果、現在のディスク使用量は80%前後となりました。現在もデータの移動中のため、今後60%ほどまでディスク使用量を減らすことができるのではないか、と考えています。
課題
今回容量の危機を一旦回避することができましたが、いくつかのテーブルが大き過ぎる事や、slow queryなどはまだ解消できていません。
今後、より多くのアクティブユーザが増えた場合に備えアーキテクチャをシフトする必要があります。
今回の一件を通して、今後NoSQLに全て移行することもできるのかな、とも考えています。
スライド
いかがでしたか?
今年10周年を迎えた『ポケコロ 』、これからもより多くの皆様に愛してもらえるサービスを続けていくためにより一層頑張っていきたいと思います!
後編では「2Dスマホゲームにおける圧縮テクスチャ」というテーマでお届けします!
こちらからお読みください!
【cocone TECH TALK VOL.4・後編】2Dスマホゲームにおける圧縮テクスチャ【イベントレポート】
また、ココネでは一緒に働く仲間を募集中です。
ご興味のある方は、以下のリンクからぜひご応募ください。