tidb_feature_1800x600 (1)

※このブログは2025年11月6日に公開された英語ブログ How to Scale TiDB Locally with Online DDL」 の拙訳です。

データ集約型アプリケーションは、プロダクトマーケットフィットが 「完了」 する前に、単一ノードのMySQLでは対応しきれなくなります。ホットパーティション、スキーマ変更の時間調整、手動シャーディングによりチームの作業は遅くなります。しかしTiDBは、MySQL互換分散SQLアーキテクチャにより、ストレージとコンピュートを独立してスケールさせ、構成変更中もアプリケーションをオンラインのまま維持します。

この短いチュートリアルでは、TiUP Playgroundを使ってローカルでTiDBを起動し、ベースラインを確立した上で、再起動やダウンタイムなしでライブスケーリングを行います。その過程で、リージョンの再バランスを観察し、レプリケーション設定を確認し、負荷下でも安全にDDLを実行します。最終的には、ラップトップ上から本番環境までTiDBの柔軟性がどのように適用されるかの実践的なイメージを持つことができます。

前提条件

まず、TiUPをインストールします。もしまだTiUPをお持ちでなければ、tiup.ioからインストールしてください。

curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

その後、ミラーを設定し、最新バージョンにアップデートします:

tiup mirror set https://tiup-mirrors.pingcap.com
tiup update --self && tiup update --all

ステップ1:小さく始める

最小構成のクラスタから始めましょう:TiDB1台、TiKV1台、PD1台

tiup playground --db 1 --pd 1 --kv 1 --tag democluster

このターミナルは開いたままにしておきます。TiDBは通常ポート4000で動作します。

小規模データセットの読み込み

次に、別のターミナルで下記コマンドを実行します:

tiup bench tpcc --host 127.0.0.1 --port 4000 -D test --dropdata --warehouses 5 prepare

ベースラインワークロードの実行

tiup bench tpcc --host 127.0.0.1 --port 4000 -D test --warehouses 5 --time 120s --threads 32 run

リアルタイムでDDLを確認することもできます。それでは、MySQLクライアントを使ってログインしましょう:

mysql -h 127.0.0.1 -P 4000 -u root 

Use test;
CREATE INDEX idx_qty ON stock (s_w_id);
SHOW INDEXES FROM stock;
ALTER TABLE stock DROP INDEX idx_qty;
ADMIN SHOW DDL JOBS 3;
SHOW INDEXES FROM stock;

これで、単一TiKVノードでのベースラインのTPSとレイテンシプロファイルが得られます。

ベースラインが確認できたので、次はTiDBがストレージをどのようにライブでスケールするかを見てみましょう。

ステップ2:ストレージのスケール

ここからが楽しい部分です。ワークロードを実行中に、TiKVノードを2台追加(1台→3台)してみましょう。

tiup playground scale-out --kv 2 --tag democluster
tiup playground display --tag democluster

デフォルトでは、TiUP Playgroundはreplication=1 (フォールトトレランスなし) で起動します。これを3に設定すると、各リージョンに3つのコピーを持つ、実際の本番に近いクラスタをシミュレーションできます。

次に、MySQLクライアントで現在のレプリケーション係数を確認します:

SELECT type, instance, `key`, value
FROM information_schema.cluster_config
WHERE type = 'pd' AND `key` LIKE '%max-replicas%';

次に、レプリケーション係数を3に戻します。これにより、TiDBのメタデータ管理を担当するPlacement Driver (PD) が、各リージョンに3つのレプリカを維持するようになります:

SET CONFIG pd replication.max-replicas = 3;

では、確認してみましょう:

SELECT type, instance, `key`, value
  -> FROM information_schema.cluster_config
  -> WHERE type = 'pd' AND `key` LIKE '%max-replicas%';

SQLで、クラスタが拡張される様子を確認します:

-- New stores appear in minutes
SELECT store_id, address, store_state_name
FROM information_schema.tikv_store_status;

-- Region distribution across stores
SELECT store_id,
      COUNT(*) AS peer_regions,
      SUM(CASE WHEN is_leader = 1 THEN 1 ELSE 0 END) AS leader_regions
FROM information_schema.tikv_region_peers
GROUP BY store_id;

これで、PDが3台のTiKVノード全体にリージョンとリーダーを再バランスする様子を、ダウンタイムなしで確認できます。

スケールできるのはストレージだけではありません。TiDBのSQLレイヤーはステートレスなので、コンピュートも追加してみましょう。

ステップ3:コンピュートのスケール

TiDBサーバーはステートレスなSQLフロントエンドであるため、コンピュートのスケールが即座に行えます。

2台目のTiDBノードを追加します:

tiup playground scale-out --db 1 --tag democluster
tiup playground display --tag democluster

Find their ports (in the SQL Shell):

SELECT instance AS sql_addr, status_address
FROM information_schema.cluster_info
WHERE type="tidb";

次に、両方のノードにトラフィックを流します。

ターミナルA→TiDB#1 (例:ポート4000)

tiup bench tpcc --host 127.0.0.1 --port 4000 -D test --warehouses 5 --time 120s --threads 32 run

ターミナルB→TiDB#2 (もし2台目のTiDBサーバーのSQLポートが50861の場合)

tiup bench tpcc --host 127.0.0.1 --port 50861 -D test --warehouses 5 --time 120s --threads 32 run

ロードバランサーを使えば、トラフィックはTiDBサーバー間でシームレスに分散されます。

ここまででOLTPのスケーリングは完了しました。次にTiFlashを用いて分析ワークロードを組み込みましょう。

ステップ4:TiFlashによる混合ワークロード処理

TiFlashは、分析ワークロード向けのTiDBのカラム型エンジンです。ここで1つのノードを追加してみましょう:

tiup playground scale-out --tiflash 1 --tag democlustertiup playground display --tag democluster

次に、テーブルをTiFlashにレプリケートします:

USE test;
ALTER TABLE stock SET TIFLASH REPLICA 1;

-- Check replication progress
SELECT * FROM information_schema.tiflash_replica
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='stock';

次に、分析クエリを意図的に実行してみましょう:

EXPLAIN ANALYZE
SELECT s_i_id, SUM(s_quantity) AS qty
FROM stock
GROUP BY s_i_id
ORDER BY qty DESC
LIMIT 10;

OLTP (オンライントランザクション処理) は引き続きTiKVで実行される一方、分析処理はTiFlashで実行されることが確認できます。これにより、重いスキャン処理をトランザクションから分離できます。

ステップ5:オブザーバビリティ

いくつかのクエリを実行して、リアルタイムの動作を確認してみましょう:

-- Connections per TiDB server
SELECT instance, COUNT(*) AS connections
FROM information_schema.cluster_processlist
GROUP BY instance;

-- Regions/Leaders per TiKV store
SELECT store_id,
      COUNT(*) AS peer_regions,
      SUM(CASE WHEN is_leader = 1 THEN 1 ELSE 0 END) AS leader_regions
FROM information_schema.tikv_region_peers
GROUP BY store_id;

このワークロードが実行されると、PD (Placement Driver) がTiKVストア間でリージョンを再バランスする様子を確認できます。TiFlashノードは通常、ほんの少数のピアリージョンしか持たず、Raftの学習者 (Learner) として動作するため、リーダーの役割は持ちません。

ステップ6:クリーンアップ

作業が完了したら、TiUP Playgroundのターミナルを閉じるだけで、クラスタは停止します。残ったデータを消去する場合は、以下のいずれかを使用できます:

tiup clean --all

Or manually remove the demo data:

rm -rf ~/.tiup/data/*democluster*

結論:TiDBをローカルでスケーリングする

私たちは小規模に始め、TiDBをライブでスケールさせました。ストレージと耐障害性を拡張するためにTiKVを追加し、ステートレスなSQLスケールアウトのためにTiDBサーバを追加し、さらにOLTPから分析処理を分離するためにTiFlashを有効化しました。その間、オンラインDDLによって、負荷がかかった状態でも変更は安全に保たれました。
その最終的な効果は、TiDBの中核となる価値を凝縮したものです:柔軟性のあるキャパシティ、運用のシンプルさ、そしてゼロダウンタイムでの進化です。

次に試せることはこちらです:

  • より大きなデータセットや高スレッド数でデモを繰り返し、リーダーやリージョンの動的な挙動を確認する
  • 異なるレプリケーション設定を試し、フェイルオーバーやp95レイテンシへの影響を観察する
  • TiDBサーバ間での負荷分散を検証し、追加のホットテーブルにTiFlashレプリカを有効化する
  • Playgroundからマネージド環境または本番デプロイへ移行し、目標とするSLOを検証する。

テスト環境でさらに多くのTiDB機能を試してみたい場合は、無料のhands-on lab coursesをチェックしてください。


Have questions? Let us know how we can help.

Contact Us

TiDB Cloud Dedicated

TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。

TiDB Cloud Starter

TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。