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

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

理由は、
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://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61975/511df498-9010-8555-621c-863d589bf760.png)

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

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

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

### インストール手順

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

https://docs.pingcap.com/tidb-in-kubernetes/stable/get-started

#### 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`

##### 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のデプロイ

２ステップ必要でした。

###### 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をインストールでき、自動フェイルオーバーの検証環境が整いました。

## 終わり

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