👻

ローカル環境にTiDBを構築してみた。

2023/02/20に公開

1. NewSQL

1-1. 特徴

NoSQLの柔軟な拡張性と分散型アーキテクチャに加え、 RDBMSの特徴であるACIDトランザクションを同時にサポートしている。

RDB, NoSQL, NewSQLの比較(参照元: https://licensecounter.jp/devops-hub/blog/tidb1/)

RDB, NoSQL, NewSQLの比較(参照元: https://licensecounter.jp/devops-hub/blog/tidb1/

🌟めちゃくちゃ高い拡張性

NewSQLはSQLを処理するコンポーネントと、データを保持するコンポーネントに分かれて構成されており、例えば処理性能は必要ないけれどディスク容量だけを拡張させたい、というシナリオの場合はデータを保持するコンポーネントだけを拡張させるといったことが可能。

データベースのノード単位ではなく、コンポーネント単位で拡張することで必要なリソースのみを拡張することが可能で、効率よくデータベースを拡張することができる。

従来のデータベースの構成例。スケール単位はノード単位になる(参照元: https://gihyo.jp/article/2022/12/kubernetes-cloudnative-topics-05)

従来のデータベースの構成例。スケール単位はノード単位になる(参照元: https://gihyo.jp/article/2022/12/kubernetes-cloudnative-topics-05)

NewSQLの場合はコンポーネント毎に拡張できるため、柔軟にスケールすることが可能(参照元: https://gihyo.jp/article/2022/12/kubernetes-cloudnative-topics-05)

NewSQLの場合はコンポーネント毎に拡張できるため、柔軟にスケールすることが可能(参照元: https://gihyo.jp/article/2022/12/kubernetes-cloudnative-topics-05)

🌟シャーディング不要

NewSQLではデータは自動的に分散して配置され、シャーディングしなくてもよい。

1-2. 種類

Cloud Native Landscape

2. TiDB

2-1. 特徴

TiDBはPingCAP社によって開発されているオープンソースのNewSQL。

メタデータを管理するPD(Placement Driver⁠)⁠、SQLを処理するTiDB、データを保存するTiKVの3つのコンポーネントによって構成されている。

TiDBのアーキテクチャ(参照元:github.com/pingcap/tidb)

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に変更

    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

スクリーンショット 2023-02-19 21.56.18.png

⇒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

スクリーンショット 2023-02-20 2.02.09.png

ロードバランサーの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ハンズオン

TiDB 検証ライフ(3-自動フェイルオーバーの準備) - Qiita

Get Started With TiDB Operator on Kubernetes

Discussion