TiDB Cloudの検証

# 1. TiDBとは
TiDBは、水平方向のスケーラビリティ、高可用性、強力な一貫性を備えたオープンソースの分散型NewSQLデータベースです。また、HTAP（Hybrid Transactional and Analytical） 機能により、OLTPとOLAPが混在したワークロードを同時に処理することが可能です。


# 2. TiDB Cloudアカウントの登録（無料）
TiDB Cloudのアカウント登録（無料）は[こちら](https://tidbcloud.com/signup)です。

# 3. 無料の`Developer Tier`のクラスタを作成
TiDB Developer Tierのクラスタを無料で作ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/05d24065-b681-d6b6-b21a-1fc2dd0abde6.png)

:::note info
- 有料の`Dedicated Tier`はAWSとGCP両方利用できますが、無料のDeveloper TierはAWSしか利用できません。 
- Develer Tierではnode数やストレージ容量なども選択できません。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/6a60156b-054a-a6fd-1dac-31a6e849c4de.png)

- `Root Password`とインターネットからこのデータベースにアクセス許可するIPアドレス(自分の環境のpublic IP)を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/49cc61fe-1c48-301f-2d6c-37faf4148233.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/4ebd383f-9d1f-9fc3-fa43-c9f485c8ec16.png)

# 4. TiDB Cloudクラスタにデータをインポート
クラスタの準備ができたら、サンプルデータをクラスタにインポートする作業を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/3302e845-e115-ba6b-5d44-a190d5bd43f2.png)

- 以下の値をコピーし、データインポートタスクページの`Bucket URL`と`Role-ARN`の空欄にそれぞれペーストしてください。
    - Bucket URL: `s3://tidbcloud-samples/gharchive/`
    - Role-ARN: `arn:aws:iam::385595570414:role/import-sample-access`
    - Target DatabaseセクションのPassword欄に、クラスタのパスワード(上記設定した`Root Password`)を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/9e9a90cd-9a15-b9b6-60b9-d277df3f9082.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/721daf59-952e-457f-01db-d4cc1d4c1992.png)

# 5. web shellを使用し、データベースの中身を確認
TiDB Cloudでは、データベースをオンライン接続するためのウェブシェルが用意されています。
1. クラスタへのデータインポートに成功したら、`Exit` ボタンをクリックします。
2. Active Clusterページでクラスタ名をクリックし、クラスタの詳細ページを表示します。
3. `Connect`ボタンをクリックすると、Connect to TiDBパネルがポップアップ表示されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/89a9160d-028c-6374-5741-16f3f376e1e5.png)
4. `Web SQL Shell` --> `Open SQL Shell`を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/6bffc91e-e2bf-3751-93ef-4fe7b6ca8ff1.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/660f5469-dc47-8f4f-e039-af71ea631f18.png)
5. 次に、以下の画像のようにクラスタのパスワードを入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/1ee4c684-1781-8c1f-3a23-230032ab9bf9.png)

6. データベースの中身を確認
    ```
    ti:root@10.0.98.216:4000=> show databases;
     Database
    --------------------
     INFORMATION_SCHEMA
     PERFORMANCE_SCHEMA
     gharchive_dev
     mysql
     test
    (5 rows)
    
    ti:root@10.0.98.216:4000=> use gharchive_dev;
    
    
    ti:root@10.0.98.216:4000=> show tables;
     Tables_in_gharchive_dev
    -------------------------
     github_events
    (1 row)
    
    
    ti:root@10.0.98.216:4000=> SELECT count(*) FROM github_events;
     count(*)
    ----------
     84925
    (1 row)
    
    ti:root@10.0.98.216:4000=>   SELECT repo_name, count(*) AS events_count
    ti:root@10.0.98.216:4000->     FROM github_events
    ti:root@10.0.98.216:4000->    WHERE type = 'WatchEvent' /* Yes, `WatchEvent` means star */
    ti:root@10.0.98.216:4000-> GROUP BY 1
    ti:root@10.0.98.216:4000-> ORDER BY 2 DESC
    ti:root@10.0.98.216:4000->    LIMIT 20;
     repo_name                                  | events_count
    --------------------------------------------+--------------
     heroku-python/flask-sockets                | 92
     aplus-framework/app                        | 18
     GitHubDaily/GitHubDaily                    | 13
     aplus-framework/database                   | 11
     google/python-fire                         | 10
     telethon-Arab/Helper                       | 9
     codex-team/editor.js                       | 9
     fikrikarim/companies-with-successful-pivot | 9
     JMTHON-AR/mus                              | 8
     masaccio/numbers-parser                    | 7
     skyline-emu/skyline                        | 7
     hibiken/asynq                              | 7
     aplus-framework/framework                  | 6
     katef/eurorack-cpu                         | 6
     aplus-framework/http-client                | 6
     lucidrains/vit-pytorch                     | 6
     google/gvisor                              | 6
     aplus-framework/one                        | 6
     google/log4jscanner                        | 6
     Anish-Agnihotri/flipper                    | 6
    (20 rows)
    
    
    
    ti:root@10.0.98.216:4000=> ALTER TABLE github_events SET TIFLASH REPLICA 1;
    ALTER TABLE
    ti:root@10.0.98.216:4000=> SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'gharchive_dev' and TABLE_NAME = 'github_events';
     TABLE_SCHEMA  | TABLE_NAME    | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS
    ---------------+---------------+----------+---------------+-----------------+-----------+--------------------
     gharchive_dev | github_events | 71       | 1             |                 | 0         | 0.6666666666666666
    (1 row)
    
    ti:root@10.0.98.216:4000=> SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'gharchive_dev' and TABLE_NAME = 'github_events';
     TABLE_SCHEMA  | TABLE_NAME    | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS
    ---------------+---------------+----------+---------------+-----------------+-----------+----------
     gharchive_dev | github_events | 71       | 1             |                 | 1         | 1
    (1 row)
    
    ti:root@10.0.98.216:4000=>
    ti:root@10.0.98.216:4000=> SELECT count(*) FROM github_events;
     count(*)
    ----------
     84925
    (1 row)
    ```