オルトプラス初「TiDB Serverless」を試してみた！！

本記事は [オルトプラス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/altplus2023) の12/22の記事です。

尚、 [TiDB Advent Calendar 2023](https://qiita.com/advent-calendar/2023/tidb) 「TiDB Serverless 使うの？使わないの？どっちなの？（使う編）」の記事をクロスポストした記事になります。

# はじめに

どうも！！オルトプラスの浦谷（urachooooooo）です

所属は技術部SREでテックスペシャリストとして横断的にデータベースを見ています！！
肩書きはエンジニアマネージャーですが生粋のDBAです！！

本記事では[PingCAP](https://pingcap.co.jp/)さんのマネージドサービス「[TiDB Serverless](https://pingcap.co.jp/tidb-cloud-serverless-pricing-details/)」について導入するまでのチュートリアル的な内容を書いていきます。

それでは22日目のアドベントカレンダー開始しますー！！

# TiDBについて
もはやお約束みたいなものなのですが、もっと認知度を広めるために！！

TiDBはPingCAPさんが開発したHTAPワークロードをサポートする分散データベースであり、NewSQLです。

MySQLとの互換性が高く、MySQLのインターフェースをそのまま使用できるのが特徴です！！

尚、TiDBの各コンポーネントは独立しているためノーメンテでスケールできるため、24時間365日運用も可能！！
（TiDBの各コンポーネントについては次のフェーズで簡単に説明します）

以上、TiDBのお約束でした。

:::note info
【NewSQLについて】
NewSQLは既存のデータベースのアーキテクチャーを捨てて分散データベース用としてゼロベースから設計して構築された全く新しいデータベースです。
もっと簡単に説明すると「RDBとNoSQLのいいとこ取りなデータベース」で、従来のRDBでは実現出来なかった書き込みのスケールが出来るようになりました。
:::

# TiDBのコンポーネントについて

- [TiDBアーキテクチャ](https://docs.pingcap.com/ja/tidb/stable/tidb-architecture#tidb-architecture)
![TiDBアーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/270dbb11-5bae-fb8b-f0af-82d417012090.png)
TiDBのコンポーネントは上記イメージの通り大きく分けて4つあります。
TiDBの主要コンポーネントである「PD」・「TiDB」・「TiKV」・「TiFlash」について簡単に特徴を説明します。（こちらもお約束みたいなものです。）

## PD（Placement Driver）
- TiDBの基本コンポーネント
- クラスター全般の管理を行う頭脳で領域管理のレイヤー
    - クラスター全体のメタデータ情報「Metadata」の管理
    - データの配置場所「Data location（Region）」の管理
    - トランザクションを割り当てるための「TSO」の発行
    - Raftグループの管理
    - etc.

:::note info
【Regionについて】
RegionはTiDBの最小単位で1テーブル作成時に1つ作成される領域です
:::

:::note info
【TSOについて】
TSOは「Timestamp Oracle」の略で、クラスター全体でユニークになるタイムスタンプで必ず昇順で発行し、TiKVのトランザクションで使用します。
:::

## TiDB
- TiDBの基本コンポーネント
- SQLを解析するレイヤー
    - MySQL protocolから送られたパケットを元に実施
        - 「Parser」がSQLの構文を解析
        - 「Optimizer」がクエリプランを計画
        - 「Executor」がSQLステートメントを実行
- ステートレスなのでデータを持たない
    - 特にスケールし放題な箇所

## TiKV
- TiDBの基本コンポーネント
- Key-Valueの構造でデータを永続化するデータストアレイヤー
    - 分散型Key-Valueストレージエンジン
    - ストレージはRocksDBを使用し、データ構造はLSM Treeを使用する
        - データを保存するための基本単位はRegion
    - Raftアルゴリズムによりデータの整合性を担保する
    - トランザクションを提供する

## TiFlash
- 必要に応じてpluggableに追加するコンポーネント
- 列指向の構造でデータを永続化するデータストアレイヤー
    - 列指向ストレージエンジン
    - 分析処理を行う場合に使用する
    - Raft Learnerコンセンサスアルゴリズムによる非同期レプリケーション
        - 元データは「[SET TIFLASH REPLICA](https://docs.pingcap.com/ja/tidb/stable/create-tiflash-replicas#create-tiflash-replicas-for-tables)」で指定されたテーブル（TiKV）から取得
        - 行から列に変換（スキーマレスからスキーマへの変換）のため読み取り専用
- HTAP（Hybrid Transaction Analytical Processing）要件を満たす事ができる

# TiDBの製品について
TiDBには大きく分けて2つあリます。
1つはTiUPコマンドを使用してオンプレミスまたはクラウド内にデプロイして環境構築するOSS版の「[TiDB](https://pingcap.co.jp/tidb-overview/)」、もう1つはTiDBのフルマネージドサービスである「[TiDB Cloud](https://pingcap.co.jp/tidb-cloud/)」です。

更にTiDB Cloudは2つのカテゴリーに分けられています。
「[TiDB Dedicated](https://pingcap.co.jp/tidb-cloud-pricing-details/)」と「[TiDB Serverless](https://pingcap.co.jp/tidb-cloud-serverless-pricing-details/)」です。

尚、旧名はTiDB Cloud「Serverless Tier」と「Dedicated Tier」だったのですが、
[2023年06月23日（金）から上記の正式名称に](https://speakerdeck.com/pingcap0315/tidb-cloudzui-xin-zhuang-kuang-noshao-jie?slide=6)なりました！！

# TiDB Cloudついて
今回使用する「TiDB Serverless」はTiDB Cloudであるため、
「TiDB Dedicated」と「TiDB Serverless」についてもう少し違いを記載していきます。

## TiDB Serverless
TiDB Serverlessは、5つのクラスターを無料で使用することができます。
（この無料枠があるので気軽に試すことができます！！）

尚、月毎に無料枠の使用上限が決まっているため、無料枠のリソースを使い切った場合は消費リソースに応じて課金（従量制料金）する仕組みです。

TiDBのコンポーネント「PD」・「TiDB」・「TiKV」・「TiFlash」のリソース割り当てについて考える必要がないのもメリットです。

必要に応じて必要なリソースを使用することができるので、本番環境でもアクセスが少なく変動のあるアプリケーション（例えば0時のアクセスだけアクセスが集中してスパイクする等）や開発環境に向いているかと思います！！

- 主な特徴
    - 5つのクラスターを無料で使用することができる
    - 6つ目のクラスターを作成する場合は、クレジットカードを追加する必要がある
    - 無料枠は
        - 行ベースのデータ5GiBを保存可能
        - 列ベースのデータ5GiBを保存可能
        - 5000万RUを消費することが可能
    - 「Chat2Query」を試すことができる
    - マルチテナントアーキテクチャを採用

:::note info
【RUについて】
RUは「[Request Unit (RU) ](https://pingcap.co.jp/tidb-cloud-serverless-pricing-details/) 」の略で、データベースへの1つのリクエストにつき消費されるリソースの量を表すために使用される単位です。
:::

## TiDB Dedicated
TiDB DedicatedはTiDBの各コンポーネント「TiDB」・「TiKV」・「TiFlash」に対してあらかじめ必要な「CPU・メモリ・ストレージ」を指定したリソースコントロールを行うことができます。

なので、無料枠はなく有料版のみになります。
尚、TiDBの基本構成である「PD」はTiDB Dedicatedの管理下にあるため不要です。

- 主な特徴
    - 有料版のみ
    - TiDB Cloudの全機能を利用可能
    - トラフィック量に応じて柔軟にスケールアウト・スケールインが可能
        - 「TiDB」・「TiKV」・「TiFlash」
    - シングルテナントアーキテクチャを採用

# まずは試してみる
TiDB Serverlessは無料で使えるので気軽に試すことにします！！
ではクラスターを作成しましょうー！！

って・・・まだアカウント無いので作ります💦

## TiDB Cloudアカウントにサインアップ
:::note info
まずはサインアップして「TiDB Cloudコンソール」へログインしよう!!
:::
### 1. 「無料トライアル」ボタンを見つけて押す
![01_アカウント作成_01無料トライアル入り口.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/96a378b3-8453-da93-3910-ec52ac8b405d.png)
[PingCAPさんの公式サイト](https://pingcap.co.jp/)のTOPに飛ぶと「無料トライアル」のボタンがあちこちあるのでポチって押す所が第一の関門である！！
もしポチって押す事が出来たら「TiDB serverless」への冒険が始まる。
さぁー勇気を出してポチるのだ！！

- 追加のバナーを発見
![01_アカウント作成_01無料トライアル入り口（新作）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/0b9ad75f-c791-8461-e957-6c5a677da868.png)
先日までなかったバナーが追加されているではないか！！
（12月05日に追加を確認）

### 2. サインインする
![01_アカウント作成_02新規サインイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/e292c051-1bd4-f51f-e429-8f455a776db5.png)
勇気を出してポチる場所を間違えました💦
ここからが勇気を出してポチる場所です！！
といった冗談はさておき、もしサインインしていなければ「[TiDB Cloudコンソール](https://tidbcloud.com/console/clusters)」へログインするためにアカウント登録が必要です。

:::note info
TiDB Cloudのログイン方法は2つあります。
「[パスワード認証](https://docs.pingcap.com/ja/tidbcloud/tidb-cloud-password-authentication)」と「[SSO認証](https://docs.pingcap.com/ja/tidbcloud/tidb-cloud-sso-authentication)」を選択可能です。
必要に応じて選択する必要があります。
- パスワード認証
    - 「電子メールとパスワード」を使用
- SSO認証
    - 「Google、GitHub、またはMicrosoftのアカウント」を使用
:::
:::note info
尚、自分は「Googleアカウント」を使用したSSOログインを選択しました。
なので、以降の手順は「[Google SSOでサインインする](https://docs.pingcap.com/ja/tidbcloud/tidb-cloud-sso-authentication#sign-in-with-google-sso)」の手順になります。
:::

### ３. googleアカウントを選択する
![01_アカウント作成_03googleアカウントを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/d97f9289-df3c-ca26-e98c-2c81c4e87c6f.png)
アカウントを選択するだけ

### 4. 同意して開始。そして「TiDB Cloudコンソール」へログイン
![01_アカウント作成_04同意して開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/5779d399-7870-177d-10d5-9a8ae1a62e0e.png)
![01_アカウント作成_05tidb_cloud_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/a734ab48-8e4b-b9a5-dca6-8c3f0aef613b.png)
同意事項にチェックを行い「Get Started」ボタンを押下すると「TiDB Cloudコンソール」へログインしてクラスターのリストが表示されます！！

この時点で「Cluster0」が作成されます。（このクラスターは初めて作成した記念として削除しないで取っておくことにします！！）

## 初期セットアップ
:::note info
作成されたクラスターの接続設定を行いTiDB Serverlessへ接続しよう！！
:::
### 1. 対象のクラスターを選択して接続設定
![02_初期セットアップ_01overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/27cb06be-0b9f-26e3-bb22-e130dc71ccd0.png)
まずはクラスターに接続するための接続設定を行う必要があります。
手順の通り、クラスター名をクリックして「Connect」ボタンを押下します。

### 2. 接続時の設定
![02_初期セットアップ_02パスワード作成（Public）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/6ec5b64a-a2d9-9ad4-1c82-316cff3d5b49.png)
詳細な接続方法が選択できるので必要に応じて設定方法を変更します。

この例はカジュアルに試すためエンドポイントタイプは「Public」、接続先は「macOS」としていますが、エンドポイントタイプが「Public」の場合はセキュリティに影響するためエンドポイントタイプは「Plivate」とした上で「プライベートエンドポイント」を設定した接続が推奨となっています。

- パブリックエンドポイント
    - TiDBサーバーレスにはTLS接続必要
    - TLS接続によりアプリケーションからTiDBクラスターへのデータ送信のセキュリティが確保される
　　
- プライベートエンドポイント(推奨)
    - 「AWS PrivateLink」経由でサービスに安全にアクセス可能
    ![privateエンドポイントアーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/fedeb7c2-2e6b-5250-13c8-8c7ac74d2d4c.png)
    - プライベートエンドポイントの設定
    ![privateエンドポイント設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/c70c0eb6-edda-5733-c3ce-b6f521657632.png)

### 3. TiDB Serverlessへ接続
![02_初期セットアップ_03MySQL接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/56196052-65aa-d293-4931-099f0b2d00e4.png)
接続情報をコピーして接続できました！！
尚、MySQLクライアントのインストールが必要になります！！
## 新規クラスター作成
:::note info
もう1台クラスターを作成しよう！！
:::

### 1. 手順に従い「Serverless」を作成
![03_新規クラスター作成_01クラスター作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/b48b5017-eb74-3c9d-2439-3aab50a1308a.png)
![03_新規クラスター作成_02overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/b11513ac-6c2d-455a-577f-050963e97eae.png)
説明は不要なくらいシンプルなインターフェース。

デフォルトのTireは「Serverless」であり、クラスター名もデフォルトで連番の「Cluster1」が設定されているため何もすることなく作成ボタンを押下すればクラスターが作成されます。

これぞマネージドサービス！！

尚、作成ボタンを押すと「Overview」画面へ自動的に遷移して、暫くすると「Connect」ボタンが有効になって押せるようになるので押します。

### 2. 接続時の設定
![03_新規クラスター作成_03パスワード作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/4293e3a1-7d53-2317-a444-26532bc677cb.png)
クラスター毎に接続設定を行う必要があるため設定を行う。
尚、各クラスター毎に接続情報が異なるため情報を管理する必要があります。

### 3. クラスターが作成されていることを確認
![03_新規クラスター作成_04作成確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/27aa83b6-638d-6af4-2e19-902527ad1c62.png)
作成されたクラスターが「Clusters」画面に表示されたら成功です！！

## パスワードリセット
:::note info
パスワードを再設定しよう！！
:::

### 1. パスワード変更対象のクラスターを選択して接続設定
![04_パスワードリセット_01overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/5999faf8-c535-acd5-47fb-74b8fbe41a64.png)
対象のクラスターを選択すると「Overview」画面へ遷移するので「Connect」ボタンを押して接続設定画面へ

### 2. パスワードをリセット
![04_パスワードリセット_02リセットサイクル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/3d8073ce-a120-afbb-e480-c007fb21fb69.png)
上記イメージの通り、パスワードは何回でもリセット可能です。
なので、パスワードを忘れたらとりあえずリセットする運用もありかもしれませんね！！

## クラスター削除
:::note info
使用しないクラスターを削除しよう！！
:::

### 1. クラスターリストから対象を選択して削除
![05_クラスター削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/0f099168-8478-cd25-55f4-535a4c486f46.png)
削除対象のクラスターの「Action」から「Delete」を選択するとクラスターを削除できます。
尚、削除するためには「削除するための確認文字列」を入力する必要があるため、入力して確認後に削除する必要があります。
（初回に作成された記念クラスターも誤って削除してしまうリスクが下がりますw）

## 無料枠作成上限でのクラスター作成
:::note info
無料での作成上限を超えたをクラスター作成時にどうなるのか？を確認しましょう！！
:::

### 1. 5つのクラスター存在時にクラスターを作成開始
![06_無料上限でのクラスター作成_01クラスターリスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/ffd26107-11a0-50e4-7328-b2a31aec236e.png)
![06_無料上限でのクラスター作成_02CreateCluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/ade7f719-d3cf-49d4-ee0d-8bdfdef3c852.png)
クラスターが無料の上限「5クラスター」存在時の状態で「Serverless」を選択すると、今まで表示されていなかったメッセージが赤色で表示されるようになります。

### 2. メッセージが出た状態で「Create」ボタンを押してみる
![06_無料上限でのクラスター作成_03作成ボタン押下.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/25ff1777-d85a-25bc-153b-88d064092d83.png)
それでも押したいのが人間である。作成ボタンを（うっかり）押してしまった場合は、そりゃそうなるよ！！と言わんばかりにエラーが出て作成出来ないだけです！！
尚、ノールックでボタンを押した場合でもエラーになります。

### 3. 上限以上のクラスターを作成する場合
![06_無料上限でのクラスター作成_04クレジットカードを登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/d77de8fb-d818-d6d7-3177-df3cb6fe539e.png)
クレジットカードを登録すれば無料枠の制限から解放されます！！

## 「mysql_config_editor」を使用した接続
:::note info
ログインパスを設定しよう
（MySQLが使用できるため「mysql_config_editor」も使用できます！！）
:::
1. TLSの情報を除いた情報を元に設定する
    ```shell
    mysql_config_editor set --login-path=tidb-serverless --user='tidbServerless.root' --host=gateway01.ap-northeast-1.prod.aws.tidbcloud.com -P 4000 --password
    ```
2. パスワードを設定する
    ```shell
    Enter password:
    ```
3. ログインパスを指定して接続（PublicのみTSLのオプションが必要）
    ```shell
    mysql --login-path=tidb-serverless --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/cert.pem
    ```

## （おまけ）作成の雰囲気だけでも！！
![TiDB Serverless作成デモ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/6f3e200f-40bc-e7ee-4187-7da113d3132c.gif)
クラスターの作成時間は約30秒です。
はっ早い💦

# まとめ
TiDB Serverlessの無料枠を試してみました！！
（本当に無料で使い続けていいのかな、ありがたい！！）

自分はCUIを使用して自動化させたいタイプなので、
TiUPコマンドを使用したTiDBクラスターの作成が好きだったのですが、
「あれ、GUIのインターフェースであるTiDB Cloudコンソールも悪くない！！」と思い更に、初回のクラスター作成時には「何て楽なんだ！！」と感動してしまいました！！

因みに、「[TiDB CloudCLI](https://docs.pingcap.com/ja/tidbcloud/get-started-with-cli)」や「[Terraform](https://docs.pingcap.com/ja/tidbcloud/terraform-tidbcloud-provider-overview#terraform-integration-overview)」で自動化出来そうです！！
（GUIもいいって言ってたじゃん💦）

お世辞抜きで本当に楽でした！！
やっぱり何でもやってみないとですねー
（やってみる或いはチャレンジは本当に大事！！）

次はTiDB Cloudの検証をせねば！！
そしてプロジェクトへの導入を目指して！！！