いきなり自動フェイルオーバーの検証から始めます
理由は、
1. TiDBの特徴の一つに「High Availability」が挙げられている
2. 自分のショボい環境にサクッと入れたTiDBで可用性をどこまで享受できるか
自動フェイルオーバーとは
TiDBクラスタのあるノードがダウンした場合、TiDBが自動的に新しいノードを追加し、クラスタの可用性を担保することのようです。
自動フェイルオーバーの試験
試しに二つのTiDBサーバプロセスから一つKillし、自動復旧するか確認してみます。
tidb-serverプロセスを特定
$ ps -ef | grep tidb-server | grep -v grep
501 4920 4909 0 12:41PM ttys002 0:05.03 /Users/apple/.tiup/components/tidb/v5.3.0/tidb-server -P 4000 --store=tikv --host=127.0.0.1 --status=10080 --path=127.0.0.1:2379,127.0.0.1:2382,127.0.0.1:2384 --log-file=/Users/apple/.tiup/data/SqanXmV/tidb-0/tidb.log
501 4921 4909 0 12:41PM ttys002 0:03.66 /Users/apple/.tiup/components/tidb/v5.3.0/tidb-server -P 4001 --store=tikv --host=127.0.0.1 --status=10081 --path=127.0.0.1:2379,127.0.0.1:2382,127.0.0.1:2384 --log-file=/Users/apple/.tiup/data/SqanXmV/tidb-1/tidb.log
ポート番号4001のプロセスを強制終了
$ kill -9 4921
(base) appurunoMacBook-Air:~ apple$ ps | grep tidb-server | grep -v grep
4920 ttys002 0:09.12 /Users/apple/.tiup/components/tidb/v5.3.0/tidb-server -P 4000 --store=tikv --host=127.0.0.1 --status=10080 --path=127.0.0.1:2379,127.0.0.1:2382,127.0.0.1:2384 --log-file=/Users/apple/.tiup/data/SqanXmV/tidb-0/tidb.log
TiDBサーバプロセスが一つのみ残ったので、後は復旧を待つか。
5分後、再確認
あれー、プロセス一つのみで、復旧できていないぞ。
$ ps | grep tidb-server | grep -v grep
4920 ttys002 0:16.36 /Users/apple/.tiup/components/tidb/v5.3.0/tidb-server -P 4000 --store=tikv --host=127.0.0.1 --status=10080 --path=127.0.0.1:2379,127.0.0.1:2382,127.0.0.1:2384 --log-file=/Users/apple/.tiup/data/SqanXmV/tidb-0/tidb.log
どういうこと?そう簡単にはいかないか。。。
自動フェイルオーバーはTiDB Operatorという別ツールが必要でした
TiDBクラスタをKubernetesクラスタ上で管理し、関連タスクを自動化するツールのようです。
これがあるから、TiDBが真のクラウドネイティブになれたらしいです。
※ 引用: https://github.com/pingcap/tidb-operator
TiDB Operatorを用いて、TiDBクラスタの安全なスケールアウトや自動フェイルオーバーを実現しているようです。
早速、TiDB Operatorインストールしてみます。
インストール手順
PingCAP社のドキュメントに、あくまでテスト環境構築用にクイックインストール手順がありました。
1. Kubernetesテストクラスタ作成
導入要件となる下記インストール
- Docker 20.10.11
- https://www.docker.com/get-started からダウンロードしインストール
- kubectl 1.22.4 (Docker入れたら含まれていました)
- kind 0.11.1
- brewコマンドなかったら、Homebrewインストール
- https://brew.sh/index_ja からインストールコマンドコピーし実行 $ brew install kind
- brewコマンドなかったら、Homebrewインストール
Kubernetesクラスタ作成
$ kind create cluster
正常にインストールされたことを確認。
$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:50444
CoreDNS is running at https://127.0.0.1:50444/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
2. TiDB Operatorのデプロイ
導入要件となるHelm 3をインストール
$ brew install helm
TiDB Operatorのデプロイ
2ステップ必要でした。
TiDB Operator CRDsのインストール
TiDB Operatorは複数CRDs(Custom Resource Definitions) が含まれており、それを用いてTiDBクラスタのさまざまなコンポーネントが実装されているようです(よくわからない、後で調べるか)。
$ kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.2.4/manifests/crd.yaml
Helm 3を使ってTiDB Operatorをインストール
- PingCAP のリポジトリを追加
$ helm repo add pingcap https://charts.pingcap.org/
- TiDB Operatorの名前空間を作成
$ kubectl create namespace tidb-admin
- TiDB Operatorをインストール
$ helm install --namespace tidb-admin tidb-operator pingcap/tidb-operator --version v1.2.4
TiDB Operatorのコンポーネントが起動されたことを確認
$ kubectl get pods --namespace tidb-admin -l app.kubernetes.io/instance=tidb-operator
NAME READY STATUS RESTARTS AGE
tidb-controller-manager-7c79b4567c-72nl9 1/1 Running 0 2m41s
tidb-scheduler-b75d449b-whhlk 2/2 Running 0 2m41s
3. TiDBクラスタとその監視サービスのデプロイ
TiDBクラスタのデプロイ
$ kubectl create namespace tidb-cluster && \
kubectl -n tidb-cluster apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-cluster.yaml
監視サービスのデプロイ
$ curl -LO https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-monitor.yaml && \
kubectl -n tidb-cluster apply -f tidb-monitor.yaml
Podのステータスを確認
watchコマンドがない場合は、インストールします。
$ brew install watch
ステータス確認します。
$ watch kubectl get po -n tidb-cluster
Every 2.0s: kubectl get po -n tidb-cluster appurunoMacBook-Air.local: Sat Dec 4 14:40:20 2021
NAME READY STATUS RESTARTS AGE
basic-discovery-f699b74cd-4s8c2 1/1 Running 0 5m29s
basic-monitor-0 3/3 Running 0 3m50s
basic-pd-0 1/1 Running 0 5m27s
basic-tidb-0 2/2 Running 0 3m6s
basic-tikv-0 1/1 Running 0 4m49s
4. TiDBクラスタへ接続
MySQLクライアントのインストール
$ echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ brew install mysql-client
ポート4000をフォーワード
ローカルホストからKubernetes上のTiDBへの接続は、ポートフォーワーディングを使用します。
- まず、tidb-cluster名前空間のサービスリストを確認
$ kubectl get svc -n tidb-cluster
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
basic-discovery ClusterIP 10.96.64.253 <none> 10261/TCP,10262/TCP 27m
basic-grafana ClusterIP 10.96.245.244 <none> 3000/TCP 25m
basic-monitor-reloader ClusterIP 10.96.36.40 <none> 9089/TCP 25m
basic-pd ClusterIP 10.96.98.1 <none> 2379/TCP 27m
basic-pd-peer ClusterIP None <none> 2380/TCP 27m
basic-prometheus ClusterIP 10.96.84.61 <none> 9090/TCP 25m
basic-tidb ClusterIP 10.96.114.200 <none> 4000/TCP,10080/TCP 25m
basic-tidb-peer ClusterIP None <none> 10080/TCP 25m
basic-tikv-peer ClusterIP None <none> 20160/TCP 26m
TiDBサービスの名前はbasic-tidbとなっています。
- ポートフォーワード
ポートフォーワーディングの結果をpf4000.outファイルに出力します。
バックグラウンドでコマンドを実行することで、残りの操作を同じ端末で続けられます。
$ kubectl port-forward -n tidb-cluster svc/basic-tidb 4000 > pf4000.out &
- TiDBサービスに接続
$ mysql -h 127.0.0.1 -P 4000 -u root
クラスタに接続できたので、TiDB機能を試してみます。
mysql> select tidb_version()\G
*************************** 1. row ***************************
tidb_version(): Release Version: v5.2.1
Edition: Community
Git Commit Hash: cd8fb24c5f7ebd9d479ed228bb41848bd5e97445
Git Branch: heads/refs/tags/v5.2.1
UTC Build Time: 2021-09-08 02:32:56
GoVersion: go1.16.4
Race Enabled: false
TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
Check Table Before Drop: false
1 row in set (0.01 sec)
mysql> select * from information_schema.tikv_store_status\G
*************************** 1. row ***************************
STORE_ID: 1001
ADDRESS: basic-tikv-0.basic-tikv-peer.tidb-cluster.svc:20160
STORE_STATE: 0
STORE_STATE_NAME: Up
LABEL: null
VERSION: 5.2.1
CAPACITY: 58.42GiB
AVAILABLE: 49.61GiB
LEADER_COUNT: 26
LEADER_WEIGHT: 1
LEADER_SCORE: 26
LEADER_SIZE: 26
REGION_COUNT: 26
REGION_WEIGHT: 1
REGION_SCORE: 26
REGION_SIZE: 26
START_TS: 2021-12-04 05:36:46
LAST_HEARTBEAT_TS: 2021-12-04 06:17:00
UPTIME: 40m14.049320428s
1 row in set (0.03 sec)
mysql> select * from information_schema.cluster_info\G
*************************** 1. row ***************************
TYPE: tidb
INSTANCE: basic-tidb-0.basic-tidb-peer.tidb-cluster.svc:4000
STATUS_ADDRESS: basic-tidb-0.basic-tidb-peer.tidb-cluster.svc:10080
VERSION: 5.2.1
GIT_HASH: cd8fb24c5f7ebd9d479ed228bb41848bd5e97445
START_TIME: 2021-12-04T05:38:39Z
UPTIME: 39m7.529825774s
SERVER_ID: 0
*************************** 2. row ***************************
TYPE: pd
INSTANCE: basic-pd-0.basic-pd-peer.tidb-cluster.svc:2379
STATUS_ADDRESS: basic-pd-0.basic-pd-peer.tidb-cluster.svc:2379
VERSION: 5.2.1
GIT_HASH: 8afd38d919ec727712a9518cc3ebdcab47b2fbcb
START_TIME: 2021-12-04T05:35:25Z
UPTIME: 42m21.529832332s
SERVER_ID: 0
*************************** 3. row ***************************
TYPE: tikv
INSTANCE: basic-tikv-0.basic-tikv-peer.tidb-cluster.svc:20160
STATUS_ADDRESS: basic-tikv-0.basic-tikv-peer.tidb-cluster.svc:20180
VERSION: 5.2.1
GIT_HASH: 2c99f317d4ba125b772a8b94a6c3c0eb9d07ac59
START_TIME: 2021-12-04T05:36:46Z
UPTIME: 41m0.529834183s
SERVER_ID: 0
3 rows in set (0.07 sec)
これで、ようやくTiDB Operatorをインストールでき、自動フェイルオーバーの検証環境が整いました。
終わり
長編となってしまったので、一旦ここで終わります。
本題の自動フェイルオーバー検証が次回に持ち越しとなり、申し訳ありません。