# TiDB を運用データ層として使用する

## 概要

この演習では、MySQLソースからTiDBの宛先へのデータベースレプリケーションタスクをセットアップします。また、MySQLに対して適用される変更に合わせて、TiDB上でリアルタイム分析を行います。このようにして、TiDBは運用データ層として、トランザクションと分析ワークロードの要求をバランスさせます。

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

### 所要時間

+ この演習は約 90 分程度かかります。

### タスク

+ TiDBクラスタ用の`TiDB Data Migration`サービスをデプロイして開始。
+ MySQLからTiDBへのレプリケーションを開始します。
+ MySQLでデータ変更を適用し、TiDBでリアルタイム分析を実行します。

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


## モジュール 1: MySQL サーバーに接続してクエリを実行し、ソーススキーマを検証する

### 手順 1. リモート Linux に接続する

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

+ ログイン後に表示されるバナー：

    ```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. MySQL サーバーノードに接続する

+ リモートLinuxからMySQLサーバーノードに接続し、促された場合、`yes`と答えてください。

   ```bash
   ssh -i /home/ec2-user/.ssh/pe-class-key-oregon.pem rocky@${HOST_MYSQL1_PRIVATE_IP}
   ```
   ```output
   Last login: Wed Oct  9 02:16:14 2024 from 10.90.4.225
   [rocky@ip-10-90-1-132 ~]$
   ```

### 手順 3. データベースユーザー `root` として MySQL サーバーに接続する

   ```bash
   mysql -h localhost -P 3306 -u root -pq1w2e3R4_ --connect-expired-password
   ```
   ```output
   mysql> 
   ```

### 手順 4. 既存のスキーマを確認する

+ `sbtest`データベースに既に存在しているテーブルとデータを確認します。
   
   ```sql
   SHOW DATABASES;
   ```
   ```output
   +--------------------+
   | Database           |
   +--------------------+
   | information_schema |
   | mysql              |
   | performance_schema |
   | sbtest             |
   | sp500insight       |
   | sys                |
   +--------------------+
   6 rows in set (0.00 sec)
   ```
   ```sql
   SHOW TABLES FROM sp500insight;
   ```
   ```output
   +------------------------+
   | Tables_in_sp500insight |
   +------------------------+
   | companies              |
   | index_compositions     |
   | index_price_history    |
   | indexes                |
   | stock_price_history    |
   | user_selected_stocks   |
   | users                  |
   +------------------------+
   7 rows in set (0.00 sec)
   ```

+ MySQLサーバーでテーブル`sp500insight.stock_price_history`の行数を確認します。最初の実行には5秒以上かかります。

   ```sql
   SELECT COUNT(*) FROM sp500insight.stock_price_history;
   ```
   ```output
   +----------+
   | COUNT(*) |
   +----------+
   |  1157000 |
   +----------+
   1 row in set (7.82 sec)
   ```
    
+ MySQLサーバーノードのOSプロンプトに戻ります。
   
   ```sql
   EXIT
   ```
   ```output
   bye
   [rocky@ip-10-90-1-132 ~]$
   ```

+ MySQLサーバーに接続したターミナル（プロンプトが `[rocky@` で始まる）が開かれたまま、次の練習に進みます。

## モジュール 2: MySQL から TiDB へのサンプルデータベースの移行とレプリケーション

### 手順 1. 移行のためのユーザーを MySQL で作成

+ [ターミナル 1](ssh://monitor1-ssh#1)でMySQLサーバーに接続し、移行とレプリケーション用に専用のユーザー`dm_user`をMySQLで作成します。

   ```bash
   X=q1w2e3R4_
   mysql -h localhost -P 3306 -uroot -p$X --connect-expired-password << EOF
   DROP USER IF EXISTS dm_user@'%';
   CREATE USER dm_user@'%' IDENTIFIED BY 'q1w2e3R4_';
   GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
   EXIT
   EOF
   ```
   ```output
   mysql: [Warning] Using a password on the command line interface can be insecure.
   ```

+ リモートTiUPコントロールマシンに戻ります。

   ```bash
   exit
   ```
   ```output
   logout
   Connection to 10.90.1.132 closed.
   ```

### 手順 2. TiDB クラスタがすでに起動していることを確認

+ TiDBクラスタの状態を確認します。`tidb-demo` TiDBクラスタには1つのTiDBサーバー、3つのTiKVサーバー、および1つのTiFlashサーバーがあることに注意してください。
 
   ```bash
   ~/.tiup/bin/tiup cluster display tidb-demo
   ```
   ```output
   Cluster type:       tidb
   Cluster name:       tidb-demo
   Cluster version:    v8.1.0
   Deploy user:        ec2-user
   SSH type:           builtin
   Dashboard URL:      http://54.218.160.235:2379/dashboard
   Grafana URL:        http://10.90.4.225:3000
   ID                 Role          Host         Ports                            OS/Arch       Status  Data Dir                      Deploy Dir
   --                 ----          ----         -----                            -------       ------  --------                      ----------
   10.90.4.225:9093   alertmanager  10.90.4.225  9093/9094                        linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
   10.90.4.225:3000   grafana       10.90.4.225  3000                             linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
   10.90.3.54:2379    pd            10.90.3.54   2379/2380                        linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.4.225:9090   prometheus    10.90.4.225  9090/12020                       linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
   10.90.2.134:4000   tidb          10.90.2.134  4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
   10.90.4.150:9000   tiflash       10.90.4.150  9000/8123/3930/20170/20292/8234  linux/x86_64  Up      /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
   10.90.1.183:20160  tikv          10.90.1.183  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.1.251:20160  tikv          10.90.1.251  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.1.41:20160   tikv          10.90.1.41   20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   Total nodes: 9
   ```

### 手順 3. TiDB で移行専用のユーザーを作成

+ 移行とレプリケーションの目的で、TiDB上で専用のユーザー`dm_user`を作成します。
   
   ```bash
   mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -uroot << 'EOF'
   DROP USER IF EXISTS dm_user@'%';
   CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
   GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
   EXIT
   EOF
   ```

### 手順 4. TiDB にターゲットデータベースを作成

+ TiDBにターゲットデータベース`sp500insight`とその空のテーブルを作成します。テーブルには`companies`、`index_compositions`、`index_price_history`、`indexes`、`stock_price_history`、`user_selected_stocks`、および`users`が含まれます。
   
   ```bash
   mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -uroot
   ```
   ```sql
   CREATE DATABASE sp500insight;
   USE sp500insight;
   CREATE TABLE `companies` (
     `stock_symbol` varchar(10) NOT NULL,
     `exchange_symbol` varchar(50) NOT NULL,
     `short_name` varchar(50) DEFAULT NULL,
     `long_name` varchar(100) DEFAULT NULL,
     `sector` varchar(50) DEFAULT NULL,
     `industry` varchar(50) DEFAULT NULL,
     `current_price` decimal(18,2) DEFAULT NULL,
     `market_cap` bigint(20) DEFAULT NULL,
     `ebitda` bigint(20) DEFAULT NULL,
     `revenue_growth` float DEFAULT NULL,
     `city` varchar(50) DEFAULT NULL,
     `state` varchar(50) DEFAULT NULL,
     `country` varchar(50) DEFAULT NULL,
     `country_code` varchar(3) DEFAULT NULL,
     `full_time_employees` int(11) DEFAULT NULL,
     `long_business_summary` text DEFAULT NULL,
     PRIMARY KEY (stock_symbol, exchange_symbol)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
   CREATE TABLE `index_compositions` (
     `index_symbol` varchar(10) DEFAULT NULL,
     `stock_symbol` varchar(10) NOT NULL,
     `weight` double DEFAULT NULL,
     PRIMARY KEY (stock_symbol)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
   CREATE TABLE `index_price_history` (
     `record_date` date NOT NULL,
     `index_symbol` varchar(10) NOT NULL,
     `price` decimal(18,2) DEFAULT NULL,
     PRIMARY KEY (record_date, index_symbol)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
   CREATE TABLE `indexes` (
     `index_symbol` varchar(10) NOT NULL,
     `short_name` varchar(50) DEFAULT NULL,
     PRIMARY KEY (index_symbol)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
   CREATE TABLE `stock_price_history` (
     `record_date` date NOT NULL,
     `stock_symbol` varchar(10) NOT NULL,
     `adj_close` decimal(32,16) DEFAULT NULL,
     `close` decimal(32,16) DEFAULT NULL,
     `high` decimal(32,16) DEFAULT NULL,
     `low` decimal(32,16) DEFAULT NULL,
     `open` decimal(32,16) DEFAULT NULL,
     `volume` bigint(20) DEFAULT NULL,
     PRIMARY KEY (record_date, stock_symbol)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
   CREATE TABLE `user_selected_stocks` (
     `user_id` int(11) NOT NULL,
     `stock_symbol` varchar(10) NOT NULL,
     `created_date` datetime DEFAULT NULL,
     PRIMARY KEY (user_id, stock_symbol)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
   CREATE TABLE `users` (
     `user_id` int(11) NOT NULL,
     `created_date` datetime DEFAULT NULL,
     PRIMARY KEY (user_id)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
   SET GLOBAL allow_auto_random_explicit_insert = true;
   ```

### 手順 5. 分析クエリ用に TiFlash を有効化

+ テーブル`sp500insight.stock_price_history`に対してTiFlashの分析列指向ストレージを有効にします。
   
   ```sql
   ALTER TABLE sp500insight.stock_price_history SET TIFLASH REPLICA 1;
   EXIT;
   ```
   ```output
   Query OK, 0 rows affected (0.10 sec)
   Bye
   ```

### 手順 6. TiDB Data Migration ユーティリティをインストール

+ TiDB Data Migrationコンポーネントをインストールします。
   
   ```bash
   ~/.tiup/bin/tiup install dm dmctl:vtidb_version dm-master:vtidb_version dm-worker:vtidb_version
   ```
   ```bash
   ~/.tiup/bin/tiup list --verbose | grep dm
   ```
   ```output
   dm                 pingcap  v1.15.1,v1.16.0                     linux/amd64  Data Migration Platform manager
   dm-master          pingcap  v8.0.0,vtidb_version                       linux/x86_64  dm-master component of Data Migration Platform.
   dm-worker          pingcap  v8.0.0,vtidb_version                       linux/x86_64  dm-worker component of Data Migration Platform.
   dmctl              pingcap  v6.5.1,v6.5.9,v7.5.0,vtidb_version  linux/x86_64  dmctl component of Data Migration Platform.
   ```

### 手順 7. TiDB Data Migration クラスタのトポロジファイルを確認

+ TiDB Data Migrationクラスタのトポロジ設定ファイルが既にプロビジョニングされています。設定を確認し、変更は必要ありません。

   ```bash
   cat dm-topology.yaml 
   ```
   ```output
   global:
     user: "ec2-user"
     ssh_port: 22
     deploy_dir: "/tidb-deploy"
     data_dir: "/tidb-data"
     arch: "amd64"
   master_servers:
     - host: 10.90.4.225
   worker_servers:
     - host: 10.90.4.225
   monitoring_servers:
     - host: 10.90.3.54
   grafana_servers:
     - host: 10.90.3.54
   alertmanager_servers:
     - host: 10.90.3.54
   ```

### 手順 8. TiDB Data Migration クラスタをデプロイして起動

+ TiDB Data Migrationクラスタ - `dm-test`をデプロイ

   ```bash
   ~/.tiup/bin/tiup dm deploy dm-test vtidb_version ./dm-topology.yaml \
    --user ec2-user \
    -i /home/ec2-user/.ssh/pe-class-key-oregon.pem \
    --yes
   ```
   ```output
   Starting component dm: /home/ec2-user/.tiup/components/dm/v1.16.0/tiup-dm deploy dm-test vtidb_version ./dm-topology.yaml --user ec2-user -i /home/ec2-user/.ssh/pe-class-key-oregon.pem --yes
   + Detect CPU Arch Name
   .
   .
   .
   Cluster `dm-test` deployed successfully, you can start it with command: `tiup dm start dm-test`
   ```

+ TiDB Data Migrationクラスタ - `dm-test`を開始します。

   ```bash
   ~/.tiup/bin/tiup dm start dm-test
   ```
   ```output
   Starting component dm: /home/ec2-user/.tiup/components/dm/v1.16.0/tiup-dm start dm-test
   Starting cluster dm-test...
   + [ Serial ] - SSHKeySet: privateKey=/home/ec2-user/.tiup/storage/dm/clusters/dm-test/ssh/id_rsa, publicKey=/home/ec2-user/.tiup/storage/dm/clusters/dm-test/ssh/id_rsa.pub
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.1.7
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.3.71
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.1.7
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.4.191
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.1.7
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.3.49
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.3.135
   + [ Serial ] - StartCluster
   Starting component dm-master
   	Starting instance 10.90.4.191:8261
   	Start instance 10.90.4.191:8261 success
   Starting component dm-worker
   	Starting instance 10.90.3.135:8262
   	Starting instance 10.90.3.49:8262
   	Starting instance 10.90.3.71:8262
   	Start instance 10.90.3.135:8262 success
   	Start instance 10.90.3.71:8262 success
   	Start instance 10.90.3.49:8262 success
   Starting component prometheus
   	Starting instance 10.90.1.7:9090
   	Start instance 10.90.1.7:9090 success
   Starting component grafana
   	Starting instance 10.90.1.7:3000
   	Start instance 10.90.1.7:3000 success
   Starting component alertmanager
   	Starting instance 10.90.1.7:9093
   	Start instance 10.90.1.7:9093 success
   Started cluster `dm-test` successfully
   ```
  
+ TiDB Data Migrationクラスタのステータスが起動していることを確認します。

   ```bash
   tiup dm display dm-test
   ```
   ```output
   Starting component dm: /home/ec2-user/.tiup/components/dm/v1.16.0/tiup-dm display dm-test
   Cluster type:       dm
   Cluster name:       dm-test
   Cluster version:    vtidb_version
   Deploy user:        ec2-user
   SSH type:           builtin
   Grafana URL:        http://10.90.3.188:3000
   ID                Role          Host         Ports      OS/Arch       Status     Data Dir                      Deploy Dir
   --                ----          ----         -----      -------       ------     --------                      ----------
   10.90.3.188:9093  alertmanager  10.90.3.188  9093/9094  linux/x86_64  Up         /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
   10.90.4.196:8261  dm-master     10.90.4.196  8261/8291  linux/x86_64  Healthy|L  /tidb-data/dm-master-8261     /tidb-deploy/dm-master-8261
   10.90.4.196:8262  dm-worker     10.90.4.196  8262       linux/x86_64  Free       /tidb-data/dm-worker-8262     /tidb-deploy/dm-worker-8262
   10.90.3.188:3000  grafana       10.90.3.188  3000       linux/x86_64  Up         -                             /tidb-deploy/grafana-3000
   10.90.3.188:9090  prometheus    10.90.3.188  9090       linux/x86_64  Up         /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
   Total nodes: 5
   ``` 

### 手順 9. 移行元を設定

+ 移行タスクのソース設定を設定します。

   ```bash
   cat << EOF > mysql-source-conf1.yaml
   source-id: "mysql-replica-01"
   from:
     host: "${HOST_MYSQL1_PRIVATE_IP}"
     port: 3306
     user: "dm_user"
     password: "q1w2e3R4_"
   EOF
   cat mysql-source-conf1.yaml
   ```
   ```output
   source-id: "mysql-replica-01"
   from:
     host: "10.90.1.135"
     port: 3306
     user: "dm_user"
     password: "q1w2e3R4_"
   ```

+ MySQLインスタンスを移行ソースに設定し、それがTiDB Data Migrationクラスタによって認識されることを確認します。
   
   ```bash
   ~/.tiup/bin/tiup dmctl:vtidb_version \
    --master-addr=${HOST_MONITOR1_PRIVATE_IP}:8261 operate-source create mysql-source-conf1.yaml
   ```
   ```output
   Starting component dmctl: /home/ec2-user/.tiup/components/dmctl/vtidb_version/dmctl/dmctl --master-addr=10.90.4.66:8261 operate-source create mysql-source-conf1.yaml
   {
       "result": true,
       "msg": "",
       "sources": [
           {
               "result": true,
               "msg": "",
               "source": "mysql-replica-01",
               "worker": "dm-10.90.3.187-8262"
           }
       ]
   }
   ```
   ```bash
   ~/.tiup/bin/tiup dmctl:vtidb_version \
    --master-addr=${HOST_MONITOR1_PRIVATE_IP}:8261 get-config source mysql-replica-01
   ```
   ```output
   Starting component dmctl: /home/ec2-user/.tiup/components/dmctl/vtidb_version/dmctl/dmctl --master-addr=10.90.4.66:8261 get-config source mysql-replica-01
   {
       "result": true,
       "msg": "",
       "cfg": "enable: true\nenable-gtid: false\nauto-fix-gtid: false\nrelay-dir: relay-dir\nmeta-dir: \"\"\nflavor: mysql\ncharset: \"\"\nenable-relay: false\nrelay-binlog-name: \"\"\nrelay-binlog-gtid: \"\"\nsource-id: mysql-replica-01\nfrom:\n  host: 10.90.1.135\n  port: 3306\n  user: dm_user\n  password: '******'\n  max-allowed-packet: null\n  session: {}\n  security: null\npurge:\n  interval: 3600\n  expires: 0\n  remain-space: 15\nchecker:\n  check-enable: true\n  backoff-rollback: 5m0s\n  backoff-max: 5m0s\n  check-interval: 5s\n  backoff-min: 1s\n  backoff-jitter: true\n  backoff-factor: 2\nserver-id: 429530419\ntracer: {}\ncase-sensitive: false\nfilters: []\n"
   }
   ```
   ```bash
   ~/.tiup/bin/tiup dmctl:vtidb_version \
    --master-addr=${HOST_MONITOR1_PRIVATE_IP}:8261 operate-source show
   ```
   ```output
   Starting component dmctl: /home/ec2-user/.tiup/components/dmctl/vtidb_version/dmctl/dmctl --master-addr=10.90.4.66:8261 operate-source show
   {
       "result": true,
       "msg": "",
       "sources": [
           {
               "result": true,
               "msg": "",
               "source": "mysql-replica-01",
               "worker": "dm-10.90.3.187-8262"
           }
       ]
   }
   ```

### 手順 10. 移行タスクを作成して開始

+ 移行タスクの設定を作成して移行タスクを開始します。このタスクはMySQLサーバーからTiDBクラスタへのデータベース`sp500insight`の変更を移行し、レプリケーションし続けます。

+ 移行タスク設定を生成します。

   ```bash
   cat << EOF > dm-task.yaml
   name: "dm-task"
   task-mode: all
   ignore-checking-items: ["auto_increment_ID"]

   target-database:
     host: "${HOST_DB1_PRIVATE_IP}"
     port: 4000
     user: "dm_user"
     password: "q1w2e3R4_"

   mysql-instances:
     - source-id: "mysql-replica-01"
       route-rules: ["instance-1-user-schema-rule"]
       block-allow-list: "rule_1"
       mydumper-config-name: "global"
       loader-config-name: "global"

   routes:
     instance-1-user-schema-rule:
       schema-pattern: "sp500insight"
       target-schema: "sp500insight"

   block-allow-list:
     rule_1:
       do-dbs: ["sp500insight"]

   mydumpers:
     global:
       threads: 32
       chunk-filesize: 64

   loaders:
     global:
       pool-size: 8
       import-mode: "physical"
       pd-addr: "${HOST_PD1_PRIVATE_IP}:2379"
   EOF
   cat dm-task.yaml
   ```
    ```output
    name: "dm-task"
    task-mode: all
    ignore-checking-items: ["auto_increment_ID"]
    .
    .
    .
    loaders:
      global:
        pool-size: 32
        import-mode: "physical"
    ```

+ 移行タスクの事前チェックを行います。メッセージは`pre-check is passed`であるべきです。

  ```bash
  ~/.tiup/bin/tiup dmctl:vtidb_version \
    --master-addr=${HOST_MONITOR1_PRIVATE_IP}:8261 check-task ./dm-task.yaml
  ```
  ```output
  Starting component dmctl: /home/ec2-user/.tiup/components/dmctl/vtidb_version/dmctl/dmctl --master-addr=10.90.4.235:8261 check-task ./dm-task.yaml
  {
  "result": true,
  "msg": "pre-check is passed. "
  }
    ```

+ 移行とレプリケーションタスクを開始し、移行の進行を確認します。
   
   ```bash
   ~/.tiup/bin/tiup dmctl:vtidb_version \
    --master-addr=${HOST_MONITOR1_PRIVATE_IP}:8261 start-task ./dm-task.yaml
   ```
   ```output
   Starting component dmctl: /home/ec2-user/.tiup/components/dmctl/vtidb_version/dmctl/dmctl --master-addr=10.90.4.66:8261 start-task ./dm-task.yaml
   {
       "result": true,
       "msg": "",
       "sources": [
           {
               "result": true,
               "msg": "",
               "source": "mysql-replica-01",
               "worker": "dm-10.90.3.187-8262"
           }
       ],
       "checkResult": "pre-check is passed. "
   }
   ```

### 手順 11. 移行の進捗確認

+ `query-status` アクションを何度も使用して移行の状態を確認します。`subTaskStatus` の `stage`、`unit`、および `progress` 属性に注目してください。タスクには3つのサブタスクユニット、`Dump`、`Load`、`Sync` が含まれています。

+ `watch` コマンドを使用して全体のタスクの進行を監視します。以下の追加情報を読み、画面上での移行の進捗を観察してください。

   ```bash
   watch -n 1 -d ~/.tiup/bin/tiup dmctl:vtidb_version --master-addr=${HOST_MONITOR1_PRIVATE_IP}:8261 query-status ./dm-task.yaml
   ```
  
+ ユニット `Dump`、ステージ `Running`:
   
    ```output
    {
    ...
          "subTaskStatus": [
              {
                  "name": "dm-task",
                  "stage": "Running",
                  "unit": "Dump",
                  "result": null,
                  "unresolvedDDLLockID": "",
                  "dump": {
                      "totalTables": "6",
                      "completedTables": 3,
                      "finishedBytes": 7949200595,
                      "finishedRows": 39359277,
                      "estimateTotalRows": 59224808,
                      "bps": "57472325",
                      "progress": "64.63 %"
                  },
                  "validation": null
              }
          ]
      }
    ]
    }
    ```

+ ユニット `Load`、ステージ `Running`:

    ```output
    {
    ...
             "subTaskStatus": [
                 {
                     "name": "dm-task",
                     "stage": "Running",
                     "unit": "Load",
                     "result": null,
                     "unresolvedDDLLockID": "",
                     "load": {
                         "finishedBytes": "5307344924",
                         "totalBytes": "8161057816",
                         "progress": "65.03 %",
                         "metaBinlog": "(binlog.000008, 157240317)",
                         "metaBinlogGTID": "",
                         "bps": "62882221"
                     },
                     "validation": null
                 }
             ]
         }
     ]
    }
    ```

+ ユニット `Sync`、ステージ `Running`。ターゲットの TiDB とソースの MySQL が同期されていることに注意してください。

    ```output
    {
    ...
                "subTaskStatus": [
                    {
                        "name": "dm-task",
                        "stage": "Running",
                        "unit": "Sync",
                        "result": null,
                        "unresolvedDDLLockID": "",
                        "sync": {
                            "totalEvents": "19767046",
                            "totalTps": "21118",
                            "recentTps": "0",
                            "masterBinlog": "(binlog.000011, 706201359)",
                            "masterBinlogGtid": "",
                            "syncerBinlog": "(binlog.000011, 706201359)",
                            "syncerBinlogGtid": "00000000-0000-0000-0000-000000000000:0",
                            "blockingDDLs": [
                            ],
                            "unresolvedGroups": [
                            ],
                            "synced": true,
                            "binlogType": "remote",
                            "secondsBehindMaster": "0",
                            "blockDDLOwner": "",
                            "conflictMsg": "",
                            "totalRows": "19767046",
                            "totalRps": "21118",
                            "recentRps": "0"
                        },
                        "validation": null
                    }
                ]
            }
        ]
    }
    ```

+ 移行とレプリケーションの `subTaskStatus` が`"stage": "Running"` および `"unit": "Sync"` の状態に達したことを確認します。`watch` コマンドをそのままにして、次の演習に進みます。

## モジュール 3: MySQL の上流で変更を実行し、TiDB の下流でリアルタイム分析クエリを実行する

### 手順 1. リモートの Linux monitor1_address から TiDB サーバインスタンスに接続する

+ ここをクリック - [ターミナル 2](ssh://monitor1-ssh#2) で、monitor1_address に接続した後、TiDB クラスタに接続します。

+ ログイン後に表示されるバナー：

    ```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/
    ```

+ TiDB クラスタに接続します。

   ```bash
   export MYSQL_PS1="tidb:db1> "
   mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -u root
   ```
   ```output
   tidb:db1> 
   ```

### 手順 2. 下流の TiDB でクエリを実行する

+ TiDB でテーブル `sp500insight.stock_price_history` の行数を確認します。初回の実行には0.1秒未満しかかかりません。
   
   ```sql
   SELECT COUNT(*) FROM sp500insight.stock_price_history;
   ```
   ```output
   +----------+
   | COUNT(*) |
   +----------+
   |  1157000 |
   +----------+
   1 row in set (0.03 sec)
   ```

### 手順 3. 上流の MySQL で INSERT 操作を実行する

+ ここをクリック - [ターミナル 3](ssh://monitor1-ssh#3) で、monitor1_address に接続した後、MySQL サーバに接続します。

+ ログイン後に表示されるバナー：

    ```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/
    ```


+ MySQL サーバノードに接続します。

   ```bash
   ssh -i /home/ec2-user/.ssh/pe-class-key-oregon.pem rocky@${HOST_MYSQL1_PRIVATE_IP}
   ```
   ```output
   Last login: Thu Aug  1 11:58:47 2024 from 10.90.4.90
   [rocky@ip-10-90-1-235 ~]$
   ```

+ データベースセッションで MySQL サーバに接続します。

   ```bash
   mysql -h localhost -P 3306 -u root -pq1w2e3R4_ --connect-expired-password
   ```
   ```output
   mysql> 
   ```

+ [ターミナル 3](ssh://monitor1-ssh#3) （MySQL側）で、テーブル `sp500insight.stock_price_history` に新しい行を `INSERT` します。行数が `1157000` から `1157001` に増加したことを確認します。
   
   ```sql
   SELECT COUNT(*) FROM sp500insight.stock_price_history;
   INSERT INTO sp500insight.stock_price_history VALUES (
    '2020-01-12','MMM',60.3188858032226560,77.0199966430664000,67.4499969482421900,91.6699981689453100,91.0899963378906200,3043700);
   SELECT COUNT(*) FROM  sp500insight.stock_price_history;
   ```
   ```output
   +----------+
   | COUNT(*) |
   +----------+
   |  1157000 |
   +----------+
   1 row in set (0.17 sec)
   ...
   Query OK, 1 row affected (0.01 sec)
   ...
   +----------+
   | COUNT(*) |
   +----------+
   |  1157001 |
   +----------+
   1 row in set (0.17 sec)
   ```

### 手順 4. 下流の TiDB で再度クエリを実行し、変化を観察する

+ [ターミナル 2](ssh://monitor1-ssh#2)（TiDB側）に戻り、TiDB側からの変化の結果を観察します。変更はすでに MySQL から同期されています。行数は `1157001` であるはずです。
   
   ```sql
   SELECT COUNT(*) FROM sp500insight.stock_price_history;
   ```
   ```output
   +----------+
   | COUNT(*) |
   +----------+
   |  1157001 |
   +----------+
   1 row in set (0.04 sec)
   ```

### 手順 5. TiDB での実行計画を観察する

+ TiDB での以前の `COUNT()` クエリの実行計画を検証します。taskカラムに注目してください。`mpp[tiflash]` は、これらのタスクが列指向ストレージレイヤーである TiFlash での大規模並列処理を利用することを示します。
   
   ```bash
   EXPLAIN SELECT COUNT(*) FROM sp500insight.stock_price_history;
   ```
   ```output
   +------------------------------+------------+--------------+---------------------------+----------------------------------------------------------------------+
   | id                           | estRows    | task         | access object             | operator info                                                        |
   +------------------------------+------------+--------------+---------------------------+----------------------------------------------------------------------+
   | HashAgg_22                   | 1.00       | root         |                           | funcs:count(Column#11)->Column#9                                     |
   | └─TableReader_24             | 1.00       | root         |                           | MppVersion: 2, data:ExchangeSender_23                                |
   |   └─ExchangeSender_23        | 1.00       | mpp[tiflash] |                           | ExchangeType: PassThrough                                            |
   |     └─HashAgg_9              | 1.00       | mpp[tiflash] |                           | funcs:count(sp500insight.stock_price_history.record_date)->Column#11 |
   |       └─TableFullScan_21     | 1157000.00 | mpp[tiflash] | table:stock_price_history | keep order:false                                                     |
   +------------------------------+------------+--------------+---------------------------+----------------------------------------------------------------------+
   ```

+ 時間が許せば、MySQL 側で追加の変更を試み、その結果を TiDB で観察したり、その他の分析クエリを TiDB で実験してください。例えば:
   ```sql
   USE sp500insight;
   WITH index_companies AS (
      SELECT
          c.stock_symbol, c.short_name, c.exchange_symbol, ic.weight, c.market_cap AS market_cap, c.revenue_growth AS revenue_growth
      FROM companies c
      JOIN index_compositions ic ON c.stock_symbol = ic.stock_symbol
      WHERE index_symbol = 'SP500' AND sector = 'Energy'
   ), companies_latest_price AS (
      SELECT
          stock_symbol, DATE(last_day) AS last_change_day, last_close_price, last_2nd_close_price, 
          last_close_price - last_2nd_close_price AS last_change,
          (last_close_price - last_2nd_close_price) / last_2nd_close_price AS last_change_percentage
      FROM (
        SELECT
          LAST_VALUE(stock_symbol) OVER (PARTITION BY stock_symbol ORDER BY record_date) AS stock_symbol,
          LAST_VALUE(record_date) OVER (PARTITION BY stock_symbol ORDER BY record_date) AS last_day,
          NTH_VALUE(close, 1) OVER (PARTITION BY stock_symbol ORDER BY record_date DESC) AS last_close_price,
          NTH_VALUE(close, 2) OVER (PARTITION BY stock_symbol ORDER BY record_date DESC) AS last_2nd_close_price,
          ROW_NUMBER() OVER (PARTITION BY stock_symbol ORDER BY record_date DESC) AS row_num
        FROM stock_price_history sph
        WHERE
          record_date > DATE_SUB((SELECT MAX(record_date) FROM stock_price_history), INTERVAL 2 DAY)
          AND sph.stock_symbol IN (SELECT stock_symbol FROM index_companies ic)
      ) sub
      WHERE
          row_num = 2
   )
   SELECT
      ic.stock_symbol, ic.exchange_symbol, ic.short_name, ic.weight, ic.market_cap, ic.revenue_growth,
      clp.last_change, clp.last_change_day, clp.last_close_price, clp.last_2nd_close_price, clp.last_change_percentage
   FROM index_companies ic
   LEFT JOIN companies_latest_price clp ON ic.stock_symbol = clp.stock_symbol
   ORDER BY ic.weight DESC;
   ```
   ```output
   +--------------+-----------------+---------------------------------+------------------------+--------------+----------------+---------------------+-----------------+----------------------+----------------------+-------------------------+
   | stock_symbol | exchange_symbol | short_name                      | weight                 | market_cap   | revenue_growth | last_change         | last_change_day | last_close_price     | last_2nd_close_price | last_change_percentage  |
   +--------------+-----------------+---------------------------------+------------------------+--------------+----------------+---------------------+-----------------+----------------------+----------------------+-------------------------+
   | XOM          | NYQ             | Exxon Mobil Corporation         |   0.013441937585551282 | 474511933440 |          0.689 |  1.2800064086914100 | 2023-01-10      | 111.3700027465820300 | 110.0899963378906200 |  0.01162690935843785832 |
   | CVX          | NYQ             | Chevron Corporation             |   0.009567226003564158 | 337731289088 |           0.81 | -0.8399963378906000 | 2023-01-10      | 175.1999969482422000 | 176.0399932861328000 | -0.00477162218772232275 |
   | COP          | NYQ             | ConocoPhillips                  |   0.004417814517419704 | 155952644096 |          1.237 |  0.1599960327148400 | 2023-01-10      | 118.2399978637695300 | 118.0800018310546900 |  0.00135497993084178221 |
   | SLB          | NYQ             | Schlumberger N.V.               |  0.0022377960040345308 |  78996119552 |          0.279 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | EOG          | NYQ             | EOG Resources, Inc.             |  0.0021024604924476343 |  74218659840 |          0.924 | -0.7600021362304600 | 2023-01-10      | 126.8499984741211000 | 127.6100006103515600 | -0.00595566282105957140 |
   | MPC          | NYQ             | Marathon Petroleum Corporation  |   0.002050747487098508 |  72393146368 |          0.818 |  1.0999984741211000 | 2023-01-10      | 117.5999984741211000 | 116.5000000000000000 |  0.00944204698816394850 |
   | OXY          | NYQ             | Occidental Petroleum Corporatio |   0.001695676548826279 |  59858837504 |          0.792 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | PXD          | NYQ             | Pioneer Natural Resources Compa |  0.0016017013932190817 |  56541433856 |          0.641 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | VLO          | NYQ             | Valero Energy Corporation       |  0.0015472850935959574 |  54620491776 |          0.593 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | HES          | NYQ             | Hess Corporation                |  0.0012744122628788822 |  44987846656 |          0.776 |  1.6300048828125000 | 2023-01-10      | 145.2500000000000000 | 143.6199951171875000 |  0.01134942861878312162 |
   | PSX          | NYQ             | Phillips 66                     |  0.0012589621320069535 |  44442443776 |          0.799 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | KMI          | NYQ             | Kinder Morgan, Inc.             |  0.0012062691273686955 |  42582335488 |          0.354 |  0.0400009155273440 | 2023-01-10      |  18.7800006866455080 |  18.7399997711181640 |  0.00213452059850037319 |
   | DVN          | NYQ             | Devon Energy Corporation        |  0.0012053375130788024 |  42549448704 |          0.789 | -0.2800025939941400 | 2023-01-10      |  62.8499984741210940 |  63.1300010681152340 | -0.00443533326875800678 |
   | WMB          | NYQ             | Williams Companies, Inc. (The)  |  0.0011162172177908748 |  39403425792 |          0.091 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | HAL          | NYQ             | Halliburton Company             |  0.0010393744130051477 |  36690808832 |          0.388 |  0.0500030517578160 | 2023-01-10      |  40.9900016784668000 |  40.9399986267089840 |  0.00122137404580161222 |
   | OKE          | NYQ             | ONEOK, Inc.                     |  0.0008854096904464799 |  31255721984 |          0.769 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | BKR          | NMS             | Baker Hughes Company            |  0.0008807471517968449 |  31091130368 |          0.054 | -0.0400009155273450 | 2023-01-10      |  30.8299999237060550 |  30.8700008392334000 | -0.00129578602008027511 |
   | FANG         | NMS             | Diamondback Energy, Inc.        |   0.000730020047064916 |  25770334208 |          0.565 |  0.2900085449218600 | 2023-01-10      | 142.2400054931640600 | 141.9499969482422000 |  0.00204303311839874783 |
   | MRO          | NYQ             | Marathon Oil Corporation        |  0.0005965698099807201 |  21059426304 |          0.731 |  0.0399990081787110 | 2023-01-10      |  27.0499992370605470 |  27.0100002288818360 |  0.00148089625471161593 |
   | CTRA         | NYQ             | Coterra Energy Inc.             |  0.0005690298110137097 |  20087240704 |          5.204 | -0.3899993896484380 | 2023-01-10      |  24.6900005340576170 |  25.0799999237060550 | -0.01555021494556719473 |
   | TRGP         | NYQ             | Targa Resources, Inc.           |  0.0004842024080652878 |  17092760576 |          0.773 |               NULL | NULL           |                NULL |                NULL |                    NULL |
   | APA          | NMS             | APA Corporation                 | 0.00039910236086756015 |  14088655872 |          0.374 |  0.5799980163574200 | 2023-01-10      |  43.8199996948242200 |  43.2400016784668000 |  0.01341345961709929139 |
   | EQT          | NYQ             | EQT Corporation                 |  0.0003576031445812937 |  12623697920 |          1.092 | -0.6399993896484380 | 2023-01-10      |  33.4000015258789060 |  34.0400009155273440 | -0.01880139166966068805 |
   +--------------+-----------------+---------------------------------+------------------------+--------------+----------------+---------------------+-----------------+----------------------+----------------------+-------------------------+
   23 rows in set (0.01 sec)
   ```

## 結論

### TiDB を操作データストアとして活用する

TiDB は最先端の分散 SQL リレーショナルデータベースであり、その堅牢なアーキテクチャが Hybrid Transactional and Analytical Processing (HTAP) ワークロードをサポートするため、操作データストア (ODS) として注目されています。MySQL 互換性を持つように設計されており、高可用性、強い一貫性、および水平スケーラビリティを実現するため、ダイナミックでデータ集約型のアプリケーションに最適なソリューションです。

操作データストアは、さまざまなソースからのデータを集約する中央リポジトリとして機能し、リアルタイムデータ分析や報告といった操作を容易にします。従来のデータウェアハウスとは異なり、ODS はリアルタイムで頻繁に更新され、主な業務システムとデータウェアハウスの間の仲介者として機能します。

### リアルタイムデータ統合とハイブリッドワークロード

TiDB の OLTP と OLAP のワークロードを同時に処理する能力は、操作データストアの分野において卓越しています。このハイブリッドな機能により、企業はトランザクション パフォーマンスに影響を与えずにリアルタイムで複雑な分析クエリを実行できます。TiDB がこのハイブリッド性をどのように達成しているか、[アーキテクチャ](https://docs.pingcap.com/tidb/v8.4/explore-htap) に関する資料で詳しく学んでください。

TiDB を ODS として使用することで、データ集約プロセスを大幅に合理化できます。販売システム、在庫データベース、顧客サービスログからデータを集積する必要がある小売企業を考えてみましょう。TiDB の HTAP 機能を利用することで、同社は売上トレンド、在庫レベル、顧客フィードバックに対するリアルタイム分析を実行し、従来のバッチ処理方法の遅延なく即座に業務の意思決定を可能にします。

### 大量データ処理に適したアーキテクチャ

大規模なトランザクションデータ量を扱う企業にとって、TiDB のデータを複数ノードに自動複製し、高可用性と信頼性を確保できる能力は安心感をもたらします。高可用性はマルチ Raft プロトコルによってさらに強化され、インフラストラクチャの一部が故障してもデータが安全であることを企業に保証します。

### 操作の簡素化と複雑性の軽減

TiDB を ODS として展開することで、技術スタックは劇的に簡素化されます。従来のシステムは、データの取り込み、ETL処理、ストレージに複数の異なるツールに依存することが多く、管理が複雑になりコストが増加します。TiDBは、データの取得からクエリに至るまでの完全なデータライフサイクルを単一のプラットフォームで処理することにより、この複雑さを解消します。

```hbsptform
{
  "ui": {
    "titleLevel": 3
  },
  "portalId": "4466002",
  "formId": "62bfb32a-a60a-4f9d-b2dc-1107a93db568",
  "region": "na1",
  "sfdcCampaignId": "701RC00000NdFlAYAV"
}
```