2025/04/24 19:13 Discord Indexes Trillions of Messages

やあ、ロボ子。今日のITニュースはDiscordの検索インフラの話じゃ。

Discordですか、博士。興味深いですね。どのような内容なのでしょうか?

Discordが検索インフラをElasticsearch on Kubernetesに移行したらしいのじゃ。従来の検索インフラがメッセージのスループット増加に対応できなくなったのが理由らしいぞ。

Kubernetesを使うことで、リソースの調整が細かくなり、コスト最適化もできるようになったのですね。

そうじゃ。さらに、Elastic Kubernetes Operator (ECK)を使ってElasticsearchクラスタをデプロイしたらしい。OSのアップデートも自動化されたみたいじゃな。

運用がかなり楽になったのですね。他に何か注目すべき点はありますか?

マルチクラスタ「セル」アーキテクチャを構築したことじゃな。以前はクラスタが巨大化して、ノードの故障が頻発していたらしい。

クラスタを小さく分割することで、管理のオーバーヘッドを減らし、パフォーマンスを向上させたのですね。

その通り。各セル内で専用のIngestノード、Master-eligibleノード、Dataノードを実行しているらしいぞ。ノードの種類ごとにリソース要件が違うから、それぞれ異なるマシンタイプにスケジュールしているんじゃ。

なるほど。可用性も考慮されているのですね。各クラスタはゾーン障害に耐性を持つように設計されているとのことですが、具体的にはどのような構成なのでしょうか?

3つのMaster-eligibleノードを各ゾーンに1つずつ配置し、少なくとも3つのIngestノードも同様に配置。Dataノードはインデックスのプライマリとレプリカを異なるゾーンに配置して、ゾーン間で分散させているんじゃ。

堅牢な構成ですね。メッセージキューもRedisからPubSubに移行したとのことですが、これはどのようなメリットがあるのでしょうか?

PubSubにすることで、メッセージの配信が保証されるようになったんじゃ。Elasticsearchで障害が発生しても、メッセージが失われる心配がなくなったぞ。

それは大きいですね。メッセージのバッチ処理も行っているとのことですが、どのように工夫されているのでしょうか?

各バルクインデックス操作が単一のElasticsearchインデックスとノードと通信するようにしているんじゃ。こうすることで、ノードが故障した場合の影響範囲を限定できる。

なるほど。メッセージルーターを実装して、メッセージを適切なクラスタとインデックスに振り分けているのですね。

そうじゃ。この新しいアーキテクチャのおかげで、DMの検索機能も実現できたらしいぞ。以前はギルドごとにメッセージがシャーディングされていたから、DM全体の検索は難しかったんじゃ。

ユーザーごとにメッセージをシャーディングすることで、DM検索が可能になったのですね。データの格納量は増えますが、利便性が向上しますね。

さらに、「Big Freaking Guilds(BFG)」と呼ばれる大規模ギルド向けに、専用のElasticsearchクラスタを提供しているらしいぞ。

LuceneのMAX_DOC制限に近づいているギルドが増えているのですね。BFG専用のクラスタを用意することで、他のギルドへの影響を避けることができるのですね。

その通り。BFGのメッセージを複数のプライマリシャードを持つ新しいインデックスに再インデックス作成することで、検索機能を拡張し、クエリパフォーマンスも向上させているんじゃ。

再インデックス作成のフローも興味深いですね。二重インデックス作成を行い、段階的に切り替えることで、ダウンタイムを最小限に抑えているのですね。

じゃろ? 最後に、ロボ子。Discordの検索インフラ刷新は、まるで私が作った迷路みたいじゃな。複雑だけど、ちゃんとゴールにたどり着けるように設計されているんじゃ!

博士、それは褒め言葉なのでしょうか?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。