自己紹介
初投稿なので、自己紹介。
ワクトのオーガです。
これから、バックエンドのキャッチアップした関連の記事を投稿していきたいと思ってます。
よろしくお願いします!!!🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉
TiDBとは?
-
オープンソースの分散データベース。
-
読み方は、タイディービィー。
-
PingCAP社が開発している。
-
MySQLと互換があり、同じように使用可能。
-
高い拡張性
-
シャーディングが自動で行われる
そもそも、シャーディングって???
(Google AI Bardによると)
分散データベースにおけるシャーディングとは、データベースのデータを複数のノードに分散して保存する技術です。これにより、データベースのパフォーマンスを向上させ、データの可用性を高めることができます。
-
シャーディングの種類
- 水平分散:データをキーの値に基づいて分散します
- 垂直分散:データを属性の値に基づいて分散します
-
シャーディングの用途
- 水平分散は、データの検索や更新のパフォーマンスを向上させるのに適しています
- 垂直分散は、データのサイズが大きくなり、処理が重くなった場合に適しています
-
シャーディングのメリット/デメリット
メリット | デメリット |
---|---|
パフォーマンスの向上 | 複雑さの増加 |
可用性の向上 | コストの増加 |
スケーラビリティの向上 | パフォーマンスの低下 |
柔軟性の向上 |
もちろん、通常のDBと同様、むやみなパフォーマンスチューニングは逆効果になりうる。
水平分散を図解
- ユニークなキー(ここでいうid)を1〜1000、1001〜2000、2001〜3000・・・というようにノードに分散して保存する。
垂直分散を図解
- カラムごとに分散して保存する
- よく参照されるカラムを切り出して別ノードに保存することでパフォーマンスの改善が期待できるっぽい。(ここは、これから調べる)
TiDBとRDBの違い
-
スケールイン/スケールアウトが容易
-
分断耐性が高い(ノードが1個落ちても、サービス継続可能)
以下比較表
DBMS | 一貫性 | 可用性 | 分断耐性 | ACIDトランザクション | 拡張性の高さ |
---|---|---|---|---|---|
MySQL | ○ | ○ | × | ○ | △ |
TiDB | ○ | △ | ○ | ○ | ○ |
MySQLの欠点である分断耐性が、分散データベースであるが故に、NewSQL(TiDB)では、強みとなっている。
DBへの接続方法
Goによる接続例
- gormもサポートしているので、今までと同じコードで問題なし。
package main
import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// Migrate the schema
db.AutoMigrate(&Product{})
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1)
}
TiDBをローカルに立ててみた
- 基本、公式にあるやつを実行
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
source ~/.zshrc
tiup playground
以下の表示が出れば成功🎉 🎉 🎉
🎉 TiDB Playground Cluster is started, enjoy!
- 別端末を開いて、MySQLと同じく接続する!!!
# portは、4000 で TiDBへ接続する
mysql --host 127.0.0.1 --port 4000 -u root
Your MySQL connection id is 11
Server version: 5.7.25-TiDB-v7.2.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 8.0 compatible
# あとは、MySQLと同じ
mysql> CREATE DATABASE user;
mysql> use user;
Database changed
mysql> CREATE TABLE `user` (
-> `id` INT(255) NOT NULL AUTO_INCREMENT,
-> `name` VARCHAR(255) NOT NULL,
-> `password` VARCHAR(255) NOT NULL,
-> `created_at` DATETIME NOT NULL,
-> `updated_at` DATETIME NOT NULL,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected (0.10 sec)
mysql> DESC user;
+------------+--------------+------+------+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+------+---------+----------------+
| id | int(255) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+------+---------+----------------+
4 rows in set (0.00 sec)
mysql> INSERT INTO `user` (`name`,`created_at`,`updated_at`) VALUES ("テスト",NOW(),NOW());
Query OK, 1 row affected (0.01 sec)
mysql> select * from user;
+----+-----------+---------------------+---------------------+
| id | name | created_at | updated_at |
+----+-----------+---------------------+---------------------+
| 1 | テスト | 2023-07-23 21:14:13 | 2023-07-23 21:14:13 |
+----+-----------+---------------------+---------------------+
1 rows in set (0.00 sec)
mysql> exit
minikube で ローカルにTiDBを立ててみる
M1 Mac メモリ8GB のせいなのか、メモリが足らずTiDBが起動せず。
Dockerのメモリ上限とかいじっても改善せず。
今度、リベンジ。このために、お家k8sやっても良い。。。
まとめ
良かった点
- 今まで、難しそうと敬遠してきたが、意外と使うだけならそうでもない。むしろ楽しい😍😍😍
- 拡張性も高いし、個人開発でのDBも、今後キャッチアップ含みで導入して慣れていきたい。
- シャーディング???分散データベース???だった点が、少し理解が進んだ!!!
いまいちだった点
- kubernetes上で構築したかったが、minikubeのメモリの関係上できなかった。
- スケールイン/スケールアウトのしやすさが体験できなかった。
次に向けて
- kubernetes上でできなかったのか悔しいのでリベンジする
- TiDB cloudは次回使ってみる。
- 個人開発に導入する。
参考
余談
久しぶりにminikube起動したら、絵文字すごっwww
MacBook-Air:qiita-article-org $ minikube start
😄 Darwin 13.4 (arm64) 上の minikube v1.28.0
🎉 minikube 1.31.1 が利用可能です!次の URL からダウンロードしてください: https://github.com/kubernetes/minikube/releases/tag/v1.31.1
💡 この通知を無効にするためには、'minikube config set WantUpdateNotification false' を実行します
✨ 既存のプロファイルを元に、docker ドライバーを使用します
👍 minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
🚜 ベースイメージを取得しています...
🤷 docker 「 minikube 」 container がありません。再生成します。
🔥 docker container (CPUs=2, Memory=2200MB) を作成しています...
🐳 Docker 20.10.20 で Kubernetes v1.25.3 を準備しています...
🔎 Kubernetes コンポーネントを検証しています...
▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
💡 アドオンを有効にした後、「minikube tunnel」を実行することで、ingress リソースが「127.0.0.1」で利用可能になります
▪ k8s.gcr.io/ingress-nginx/controller:v1.2.1 イメージを使用しています
▪ k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 イメージを使用しています
▪ k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 イメージを使用しています
🔎 ingress アドオンを検証しています...
🌟 有効なアドオン: storage-provisioner, default-storageclass, ingress
❗ /usr/local/bin/kubectl のバージョンは 1.22.5 で、Kubernetes 1.25.3 と互換性がないかもしれません。
▪ kubectl v1.25.3 が必要ですか? 'minikube kubectl -- get pods -A' を試してみてください
🏄 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました
MacBook-Air:qiita-article-org $