## モジュール 3: マルチテナント環境でのシステムリソース管理

このモジュールでは、リソース制御を使用して TiDB 内のリソースグループを効果的に管理する方法を説明します。これにより、異なるデータベースユーザーが制御された必要なリソースを受け取ることができます。そのため、異なるユーザーが所有するワークロードを事前に指定された優先度に分類することができます。TiDB リソース制御は、`RU_PER_SEC`、`PRIORITY`、`BURSTABLE` などのリソースグループ属性を利用して、DBA がシステムリソース制御を実現するのに役立ちます。この演習では `RU_PER_SEC` のみを使用します。

### 手順 1. データベースマルチテナント設定

+ データベースレベルで 2 つのテナントとして機能する 2 つのデータベースユーザーを作成します。`t999` はスキーマ `sbtest999` にアクセスし、`t1000` はスキーマ `sbtest1000` にアクセスします。
+ `t1000` と `sbtest1000` がプレミアムテナント構成であり、`t999` と `sbtest999` が無料ティアテナント構成であると仮定しましょう。

  ```sql
  CREATE USER 't999'@'%' IDENTIFIED BY 'tidb';
  CREATE USER 't1000'@'%' IDENTIFIED BY 'tidb';
  GRANT ALL PRIVILEGES ON sbtest999.*  TO 't999'@'%';
  GRANT ALL PRIVILEGES ON sbtest1000.*  TO 't1000'@'%';
  EXIT;
  ```

  ```output
  Query OK, 0 rows affected (0.02 sec)

  Query OK, 0 rows affected (0.01 sec)

  Query OK, 0 rows affected (0.02 sec)

  Query OK, 0 rows affected (0.02 sec)
  ```

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

+ これで、リモート Linux に接続された 2 つのターミナルが用意されました。

### 手順 2. 両方の接続からサンプルワークロードを開始し、ベースラインを観察する

+ **ターミナル 1** と **ターミナル 2** の両方でサンプルワークロードを開始します。サンプルワークロードは約 1 分間実行されます。

+ 以下のコマンドを [ターミナル 1](ssh://monitor1-ssh#1) に **コピー** します。これは、ユーザー `t999` としてスキーマ `sbtest999` でサンプルワークロードを実行します。実行せずに、[ターミナル 2](ssh://monitor1-ssh#2) に切り替えてください。

  ```bash
  cd
  clear
  cat << EOF > t999_sysbench_config
  mysql-host=${HOST_DB1_PRIVATE_IP}
  mysql-port=4000
  mysql-user=t999
  mysql-password=tidb
  mysql-db=sbtest999
  time=60
  threads=1
  report-interval=1
  EOF
  sysbench oltp_read_write run --config-file=t999_sysbench_config --tables=10 --table_size=100
  ```

+ 以下のコマンドを [ターミナル 2](ssh://monitor1-ssh#2) に **コピー** します。これは、ユーザー `t1000` としてスキーマ `sbtest1000` でサンプルワークロードを実行します。実行しないでください。

  ```bash
  cd
  clear
  cat << EOF > t1000_sysbench_config
  mysql-host=${HOST_DB1_PRIVATE_IP}
  mysql-port=4000
  mysql-user=t1000
  mysql-password=tidb
  mysql-db=sbtest1000
  time=60
  threads=1
  report-interval=1
  EOF
  sysbench oltp_read_write run --config-file=t1000_sysbench_config --tables=10 --table_size=100
  ```

+ 両方のターミナルが同じワークロードを実行する準備ができたので、[ターミナル 1](ssh://monitor1-ssh#1) で <kbd>ENTER</kbd> キーを押し、すぐに [ターミナル 2](ssh://monitor1-ssh#2) に切り替えて、再度 <kbd>ENTER</kbd> を押します。

+ ワークロードは 1 分間実行されます。両方のターミナルからの sysbench 出力を比較します。`tps` と `qps` を確認すると、以下のサンプル出力のように類似していることがわかります。

+ [ターミナル 1](ssh://monitor1-ssh#1) では、トランザクションは約 `79.95 per sec`、クエリは `1598.91 per sec` です。

  ```output
  ...
  [ 55s ] thds: 1 tps: 83.00 qps: 1655.99 (r/w/o: 1157.99/332.00/166.00) lat (ms,95%): 15.00 err/s: 0.00 reconn/s: 0.00
  [ 56s ] thds: 1 tps: 74.00 qps: 1486.01 (r/w/o: 1042.01/296.00/148.00) lat (ms,95%): 16.12 err/s: 0.00 reconn/s: 0.00
  [ 57s ] thds: 1 tps: 78.00 qps: 1551.99 (r/w/o: 1083.99/312.00/156.00) lat (ms,95%): 15.83 err/s: 0.00 reconn/s: 0.00
  [ 58s ] thds: 1 tps: 77.00 qps: 1555.00 (r/w/o: 1092.00/309.00/154.00) lat (ms,95%): 15.55 err/s: 0.00 reconn/s: 0.00
  [ 59s ] thds: 1 tps: 79.00 qps: 1567.00 (r/w/o: 1094.00/315.00/158.00) lat (ms,95%): 15.55 err/s: 0.00 reconn/s: 0.00
  [ 60s ] thds: 1 tps: 78.00 qps: 1557.99 (r/w/o: 1090.00/312.00/156.00) lat (ms,95%): 14.46 err/s: 0.00 reconn/s: 0.00
  SQL statistics:
      queries performed:
          read:                            67172
          write:                           19192
          other:                           9596
          total:                           95960
      transactions:                        4798   (79.95 per sec.)
      queries:                             95960  (1598.91 per sec.)
      ignored errors:                      0      (0.00 per sec.)
      reconnects:                          0      (0.00 per sec.)

  General statistics:
      total time:                          60.0146s
      total number of events:              4798

  Latency (ms):
           min:                                    8.86
           avg:                                   12.51
           max:                                   28.92
           95th percentile:                       15.83
           sum:                                60008.24

  Threads fairness:
      events (avg/stddev):           4798.0000/0.00
      execution time (avg/stddev):   60.0082/0.00
  ```

+ [ターミナル 2](ssh://monitor1-ssh#2) では、トランザクションは約 `80.57 per sec`、クエリは `1611.43 per sec` です。

  ```output
  ...
  [ 55s ] thds: 1 tps: 81.00 qps: 1609.01 (r/w/o: 1124.01/323.00/162.00) lat (ms,95%): 14.73 err/s: 0.00 reconn/s: 0.00
  [ 56s ] thds: 1 tps: 76.00 qps: 1534.04 (r/w/o: 1074.03/308.01/152.00) lat (ms,95%): 16.41 err/s: 0.00 reconn/s: 0.00
  [ 57s ] thds: 1 tps: 83.00 qps: 1660.01 (r/w/o: 1162.01/332.00/166.00) lat (ms,95%): 14.21 err/s: 0.00 reconn/s: 0.00
  [ 58s ] thds: 1 tps: 82.00 qps: 1639.99 (r/w/o: 1147.99/328.00/164.00) lat (ms,95%): 15.27 err/s: 0.00 reconn/s: 0.00
  [ 59s ] thds: 1 tps: 87.00 qps: 1739.99 (r/w/o: 1217.99/348.00/174.00) lat (ms,95%): 13.70 err/s: 0.00 reconn/s: 0.00
  [ 60s ] thds: 1 tps: 84.00 qps: 1672.99 (r/w/o: 1172.99/332.00/168.00) lat (ms,95%): 17.01 err/s: 0.00 reconn/s: 0.00
  SQL statistics:
      queries performed:
          read:                            67690
          write:                           19340
          other:                           9670
          total:                           96700
      transactions:                        4835   (80.57 per sec.)
      queries:                             96700  (1611.43 per sec.)
      ignored errors:                      0      (0.00 per sec.)
      reconnects:                          0      (0.00 per sec.)

  General statistics:
      total time:                          60.0074s
      total number of events:              4835

  Latency (ms):
           min:                                    8.53
           avg:                                   12.41
           max:                                   35.83
           95th percentile:                       15.83
           sum:                                60000.84

  Threads fairness:
      events (avg/stddev):           4835.0000/0.00
      execution time (avg/stddev):   60.0008/0.00
  ```

### 手順 3. 異なるテナントに RU クォータを設定する

+ ここで興味深いことが起こります。システムが圧迫されているとします。スケールアウトを決定する前に、プレミアムユーザー（t1000 など）により多くのシステムリソースを与え、無料ティアテナント（t999 など）には少なくしたいとします。

+ [ターミナル 1](ssh://monitor1-ssh#1) で、TiDB サーバーインスタンスに接続します。

  ```bash
  mysql --prompt="mysql [\d] > " -h ${HOST_DB1_PRIVATE_IP} -P 4000 -u root
  ```

  ```output
  mysql [(none)] >
  ```

+ ユーザー `t999` とユーザー `t1000` に対して、[リクエストユニット（RU）per second](https://docs.pingcap.com/tidb/stable/tidb-resource-control-ru-groups/#what-is-request-unit-ru) で異なるクォータを持つリソースグループを設定します。`t999` は `1000`、`t1000` は `20000` を取得します。

  ```sql
  DROP RESOURCE GROUP IF EXISTS free_tier;
  DROP RESOURCE GROUP IF EXISTS premium;
  CREATE RESOURCE GROUP free_tier RU_PER_SEC = 1000;
  CREATE RESOURCE GROUP premium RU_PER_SEC = 20000;
  ALTER USER t999 RESOURCE GROUP free_tier;
  ALTER USER t1000 RESOURCE GROUP premium;
  SELECT * FROM information_schema.resource_groups;
  SELECT Host, user, User_attributes FROM mysql.user WHERE user IN ('t999','t1000');
  EXIT
  ```

  ```output
  +-----------+------------+----------+-----------+-------------+------------+
  | NAME      | RU_PER_SEC | PRIORITY | BURSTABLE | QUERY_LIMIT | BACKGROUND |
  +-----------+------------+----------+-----------+-------------+------------+
  | default   | UNLIMITED  | MEDIUM   | YES       | NULL        | NULL       |
  | free_tier | 1000       | MEDIUM   | NO        | NULL        | NULL       |
  | premium   | 20000      | MEDIUM   | NO        | NULL        | NULL       |
  +-----------+------------+----------+-----------+-------------+------------+
  3 rows in set (0.00 sec)
  +------+-------+---------------------------------+
  | Host | user  | User_attributes                 |
  +------+-------+---------------------------------+
  | %    | t999  | {"resource_group": "free_tier"} |
  | %    | t1000 | {"resource_group": "premium"}   |
  +------+-------+---------------------------------+
  2 rows in set (0.00 sec)
  ```

### 手順 4. サンプルワークロードを再度開始し、結果を観察する

+ 以下のコマンドを [ターミナル 1](ssh://monitor1-ssh#1) に **コピー** します。これは、ユーザー `t999` としてスキーマ `sbtest999` でサンプルワークロードを実行します。実行せずに、[ターミナル 2](ssh://monitor1-ssh#2) に切り替えてください。

  ```bash
  clear
  cat << EOF > t999_sysbench_config
  mysql-host=${HOST_DB1_PRIVATE_IP}
  mysql-port=4000
  mysql-user=t999
  mysql-password=tidb
  mysql-db=sbtest999
  time=60
  threads=1
  report-interval=1
  EOF
  sysbench oltp_read_write run --config-file=t999_sysbench_config --tables=10 --table_size=100
  ```

+ 以下のコマンドを [ターミナル 2](ssh://monitor1-ssh#2) に **コピー** します。これは、ユーザー `t1000` としてスキーマ `sbtest1000` でサンプルワークロードを実行します。実行しないでください。

  ```bash
  clear
  cat << EOF > t1000_sysbench_config
  mysql-host=${HOST_DB1_PRIVATE_IP}
  mysql-port=4000
  mysql-user=t1000
  mysql-password=tidb
  mysql-db=sbtest1000
  time=60
  threads=1
  report-interval=1
  EOF
  sysbench oltp_read_write run --config-file=t1000_sysbench_config --tables=10 --table_size=100
  ```

+ 両方のターミナルが同じワークロードを実行する準備ができたので、[ターミナル 1](ssh://monitor1-ssh#1) で <kbd>ENTER</kbd> キーを押し、すぐに [ターミナル 2](ssh://monitor1-ssh#2) に切り替えて、再度 <kbd>ENTER</kbd> を押します。

+ 両方のターミナルからの sysbench 出力を比較します。`tps` と `qps` を確認すると、今回は同じではありません。

+ [ターミナル 1](ssh://monitor1-ssh#1) では、無料ティアテナントのトランザクションは約 `20.41 per sec`、クエリは `408.21 per sec` です。

  ```output
  ...
  [ 55s ] thds: 1 tps: 20.00 qps: 403.00 (r/w/o: 282.00/81.00/40.00) lat (ms,95%): 54.83 err/s: 0.00 reconn/s: 0.00
  [ 56s ] thds: 1 tps: 20.00 qps: 401.00 (r/w/o: 280.00/81.00/40.00) lat (ms,95%): 54.83 err/s: 0.00 reconn/s: 0.00
  [ 57s ] thds: 1 tps: 20.00 qps: 384.00 (r/w/o: 266.00/78.00/40.00) lat (ms,95%): 55.82 err/s: 0.00 reconn/s: 0.00
  [ 58s ] thds: 1 tps: 20.00 qps: 414.99 (r/w/o: 294.00/81.00/40.00) lat (ms,95%): 54.83 err/s: 0.00 reconn/s: 0.00
  [ 59s ] thds: 1 tps: 19.00 qps: 383.01 (r/w/o: 266.00/79.00/38.00) lat (ms,95%): 55.82 err/s: 0.00 reconn/s: 0.00
  [ 60s ] thds: 1 tps: 20.00 qps: 400.00 (r/w/o: 280.00/80.00/40.00) lat (ms,95%): 55.82 err/s: 0.00 reconn/s: 0.00
  SQL statistics:
      queries performed:
          read:                            17150
          write:                           4900
          other:                           2450
          total:                           24500
      transactions:                        1225   (20.41 per sec.)
      queries:                             24500  (408.21 per sec.)
      ignored errors:                      0      (0.00 per sec.)
      reconnects:                          0      (0.00 per sec.)

  General statistics:
      total time:                          60.0175s
      total number of events:              1225

  Latency (ms):
           min:                                   11.11
           avg:                                   48.99
           max:                                   58.21
           95th percentile:                       55.82
           sum:                                60014.80

  Threads fairness:
      events (avg/stddev):           1225.0000/0.00
      execution time (avg/stddev):   60.0148/0.00
  ```

+ [ターミナル 2](ssh://monitor1-ssh#2) では、プレミアムテナントのトランザクションは約 `82.60 per sec`、クエリは `1652.09 per sec` です。

  ```output
  ...
  [ 55s ] thds: 1 tps: 81.00 qps: 1617.00 (r/w/o: 1132.00/323.00/162.00) lat (ms,95%): 15.55 err/s: 0.00 reconn/s: 0.00
  [ 56s ] thds: 1 tps: 82.00 qps: 1635.00 (r/w/o: 1143.00/328.00/164.00) lat (ms,95%): 14.21 err/s: 0.00 reconn/s: 0.00
  [ 57s ] thds: 1 tps: 82.00 qps: 1645.00 (r/w/o: 1153.00/328.00/164.00) lat (ms,95%): 14.21 err/s: 0.00 reconn/s: 0.00
  [ 58s ] thds: 1 tps: 89.00 qps: 1774.00 (r/w/o: 1240.00/356.00/178.00) lat (ms,95%): 12.98 err/s: 0.00 reconn/s: 0.00
  [ 59s ] thds: 1 tps: 81.00 qps: 1622.00 (r/w/o: 1136.00/324.00/162.00) lat (ms,95%): 15.55 err/s: 0.00 reconn/s: 0.00
  [ 60s ] thds: 1 tps: 84.00 qps: 1685.00 (r/w/o: 1181.00/336.00/168.00) lat (ms,95%): 14.73 err/s: 0.00 reconn/s: 0.00
  SQL statistics:
      queries performed:
          read:                            69398
          write:                           19828
          other:                           9914
          total:                           99140
      transactions:                        4957   (82.60 per sec.)
      queries:                             99140  (1652.09 per sec.)
      ignored errors:                      0      (0.00 per sec.)
      reconnects:                          0      (0.00 per sec.)

  General statistics:
      total time:                          60.0076s
      total number of events:              4957

  Latency (ms):
           min:                                    8.78
           avg:                                   12.10
           max:                                   38.10
           95th percentile:                       15.27
           sum:                                60001.22

  Threads fairness:
      events (avg/stddev):           4957.0000/0.00
      execution time (avg/stddev):   60.0012/0.00
  ```

+ これでモジュール 3 は終了です。[ターミナル 1](ssh://monitor1-ssh#1) のワークロードが意図的に遅くされていることに注意してください。`RU_PER_SEC` に加えて、リソース制御は DBA 向けに `PRIORITY` や `BURSTABLE` などの他の設定可能な属性を提供します。これらすべてを活用する方法の詳細については、[リソース制御を使用した混合ワークロードの管理](/labs/demo_006) をご覧ください。次のモジュールに進んでください。
