TiDB 検証ライフ(5-ディスク障害検証の準備)

# ディスク障害時、TiDBがどこまで対処できるか検証します

## まずはTiDBストレージのコンセプトを理解しないと

### ストレージレイヤーのアーキテクチャー

RowベースのTiKVクラスタと、ColumnベースのTiFlashクラスタにより構成されています。
TiKVはKey-Valueのストレージモデルを採用しているようです。
データ保存単位はRegionとStore(これが何かは後で調べようっと)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61975/9d5e64a5-c337-cf14-3211-c44a1d20ea98.png)

※ 引用: https://docs.pingcap.com/tidb/stable/tidb-storage

### データはどのように保存されるか

キーワードが二つありました。

- RocksDBをローカルストレージとして採用
    - RocksDBは、Facebook社から提供されたOSSのスタンドアロンストレージエンジン
- Raftプロトコルにて複数マシンでレプリケーションを構成
    - Raftアルゴリズムを使ってレプリカ管理など行い、マシン障害に備える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61975/a48754a8-57bb-b6ce-5ae3-1e42d9360d74.png)

※ 引用: https://docs.pingcap.com/tidb/stable/tidb-storage

### Region

Regionの中身はこんな感じのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61975/f1019b9a-467f-5492-6016-6f4c95f31dde.png)

※ 引用: https://docs.pingcap.com/tidb/stable/tidb-storage

### 分散ACIDトランザクション
TiKVのトランザクションはGoogleのBigTableでも採用されている[Percolator](https://research.google.com/pubs/pub36726.html)モデルを採用しているとのことです。
これは興味深いので、別途検証してみようと思います。

## TiDBストレージの論理構造はわかったが実態はどうよ

実際、TiKVプロセスが開いているファイルやらを確認してみました。

### DockerのコンテナIDを確認

```
$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED      STATUS          PORTS                       NAMES
17818ffab074   kindest/node:v1.21.1   "/usr/local/bin/entr…"   3 days ago   Up 10 minutes   127.0.0.1:50444->6443/tcp   kind-control-plane
```

### コンテナIDを指定しログイン

```
$ docker exec -it 17818ffab074 /bin/bash
```

### lsofコマンドをインストール

```
root@kind-control-plane:/# apt-get update
root@kind-control-plane:/# apt-get install lsof
```

### tikv-serverのプロセスIDを確認

```
root@kind-control-plane:/# ps -ef | grep tikv-server | grep -v grep
root        2054    1600  4 13:09 ?        00:00:30 /tikv-server --pd=http://basic-pd:2379 --advertise-addr=basic-tikv-0.basic-tikv-peer.tidb-cluster.svc:20160 --addr=0.0.0.0:20160 --status-addr=0.0.0.0:20180 --advertise-status-addr=basic-tikv-0.basic-tikv-peer.tidb-cluster.svc:20180 --data-dir=/var/lib/tikv --capacity=0 --config=/etc/tikv/tikv.toml
```

### 上記プロセスIDを指定しオープンされているファイルを確認

TiDBストレージのディレクトリやファイル構成がなんとなく見えてきました。

- tikv-server: サイズが大きいのでこれがコア部?
- /var/lib/tikv/rocksdb.info: RocksDBの情報がここに記載されている?
- /var/lib/tikv/raftdb.info: Raft関連情報がここに記載されている?
- /var/lib/tikv/raft: MANIFEST、LOCK、.sst, .log などのファイル存在
- /var/lib/tikv/db: MANIFEST、LOCK、.sst, .log などのファイル存在

```
root@kind-control-plane:/# lsof -p 2054 | egrep 'REG|DIR'
tikv-serv 2054 root  cwd       DIR  0,442      4096 3148202 /
tikv-serv 2054 root  rtd       DIR  0,442      4096 3148202 /
tikv-serv 2054 root  txt       REG  0,442 210685000 3277893 /tikv-server
tikv-serv 2054 root  mem       REG  254,1           3277893 /tikv-server (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278505 /usr/glibc-compat/lib/libresolv.so.2 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278492 /usr/glibc-compat/lib/libnss_dns.so.2 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278495 /usr/glibc-compat/lib/libnss_files.so.2 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278091 /lib/ld-musl-x86_64.so.1 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278468 /usr/glibc-compat/lib/libc.so.6 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278477 /usr/glibc-compat/lib/libm.so.6 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278508 /usr/glibc-compat/lib/librt.so.1 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278527 /usr/lib/libgcc_s.so.1 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278502 /usr/glibc-compat/lib/libpthread.so.0 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278474 /usr/glibc-compat/lib/libdl.so.2 (stat: No such file or directory)
tikv-serv 2054 root  mem       REG  254,1           3278458 /usr/glibc-compat/lib/ld-linux-x86-64.so.2 (stat: No such file or directory)
tikv-serv 2054 root    3w      REG  254,1    678326 2756881 /var/lib/tikv/rocksdb.info
tikv-serv 2054 root    4w      REG  254,1    318742 2756880 /var/lib/tikv/raftdb.info
tikv-serv 2054 root   21wW     REG  0,442         0 3281684 /tmp/0_TIKV_LOCK_FILES/0.0.0.0_20160
tikv-serv 2054 root   22wW     REG  254,1         0 2757057 /var/lib/tikv/LOCK
tikv-serv 2054 root   23r      DIR  254,1      4096 2757055 /var/lib/tikv/raft
tikv-serv 2054 root   24uW     REG  254,1         0 2757058 /var/lib/tikv/raft/LOCK
tikv-serv 2054 root   25r      REG  254,1     10930 2756875 /var/lib/tikv/raft/000007.sst
tikv-serv 2054 root   26r      REG  254,1     96153 2757039 /var/lib/tikv/raft/000004.sst
tikv-serv 2054 root   27r      DIR  254,1      4096 2757055 /var/lib/tikv/raft
tikv-serv 2054 root   28r      REG  254,1     13329 2756872 /var/lib/tikv/raft/000010.sst
tikv-serv 2054 root   29w      REG  254,1       231 2756873 /var/lib/tikv/raft/MANIFEST-000011
tikv-serv 2054 root   30w      REG  254,1     50729 2756877 /var/lib/tikv/raft/000012.log
tikv-serv 2054 root   31r      DIR  254,1      4096 2757070 /var/lib/tikv/db
tikv-serv 2054 root   32uW     REG  254,1         0 2757071 /var/lib/tikv/db/LOCK
tikv-serv 2054 root   33r      REG  254,1    570495 2757224 /var/lib/tikv/db/000012.sst
tikv-serv 2054 root   34r      REG  254,1     17583 2756908 /var/lib/tikv/db/000023.sst
tikv-serv 2054 root   35r      REG  254,1    137932 2757227 /var/lib/tikv/db/000015.sst
tikv-serv 2054 root   37r      DIR  254,1      4096 2757070 /var/lib/tikv/db
tikv-serv 2054 root   38r      DIR  254,1      4096 2757070 /var/lib/tikv/db
tikv-serv 2054 root   39r      DIR  254,1      4096 2757070 /var/lib/tikv/db
tikv-serv 2054 root   40r      DIR  254,1      4096 2757070 /var/lib/tikv/db
tikv-serv 2054 root   41w      REG  254,1      1037 2756878 /var/lib/tikv/db/MANIFEST-000030
tikv-serv 2054 root   43r      REG  254,1     23367 2757256 /var/lib/tikv/db/000032.sst
tikv-serv 2054 root   45w      REG  254,1     31332 2757258 /var/lib/tikv/db/000034.log
tikv-serv 2054 root   46r      REG  254,1      3401 2756910 /var/lib/tikv/db/000037.sst
```

## 終わりに

TiDBストレージ検証の準備として、関連構成を確認できました。
各ファイルの機能など詳細まで理解できていませんが、徐々に理解を深めていきます。
次回は取り敢えず、データ破壊しどうなるか見てみます。お楽しみに。