## モジュール 4: ホットデータとコールドデータのストレージ層配置の実装

この演習では、TiDBのSQL内の配置ルールの特徴機能を体験します。この機能は、SQLステートメントを使用してTiDB内でデータがどこに格納されるかを指定することができます。配置ルールを使用してコスト効率を改善するために、テーブルのパーティションを利用してコールドデータを`低コスト`ストレージ（または低パフォーマンスノード）に、ホットデータを`高コスト`ストレージ（または高パフォーマンスノード）に分離する練習を行います。

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

### 手順 1. TiKV クラスタのスケールアウト

+ TiKV クラスタをスケールアウトして、低パフォーマンスストレージを持つ3つの追加TiKVノードを含めます。この演習では、TiKVノードが稼働している各EC2に追加のTiKVインスタンスを1つ置くだけです。3つの新しいTiKVノードが低パフォーマンスストレージを持ち、既存の3つのTiKVノードが高パフォーマンスストレージを持っていることを想定します。

  ```bash
  tiup cluster scale-out tidb-test solution-topology-placement-rule.yaml --yes --user ec2-user -i ~/.ssh/pe-class-key-${LAB:REGION_NAME}.pem
  ```

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

### 手順 2. TiDB クラスタの状態を確認する

  ```bash
  tiup cluster display tidb-test
  ```

  ```output
  ...
  Cluster type:       tidb
  Cluster name:       tidb-test
  Cluster version:    v7.5.1
  Deploy user:        tidb
  SSH type:           builtin
  Dashboard URL:      http://10.90.2.59:2379/dashboard
  Grafana URL:        http://10.90.4.204:3000
  ID                 Role          Host         Ports                            OS/Arch       Status   Data Dir                      Deploy Dir
  --                 ----          ----         -----                            -------       ------   --------                      ----------
  10.90.4.204:9093   alertmanager  10.90.4.204  9093/9094                        linux/x86_64  Up       /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  10.90.4.204:3000   grafana       10.90.4.204  3000                             linux/x86_64  Up       -                             /tidb-deploy/grafana-3000
  10.90.1.22:2379    pd            10.90.1.22   2379/2380                        linux/x86_64  Up       /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.2.59:2379    pd            10.90.2.59   2379/2380                        linux/x86_64  Up|L|UI  /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.3.126:2379   pd            10.90.3.126  2379/2380                        linux/x86_64  Up       /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.4.204:9090   prometheus    10.90.4.204  9090/12020                       linux/x86_64  Up       /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  10.90.1.123:4000   tidb          10.90.1.123  4000/10080                       linux/x86_64  Up       -                             /tidb-deploy/tidb-4000
  10.90.2.193:4000   tidb          10.90.2.193  4000/10080                       linux/x86_64  Up       -                             /tidb-deploy/tidb-4000
  10.90.4.100:9000   tiflash       10.90.4.100  9000/8123/3930/20170/20292/8234  linux/x86_64  Up       /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
  10.90.1.45:20160   tikv          10.90.1.45   20160/20180                      linux/x86_64  Up       /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.1.45:20161   tikv          10.90.1.45   20161/20181                      linux/x86_64  Up       /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  10.90.2.251:20160  tikv          10.90.2.251  20160/20180                      linux/x86_64  Up       /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.2.251:20161  tikv          10.90.2.251  20161/20181                      linux/x86_64  Up       /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  10.90.3.130:20160  tikv          10.90.3.130  20160/20180                      linux/x86_64  Up       /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.130:20161  tikv          10.90.3.130  20161/20181                      linux/x86_64  Up       /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  Total nodes: 15
  ```

### 手順 3. 配置ポリシーを作成する

+ 高パフォーマンスのストレージを持つTiKVノードにホットデータを、低パフォーマンスのストレージを持つTiKVノードにコールドデータを割り当てるために、配置ポリシーを作成します。

+ rootとしてTiDBサーバーに接続します。

    ```bash
    ./connect-db1.sh
    ```

    ```output
    tidb:db1>
    ```

+ 配置ルールに利用可能なラベルを確認します。キーが`storage-performance`のラベルに注意してください。`engine`、`zone`、および`region`は、現在は無視しても安全です。

    ```sql
    SHOW PLACEMENT LABELS;
    ```

    ```output
    tidb:db1> SHOW PLACEMENT LABELS;
    +---------------------+-----------------------+
    | Key                 | Values                |
    +---------------------+-----------------------+
    | engine              | ["tiflash"]           |
    | region              | ["Seattle"]           |
    | storage-performance | ["high", "low"]       |
    | zone                | ["az1", "az2", "az3"] |
    +---------------------+-----------------------+
    4 rows in set (0.00 sec)
    ```

+ 使用可能なラベルとそれに対応するTiKVストアを確認します。なお、`store_id`列はTiKVストアIDを表し、`label`列は各TiKVストアのラベル付けされたキーバリューを示しています。

    ```sql
    SELECT store_id, address, store_state_name, label
    FROM information_schema.tikv_store_status;
    ```

    ```output
    tidb:db1> SELECT store_id, address, store_state_name, label
          -> FROM information_schema.tikv_store_status;
    +----------+-------------------+------------------+--------------------------------------------------------------------------------------------------------------------------+
    | store_id | address           | store_state_name | label                                                                                                                    |
    +----------+-------------------+------------------+--------------------------------------------------------------------------------------------------------------------------+
    |        1 | 10.90.3.130:20160 | Up               | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "high"}, {"key": "zone", "value": "az3"}]|
    |        2 | 10.90.2.251:20160 | Up               | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "high"}, {"key": "zone", "value": "az2"}]|
    |        3 | 10.90.1.45:20160  | Up               | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "high"}, {"key": "zone", "value": "az1"}]|
    |       98 | 10.90.4.100:3930  | Up               | [{"key": "engine", "value": "tiflash"}]                                                                                  |
    |      186 | 10.90.2.251:20161 | Up               | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az2"}] |
    |      187 | 10.90.1.45:20161  | Up               | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az1"}] |
    |      188 | 10.90.3.130:20161 | Up               | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az3"}] |
    +----------+-------------------+------------------+--------------------------------------------------------------------------------------------------------------------------+
    7 rows in set (0.01 sec)
    ```

+ ホットデータのための配置ポリシーを作成し、ラベルのキー・バリューペア`(storage-performance, high)`にマッピングします。

    ```sql
    DROP PLACEMENT POLICY IF EXISTS hot;
    ```

    ```output
    tidb:db1> DROP PLACEMENT POLICY IF EXISTS hot;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    ```

    ```sql
    CREATE PLACEMENT POLICY hot
       CONSTRAINTS="[+storage-performance=high]";
    ```

    ```output
    tidb:db1> CREATE PLACEMENT POLICY hot
          ->   CONSTRAINTS="[+storage-performance=high]";
    Query OK, 0 rows affected (0.07 sec)
    ```

+ コールドデータ用の配置ポリシーを作成し、それをラベルのキー・バリュー・ペア `(storage-performance, low)` にマッピングします。

    ```sql
    DROP PLACEMENT POLICY IF EXISTS cold;
    ```

    ```output
    tidb:db1> DROP PLACEMENT POLICY IF EXISTS cold;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    ```

    ```sql
    CREATE PLACEMENT POLICY cold
       CONSTRAINTS="[+storage-performance=low]";
    ```

    ```output
    tidb:db1> CREATE PLACEMENT POLICY cold
          ->   CONSTRAINTS="[+storage-performance=low]";
    Query OK, 0 rows affected (0.07 sec)
    ```

+ 作成された配置ルールの制約定義を確認します: `hot` と `cold`:

    ```sql
    SELECT policy_name, constraints FROM information_schema.placement_policies;
    ```

    ```output
    tidb:db1> SELECT policy_name, constraints FROM information_schema.placement_policies;
    +-------------+-----------------------------+
    | policy_name | constraints                 |
    +-------------+-----------------------------+
    | hot         | [+storage-performance=high] |
    | cold        | [+storage-performance=low]  |
    +-------------+-----------------------------+
    2 rows in set (0.00 sec)
    ```

### 手順 4. テーブルを2つ作成する

+ 前の段階での配置ルールを利用して2つのレンジパーティションテーブルを作成し、1つはコールドとホットのパーティションを持ち、もう1つはコールドのみのパーティションを持つテーブルを作成して、ストレージコストの効率を最大化します。

+ `hot` と `cold` の配置ルールを使用して、`test.orders` のパーティションテーブルを作成します。`order_date` が2010年より前および2010年から2015年の間（2015年を含まない）の注文は `cold` としてマークされ、2015年以降の注文は `hot` としてマークされて `MAXVALUE` パーティションにマッピングされます。

    ```sql
    DROP TABLE IF EXISTS test.orders;
    ```

    ```output
    tidb:db1> DROP TABLE IF EXISTS test.orders;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    ```

    ```sql
    CREATE TABLE test.orders (order_id INT, item VARCHAR(50), order_date DATE, PRIMARY KEY (order_date, order_id))
    PARTITION BY RANGE( YEAR(order_date) ) (
       PARTITION p10 VALUES LESS THAN (2010) PLACEMENT POLICY=cold,
       PARTITION p15 VALUES LESS THAN (2015) PLACEMENT POLICY=cold,
       PARTITION pm VALUES LESS THAN MAXVALUE PLACEMENT POLICY=hot
    );
    ```

    ```output
    tidb:db1> CREATE TABLE test.orders (order_id INT, item VARCHAR(50), order_date DATE, PRIMARY KEY (order_date, order_id))
       -> PARTITION BY RANGE( YEAR(order_date) ) (
       ->   PARTITION p10 VALUES LESS THAN (2010) PLACEMENT POLICY=cold,
       ->   PARTITION p15 VALUES LESS THAN (2015) PLACEMENT POLICY=cold,
       ->   PARTITION pm VALUES LESS THAN MAXVALUE PLACEMENT POLICY=hot
       -> );
    Query OK, 0 rows affected (0.34 sec)
    ```

+ すべてのパーティションに対して`cold`配置ルールのみを使用して、パーティションテーブル`test.orders_log`を作成します。

    ```sql
    DROP TABLE IF EXISTS test.orders_log;
    ```

    ```output
    tidb:db1> DROP TABLE IF EXISTS test.orders_log;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    ```

    ```sql
    CREATE TABLE test.orders_log (order_id INT, item VARCHAR(50), order_date DATE, PRIMARY KEY (order_date, order_id))
    PARTITION BY RANGE( YEAR(order_date) ) (
       PARTITION p10 VALUES LESS THAN (2010) PLACEMENT POLICY=cold,
       PARTITION p15 VALUES LESS THAN (2015) PLACEMENT POLICY=cold,
       PARTITION pm VALUES LESS THAN MAXVALUE PLACEMENT POLICY=cold
    );
    ```

    ```output
    tidb:db1> CREATE TABLE test.orders_log (order_id INT, item VARCHAR(50), order_date DATE, PRIMARY KEY (order_date, order_id))
       -> PARTITION BY RANGE( YEAR(order_date) ) (
       ->   PARTITION p10 VALUES LESS THAN (2010) PLACEMENT POLICY=cold,
       ->   PARTITION p15 VALUES LESS THAN (2015) PLACEMENT POLICY=cold,
       ->   PARTITION pm VALUES LESS THAN MAXVALUE PLACEMENT POLICY=cold
       -> );
    Query OK, 0 rows affected (0.38 sec)
    ```

### 手順 5. 配置ルールが適用されたことを確認する

+ ホットとコールドのテーブル `test.orders` の TiKV リージョン情報を表示します。`START_KEY` が最も高い `REGION_ID` に注目してください。それが `MAXVALUE` パーティションです。例として出力すると、`REGION_ID` は264です（環境によってリージョンIDと開始キーの番号が異なる場合があります）。

  ```sql
  SHOW TABLE test.orders REGIONS\G
  ```

  ```output
  tidb:db1> SHOW TABLE test.orders REGIONS\G
  *************************** 1. row ***************************
              REGION_ID: 256
              START_KEY: t_83_
                 END_KEY: t_84_
              LEADER_ID: 259
        LEADER_STORE_ID: 188
                 PEERS: 259, 269, 271
              SCATTERING: 0
           WRITTEN_BYTES: 136
              READ_BYTES: 0
  APPROXIMATE_SIZE(MB): 1
        APPROXIMATE_KEYS: 0
  SCHEDULING_CONSTRAINTS: CONSTRAINTS="[+storage-performance=low]"
        SCHEDULING_STATE: SCHEDULED
  *************************** 2. row ***************************
              REGION_ID: 260
              START_KEY: t_84_
                 END_KEY: t_85_
              LEADER_ID: 263
        LEADER_STORE_ID: 188
                 PEERS: 263, 270, 272
              SCATTERING: 0
           WRITTEN_BYTES: 136
              READ_BYTES: 0
  APPROXIMATE_SIZE(MB): 1
        APPROXIMATE_KEYS: 0
  SCHEDULING_CONSTRAINTS: CONSTRAINTS="[+storage-performance=low]"
        SCHEDULING_STATE: SCHEDULED
  *************************** 3. row ***************************
              REGION_ID: 264
              START_KEY: t_85_
                 END_KEY: t_86_
              LEADER_ID: 266
        LEADER_STORE_ID: 3
                 PEERS: 265, 266, 268
              SCATTERING: 0
           WRITTEN_BYTES: 0
              READ_BYTES: 0
  APPROXIMATE_SIZE(MB): 1
        APPROXIMATE_KEYS: 0
  SCHEDULING_CONSTRAINTS: CONSTRAINTS="[+storage-performance=high]"
        SCHEDULING_STATE: SCHEDULED
  3 rows in set (0.02 sec)
  ```

+ テーブル `test.orders` におけるリージョンと TiKV ストアのマッピングが配置ポリシーと一致していることを確認します。配置ルールによれば、`REGION_ID` 264 のリージョンは `ストレージパフォーマンス:高` の TiKV ノードにマッピングされるべきで、他の二つのリージョンである 256 と 260 は `ストレージパフォーマンス:低` の TiKV ノードにマッピングされるべきです。

  ```sql
  SELECT kvrs.region_id, kvss.store_id, kvrp.is_leader, kvss.label, kvss.start_ts
     FROM information_schema.tikv_region_status kvrs
     JOIN information_schema.tikv_region_peers kvrp
     ON kvrs.region_id = kvrp.region_id
     JOIN information_schema.tikv_store_status kvss
     ON kvrp.store_id = kvss.store_id
     JOIN information_schema.tables t
     ON t.table_name = kvrs.table_name
     WHERE t.table_schema='test'
     AND t.table_name='orders'
     AND kvrs.is_index = 0
     AND kvrp.is_leader = 1;
  ```

  ```output
  tidb:db1> SELECT kvrs.region_id, kvss.store_id, kvrp.is_leader, kvss.label, kvss.start_ts
     ->   FROM information_schema.tikv_region_status kvrs
     ->   JOIN information_schema.tikv_region_peers kvrp
     ->   ON kvrs.region_id = kvrp.region_id
     ->   JOIN information_schema.tikv_store_status kvss
     ->   ON kvrp.store_id = kvss.store_id
     ->   JOIN information_schema.tables t
     ->   ON t.table_name = kvrs.table_name
     ->   WHERE t.table_schema='test'
     ->   AND t.table_name='orders'
     ->   AND kvrs.is_index = 0
     ->   AND kvrp.is_leader = 1;
  +-----------+----------+-----------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
  | region_id | store_id | is_leader | label                                                                                                                    | start_ts            |
  +-----------+----------+-----------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
  |       264 |        3 |         1 | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "high"}, {"key": "zone", "value": "az1"}]| 2023-06-08 06:47:58 |
  |       256 |      188 |         1 | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az3"}] | 2023-06-08 06:49:39 |
  |       260 |      188 |         1 | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az3"}] | 2023-06-08 06:49:39 |
  +-----------+----------+-----------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
  3 rows in set (0.01 sec)
  ```

+ `COLD`のみのテーブル`test.orders_log`のTiKVリージョン情報を表示します。出力例において、すべてのリージョンの`REGION_ID`に注意してください。それらは277、281、および285です（ただし、環境によってはリージョンIDや開始キーの番号が異なる場合があります）。

  ```sql
  SHOW TABLE test.orders_log REGIONS\G
  ```

  ```output
  tidb:db1> SHOW TABLE test.orders_log REGIONS\G
  *************************** 1. row ***************************
              REGION_ID: 277
              START_KEY: t_88_
                 END_KEY: t_89_
              LEADER_ID: 280
        LEADER_STORE_ID: 188
                 PEERS: 280, 289, 292
              SCATTERING: 0
           WRITTEN_BYTES: 136
              READ_BYTES: 0
  APPROXIMATE_SIZE(MB): 1
        APPROXIMATE_KEYS: 0
  SCHEDULING_CONSTRAINTS: CONSTRAINTS="[+storage-performance=low]"
        SCHEDULING_STATE: SCHEDULED
  *************************** 2. row ***************************
              REGION_ID: 281
              START_KEY: t_89_
                 END_KEY: t_90_
              LEADER_ID: 284
        LEADER_STORE_ID: 188
                 PEERS: 284, 291, 294
              SCATTERING: 0
           WRITTEN_BYTES: 136
              READ_BYTES: 0
  APPROXIMATE_SIZE(MB): 1
        APPROXIMATE_KEYS: 0
  SCHEDULING_CONSTRAINTS: CONSTRAINTS="[+storage-performance=low]"
        SCHEDULING_STATE: SCHEDULED
  *************************** 3. row ***************************
              REGION_ID: 285
              START_KEY: t_90_
                 END_KEY: t_91_
              LEADER_ID: 288
        LEADER_STORE_ID: 188
                 PEERS: 288, 290, 293
              SCATTERING: 0
           WRITTEN_BYTES: 136
              READ_BYTES: 0
  APPROXIMATE_SIZE(MB): 1
        APPROXIMATE_KEYS: 0
  SCHEDULING_CONSTRAINTS: CONSTRAINTS="[+storage-performance=low]"
        SCHEDULING_STATE: SCHEDULED
  3 rows in set (0.02 sec)
  ```

+ テーブル`test.orders_log`のリージョンとTiKVストアのマッピングが配置ポリシーと一致していることを確認します。配置ルールによると、すべてのリージョンは`storage-performance:low`のTiKVノードにマッピングされるべきです。

  ```sql
  SELECT kvrs.region_id, kvss.store_id, kvrp.is_leader, kvss.label, kvss.start_ts
     FROM information_schema.tikv_region_status kvrs
     JOIN information_schema.tikv_region_peers kvrp
     ON kvrs.region_id = kvrp.region_id
     JOIN information_schema.tikv_store_status kvss
     ON kvrp.store_id = kvss.store_id
     JOIN information_schema.tables t
     ON t.table_name = kvrs.table_name
     WHERE t.table_schema='test'
     AND t.table_name='orders_log'
     AND kvrs.is_index = 0
     AND kvrp.is_leader = 1;
  ```

  ```output
  tidb:db1> SELECT kvrs.region_id, kvss.store_id, kvrp.is_leader, kvss.label, kvss.start_ts
     ->   FROM information_schema.tikv_region_status kvrs
     ->   JOIN information_schema.tikv_region_peers kvrp
     ->   ON kvrs.region_id = kvrp.region_id
     ->   JOIN information_schema.tikv_store_status kvss
     ->   ON kvrp.store_id = kvss.store_id
     ->   JOIN information_schema.tables t
     ->   ON t.table_name = kvrs.table_name
     ->   WHERE t.table_schema='test'
     ->   AND t.table_name='orders_log'
     ->   AND kvrs.is_index = 0
     ->   AND kvrp.is_leader = 1;
  +-----------+----------+-----------+-------------------------------------------------------------------------------------------------------------------------+---------------------+
  | region_id | store_id | is_leader | label                                                                                                                   | start_ts            |
  +-----------+----------+-----------+-------------------------------------------------------------------------------------------------------------------------+---------------------+
  |       281 |      188 |         1 | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az3"}]| 2023-06-08 06:49:39 |
  |       285 |      188 |         1 | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az3"}]| 2023-06-08 06:49:39 |
  |       277 |      188 |         1 | [{"key": "region", "value": "Seattle"}, {"key": "storage-performance", "value": "low"}, {"key": "zone", "value": "az3"}]| 2023-06-08 06:49:39 |
  +-----------+----------+-----------+-------------------------------------------------------------------------------------------------------------------------+---------------------+
  3 rows in set (0.01 sec)
  ```

+ クエリトレースを実行して、テーブル `test.orders` のパーティションのプルーニングを確認します。2010年から2015年までのデータをクエリしているため、コールドストレージでのクエリスキャンが予想されます。出力から、リージョンID 260 のリージョンがスキャンされていることが観察されます。これは `storage-performance:low` とラベル付けされた TiKV ノード上にあります。

  ```bash
  TRACE
  SELECT item, order_date FROM test.orders
  WHERE order_date BETWEEN STR_TO_DATE('01/01/2013', '%m/%d/%Y') AND STR_TO_DATE('12/31/2013', '%m/%d/%Y');
  ```

  ```output
  tidb:db1> TRACE
     -> SELECT item, order_date FROM test.orders
     -> WHERE order_date BETWEEN STR_TO_DATE('01/01/2013', '%m/%d/%Y') AND STR_TO_DATE('12/31/2013', '%m/%d/%Y');
  +----------------------------------------------------------------------+-----------------+------------+
  | operation                                                            | startTS         | duration   |
  +----------------------------------------------------------------------+-----------------+------------+
  | trace                                                                | 07:21:19.269181 | 3.05361ms  |
  |   ├─session.ExecuteStmt                                              | 07:21:19.269186 | 993.479µs  |
  |   │ ├─executor.Compile                                               | 07:21:19.269203 | 325.317µs  |
  |   │ └─session.runStmt                                                | 07:21:19.269551 | 604.178µs  |
  |   │   └─TableReaderExecutor.Open                                     | 07:21:19.270058 | 64.011µs   |
  |   │     └─distsql.Select                                             | 07:21:19.270078 | 31.097µs   |
  |   │       └─regionRequest.SendReqCtx                                 | 07:21:19.270210 | 1.92593ms  |
  |   │         └─rpcClient.SendRequest, region ID: 260, type: Cop       | 07:21:19.270231 | 1.894279ms |
  |   │           └─tikv.RPC                                             | 07:21:19.270232 | 638.566µs  |
  |   │             ├─tikv.Wait                                          | 07:21:19.270232 | 36.129µs   |
  |   │             │ └─tikv.GetSnapshot                                 | 07:21:19.270232 | 36.129µs   |
  |   │             └─tikv.Process                                       | 07:21:19.270268 | 9.578µs    |
  |   │               └─tikv.RocksDBBlockRead                            | 07:21:19.270268 | 9.578µs    |
  |   └─*executor.TableReaderExecutor.Next                               | 07:21:19.270188 | 2.011021ms |
  +----------------------------------------------------------------------+-----------------+------------+
  14 rows in set (0.00 sec)
  ```

+ テーブル `test.orders` のパーティションプルーニングを再度確認するためにクエリトレースを実行します。2015年以降のデータをクエリしているため、ホットストレージでのクエリスキャンが予想されます。出力から、リージョンID 264 のリージョンがスキャンされていることを観察しますが、これは `storage-performance:high` ラベルが付いた TiKV ノード上にあります。

  ```sql
  TRACE
  SELECT item, order_date FROM test.orders
  WHERE order_date BETWEEN STR_TO_DATE('01/01/2018', '%m/%d/%Y') AND STR_TO_DATE('12/31/2020', '%m/%d/%Y');
  ```

  ```output
  tidb:db1> TRACE
     -> SELECT item, order_date FROM test.orders
     -> WHERE order_date BETWEEN STR_TO_DATE('01/01/2018', '%m/%d/%Y') AND STR_TO_DATE('12/31/2020', '%m/%d/%Y');
  +----------------------------------------------------------------------+-----------------+------------+
  | operation                                                            | startTS         | duration   |
  +----------------------------------------------------------------------+-----------------+------------+
  | trace                                                                | 07:22:01.845194 | 3.520554ms |
  |   ├─session.ExecuteStmt                                              | 07:22:01.845198 | 1.770717ms |
  |   │ ├─executor.Compile                                               | 07:22:01.845213 | 316.007µs  |
  |   │ └─session.runStmt                                                | 07:22:01.845548 | 1.403662ms |
  |   │   └─TableReaderExecutor.Open                                     | 07:22:01.846018 | 896.463µs  |
  |   │     └─distsql.Select                                             | 07:22:01.846035 | 864.376µs  |
  |   │       ├─loadRegion                                               | 07:22:01.846045 | 813.222µs  |
  |   │       └─regionRequest.SendReqCtx                                 | 07:22:01.847019 | 1.598742ms |
  |   │         └─rpcClient.SendRequest, region ID: 264, type: Cop       | 07:22:01.847036 | 1.569261ms |
  |   │           └─tikv.RPC                                             | 07:22:01.847037 | 1.176324ms |
  |   │             └─tikv.Wait                                          | 07:22:01.847037 | 1ms        |
  |   │               └─tikv.GetSnapshot                                 | 07:22:01.847037 | 995.958µs  |
  |   └─*executor.TableReaderExecutor.Next                               | 07:22:01.846982 | 1.689167ms |
  +----------------------------------------------------------------------+-----------------+------------+
  13 rows in set (0.01 sec)
  ```

+ ご興味がある方は、`test.orders_log` テーブルに対して類似のクエリを試すことができます。これはコールドTiKVノードにのみ配置されます。

### 手順 6. テーブルと配置ポリシーを削除する

  ```sql
  DROP TABLE IF EXISTS test.orders;
  DROP TABLE IF EXISTS test.orders_log;
  DROP PLACEMENT POLICY IF EXISTS hot;
  DROP PLACEMENT POLICY IF EXISTS cold;
  ```

  ```output
  Query OK, 0 rows affected (0.52 sec)
  Query OK, 0 rows affected (0.52 sec)
  Query OK, 0 rows affected (0.53 sec)
  Query OK, 0 rows affected (0.52 sec)
  ```

### 手順 7. TiDB 接続を終了し、TiKV ノードをスケールインします

  ```sql
  EXIT
  ```

  ```output
  tidb:db1> EXIT
  Bye
  ```

  ```bash
  tiup cluster scale-in tidb-test --node ${HOST_KV1_PRIVATE_IP}:20161 --yes
  ```

  ```output
  ...
  Scaled cluster `tidb-test` in successfully
  ```

  ```bash
  tiup cluster scale-in tidb-test --node ${HOST_KV2_PRIVATE_IP}:20161 --yes
  ```

  ```output
  ...
  Scaled cluster `tidb-test` in successfully
  ```

  ```bash
  tiup cluster scale-in tidb-test --node ${HOST_KV3_PRIVATE_IP}:20161 --yes
  ```

  ```output
  ...
  Scaled cluster `tidb-test` in successfully
  ```

+ ドロップされた`tikv`は数分から数時間でトムストーンになります。その後、pruneコマンドを使ってクリーンできます。待ちたくない場合は、スケールインコマンドで`--force`を使うことができます。しかし、モニタリングサービスとダッシュボードに異常が表示される可能性があります。

  ```bash
  tiup cluster display tidb-test
  ```

  ```output
  ...
  Cluster type:       tidb
  Cluster name:       tidb-test
  Cluster version:    v7.5.0
  Deploy user:        tidb
  SSH type:           builtin
  Dashboard URL:      http://10.90.2.59:2379/dashboard
  Grafana URL:        http://10.90.4.204:3000
  ID                 Role          Host         Ports                            OS/Arch       Status           Data Dir                      Deploy Dir
  --                 ----          ----         -----                            -------       ------           --------                      ----------
  10.90.4.14:9093    alertmanager  10.90.4.14   9093/9094                        linux/x86_64  Up               /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  10.90.4.14:3000    grafana       10.90.4.14   3000                             linux/x86_64  Up               -                             /tidb-deploy/grafana-3000
  10.90.1.254:2379   pd            10.90.1.254  2379/2380                        linux/x86_64  Up               /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.2.60:2379    pd            10.90.2.60   2379/2380                        linux/x86_64  Up               /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.3.58:2379    pd            10.90.3.58   2379/2380                        linux/x86_64  Up|L             /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.4.14:9090    prometheus    10.90.4.14   9090/12020                       linux/x86_64  Up               /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  10.90.2.231:4000   tidb          10.90.2.231  4000/10080                       linux/x86_64  Up               -                             /tidb-deploy/tidb-4000
  10.90.3.141:4000   tidb          10.90.3.141  4000/10080                       linux/x86_64  Up               -                             /tidb-deploy/tidb-4000
  10.90.4.207:9000   tiflash       10.90.4.207  9000/8123/3930/20170/20292/8234  linux/x86_64  Up               /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
  10.90.1.71:20160   tikv          10.90.1.71   20160/20180                      linux/x86_64  Up               /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.1.71:20161   tikv          10.90.1.71   20161/20181                      linux/x86_64  Pending Offline  /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  10.90.2.109:20160  tikv          10.90.2.109  20160/20180                      linux/x86_64  Up               /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.2.109:20161  tikv          10.90.2.109  20161/20181                      linux/x86_64  Pending Offline  /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  10.90.3.221:20160  tikv          10.90.3.221  20160/20180                      linux/x86_64  Up               /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.221:20161  tikv          10.90.3.221  20161/20181                      linux/x86_64  Pending Offline  /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  Total nodes: 15
  ```

### 手順 8. スケールインされた TiKV の剪定

+ 状態が `Tombstone` になるまで、数分から数時間かかることがあるので、その後でTiKVをクリーンにすることができます。

  ```bash
  tiup cluster display tidb-test
  ```

  ```output
  tiup is checking updates for component cluster ...
  Starting component `cluster`: /home/ec2-user/.tiup/components/cluster/v1.13.1/tiup-cluster display tidb-test
  Cluster type:       tidb
  Cluster name:       tidb-test
  Cluster version:    v7.5.1
  Deploy user:        ec2-user
  SSH type:           builtin
  Dashboard URL:      http://18.141.56.57:2379/dashboard
  Grafana URL:        http://10.90.4.14:3000
  ID                 Role          Host         Ports                            OS/Arch       Status     Data Dir                      Deploy Dir
  --                 ----          ----         -----                            -------       ------     --------                      ----------
  10.90.4.14:9093    alertmanager  10.90.4.14   9093/9094                        linux/x86_64  Up         /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  10.90.4.14:3000    grafana       10.90.4.14   3000                             linux/x86_64  Up         -                             /tidb-deploy/grafana-3000
  10.90.1.254:2379   pd            10.90.1.254  2379/2380                        linux/x86_64  Up         /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.2.60:2379    pd            10.90.2.60   2379/2380                        linux/x86_64  Up         /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.3.58:2379    pd            10.90.3.58   2379/2380                        linux/x86_64  Up|L       /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.4.14:9090    prometheus    10.90.4.14   9090/12020                       linux/x86_64  Up         /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  10.90.2.231:4000   tidb          10.90.2.231  4000/10080                       linux/x86_64  Up         -                             /tidb-deploy/tidb-4000
  10.90.3.141:4000   tidb          10.90.3.141  4000/10080                       linux/x86_64  Up         -                             /tidb-deploy/tidb-4000
  10.90.4.207:9000   tiflash       10.90.4.207  9000/8123/3930/20170/20292/8234  linux/x86_64  Up         /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
  10.90.1.71:20160   tikv          10.90.1.71   20160/20180                      linux/x86_64  Up         /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.1.71:20161   tikv          10.90.1.71   20161/20181                      linux/x86_64  Tombstone  /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  10.90.2.109:20160  tikv          10.90.2.109  20160/20180                      linux/x86_64  Up         /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.2.109:20161  tikv          10.90.2.109  20161/20181                      linux/x86_64  Tombstone  /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  10.90.3.221:20160  tikv          10.90.3.221  20160/20180                      linux/x86_64  Up         /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.221:20161  tikv          10.90.3.221  20161/20181                      linux/x86_64  Tombstone  /tidb-data/tikv-20161         /tidb-deploy/tikv-20161
  Total nodes: 15
  There are some nodes can be pruned:
     Nodes: [10.90.3.221:20161 10.90.1.71:20161 10.90.2.109:20161]
     You can destroy them with the command: `tiup cluster prune tidb-test`
  ```

  ```bash
  tiup cluster prune tidb-test --yes
  ```

  ```output
  ...
  Destroy success
  ```
