Discord
Discord、数兆件のメッセージをCassandraからScyllaDBへ移行
メッセージ保存基盤としてCassandraを使っていたDiscordが、レイテンシとガベージコレクションの問題を解消するためC++実装のScyllaDBへ移行した。
課題
177ノードまで拡大したCassandraでホットパーティションとGCポーズによるレイテンシスパイクが深刻化
アプローチ
C++実装のScyllaDBへ移行、Rustで独自マイグレーターを開発し最大320万メッセージ/秒で転送
効果
ノード数177→72に削減、メッセージ取得のp99レイテンシが40〜125msから15msへ改善
背景
DiscordはCassandraクラスタに全メッセージ履歴を保存していたが、クラスタは2017年の12ノードから2022年初頭には177ノードにまで拡大していた。大規模サーバーは小規模グループより桁違いに多くのメッセージを送信するため、特定チャンネルへのアクセスが集中する「ホットパーティション」問題がレイテンシを悪化させていた。またノードをローテーションから外してSSTablesを圧縮する「gossip dance」と呼ばれる運用が頻繁に必要となり、コストの高い運用作業になっていた。加えてJVMベースであるがゆえのガベージコレクションのポーズが重大なレイテンシスパイクを引き起こし、JVM設定のチューニングに多大な労力を要していた。
移行のプロセス
DiscordはCQLプロトコルと互換性を持ちC++で実装されたScyllaDBへの移行を決定した。データ移行にあたっては当初Sparkでのマイグレーションを検討し「推定3ヶ月」かかると見積もられたが、Rustでリクエストコアレシング機能を備えた独自のマイグレーターを開発したことで、推定期間を9日間にまで短縮した。このRust製マイグレーターは最大で毎秒320万メッセージという転送速度を達成した。
移行前後の変化
| 指標 | Before | After | |
|---|---|---|---|
| メッセージレイテンシ(p99程度) | 約200ms | 約5ms | |
| 推定移行期間 | 約3ヶ月 | 9日間 |
結果
移行の結果、複数の指標で効率化が見られた。
- Cassandraクラスタのノード数は177から72へと削減された
- ノードあたりのストレージは平均4TBから9TBへと効率化された
- メッセージ取得のp99レイテンシは40〜125msから15msへ改善した
- メッセージ挿入のp99レイテンシは5〜70msから5msで安定するようになった
学び
Discordはシステムの根本的な改善にはデータベースの変更だけでなく上流システムへの投資も必要だったと振り返っており、Rustの「fearless concurrency」がこの大規模マイグレーションを可能にしたと総括している。
