## モジュール 3: 既存のワークロードに基づいた TiDB と TiKV のサイズ設定

### 注意

+ この実践では、`sysbench`を使用してワークロードのテストを行います。このワークロードは18,000 QPSの読み取りワークロードです。

### 手順  1. `sysbench` 環境の準備

+ ここをクリック - [ターミナル 3](ssh://monitor1-ssh#3)を開き、TiUPコントロールマシンに接続します。

  + `sysbench` の設定を行います。

   ```bash
   cat << EOF > sysbench_config
   mysql-host=${HOST_MONITOR1_PRIVATE_IP}
   mysql-port=6000
   mysql-user=root
   mysql-password=
   mysql-db=sbtest
   time=120
   threads=14
   report-interval=5
   EOF
   cat sysbench_config
   ```

   ```output
   mysql-host=10.90.1.190
   mysql-port=6000
   mysql-user=root
   mysql-password=
   mysql-db=sbtest
   time=120
   threads=14
   report-interval=5
   ```

### 手順  2. テストワークロードを適用

+ `sysbench` テストを開始します。

   ```bash
   sysbench \
    --config-file=sysbench_config oltp_read_only \
    --tables=6 \
    --table-size=10000000 run
   ```

   ```output
   sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)

   Running the test with following options:
   Number of threads: 14
   Report intermediate results every 5 second(s)
   Initializing random number generator from current time

   Initializing worker threads...

   Threads started!

   [ 5s ] thds: 14 tps: 1203.22 qps: 19280.38 (r/w/o: 16871.13/0.00/2409.25) lat (ms,95%): 14.46 err/s: 0.00 reconn/s: 0.00
   ...
   [ 120s ] thds: 14 tps: 1224.00 qps: 19581.56 (r/w/o: 17133.37/0.00/2448.20) lat (ms,95%): 13.95 err/s: 0.00 reconn/s: 0.00
   SQL statistics:
       queries performed:
           read:                            2048564
           write:                           0
           other:                           292652
           total:                           2341216
       transactions:                        146326 (1219.27 per sec.)
       queries:                             2341216 (19508.27 per sec.)
       ignored errors:                      0      (0.00 per sec.)
       reconnects:                          0      (0.00 per sec.)

   General statistics:
       total time:                          120.0102s
       total number of events:              146326

   Latency (ms):
            min:                                    9.18
            avg:                                   11.48
            max:                                   29.71
            95th percentile:                       13.95
            sum:                              1679913.22

   Threads fairness:
       events (avg/stddev):           10451.8571/163.05
       execution time (avg/stddev):   119.9938/0.00
   ```

### 手順  3. ベースラインを分析

+ QPS、レイテンシ、および TiDB リソース利用率を収集します。
  + QPS は: 19,508.27 per sec
  + P95 レイテンシは: 13.95ms
  + リソース利用率。Grafana ダッシュボードに切り替えて、`tidb-demo-Performance-Overview - Performance Overview` を見つけ、`TiDB CPU` & `TiKV CPU/IO MBps` を確認します。
    + TiDB CPU(Max): ≈ 6.1vc/8vc ≈ 76%
    + TiKV CPU(Max): ≈ 1.5vc/8vc ≈ 19%

+ TiDB クラスターサイジングツールの見積もり結果:
  + サイズ: tidb(8vc/16GiB) x 1, tikv(8vc/32GiB) x 3
  + QPS: 18,000
  + リソース利用率: tidb ≈ 95.24%, tikv ≈ 21.43%

  ![80%](https://lab-static.pingcap.com/quick-demo/demo-301-2-en.png)

+ `sysbench` の結果はツールの見積もりよりも少し良いことがわかります。サイジングツールは TiDB 6.x を基に作られており、私たちは TiDB tidb_version を使用してテストしています。

### 手順  4. TiDB SQL レイヤーをスケールアウト

+ TiDB SQL レイヤーに TiDB サーバーを追加してスケールアウトします。QPS が増加していることを確認してください。

+ スケールアウトの設定ファイルを確認します。

   ```bash
   cat scale-out-tidb.yaml
   ```

   ```output
   tidb_servers:
     - host: 10.90.2.188
       port: 4000
       status_port: 10080
       deploy_dir: /tidb-deploy/tidb-4000
       log_dir: /tidb-deploy/tidb-4000/log
   ```

+ 新しい tidb-server をスケールアウトします。

   ```bash
   ~/.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
   ```

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

  + TiDB クラスターを確認します。TiDB クラスターに 2 つの tidb-server があることを確認してください。

   ```bash
   ~/.tiup/bin/tiup cluster display tidb-demo
   ```

   ```output
   Cluster type:       tidb
   Cluster name:       tidb-demo
   Cluster version:    v8.1.0
   Deploy user:        ec2-user
   SSH type:           builtin
   Dashboard URL:      http://35.89.229.27:2379/dashboard
   Grafana URL:        http://10.90.4.39:3000
   ID                 Role          Host         Ports        OS/Arch       Status  Data Dir                      Deploy Dir
   --                 ----          ----         -----        -------       ------  --------                      ----------
   10.90.4.39:9093    alertmanager  10.90.4.39   9093/9094    linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
   10.90.4.39:3000    grafana       10.90.4.39   3000         linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
   10.90.2.182:2379   pd            10.90.2.182  2379/2380    linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.4.39:9090    prometheus    10.90.4.39   9090/12020   linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
   10.90.2.253:4000   tidb          10.90.2.253  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
   10.90.2.92:4000    tidb          10.90.2.92   4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
   10.90.3.122:20160  tikv          10.90.3.122  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.3.153:20160  tikv          10.90.3.153  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.3.5:20160    tikv          10.90.3.5    20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.4.39:6000    tiproxy       10.90.4.39   6000/3080    linux/x86_64  Up      -                             /tidb-deploy/tiproxy-6000
   Total nodes: 10
   ```

+ 現在 TiProxy に 2 つの TiDB サーバーが接続されていることを確認します。Grafana ダッシュボードにログインし、`tidb-demo-TiProxy-Summary - Backend` を見つけ、`Ping Backend Duration` パネルで 2 つの tidb-server があることを確認します。

### 手順  5. sysbench ワークロードのスケールアウト

+ `sysbench` スレッドを 28 に増やします。

   ```bash
   cat << EOF > sysbench_config
   mysql-host=${HOST_MONITOR1_PRIVATE_IP}
   mysql-port=6000
   mysql-user=root
   mysql-password=
   mysql-db=sbtest
   time=120
   threads=28
   report-interval=5
   EOF
   cat sysbench_config
   ```

   ```output
   mysql-host=10.90.1.190
   mysql-port=6000
   mysql-user=root
   mysql-password=
   mysql-db=sbtest
   time=120
   threads=28
   report-interval=5
   ```

+ 再度 `sysbench` テストを開始します。

   ```bash
   sysbench \
    --config-file=sysbench_config oltp_read_only \
    --tables=6 \
    --table-size=10000000 run
   ```

   ```output
   sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)

   Running the test with following options:
   Number of threads: 28
   Report intermediate results every 5 second(s)
   Initializing random number generator from current time

   Initializing worker threads...

   Threads started!

   [ 5s ] thds: 28 tps: 2272.50 qps: 36408.77 (r/w/o: 31858.37/0.00/4550.40) lat (ms,95%): 15.00 err/s: 0.00 reconn/s: 0.00
   ...
   [ 120s ] thds: 28 tps: 2301.17 qps: 36810.07 (r/w/o: 32208.13/0.00/4601.93) lat (ms,95%): 14.73 err/s: 0.00 reconn/s: 0.00
   SQL statistics:
       queries performed:
           read:                            3861368
           write:                           0
           other:                           551624
           total:                           4412992
       transactions:                        275812 (2298.15 per sec.)
       queries:                             4412992 (36770.39 per sec.)
       ignored errors:                      0      (0.00 per sec.)
       reconnects:                          0      (0.00 per sec.)

   General statistics:
       total time:                          120.0136s
       total number of events:              275812

   Latency (ms):
            min:                                    9.41
            avg:                                   12.18
            max:                                   41.35
            95th percentile:                       14.73
            sum:                              3359870.50

   Threads fairness:
       events (avg/stddev):           9850.4286/324.02
       execution time (avg/stddev):   119.9954/0.00
   ```

### 手順  6. スケールアウトの結果を分析

+ QPS、レイテンシ、および TiDB リソース利用率を確認します。
  + QPS は: 36,770.39 per sec
  + P95 レイテンシは: 14.73ms
  + リソース利用率。Grafana ダッシュボードに切り替えて、`tidb-demo-Performance-Overview - Performance Overview` を見つけ、`TiDB CPU` & `TiKV CPU/IO MBps` を確認します。
    + tidb CPU(Max): ≈ 6vc/8vc ≈ 75%
    + tikv CPU(Max): ≈ 2.8vc/8vc ≈ 35%

+ TiDB クラスターサイジングツールの見積もり結果:
  + サイズ: tidb(8vc/16GiB) x 2, tikv(8vc/32GiB) x 3
  + QPS: 36,000
  + リソース利用率: tidb ≈ 95.24%, tikv ≈ 42.86%

  ![80%](https://lab-static.pingcap.com/quick-demo/demo-301-3-en.png)

+ `sysbench` の結果はツールの見積もりよりも少し良いことがわかります。サイジングツールは TiDB 6.x を基に作られており、私たちは TiDB tidb_version を使用してテストしています。
