4000ものインスタンスを処理するLINEのMySQL運用の裏側
Oracle Developer Days初日の基調講演ではLINE 大塚知亮氏が同社におけるMySQLの運用について解説した。なお大塚氏は2016年にLINEの夏季インターンシップに参加し、アルバイトを経て2018年にLINEに入社した。好きなMySQLの機能は準同期レプリケーションで「binlogを眺めるのが好き」と言うほどのMySQL好き。
大塚氏が所属するのはLINEのサービス開発に必要なデータベースの運用業務全般を担うデータベース室(Database dept)。スキーマやACLなどの管理から、大きなサービスになるとレプリケーショントポロジを考案し、遅いクエリが出たらチューニング、新機能やバグの調査、そして後述する運用システムの開発も行う。
LINEのデータベース室では主に、Webアプリケーション系であればMySQLやRedis、MongoDB、FinTech系ならOracle DatabaseやMicrosoft SQLServer、分析系ならHBaseやCUBRIDをサポートしている。2011年に部署がスタートした当初、データベースはMySQLも含め4種類だったが、社内の要望に応じて種類を増やしていき、2017年からプライベートクラウドに乗せるように運用を開始。さらに2020年にはプラットフォームを刷新した。
データベースのインスタンスを作るなど、LINE社内の開発者がデータベースを使いたい時は、プライベートクラウド「Verda」のWeb UIから操作する。また変更により可用性に影響が生じ得る操作(スキーマ変更やトポロジ変更など)はデータベース室に依頼する。
現在、LINEではMySQLのインスタンスは約4000ある。内訳は、最新バージョンとなる8.0が16%、5.7が57%、EOLが迫っている5.6が21%。絶賛アップグレード中だ。2017年からはインスタンスタイプの標準化や統一を行い、構築作業の自動化も進んできたものの、インスタンス数の急増もあり、マイグレーション作業やアラート対応に追われていた。
そこで2020年からはMySQL運用システムを刷新し、開発者がセルフマネジメントできるようにした。MySQL運用の柱となるのが「GlenDB」、Verdaの新しいコンポーネントとしてHA構成システムも独自にスクラッチから開発した。APIを通じてMySQLのインスタンス作成などを自動化する。
GlenDBの構成と流れを追ってみよう。開発者がVerdaのUIからMySQLサービスをリクエストすると、内部のAPIを通じ、VMの構築やMySQLのインストール、さらにレプリケーション構成まで構築する。これをHAマネージャーとなるGlenHAに登録し、DNSやロードバランサーを設定する。ログファイルはElasticsearchとKibanaで確認し、PrometheusによるDBONEモニタリングシステムからメトリクスを管理する。
オペレーションコストの削減のためにGlenDBで実装された機能の一つがオートヒーリング機能。GlenHAが5秒おきに死活監視して、3回連続で失敗すると「故障」と判断し、必要に応じてフェイルオーバー処理を進める。具体的にはレプリケーショントポロジ変更、プライマリ昇格、DNSやロードバランサー設定変更など。「故障」したサーバが短時間で復旧した場合は復旧後の状況を確認し、レプリケーショントポロジに再度追加する。一定時間を過ぎても復旧しない場合は、新しいインスタンスにバックアップからリストアすることでトポロジを復旧する。
下記はLINE社内の開発者が目にするVerdaのUIサンプル画面だ。画面右の「Action」からフェイルオーバーやインスタンスのリスタートなど、セルフマネジメントできる。
稼働させているMySQLを最新版にするメジャーバージョンアップも重要な課題だ。LINEではメジャーバージョンをまたぐアップグレードを、新しいバージョンでの新規作成、データとACLのリストア、クエリのデグレード確認、新旧環境をまたぐレプリケーションの設定、フェイルオーバーによる切り替えという手順で行っている。
この作業を大量のインスタンスに対して行うため、同室ではマイグレーション作業を自動化するためのツール「MUH(MySQL Upgrade Helper)」を開発した。これはOSSや内製ツールを組み合わせたもので、移行先MySQL作成はVerdaのUIから行えば、データ移行やACL移行からレプリケーション設定までをWeb画面から完了できる。
なお上記の方法で8.0へのアップグレードした際、ちょっとした問題に直面した。現象としては文字列の比較やソート順に関する照合順序(COLLATION)の設定が変わってしまったのだ。これは5.7と8.0でデフォルト値が変わったため、テーブルを新規作成してデータを移行するとこの値が変わってしまったのだ。8.0への移行時には、新規作成時に設定するか移行後に値を変更するなど、適切な設定になるように注意が必要だ。
ほかにもデータベース室ではオペレーションを支えるツールとしてMQR(MySQL Query Replayer)やmyStatusgoなどを開発してGitHubで公開している。前者はネットワークパケットからクエリを抽出し、別のMySQLにクエリを再現することでデグレードを確認するもので、後者はインスタンス情報を1秒間隔で表示するMySQL版topコマンドとなる。
こうしてLINEのデータベース室では運用管理を効率化するためのツールを開発しながら、少人数で膨大なデータベースを運用している。今後もさらに低コストで運用するためのシステムや自律的なシステムの開発を続けていくそうだ。