## モジュール 4: Key Visualizer の使用

+ この演習では、sysbenchツールを使用して同時データ挿入をシミュレートし、`AUTO_RANDOM` オプションを採用してホットスポットを分割することを試みます。

### 手順 1. [TiDB PD Dashboard](http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard) の `key visualizer` を設定する

+ [TiDB PD Dashboard](http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard) を開き、デフォルトのユーザー名は `root` 、パスワードはありません。
+ [TiDB PD Dashboard](http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard) の `key visualizer` で、リフレッシュ間隔を `30s` に設定します。

### 手順 2. スクリプト `oltp_common_1.lua` を読む

+ `CREATE TABLE` 文に注目してください。使用されたテーブル作成方法からどのような問題が発生しうるか検討してください。

  ```bash
  cat oltp_common_1.lua
  ```

  ```output
  cat oltp_common_1.lua
  ...
  query = string.format([[
  CREATE TABLE sbtest%d(
    id INT(11) NOT NULL AUTO_INCREMENT,
    k INT(11) NOT NULL DEFAULT '0',
    c CHAR(120) NOT NULL DEFAULT '',
    pad CHAR(60) DEFAULT '' NOT NULL,
    PRIMARY KEY (id)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin]],
        table_num)

  con:query(query)
  ...
  ```

+ 作成されたテーブルは、プライマリキーのためにクラスタ化インデックスを持っています。プライマリキーのカラム `id` に `AUTO_INCREMENT` を使用しているため、同時挿入中にホットスポット問題が発生する可能性があります。

### 手順 3. sysbenchツールの設定ファイルを確認する

  ```bash
  cat config_lab01
  ```

  ```output
  mysql-host=10.90.1.178
  mysql-port=4000
  mysql-user=root
  mysql-db=sbtest
  mysql-password=
  time=600
  threads=32
  report-interval=10
  db-driver=mysql
  ```

+ 詳細な説明:
  + time: テストの実行時間。
  + thread: 同時セッションの数。
  + report-interval: リポートの間隔を何秒ごとに表示するか。
  + db-driver: MySQL互換の構文。

### 手順 4. sysbenchテストのために新しいデータベースを作成する

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

  ```sql
  CREATE DATABASE sbtest;
  EXIT;
  ```

### 手順 5. sysbenchを実行して同時データ挿入のシナリオをシミュレートする

+ このステップには5分かかる場合があります。このプロセス中に、[TiDB PD Dashboard](http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard) のトラフィック可視化グラフを使用して、ホットスポットが生成されたかどうかを監視できます。

  ```bash
  sysbench './oltp_common_1.lua' --config-file=config_lab01 --tables=1 --table-size=5000000 prepare
  ```

  ```output
   sysbench './oltp_common_1.lua' --config-file=config_lab01 --tables=1 --table-size=5000000 prepare
  sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)

  Initializing worker threads...

  Creating table 'sbtest1'...
  Inserting 20000000 records into 'sbtest1'
  ```

+ table-size : テーブルに挿入される行の数。
+ sysbenchテストの完了後、[TiDB PD Dashboard](http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard) のトラフィック可視化グラフで1時間以内の書き込みトラフィックを観察してください。以下の図は20,000,000の挿入で生成されたものです。あなたの図は異なるかもしれません。その理由を考え、この方法を最適化できるかどうか検討してください。

  ![30%](https://lab-static.pingcap.com/quick-demo/TableAndIdnexDesignSysBench1_aa_001_20231121.png)
  + このテーブルはプライマリキー用のクラスタ化インデックスであり、プライマリキーを定義するために `AUTO_INCREMENT` を使用しています。データを連続して挿入するとき、同時に書き込み圧力が一定のリージョンに集中しているのを確認しました。これはホットスポット問題を意味します。

### 手順 6. `oltp_common_1.lua` のデータをクリーンアップする

  ```bash
  sysbench './oltp_common_1.lua' --config-file=config_lab01 cleanup
  ```

  ```output
   sysbench './oltp_common_1.lua' --config-file=config_lab01 cleanup
  sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)

  Dropping table 'sbtest1'...
  ```

### 手順 7. スクリプト `oltp_common_2.lua` を読む

+ `CREATE TABLE` 文に注目してください。

   ```bash
  cat oltp_common_2.lua
  ```

  ```output
  ...
  query = string.format([[
  CREATE TABLE sbtest%d(
  id bigINT(11) NOT NULL AUTO_RANDOM(5),
  k INT(11) NOT NULL DEFAULT '0',
  c CHAR(120) NOT NULL DEFAULT '',
  pad CHAR(60) DEFAULT '' NOT NULL,
  PRIMARY KEY (id)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin]],
        table_num)

  con:query(query)
  ...
  ```

### 手順 8. sysbenchを実行して同時データ挿入のシナリオをシミュレートする

+ 再び、このステップには5分かかるかもしれません。このプロセス中、[TiDB PD Dashboard](http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard) のトラフィック可視化グラフを使用して、ホットスポットが生成されたかどうかを監視できます。

  ```bash
  sysbench './oltp_common_2.lua' --config-file=config_lab01 --tables=1 --table-size=5000000 prepare
  ```

  ```output
  sysbench './oltp_common_2.lua' --config-file=config_lab01 --tables=1 --table-size=5000000 prepare
  sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)

  Initializing worker threads...

  Creating table 'sbtest1'...
  Inserting 5000000 records into 'sbtest1'
  ```

+ sysbenchテストの完了後、[TiDB PD Dashboard](http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard) のトラフィック可視化グラフで1時間以内の書き込みフローを観察してください。以下の図は20,000,000の挿入で生成されたものです。あなたの図は異なるかもしれません。その理由を検討し、前回のテストと比較して、ホットスポット問題が解決されたかどうかを判断してください。

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

### 手順 9. `oltp_common_2.lua` のデータをクリーンアップする

  ```bash
  sysbench './oltp_common_2.lua' --config-file=config_lab01 cleanup
  ```

  ```output
   sysbench './oltp_common_2.lua' --config-file=config_lab01 cleanup
  sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)

  Dropping table 'sbtest1'...
  ```
