ローカル環境にTiDBを構築してみた。
1. NewSQL
1-1. 特徴
NoSQLの柔軟な拡張性と分散型アーキテクチャに加え、 RDBMSの特徴であるACIDトランザクションを同時にサポートしている。
RDB, NoSQL, NewSQLの比較(参照元: https://licensecounter.jp/devops-hub/blog/tidb1/)
🌟めちゃくちゃ高い拡張性
NewSQLはSQLを処理するコンポーネントと、データを保持するコンポーネントに分かれて構成されており、例えば処理性能は必要ないけれどディスク容量だけを拡張させたい、というシナリオの場合はデータを保持するコンポーネントだけを拡張させるといったことが可能。
データベースのノード単位ではなく、コンポーネント単位で拡張することで必要なリソースのみを拡張することが可能で、効率よくデータベースを拡張することができる。
従来のデータベースの構成例。スケール単位はノード単位になる(参照元: https://gihyo.jp/article/2022/12/kubernetes-cloudnative-topics-05)
NewSQLの場合はコンポーネント毎に拡張できるため、柔軟にスケールすることが可能(参照元: https://gihyo.jp/article/2022/12/kubernetes-cloudnative-topics-05)
🌟シャーディング不要
NewSQLではデータは自動的に分散して配置され、シャーディングしなくてもよい。
1-2. 種類
2. TiDB
2-1. 特徴
TiDBはPingCAP社によって開発されているオープンソースのNewSQL。
メタデータを管理するPD(Placement Driver)、SQLを処理するTiDB、データを保存するTiKVの3つのコンポーネントによって構成されている。
TiDBのアーキテクチャ(参照元:github.com/pingcap/tidb)
また、TiDBはHTAP(Hybrid Transaction Analytical Processing)に対応しており、従来のリレーショナル構造に加えて列志向のデータも同時に保持できる。
MySQLとの互換性も◎
2-2. Kubernetes上にTiDBを構築
TiDBをKubernetesで動かす場合は、TiDBが開発しているtidb-operatorを使うことが推奨されている。
-
🔥メモリの確認
後半podの起動時にメモリ不足でkubectlが⬇️しか返さなくなった。
Unable to connect to the server: net/http: TLS handshake timeout
今回はDocker Desktopを使用するため、dockerとMinikubeのメモリを事前にあげておく。
dockerのメモリを8GBに変更
Minikubeのインストール後にメモリを設定。
# Minikubeのメモリを設定(約8GB) minikube config set memory 7960 # deleteしないと反映されない minikube delete
①事前準備
-
minikube を使用して Kubernetes クラスターを作成
# Minikubeインストール brew install minikube # 起動 (今回はdockerで。) minikube start --driver=docker
エイリアスを定義。
alias kubectl='minikube kubectl --'
Kubernetes のステータスを確認し、
kubectl
接続できることを確認。kubectl cluster-info
⇒TiDB Operator をデプロイする準備が完了◎
②TiDB Operatorのデプロイ
導入要件となるHelm 3をインストール。
brew install helm
TiDB Operator CRDsのインストール。
kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.3.9/manifests/crd.yaml
-
エラーの場合
customresourcedefinition.apiextensions.k8s.io/backupschedules.pingcap.com configured customresourcedefinition.apiextensions.k8s.io/backups.pingcap.com configured customresourcedefinition.apiextensions.k8s.io/dmclusters.pingcap.com configured customresourcedefinition.apiextensions.k8s.io/restores.pingcap.com configured customresourcedefinition.apiextensions.k8s.io/tidbclusterautoscalers.pingcap.com configured customresourcedefinition.apiextensions.k8s.io/tidbinitializers.pingcap.com configured customresourcedefinition.apiextensions.k8s.io/tidbmonitors.pingcap.com configured customresourcedefinition.apiextensions.k8s.io/tidbngmonitorings.pingcap.com configured The CustomResourceDefinition "tidbclusters.pingcap.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
kubectl applyでデプロイする際には容量制限に気をつける - chari_ngo’s blog
**kubectl create** -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.3.9/manifests/crd.yaml
tidb-operatorをhelmでデプロイ。
# PingCAPのリポジトリを追加
helm repo add pingcap https://charts.pingcap.org/
# TiDB Operatorの名前空間を作成
kubectl create namespace tidb-admin
# tidb-operator install
helm install --namespace tidb-admin tidb-operator pingcap/tidb-operator --version v1.3.9
正常にデプロイされているか確認。
kubectl get pods --namespace tidb-admin -l app.kubernetes.io/instance=tidb-operator
⇒tidb-schedulerとtidb-controller-managerが動いている🙆♀️
③TiDBを作成
TidbClusterのCustom Resource(CR)を定義する。
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
name: sample-cluster
spec:
version: v6.1.0
pd:
baseImage: pingcap/pd
replicas: 3
requests:
storage: "10Gi"
config: {}
tikv:
baseImage: pingcap/tikv
replicas: 3
requests:
storage: "10Gi"
config: {}
tidb:
baseImage: pingcap/tidb
replicas: 3
service:
# ロードバランサー経由でTiDBにアクセスすることが可能
type: LoadBalancer
config: {}
kubectl create namespace sample
kubectl apply --namespace sample -f sample-tidb-cluster.yaml
# 正常にデプロイされると各コンポーネントが3podずつ立ち上がる
kubectl get pod --namespace sample
ロードバランサーの4000 Portに接続。
brew install mysql-client
TIDB_IP=$(kubectl get svc --namespace sample sample-cluster-tidb --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
mysql --comments -h ${TIDB_IP} -P 4000 -u root
mysql> # MySQLに接続できた!
99. 参考文献
▼TiDBについて&ハンズオン
【概要編】NewSQLとTiDBについて | DevOps Hub | SB C&S
▼NewSQLについて
入門NewSQL 〜Kubernetes上で手軽に使えるNewSQLを動かしてみよう | gihyo.jp
▼TiDBの構造
メイン構造 - TiDB Document Japanese
▼TiDBハンズオン
Discussion