## モジュール 1: ロードバランサーとセッションマネージャー - TiProxy

TiProxyはTiDBの公式なプロキシコンポーネントであり、ロードバランシング、接続の持続性、およびサービスディスカバリを提供することでデータベースの機能を強化するように設計されています。クライアントとTiDBサーバーの間の仲介役として機能し、スケーリング、ローリングアップグレード、および再起動などのさまざまなメンテナンス操作中にクライアント接続が安定し、中断されないようにします。これは、計画的なサーバーダウンタイム中や複数のTiDBサーバーインスタンス間でワークロードをバランスさせる必要があるシナリオで特に役立ちます。

このモジュールでは、新しいTiDBクラスタとTiProxyコンポーネントをデプロイし、そのロードバランシングとセッション移行機能を検証します。

### 手順 1. TiUP コントロールマシンに接続する

+ ここをクリック - [ターミナル 1](ssh://monitor1-ssh#1) で、ハンズオン演習用に割り当てられた仮想マシンに接続された新しいターミナルを開きます。

+ このハンズオン演習で割り当てられたすべてのサーバーインスタンスのIPアドレスの概要を取得します。環境変数のプレフィックスは、それぞれのTiDBクラスタ内の役割を表します。`sample_output`に表示されるIPアドレスは、実際のものとは異なることに注意してください。

  + `HOST_MONITOR`はPrometheusとGrafanaをホストします。
  + `HOST_CM`はTiUPコントロールマシンをホストします。
  + `HOST_PD`はPlacement Driverサーバー用です。
  + `HOST_DB`はTiDBサーバー用です。
  + `HOST_KV`はTiKVサーバー用です。
  + `HOST_TIFALSH`はTiFlashサーバー用です。
  + `HOST_TIPROXY`はTiProxyサーバー用です。

  ```bash
  cat hosts-env.sh
  ```

  ```output
  export HOST_MONITOR1_PRIVATE_IP=10.90.4.40
  export HOST_MONITOR1_PUBLIC_IP=35.166.47.245
  export HOST_CM_PRIVATE_IP=10.90.4.40
  export HOST_CM_PUBLIC_IP=35.166.47.245
  export HOST_PD1_PRIVATE_IP=10.90.2.51
  export HOST_PD1_PUBLIC_IP=52.27.45.10
  export HOST_DB1_PRIVATE_IP=10.90.2.14
  export HOST_DB1_PUBLIC_IP=44.244.238.105
  export HOST_DB2_PRIVATE_IP=10.90.2.43
  export HOST_DB2_PUBLIC_IP=34.219.136.55
  export HOST_KV1_PRIVATE_IP=10.90.1.93
  export HOST_KV1_PUBLIC_IP=52.12.133.66
  export HOST_KV2_PRIVATE_IP=10.90.1.30
  export HOST_KV2_PUBLIC_IP=18.236.119.16
  export HOST_KV3_PRIVATE_IP=10.90.1.208
  export HOST_KV3_PUBLIC_IP=35.90.161.51
  export HOST_TIFLASH1_PRIVATE_IP=10.90.4.243
  export HOST_TIFLASH1_PUBLIC_IP=34.210.114.26
  export HOST_TIPROXY1_PRIVATE_IP=10.90.4.154
  ```

### 手順 2. TiProxy を備えた新しい TiDB クラスタを作成する

+ TiDBクラスタをデプロイするために使用される提供されたトポロジファイル`topology-with-tiproxy.yaml`を確認します。トポロジファイル内のTiProxy設定（`security.auto-tls: true`、TiDBサーバー構成の下の`graceful-wait-before-shutdown: 10`、および`tiproxy_servers`）に注意してください。`sample_output`に表示されるIPアドレスは、実際のものとは異なることに注意してください。

  ```bash
  cat topology-with-tiproxy.yaml
  ```

  ```output
  ...
  server_configs:
  ...
    tidb:
      security.auto-tls: true
      graceful-wait-before-shutdown: 10
  ...
  tiproxy_servers:
    - host: 10.90.4.113
  ```

+ 次のコードブロックのコマンドは、一連の操作を順番に実行します。これらは、1. [TiUPミラー](https://docs.pingcap.com/tidb/stable/production-deployment-using-tiup)設定の変更、2. システム設定の確認、3. 失敗したチェックの修正、4. TiDBクラスタのデプロイ、最後に5. TiDBクラスタの起動です。完了するまでに約3分かかります。

  ```bash
  export PATH="$PATH:/home/ec2-user/.tiup/bin"
  tiup mirror set tidb-community-server-${LAB:TIDB_VERSION}-linux-amd64
  tiup cluster check ./topology-with-tiproxy.yaml \
   --user ec2-user \
   -i /home/ec2-user/.ssh/pe-class-key-${LAB:REGION_NAME}.pem \
   --apply
  tiup cluster deploy tidb-demo v${LAB:TIDB_VERSION} ./topology-with-tiproxy.yaml \
   --user ec2-user \
   -i /home/ec2-user/.ssh/pe-class-key-${LAB:REGION_NAME}.pem \
   --yes
  tiup cluster start tidb-demo
  sleep 5;
  tiup cluster display tidb-demo
  ```

  ```output
  Successfully set mirror to /home/ec2-user/tidb-community-server-${LAB:TIDB_VERSION}-linux-amd64
  /home/ec2-user/tidb-community-server-${LAB:TIDB_VERSION}-linux-amd64
  ...
  Cluster type:       tidb
  Cluster name:       tidb-demo
  Cluster version:    v${LAB:TIDB_VERSION}
  Deploy user:        ec2-user
  SSH type:           builtin
  Dashboard URL:      http://52.27.45.10:2379/dashboard
  Grafana URL:        http://10.90.4.40:3000
  ID                 Role          Host         Ports                            OS/Arch       Status  Data Dir                      Deploy Dir
  --                 ----          ----         -----                            -------       ------  --------                      ----------
  10.90.4.40:9093    alertmanager  10.90.4.40   9093/9094                        linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  10.90.4.40:3000    grafana       10.90.4.40   3000                             linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
  10.90.2.51:2379    pd            10.90.2.51   2379/2380                        linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.4.40:9090    prometheus    10.90.4.40   9090/12020                       linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  10.90.2.14:4000    tidb          10.90.2.14   4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  10.90.2.43:4000    tidb          10.90.2.43   4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  10.90.4.243:9000   tiflash       10.90.4.243  9000/3930/20170/20292/8234/8123  linux/x86_64  Down    /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
  10.90.1.208:20160  tikv          10.90.1.208  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.1.30:20160   tikv          10.90.1.30   20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.1.93:20160   tikv          10.90.1.93   20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.4.154:6000   tiproxy       10.90.4.154  6000/3080                        linux/x86_64  Up      -                             /tidb-deploy/tiproxy-6000
  Total nodes: 11
  ```

+ `tiproxy`コンポーネントもクラスタ表示出力にリストされていることに注意してください。このSelf-Managedクラスタは、1つのTiProxyインスタンスと2つのTiDBサーバーインスタンスで構成されています。さらに、通常は少なくとも3つのPDサーバーを使用しますが、このハンズオン演習ではPD関連のトピックはカバーしていないため、ここでは1つのPDサーバーのみを使用しています。

### 手順 3. ロードバランシング機能を検証する

+ デフォルトでは、TiProxyインスタンスはポート6000でリッスンします。TiProxy経由でTiDBサーバーインスタンスに接続します。

  ```bash
  mysql -h ${HOST_TIPROXY1_PRIVATE_IP} --port 6000 -u root
  ```

  ```output
  mysql>
  ```

+ `test.tiproxy_test`という名前のテーブルを作成し、接続を終了します。これを使用して、TiProxyの接続ロードバランシング機能を確認します。

  ```sql
  DROP TABLE IF EXISTS test.tiproxy_test;
  CREATE TABLE test.tiproxy_test (id INT AUTO_INCREMENT PRIMARY KEY, tidb_server_instance VARCHAR(30));
  EXIT
  ```

  ```output
  Query OK, 0 rows affected, 1 warning (0.00 sec)
  Query OK, 0 rows affected (0.06 sec)
  Bye
  ```

+ TiProxy経由で50のデータベース接続を生成し、各接続で新しい行をインサートし、接続を終了します。`test.tiproxy_test`テーブルの`tidb_server_instance`列は、接続を受け入れてインサートDMLを処理したTiDBサーバーインスタンスのID（**TIDB_SERVER_IP_ADDRESS:10080**形式）を示します。

  ```bash
  cat > insert_one_row.sql <<EOF
  INSERT INTO test.tiproxy_test (tidb_server_instance)
  VALUES (
      (SELECT instance FROM information_schema.cluster_processlist
       WHERE host=(SELECT host FROM information_schema.processlist WHERE id=CONNECTION_ID())
      )
  );
  EOF
  cat > insert_one_row.sh <<EOF
  mysql -h ${HOST_TIPROXY1_PRIVATE_IP} --port 6000 -u root < insert_one_row.sql
  EOF
  chmod +x insert_one_row.sh
  for c in {1..50}; do
  ./insert_one_row.sh &
  done;
  sleep 1;
  jobs
  ```

  ```output
  ...
  [43]   Done                    ./insert_one_row.sh
  [44]   Done                    ./insert_one_row.sh
  [45]   Done                    ./insert_one_row.sh
  [46]   Done                    ./insert_one_row.sh
  [47]   Done                    ./insert_one_row.sh
  [48]   Done                    ./insert_one_row.sh
  [49]-  Done                    ./insert_one_row.sh
  [50]+  Done                    ./insert_one_row.sh
  ```

+ TiDBサーバーインスタンスに接続します。

  ```bash
  mysql -h ${HOST_TIPROXY1_PRIVATE_IP} --port 6000 -u root
  ```

+ `test.tiproxy_test`テーブルを確認します。接続とインサート操作が2つのTiDBサーバーインスタンスによって均等に処理されたことがわかります。接続数にわずかな差異（例：28対22）がある場合、これは正常で予想されることです。

  ```sql
  SELECT tidb_server_instance, COUNT(1)
  FROM test.tiproxy_test
  GROUP BY tidb_server_instance;
  EXIT
  ```

  ```output
  +----------------------+----------+
  | tidb_server_instance | count(1) |
  +----------------------+----------+
  | 10.90.1.14:10080     |       25 |
  | 10.90.1.43:10080     |       25 |
  +----------------------+----------+
  2 rows in set (0.00 sec)
  Bye
  ```

### 手順 4. セッション移行機能を検証する

+ 計画的なメンテナンス操作中（例：TiDBのスケールアウト、スケールイン、またはクラスタのアップグレード）、TiProxyは既存のセッションをアクティブなTiDBサーバーインスタンス間でシームレスに移行することで、クライアントアプリケーションの中断のない接続を保証します。TiProxyの主な目標は、アプリケーションのダウンタイムをゼロにしながら、TiDBサーバー間でバランスの取れた負荷を維持することです。

+ 提供されたミニJavaプログラムのコードを確認します。これは、`test.tiproxy_test`テーブルに対して挿入ワークロードを実行するために4つのスレッドを初期化します。

  ```bash
  cat InsertJobNoExceptionHandling.java | grep -A1 -B1 'new Thread'
  ```

  ```output
          for (int i = 0; i < 4; i++) {
              new Thread(new Worker(tidbHost, port, dbUsername, dbPassword, (i + 1))).start();
          }
  ```

+ スレッドが例外に遭遇した場合、エラースタックを出力して終了します。

  ```bash
  cat InsertJobNoExceptionHandling.java | grep -A3 catch
  ```

  ```output
          } catch (Exception e) {
              e.printStackTrace();
              System.exit(1);
          }
  ```

+ ポート6000でTiProxyに対してワークロードを開始します。4つのスレッドを使用してTiDBクラスタに接続し、4つのデータベース接続が確立されます。

  ```bash
  rm -f InsertJobNoExceptionHandling.class
  javac -cp .:mysql-connector-java-5.1.36-bin.jar InsertJobNoExceptionHandling.java
  sleep 1
  java -cp .:mysql-connector-java-5.1.36-bin.jar InsertJobNoExceptionHandling ${HOST_TIPROXY1_PRIVATE_IP} 6000 root
  ```

  ```output
  Inserting 0 by worker 3
  Inserting 0 by worker 1
  Inserting 0 by worker 4
  Inserting 0 by worker 2
  Inserting 1 by worker 1
  Inserting 1 by worker 2
  Inserting 1 by worker 3
  Inserting 1 by worker 4
  Inserting 2 by worker 1
  Inserting 2 by worker 3
  Inserting 2 by worker 2
  Inserting 2 by worker 4
  ...
  ```

+ [Grafana 監視](http://${LAB:HOST_MONITOR1_PUBLIC_IP}:3000) をクリックし、ユーザー名とパスワード（両方とも「admin」）を使用してログインします。`Home` > `tidb-demo` > `tidb-demo-TiProxy-Summary` > `Balance`に移動します。`Backend Connections`パネルを確認し、各TiDBサーバーに2つの接続があることを確認します。

    ![90%](https://lab-static.pingcap.com/quick-demo/TiProxyBalance_2x2.png)

+ `Refresh time`を`10s`に変更します。 `Balance`パネルをブラウザで開いたままにし、Javaプログラムを実行し続けます。

+ ここをクリック - [ターミナル 2](ssh://monitor1-ssh#2) で、ハンズオン演習用に割り当てられた仮想マシンに接続された新しいターミナルを開きます。

+ SQLレイヤーをスケールインし、IPアドレス${HOST_DB2_PRIVATE_IP}のTiDBサーバーをクラスタから削除します。完了すると、クラスタには1つのTiDBサーバーのみが残ります。

  ```bash
  export PATH="$PATH:/home/ec2-user/.tiup/bin"
  tiup cluster scale-in tidb-demo --node ${HOST_DB2_PRIVATE_IP}:4000 -y
  sleep 2
  tiup cluster display tidb-demo
  ```

  ```output
  ...
  Stopping component tidb
  ...
  Scaled cluster `tidb-demo` in successfully
  ...
  Cluster type:       tidb
  Cluster name:       tidb-demo
  Cluster version:    v${LAB:TIDB_VERSION}
  Deploy user:        ec2-user
  SSH type:           builtin
  Dashboard URL:      http://13.115.186.238:2379/dashboard
  Grafana URL:        http://10.90.4.53:3000
  ID                 Role          Host         Ports                            OS/Arch       Status  Data Dir                      Deploy Dir
  --                 ----          ----         -----                            -------       ------  --------                      ----------
  10.90.4.53:9093    alertmanager  10.90.4.53   9093/9094                        linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  10.90.4.53:3000    grafana       10.90.4.53   3000                             linux/x86_64  Down    -                             /tidb-deploy/grafana-3000
  10.90.3.19:2379    pd            10.90.3.19   2379/2380                        linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.4.53:9090    prometheus    10.90.4.53   9090/12020                       linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  10.90.1.202:4000   tidb          10.90.1.202  4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  10.90.4.75:9000    tiflash       10.90.4.75   9000/3930/20170/20292/8234/8123  linux/x86_64  Up      /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
  10.90.3.10:20160   tikv          10.90.3.10   20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.207:20160  tikv          10.90.3.207  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.208:20160  tikv          10.90.3.208  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.4.56:6000    tiproxy       10.90.4.56   6000/3080                        linux/x86_64  Up      -                             /tidb-deploy/tiproxy-6000
  Total nodes: 10
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、ミニJavaプログラムは中断なく実行を続けます。

  ```output
  ...
  Inserting 1295 by worker 4
  Inserting 1295 by worker 3
  Inserting 1295 by worker 1
  Inserting 1295 by worker 2
  Inserting 1296 by worker 4
  Inserting 1296 by worker 3
  ...
  ```

+ ブラウザから Grafana TiProxy `Balance`パネルを確認します。4つの接続が単一のTiDBサーバーにあります。2つの接続が移行されました。

![90%](https://lab-static.pingcap.com/quick-demo/TiProxyBalance_4x0.png)

+ [ターミナル 2](ssh://monitor1-ssh#2) に切り替え、SQLレイヤーをスケールアウトしてTiDBサーバーをクラスタに追加します。完了すると、クラスタには2つのTiDBサーバーが存在します。

  ```bash
  export PATH="$PATH:/home/ec2-user/.tiup/bin"
  tiup cluster scale-out tidb-demo scale-out-tidb.yaml \
   --user ec2-user \
   -i ~/.ssh/pe-class-key-${LAB:REGION_NAME}.pem \
   -y
  tiup cluster display tidb-demo
  ```

  ```output
  ...
  Deploy TiDB instance
  ...
  Scaled cluster `tidb-demo` out successfully
  ...
  Cluster type:       tidb
  Cluster name:       tidb-demo
  Cluster version:    v${LAB:TIDB_VERSION}
  Deploy user:        ec2-user
  SSH type:           builtin
  Dashboard URL:      http://13.115.186.238:2379/dashboard
  Grafana URL:        http://10.90.4.53:3000
  ID                 Role          Host         Ports                            OS/Arch       Status  Data Dir                      Deploy Dir
  --                 ----          ----         -----                            -------       ------  --------                      ----------
  10.90.4.53:9093    alertmanager  10.90.4.53   9093/9094                        linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  10.90.4.53:3000    grafana       10.90.4.53   3000                             linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
  10.90.3.19:2379    pd            10.90.3.19   2379/2380                        linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.4.53:9090    prometheus    10.90.4.53   9090/12020                       linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  10.90.1.202:4000   tidb          10.90.1.202  4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  10.90.1.233:4000   tidb          10.90.1.233  4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  10.90.4.75:9000    tiflash       10.90.4.75   9000/3930/20170/20292/8234/8123  linux/x86_64  Up      /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
  10.90.3.10:20160   tikv          10.90.3.10   20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.207:20160  tikv          10.90.3.207  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.208:20160  tikv          10.90.3.208  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.4.56:6000    tiproxy       10.90.4.56   6000/3080                        linux/x86_64  Up      -                             /tidb-deploy/tiproxy-6000
  Total nodes: 11
  ```

+ 再び[ターミナル 1](ssh://monitor1-ssh#1) に戻ると、ミニJavaプログラムが中断なく実行を続けていることがわかります。

  ```output
  ...
  Inserting 1707 by worker 1
  Inserting 1707 by worker 3
  Inserting 1706 by worker 4
  Inserting 1708 by worker 2
  Inserting 1708 by worker 1
  Inserting 1708 by worker 3
  Inserting 1707 by worker 4
  ...
  ```

+ 再度、ブラウザからGrafana TiProxy `Balance`パネルを確認します。各TiDBサーバーに2つの接続があります。2つの接続が移行されました。

![90%](https://lab-static.pingcap.com/quick-demo/TiProxyBalance_2x2_2.png)

+ これで、TiProxyのセッション/接続移行機能が完了しました。TiProxyを使用した計画的なデータベースオンラインローリングアップグレードをサポートするために、これを実証するための別のスタンドアロンのハンズオン演習があります。詳細については、[Database Zero Downtime Online Upgrade With TiProxy](/labs/demo_005)をご覧ください。

+ [ターミナル 1](ssh://monitor1-ssh#1) に移動し、**CTRL-C**を押してJavaワークロードを停止します。その後、次のモジュールに進みます。
