0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-12-04

いきなり自動フェイルオーバーの検証から始めます

理由は、
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が真のクラウドネイティブになれたらしいです。

image.png

※ 引用: https://github.com/pingcap/tidb-operator

TiDB Operatorを用いて、TiDBクラスタの安全なスケールアウトや自動フェイルオーバーを実現しているようです。

早速、TiDB Operatorインストールしてみます。

インストール手順

PingCAP社のドキュメントに、あくまでテスト環境構築用にクイックインストール手順がありました。

1. Kubernetesテストクラスタ作成

導入要件となる下記インストール
  • Docker 20.10.11
  • kubectl 1.22.4 (Docker入れたら含まれていました)
  • kind 0.11.1
    • brewコマンドなかったら、Homebrewインストール
      - https://brew.sh/index_ja からインストールコマンドコピーし実行
    • $ brew install kind
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をインストールでき、自動フェイルオーバーの検証環境が整いました。

終わり

長編となってしまったので、一旦ここで終わります。
本題の自動フェイルオーバー検証が次回に持ち越しとなり、申し訳ありません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?