# 实验 5：在混合工作负载中使用资源控制

## 概述

在本实验中，你将使用资源控制来管理两种工作负载的资源使用情况。以下展示了 TiDB 集群的部署拓扑图。

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

> [!TIP]
> 点击 **开始** 启动实验环境。
> 环境准备就绪后，点击底部工具栏中的 **前进** 进入 **模块 1**。
> 然后，按照实验指南的步骤连接到实践环境并开始你的任务。

## 模块 1：设置并观察基线

### 步骤 1：登录远程 Linux

+ 通过点击以下链接打开 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)

### Step 7. 在两个终端中，终止工作负载

+ 在进入下一部分之前，按 <kbd>CTRL</kbd> + <kbd>C</kbd> 停止两个工作负载。


## 模块 2：控制 TiDB TiDB server 运行队列

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

### 步骤 1. 在终端 1 中，设置资源组

+ 在[终端 1](ssh://monitor1-ssh#1)中，运行脚本为 userA 和 userB 设置资源组，并为每秒资源单位（RU）设置不同的配额: 
  
  ```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 Dashboard 上检查资源使用情况

+ 使用 admin/admin 登录到 [Grafana Prometheus Dashboard](http://${LAB:HOST_MONITOR1_PUBLIC_IP}:3000)，找到 tidb-demo-TiDB-Resource-Control -> Resource Unit -> RU 面板，并确认 rg1 的 RU_PER_SEC 高于 rg2。请注意，下图中显示的性能数值仅为示意。实验中使用的虚拟机类型可能与截图时使用的不同。
  
  ![60%](https://lab-static.pingcap.com/quick-demo/demo-006-lab-2.png)

+ 由于硬件限制，我们将无法演示以下内容：(1) 通过管理资源组优先级来控制 TiDB 集群调度队列。 (2) 开启 BURSTABLE 以尽力为两种工作负载提供服务，同时遵循 PRIORITY 设置。如果你对这两个演示感兴趣，可以考虑参加我们的 Kickstart Workshops。请与讲师或销售人员沟通。

### 步骤 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;
  ```

## 实验结束