## モジュール 2: TiDB サーバーのスケールイン時における TiProxy の接続移行

TiProxy は、クライアント接続を切断することなく、ある TiDB サーバーから別の TiDB サーバーへ接続を移行できます。

TiDB サーバーがオフラインになろうとしている場合、または特定の TiDB サーバーの接続比率がしきい値を超えた場合に、接続移行がトリガーされます。TiProxy を利用している場合、この移行はクライアントに透過的です。

下記の図で、赤い点線で囲まれている TiDB サーバーがスケールイン対象です。

![demo018_splash_image_aa_003_20250926.png 85%](https://lab-static.pingcap.com/images/2025/9/26/359c3af54e50e857a606f12425b9849e2fcff4ba.png)

### 手順 1. TiProxy 設定の確認

+ [graceful-wait-before-shutdown](https://docs.pingcap.com/tidb/stable/tidb-configuration-file/#graceful-wait-before-shutdown-new-in-v50) は、TiDB を停止（TCP ポートを閉じる）する際にクライアントが切断できるよう待機する秒数です。
+ [ターミナル 2](ssh://monitor1-ssh#2) で次のコマンドを実行します:

  ```bash
  ./connect-tiproxy.sh
  ```

  ```output
  tidb:tiproxy>
  ```

  ```sql
  show config where name='graceful-wait-before-shutdown';
  exit;
  ```

  ```output
  tidb:tiproxy> show config where name='graceful-wait-before-shutdown';
  +------+------------------+-------------------------------+-------+
  | Type | Instance         | Name                          | Value |
  +------+------------------+-------------------------------+-------+
  | tidb | ${LAB:HOST_DB1_PRIVATE_IP}:4000 | graceful-wait-before-shutdown | 15    |
  | tidb | ${LAB:HOST_DB2_PRIVATE_IP}:4000 | graceful-wait-before-shutdown | 15    |
  +------+------------------+-------------------------------+-------+
  2 rows in set (0.01 sec)
  ```

> [!TIP]
> TiDB サーバーのオフライン時にクライアント接続の中断を避けるため、`graceful-wait-before-shutdown` はアプリケーション内の最長トランザクション時間より少なくとも 10 秒長く設定してください。
> さらに、TiDB サーバーのスケールイン時は、バッチ処理などの長時間トランザクションの実行を避けることを推奨します。

### 手順 2. ターミナル 1 でワークロードを確認

+ [ターミナル 1](ssh://monitor1-ssh#1) で Python のワークロードが稼働中であり、スレッドが 2 台の TiDB サーバーへ接続していることを確認します。
+ この Python コードにはスケールイン対応の特別な処理はありません。TiProxy がなければ接続断などのエラーが発生するはずです。

  ```output
  ...
  Thread 4: Connected to TiDB server ${LAB:HOST_DB2_PRIVATE_IP}:4000. User 1 balance updated to: 6
  Thread 3: Connected to TiDB server ${LAB:HOST_DB1_PRIVATE_IP}:4000. User 9 balance updated to: 8
  Thread 1: Connected to TiDB server ${LAB:HOST_DB1_PRIVATE_IP}:4000. User 10 balance updated to: 5
  Thread 2: Connected to TiDB server ${LAB:HOST_DB2_PRIVATE_IP}:4000. User 1 balance updated to: 3
  ...
  ```

### 手順 3. TiDB サーバーをスケールイン

+ [ターミナル 2](ssh://monitor1-ssh#2) を開き、次のコマンドを実行します。

  ```bash
  ~/.tiup/bin/tiup cluster scale-in tidb-demo --node ${HOST_DB2_PRIVATE_IP}:4000 -y
  ```

  ```output
  ...
  Scaled cluster `tidb-demo` in successfully
  ```

### 手順 4. [ターミナル 1](ssh://monitor1-ssh#1) の出力を確認

+ [ターミナル 1](ssh://monitor1-ssh#1) では、すべてのスレッドが同一の TiDB サーバーへ接続していることを確認できます。
+ エラーメッセージは出力されず、接続移行はアプリケーションに対して完全に透過的です。

  ```output
  ...
  Thread 2: Connected to TiDB server ${LAB:HOST_DB1_PRIVATE_IP}:4000. User 9 balance updated to: 2
  Thread 1: Connected to TiDB server ${LAB:HOST_DB1_PRIVATE_IP}:4000. User 3 balance updated to: 9
  Thread 4: Connected to TiDB server ${LAB:HOST_DB1_PRIVATE_IP}:4000. User 1 balance updated to: 6
  Thread 2: Connected to TiDB server ${LAB:HOST_DB1_PRIVATE_IP}:4000. User 6 balance updated to: 6
  ...
  ```

+ `ctrl` + `c` でワークロードを停止します。

  ```output
  ^C
  Received interrupt signal. Stopping all threads...
  ```

### まとめ

+ 本モジュールでは、TiDB サーバーのスケールイン時に TiProxy が接続を他の TiDB サーバーへ移行でき、アプリケーションに対してスケールインが透過的であることを確認しました。
