SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Developers Summit 2025 セッションレポート(AD)

1週間で120万人突破の「mixi2」──小規模チームで構築・運用を可能にしたNewSQL「TiDB」とは

【14-E-2】「mixi2の舞台裏」 TiDBで実現するSNSのスケーラビリティとパフォーマンス

  • X ポスト
  • このエントリーをはてなブックマークに追加

NewSQL「TiDB」の特徴と選定理由

 検討の結果、MIXIではTiDBを採用した。TiDBは役割ごとに「SQLレイヤーのTiDB」「キーバリューストアのTiKV」「クラスタのデータ配置などを管理するPD(プレースメントドライバー)」という3つのコンポーネントが分散配置されたアーキテクチャを持っている。

 TiDBサーバーは最低2台、TiKVサーバーとPDサーバーは最低3台必要だ。各コンポーネントは水平方向に拡張することでパフォーマンスと耐障害性を高めることができる。

 ストレージについて姜氏は「データを格納するのはTiKVコンポーネントです。データはリージョンという単位で自動的に複数のレプリカで管理され、同じデータが3つコピーされます」と説明。障害時に自動でフェイルオーバーし、容量が足りなくなった場合はノードを追加するだけで容量を増やせる利点がある。

 「RDBで行っていたデータ肥大化に伴うシャーディング、マスター冗長化などが不要になります。また、複数台で構成されるので、メンテナンスも非常に容易なことが想像できました」

 バックアップとリストア機能も重視された。TiDBのバックアップ機能は、スナップショットによるフルバックアップと差分バックアップが取得可能で、Point-in-Timeリカバリー機能も備えている。バックアップデータから解析用データベースの構築も可能なため、運用負荷を軽減できる。

 また、開発期間中はクラスターの構築やスケールアウト、スケールイン、バックアップなどの操作がすべて「tiup」コマンドで実行でき、ドキュメントも豊富だった点が高く評価された。「パフォーマンスと可用性が主な決め手となって、TiDBを採用することにしました。開発期間中は、提供元のPingCAP社の皆様と隔週でミーティングをしながら進めました」と姜氏は振り返る。

タイムラインの実装と性能検証

 mixi2ではタイムライン機能が重要な要素となっている。姜氏は、タイムラインについて「ユーザーの投稿したポストをまとめるユーザータイムラインと、フォローしたユーザーの投稿が流れてくるホームタイムラインがあります」と説明した。特にホームタイムラインを表示するには、投稿をできる限り早くフォロワーのタイムラインに届ける必要がある。そのため、事前にホームタイムラインを作成するアプローチを採用した。

 投稿APIでは、投稿者の全てのフォロワーを見つけ、それぞれのタイムラインテーブルに新しい投稿をインサートする。この処理はmixi2のアーキテクチャでは非同期で行われる。Redisへの書き込み処理はパイプライン化され、最大1000件まで同時に処理できるように最適化されている。

mixi2タイムラインのアーキテクチャ
mixi2タイムラインのアーキテクチャ

 ホームタイムラインのデータはRedisに保存され、全て時刻でソートされる。ポストのIDのみを保存し、それ以外のデータはTiDBに保存されている。ユーザーがホーム画面を開くと、これらの情報を組み合わせてタイムラインを表示する。運用上の工夫について姜氏は「ユーザーの多くは過去の投稿には関心を示さないことが多いので、一定の件数以上の過去の投稿は定期的に削除しています」と紹介した。

 アプリケーションの設計実装がある程度終わった後、サービス全体の検証が行われた。姜氏は「今回TiDBを初めて使用するので、データベースのパフォーマンスの確認を重点的に行いました」と説明。mixi2というサービス名から、ある程度のユーザー流入が予想されたため、厳しめの目標設定で検証を行った。

 APIのレイテンシー目標は100ms、書き込み性能は代表的なRPCで10,000RPS(1秒あたりのリクエスト数)を目標に設定。特に投稿がフォロワーのタイムラインに表示されるまでの時間を5〜10秒と設定し、チューニングを実施した。

 負荷テストは専用環境でLocustを使用。並列度を大きくするため、Go製のworker実装「boomer」を採用し、Kubernetes上で動作させた。シナリオはユーザー作成から認証、フォロー、投稿、いいねなどの基本操作を網羅したものだった。

 「負荷検証の結果、データベースの動きは非常に予想しやすく、書き込み性能は特に台数を増やした分だけ向上しました」と姜氏。一部の重い処理(検索インデックスの書き込みやFCM呼び出しなど)はAPIから非同期ワーカーに移動し、パフォーマンスを確保した。

 高負荷時に問題となったのは、複数のフォロワーが同時にフォロー/いいね操作をした際のロック待ちタイムアウトだった。姜氏は「TiDBは分散トランザクションなので、トランザクションのオーバーヘッドが高く、RDBより不利に作用する可能性があります」と指摘。この問題に対しては、ロック競合が発生する処理をRedis側に移動させることで回避した。

 負荷テスト中には、TiDBの各コンポーネントを意図的に停止させる障害テストも実施。「TiKVのインスタンスを停止させ、システムに設定した時間経過後にリージョンレプリカがリバランスすること」「クラスターのTiKV台数を減らしたときにリバランスすること」「PDの主担当変更」といった条件で検証した結果、クラスターのノードを落としてもサービスに影響なく処理を継続できることが確認された。

次のページ
リリース後に発生した問題と対応

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Developers Summit 2025 セッションレポート連載記事一覧

もっと読む

この記事の著者

森 英信(モリ ヒデノブ)

就職情報誌やMac雑誌の編集業務、モバイルコンテンツ制作会社勤務を経て、2005年に編集プロダクション業務やWebシステム開発事業を展開する会社・アンジーを創業。編集プロダクション業務においては、IT・HR関連の事例取材に加え、英語での海外スタートアップ取材などを手がける。独自開発のAI文字起こし・...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

井山 敬博(イヤマ タカヒロ)

 STUDIO RONDINOのカメラマン。 東京綜合写真専門学校を卒業後、photographer 西尾豊司氏に師事。2008年に独立し、フリーを経て2012年からSTUDIO RONDINOに参加。 STUDIO RONDINO Works

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

提供:PingCAP株式会社

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21127 2025/04/11 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング