## モジュール 2: 読み取りおよび書き込みワークロードを開始する

### 手順 1. テスト用のテーブルを作成する

+ [ターミナル 2](ssh://monitor1-ssh#2)で、TiDBサーバインスタンスの1つに接続し、テストテーブルを作成し、ターミナルを終了します。

  ```bash
  mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -uroot
  ```

  ```sql
  DROP TABLE IF EXISTS test.dummy;
  CREATE TABLE test.dummy (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(80), event JSON);
  EXIT;
  ```

### 手順 2. INSERT ワークロードを適用する

+ [ターミナル 2](ssh://monitor1-ssh#2)で、サンプルJavaプログラムを実行してINSERTワークロードを起動します。

+ プログラムは、2つのワーカーを使用してINSERT操作を実行するためにTiDBサーバインスタンスに接続します。接続されたTiDBサーバが接続を失うと、プログラムは自動的に別の利用可能なTiDBサーバに切り替わります。出力はINSERTリクエストを処理しているTiDBサーバのプライベートIPアドレスを表示します。2つあるはずです。ワークロードを実行したまま、次のステップに進みます。

  ```bash
  cd scripts
  javac -cp .:misc/mysql-connector-java-5.1.36-bin.jar DemoJdbcEndlessInsertDummyCSP.java
  java -cp .:misc/mysql-connector-java-5.1.36-bin.jar DemoJdbcEndlessInsertDummyCSP
  ```

  ```output
  Worker 2 -> TiDB:Thu May 09 07:05:33 UTC 2024 at ${LAB:HOST_DB1_PRIVATE_IP}
  Worker 1 -> TiDB:Thu May 09 07:05:33 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  Worker 1 -> TiDB:Thu May 09 07:05:34 UTC 2024 at ${LAB:HOST_DB1_PRIVATE_IP}
  Worker 2 -> TiDB:Thu May 09 07:05:34 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  Worker 1 -> TiDB:Thu May 09 07:05:35 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  Worker 2 -> TiDB:Thu May 09 07:05:35 UTC 2024 at ${LAB:HOST_DB1_PRIVATE_IP}
  Worker 1 -> TiDB:Thu May 09 07:05:36 UTC 2024 at ${LAB:HOST_DB1_PRIVATE_IP}
  ...
  ```

### 手順 3. サンプル QUERY ワークロードを適用する

+ [ターミナル 3](ssh://monitor1-ssh#3)で、以下のスクリプトを実行します。スクリプトは2つのTiDBサーバインスタンスに接続してクエリを実行しようとします。1つのTiDBサーバが障害または応答不能になった場合、スクリプトは自動的に別の利用可能なインスタンスに切り替わります。注意すべきは、TiDBサーバインスタンスは接続要求に対して1秒だけ応答するように設定されていることです。これはステップ2のJavaプログラムと同様の設定です。出力はtest.dummyテーブルの行数が着実に増加していることを示します。ワークロードを実行したまま、次のステップに進みます。

  ```bash
  qdb1(){
  mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -uroot --connect-timeout 1 2>/dev/null << EOF
    SELECT COUNT(event) FROM test.dummy;
  EOF
  }

  qdb2(){
  mysql -h ${HOST_DB2_PRIVATE_IP} -P 4000 -uroot --connect-timeout 1 2>/dev/null << EOF
    SELECT COUNT(event) FROM test.dummy;
  EOF
  }

  query1(){
    echo;
    date;
    qdb1 || qdb2
    sleep 2;
  }

  query2(){
    echo;
    date;
    qdb2 || qdb1
    sleep 2;
  }

  while true; do
    query1;
    query2;
  done;
  ```

  ```output
  Mon May 13 05:27:33 UTC 2024
  COUNT(event)
  2608

  Mon May 13 05:27:35 UTC 2024
  COUNT(event)
  2612

  Mon May 13 05:27:37 UTC 2024
  COUNT(event)
  2616

  Mon May 13 05:27:39 UTC 2024
  COUNT(event)
  2620
  ...
  ```

### 手順 4. TiKV リージョンレプリカの設定が3に設定されていることを確認する

+ [ターミナル 1](ssh://monitor1-ssh#1)に戻り、TiKV リージョンレプリカの設定が 3 に設定されていることを確認します。これは TiDB Cloud がデータセンター障害に耐えられる主な理由のひとつです。アベイラビリティゾーン障害で TiKV サーバが 1 台失われても、残り 2 レプリカで読み書きを継続できます。

  ```bash
  mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -uroot
  ```

  ```sql
  SHOW CONFIG WHERE type='pd' AND name='replication.max-replicas';
  EXIT
  ```

  ```output
  +------+---------------------+--------------------------+-------+
  | Type | Instance            | Name                     | Value |
  +------+---------------------+--------------------------+-------+
  | pd   | ${LAB:HOST_PD1_PUBLIC_IP}:2379   | replication.max-replicas | 3     |
  | pd   | ${LAB:HOST_PD2_PUBLIC_IP}:2379  | replication.max-replicas | 3     |
  | pd   | ${LAB:HOST_PD3_PUBLIC_IP}:2379 | replication.max-replicas | 3     |
  +------+---------------------+--------------------------+-------+
  3 rows in set (0.02 sec)
  Bye
  ```
