# 演習 5: 混合ワークロードにおけるリソース制御の使用

## 概要

この演習では、2つのワークロードのリソース使用を管理するためにリソース制御を使用します。以下はTiDBクラスタの展開トポロジ図を示しています。

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


> [!TIP]
> 演習環境を起動するには、**開始**をクリックしてください。
> 環境の準備が整ったら、下部のツールバーで **次のモジュール** を選択して **モジュール 1** に進みます。
> そして、ステップバイステップの演習ガイドに従って、ハンズオン環境に接続し、タスクを開始してください。

## モジュール 1: ベースラインのセットアップと観察

### 手順 1. 2つのターミナルを開く

+ 以下のリンクをクリックして、演習用仮想マシンへの2つのSSH接続を開きます：
  + [ターミナル 1](ssh://monitor1-ssh#1)
  + [ターミナル 2](ssh://monitor1-ssh#2)

+ これで2つのアクティブなターミナルセッションが利用可能になります。

+ ログイン後に表示されるバナーは以下のようになります。

    ```output
     ,     #_
    ~\_  ####_        Amazon Linux 2
    ~~  \_#####\
    ~~     \###|      
    ~~       \#/ ___
    ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
     ~~._.   _/
        _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
      _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/
    ```


### 手順 2. データの準備

+ いずれかのターミナルで、`tidb-admin-dataset.zip` からデータディレクトリアーカイブを `monitor1` ノードの `/home/ec2-user/stage/` に展開します。
  
  ```bash
  unzip -u stage/tidb-admin-dataset-v2.zip -d stage/
  ```

### 手順 3. ターミナル1で `sysbench` スキーマを準備

+ [ターミナル 1](ssh://monitor1-ssh#1)で、sysbenchスキーマを準備するためのスクリプトを実行します。
  
  ```bash
  mysql -h ${HOST_DB1_PRIVATE_IP} -uroot -P4000 --verbose
  ```

  ```sql
  CREATE DATABASE sbtest;
  CREATE USER 'userA'@'%' IDENTIFIED BY 'tidb';
  CREATE USER 'userB'@'%' IDENTIFIED BY 'tidb';
  GRANT ALL PRIVILEGES ON *.*  TO 'userA'@'%';
  GRANT ALL PRIVILEGES ON *.*  TO 'userB'@'%';
  ```

  ```sql
  exit;
  ```

  ```bash
  sysbench '/usr/local/share/sysbench/oltp_read_only.lua' \
    --mysql-host=${HOST_DB1_PRIVATE_IP} \
    --mysql-port=4000 \
    --mysql-user=root \
    --mysql-db=sbtest \
    --percentile=99 \
    --threads=10   \
    --tables=32 \
    --table-size=100000 \
    --report-interval=2 \
    --db-driver=mysql prepare
  ```
  
### 手順 4. ターミナル1で、userA によるサンプルワークロードを開始

+ ステップ4とステップ5をほぼ同時に実行してください。

  ```bash
  sysbench '/usr/local/share/sysbench/oltp_read_only.lua' \
    --mysql-host=${HOST_DB1_PRIVATE_IP} \
    --mysql-port=4000 \
    --mysql-user=userA \
    --mysql-db=sbtest \
    --percentile=99 \
    --mysql-password=tidb \
    --time=300 \
    --threads=10 \
    --tables=32 \
    --table-size=100000 \
    --report-interval=2 run
  ```

### 手順 5. ターミナル2で、userB による同じワークロードを開始

  ```bash
  sysbench '/usr/local/share/sysbench/oltp_read_only.lua' \
    --mysql-host=${HOST_DB2_PRIVATE_IP} \
    --mysql-port=4000 \
    --mysql-user=userB \
    --mysql-db=sbtest \
    --percentile=99 \
    --mysql-password=tidb \
    --time=300 \
    --threads=10 \
    --tables=32 \
    --table-size=100000 \
    --report-interval=2 run
  ```

### 手順 6. 両方のターミナルで、QPS を確認
 
+ [ターミナル 1](ssh://monitor1-ssh#1)と[ターミナル 2](ssh://monitor1-ssh#2)でのQPSが類似していることを確認してください。リソース制御の措置をまだ適用していないため、userAとuserBはTiDBリソースの競合において対等です。以下の図に示されているパフォーマンスの数値はあくまでも参考です。演習で使用される仮想マシンのタイプは、スクリーンショットを作成した時に使用したものとは異なる場合があります。

  ![60%](https://lab-static.pingcap.com/quick-demo/demo-006-setup.png)

### 手順 7. 両方のターミナルで、ワークロードを終了

+ <kbd>CTRL</kbd> + <kbd>C</kbd> キーを押し、次のセクションに進む前に両方のワークロードを停止します。


## モジュール 2: TiDB サーバの実行キューを制御

  ![60%](https://lab-static.pingcap.com/quick-demo/demo-006-1-en.png)

### 手順 1. ターミナル1で、リソースグループを設定

+ [ターミナル 1](ssh://monitor1-ssh#1)で、異なる秒当たりのRUクオータでuserAとuserBのためにリソースグループを設定するスクリプトを実行します。
  
  ```bash
  mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -u root --verbose
  ```

  ```sql
  ALTER USER userA RESOURCE GROUP default;
  ALTER USER userB RESOURCE GROUP default;
  DROP RESOURCE GROUP IF EXISTS rg1;
  DROP RESOURCE GROUP IF EXISTS rg2;
  CREATE RESOURCE GROUP rg1 RU_PER_SEC = 500;
  CREATE RESOURCE GROUP rg2 RU_PER_SEC = 250;
  ALTER USER userA RESOURCE GROUP rg1;
  ALTER USER userB RESOURCE GROUP rg2;
  SELECT * FROM information_schema.resource_groups;
  SELECT Host,user, User_attributes FROM mysql.user WHERE user IN ('userA','userB');
  ```

  ```sql
  exit;
  ```

### 手順 2. ターミナル1で、userA によるサンプルワークロードを開始

+ ステップ2とステップ3をほぼ同時に実行してください。
  
  ```bash
  sysbench '/usr/local/share/sysbench/oltp_read_only.lua' \
    --mysql-host=${HOST_DB1_PRIVATE_IP} \
    --mysql-port=4000 \
    --mysql-user=userA \
    --mysql-db=sbtest \
    --percentile=99 \
    --mysql-password=tidb \
    --time=300 \
    --threads=10 \
    --tables=32 \
    --table-size=100000 \
    --report-interval=2 run
  ```

### 手順 3. ターミナル2で、userB による同じワークロードを開始

  ```bash
  sysbench '/usr/local/share/sysbench/oltp_read_only.lua' \
    --mysql-host=${HOST_DB2_PRIVATE_IP} \
    --mysql-port=4000 \
    --mysql-user=userB \
    --mysql-db=sbtest \
    --percentile=99 \
    --mysql-password=tidb \
    --time=300 \
    --threads=10 \
    --tables=32 \
    --table-size=100000 \
    --report-interval=2 run
  ```

### 手順 4. 両方のターミナルで、QPS を確認

+ userAのQPSがuserBのQPSよりも高いことを観察します。これは、userAにより多くのRU_PER_SECクオータが割り当てられているためです。以下の図に示されているパフォーマンスの数値はあくまでも参考です。演習で使用される仮想マシンのタイプは、スクリーンショットを作成した時に使用したものとは異なる場合があります。
  
  ![60%](https://lab-static.pingcap.com/quick-demo/demo-006-lab-2-1.png)

### 手順 5. Grafana ダッシュボードでリソース使用を確認

+ admin/adminで[Grafana Prometheus ダッシュボード](http://${LAB:HOST_MONITOR1_PUBLIC_IP}:3000)にログインしてください、tidb-demo-TiDB-Resource-Control -> Resource Unit -> RU パネルを見つけ、rg1がrg2よりも高いRU_PER_SECを持っていることを確認してください。以下の図に示されているパフォーマンスの数値はあくまでも参考です。演習で使用される仮想マシンのタイプは、スクリーンショットを作成した時に使用したものとは異なる場合があります。
  
  ![60%](https://lab-static.pingcap.com/quick-demo/demo-006-lab-2.png)

+ ハードウェアの制限のため、以下のことはデモできません: (1) リソースグループの優先度を管理することによるTiDBクラスタのスケジューリングキューの制御。 (2) PRIORITY設定を尊重しつつ、ベストエフォートで両方のワークロードを提供するためのBURSTABLEのオン。これらの2つのデモに興味がある場合は、当社のKickstartワークショップにご参加ください。講師または営業にお話しください。

### 手順 6. 任意のターミナルで、リソースグループとユーザーを削除

  ```bash
  mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -u root --verbose
  ```

  ```sql
  DROP USER userA;
  DROP USER userB;
  DROP RESOURCE GROUP IF EXISTS rg1;
  DROP RESOURCE GROUP IF EXISTS rg2;
  ```

## 演習終了