Vitessを活用したSlackのデータストアスケーリング
(slack.engineering)-
SlackがActive-Activeクラスタ構成から、MySQLの水平スケーリングシステムであるVitessへ移行した話
-
2017年から移行を開始し、現在はVitessが全クエリの99%を処理中で、年末までに完全移行の予定
→ 現在のピーク時は230万QPS(200万が読み取り、30万が書き込み)
→ クエリレイテンシの中央値は2ms、p99クエリレイテンシは11ms
-
SlackはLAMPスタック(Linux, Apache, MySQL, PHP)で開始
-
3つのDBクラスタ
→ シャード: すべてのメッセージ、チャンネル、DMなどのユーザーデータ。ワークスペースIDでパーティショニングされ、1つのワークスペースは1つのシャードに属する
つまりSlackアプリは1つのDBにのみ接続すればよい
→ メタデータクラスタ: ワークスペースをシャードに結び付けるためのルックアップテーブル
→ キッチンシンククラスタ: 特定のワークスペース向けではない、あらゆるデータを保存。Appディレクトリなど
-
シャーディングはモノリスの"webapp"が管理・調整
-
各クラスタは1つ以上のシャードで構成され、各シャードは別のデータセンターにある少なくとも2つ以上のMySQLインスタンスでプロビジョニング
-
Active-Active設定の利点
→ 高可用性
→ 速いプロダクト開発速度
→ 容易なデバッグ
→ 容易な拡張
しかし、組織が大きくなり、プロダクトチームが新機能を作るようになると開発速度が低下
- Active-Activeの欠点
→ 拡張の限界: より大きな顧客が増えるにつれ、高性能ホストが収容できる限界に到達
→ 1つのデータモデルへの固定:
Enterprise GridやSlack Connectのような機能が入ることで、1台のサーバーにしか接続しないというパラダイムに反するようになった
→ ホットスポット: データベースフリートをうまく活用できなかった。シャードの分割やチーム移動が難しく、Slackの利用量予測も困難だったため、大半のシャードを過剰にプロビジョニングし、ロングテールを活用しにくかった
→ ワークスペースとシャードの可用性問題: シャードに問題が起きると、そのシャード上のすべての顧客がSlackを利用不能
→ 運用: 一般的なMySQL構成ではなかったため、多くの内部ツールを作成していた
-
2016年秋、1秒あたり数十万件のMySQLクエリと数千台のシャーディングされたMySQLホストを管理していた
-
定期的にスケーリングと性能の問題が発生し、新しいアプローチを検討
-
既存のものを発展させるか新製品を導入するか検討したが
→ 自社クラウドで動くMySQLを引き続き使いたい
→ 数千の固有クエリがあり、その一部は特殊なMySQL構成を利用
→ デプロイ、バックアップ、データウェアハウスETL、コンプライアンスなどがすべてMySQLベース
- なぜVitessなのか?: アプリおよび運用の要件の大半を満たしていた
→ MySQL Core: VitessはMySQLベース
→ Scalability: MySQLの主要機能とNoSQL DBのスケーラビリティを組み合わせる。組み込みシャーディングにより、特別なロジック追加なしで柔軟に拡張可能
→ Operability: 標準のフェイルオーバーやバックアップなどを自動処理。クラスタ設定に関するメタデータを追跡して一貫性を維持
→ Extensibility: Goベースのオープンソース。広範なテストカバレッジとオープンな開発者コミュニティ
- 小さな機能からVitessを本番適用
→ 2017年にRSSフィードをSlackチャンネルへ統合する機能を作ってみた
→ 2018年には新規テーブルはすべてVitess上でのみ作成
→ 2019年半ばにはレガシーDBよりVitessでの書き込みの方が多くなった
→ そしてSlackはVitessオープンソースへ継続的に貢献
→ 3年かけて99%をVitessへ移行。今年中に残り1%も完了予定
- SlackのVitess導入は成功だったのか?
→ 世界各地の複数リージョンで、複数のVitessクラスタが数十のキースペースを運用中
→ キースペースは、ユーザー数・チーム数・チャンネル数に応じて拡張される論理コレクション
→ 柔軟なシャーディングによりSlackをスケールできるようになった
→ COVID-19でSlackのクエリ数が1週間で50%増加
→ 最も忙しいキースペースをVitessの分割ワークフローで水平拡張
→ 以前ならスケーリング不可能でダウンタイムが発生していただろう
2件のコメント
https://vitess.io/
Vitess : "MySQL向けのシャーディング・ミドルウェア"
MySQLとMariaDBをクラウド上で簡単にデプロイ、スケール、管理できるように作られたソリューション
Docker(ローカル)とKubernetes上でMySQLシャードを運用・管理
アプリケーションはVTGateというプロキシを介してMySQLと通信するのと同じように利用でき、内部ではgRPCでほかのサーバーに接続する方式
メールサービスのHeyもVitessを使用中
Heyの技術スタック https://ja.news.hada.io/topic?id=2355