作者: Meditator 原文来源:https://tidb.net/blog/9ffcc309
目的:
随着 tidb 使用场景的越来越多,接入的业务越来越重要,不由得想试验下 tidb 组件的高可用性以及故障或者灾难如何恢复,恢复主要涉及的是 pd 组件和 tikv 组件,本文主要涉及 pd 组件。
tikv 恢复请看TiKV 多副本丢失以及修复实践
基础情况
tidb 版本:5.2.1
部署方式:tiup
部署拓扑
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/data/tidb/tidb-deploy"
data_dir: "/data/tidb/tidb-data"
pd_servers:
- host: 10.12.16.225
- host: 10.12.16.226
- host: 10.12.16.227
tidb_servers:
- host: 10.12.16.225
- host: 10.12.16.226
- host: 10.12.16.227
tikv_servers:
- host: 10.12.16.225
- host: 10.12.16.226
- host: 10.12.16.227
monitoring_servers:
- host: 10.12.16.228
grafana_servers:
- host: 10.12.16.228
alertmanager_servers:
- host: 10.12.16.228
复制代码
部署结果查看:
$ tiup cluster display tidb-test
复制代码
Found cluster newer version:
The latest version: v1.6.0
Local installed version: v1.5.6
Update current component: tiup update cluster
Update all components: tiup update --all
Starting component `cluster`: /data/tidb/.tiup/components/cluster/v1.5.6/tiup-cluster display tidb-test
Cluster type: tidb
Cluster name: tidb-test
Cluster version: v5.2.1
Deploy user: tidb
SSH type: builtin
Dashboard URL: http://10.12.16.227:2379/dashboard
ID Role Host Ports OS/Arch Status Data Dir Deploy Dir
-- ---- ---- ----- ------- ------ -------- ----------
10.12.16.228:9093 alertmanager 10.12.16.228 9093/9094 linux/x86_64 Up /data/tidb/tidb-data/alertmanager-9093 /data/tidb/tidb-deploy/alertmanager-9093
10.12.16.228:3000 grafana 10.12.16.228 3000 linux/x86_64 Up - /data/tidb/tidb-deploy/grafana-3000
10.12.16.225:2379 pd 10.12.16.225 2379/2380 linux/x86_64 Up /data/tidb/tidb-data/pd-2379 /data/tidb/tidb-deploy/pd-2379
10.12.16.226:2379 pd 10.12.16.226 2379/2380 linux/x86_64 Up|L /data/tidb/tidb-data/pd-2379 /data/tidb/tidb-deploy/pd-2379
10.12.16.227:2379 pd 10.12.16.227 2379/2380 linux/x86_64 Up|UI /data/tidb/tidb-data/pd-2379 /data/tidb/tidb-deploy/pd-2379
10.12.16.228:9090 prometheus 10.12.16.228 9090 linux/x86_64 Up /data/tidb/tidb-data/prometheus-9090 /data/tidb/tidb-deploy/prometheus-9090
10.12.16.225:4000 tidb 10.12.16.225 4000/10080 linux/x86_64 Up - /data/tidb/tidb-deploy/tidb-4000
10.12.16.226:4000 tidb 10.12.16.226 4000/10080 linux/x86_64 Up - /data/tidb/tidb-deploy/tidb-4000
10.12.16.227:4000 tidb 10.12.16.227 4000/10080 linux/x86_64 Up - /data/tidb/tidb-deploy/tidb-4000
10.12.16.225:20160 tikv 10.12.16.225 20160/20180 linux/x86_64 Up /data/tidb/tidb-data/tikv-20160 /data/tidb/tidb-deploy/tikv-20160
10.12.16.226:20160 tikv 10.12.16.226 20160/20180 linux/x86_64 Up /data/tidb/tidb-data/tikv-20160 /data/tidb/tidb-deploy/tikv-20160
10.12.16.227:20160 tikv 10.12.16.227 20160/20180 linux/x86_64 Up /data/tidb/tidb-data/tikv-20160 /data/tidb/tidb-deploy/tikv-20160
复制代码
提示:
防止 tiup 部署后,在破坏掉 pd 实例后,pd-server 被自动拉起来,影响试验效果,需要做如下修改
1、在 /etc/systemd/system/pd-2379.service 中去掉 Restart=always 或者改 Restart=no,
2、执行 systemctl daemon-reload 重新加载
模拟 PD 集群损坏:
1、在 10.12.16.227 上删除掉 pd-server 进程的数据目录
$ cd /data/tidb/tidb-data
$ ls
monitor-9100 tikv-20160 pd-2379
$rm -rf pd-2379
复制代码
查看 10.12.16.227:2379 进程状态:
此时 tikv 和 tidb 组件是 up 状态,还能正常提供服务
2、在 10.12.16.226 上删除掉 pd-server 进程的数据目录
$ cd /data/tidb/tidb-data
$ ls
monitor-9100 tikv-20160 pd-2379
$rm -rf pd-2379
复制代码
查看 10.12.16.226:2379 进程状态:
此时发现 pd 集群全部是 down 状态(原因大家应该很清楚,大多数原则无法满足,pd 无法选举出 leader),并且 tikv 是 N/A 状态,整个集群无法对外提供服务,此时集群不可用
3、在 10.12.16.225 上删除掉 pd-server 进程的数据目录
$ cd /data/tidb/tidb-data
$ ls
monitor-9100 tikv-20160 pd-2379
$ rm -rf pd-2379
复制代码
查看 10.12.16.225:2379 进程状态:
此时跟步骤 2 的结果一样,整个集群在步骤 2 已经对外不可用
到目前为止,整个 PD 集群已经完全被破坏掉,所有 pd-server 进程对应的数据目录全部被删除掉
修复 PD 集群:
1、找出已经损坏的 PD 集群 ID,即 cluster-id 和 alloc-id
cluster-id 查找方法:
方法 1:
通过 pd 日志查找
$ cat /data/tidb/tidb-deploy/pd-2379/log/pd.log | grep "init cluster id"
复制代码
输出:
[2021/10/09 16:02:09.878 +08:00] [INFO] [server.go:351] ["init cluster id"] [cluster-id=7016973815389845033]
复制代码
方法 2:
通过 tidb-server 日志查找
$ cat /data/tidb/tidb-deploy/tidb-4000/log/tidb.log | grep "init cluster id"
复制代码
输出:
[2021/10/09 16:02:11.722 +08:00] [INFO] [base_client.go:126] ["[pd] init cluster id"] [cluster-id=7016973815389845033]
复制代码
方法 3:
通过 tikv 日志查找
$ cat /data/tidb/tidb-deploy/tikv-20160/log/tikv.log | grep "connect to PD cluster"
复制代码
输出:
[2021/10/09 16:02:10.165 +08:00] [INFO] [server.rs:344] ["connect to PD cluster"] [cluster_id=7016973815389845033]
复制代码
alloc-id 只能通过 pd 日志查找:
$ cat /data/tidb/tidb-deploy/pd-2379/log/pd.log | grep "idAllocator allocates a new id" | awk -F'=' '{print $2}' | awk -F']' '{print $1}' | sort -r | head -n 1
复制代码
输出:
2、通过强制缩容剔除 226 和 227 上的 pd-server 节点
$ tiup cluster scale-in tidb-test -N 10.12.16.226:2379 --force
复制代码
......
failed to delete pd: Get "http://10.12.16.225:2379/pd/api/v1/members": dial tcp 10.12.16.225:2379: connect: connection refused
Stopping component pd
Stopping instance 10.12.16.226
Stop pd 10.12.16.226:2379 success
Destroying component pd
Destroying instance 10.12.16.226
Destroy 10.12.16.226 success
- Destroy pd paths: [/data/tidb/tidb-deploy/pd-2379 /etc/systemd/system/pd-2379.service /data/tidb/tidb-data/pd-2379 /data/tidb/tidb-deploy/pd-2379/log]
+ [ Serial ] - UpdateMeta: cluster=tidb-test, deleted=`'10.12.16.226:2379'`
+ [ Serial ] - UpdateTopology: cluster=tidb-test
{"level":"warn","ts":"2021-10-09T16:31:42.706+0800","logger":"etcd-client","caller":"v3@v3.5.0/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0001528c0/#initially=[10.12.16.225:2379]","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \""transport: Error while dialing dial tcp 10.12.16.225:2379: connect: connection refused\"""}
Error: context deadline exceeded
Verbose debug logs has been written to /data/tidb/.tiup/logs/tiup-cluster-debug-2021-10-09-16-31-42.log.
Error: run `/data/tidb/.tiup/components/cluster/v1.5.6/tiup-cluster` (wd:/data/tidb/.tiup/data/SlKXEx0) failed: exit status 1
复制代码
虽然有报错,但是还是强制删除两个节点
$ tiup cluster display tidb-test
复制代码
输出:
3、启动仅存的 10.12.16.225:2379 节点
$ tiup cluster start tidb-test -N 10.12.16.225:2379
复制代码
......
Start 10.12.16.225 success
+ [ Serial ] - UpdateTopology: cluster=tidb-test
{"level":"warn","ts":"2021-10-09T16:35:22.598+0800","logger":"etcd-client","caller":"v3@v3.5.0/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0001b6700/#initially=[10.12.16.225:2379]","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
Error: context deadline exceeded
Verbose debug logs has been written to /data/tidb/.tiup/logs/tiup-cluster-debug-2021-10-09-16-35-22.log.
Error: run `/data/tidb/.tiup/components/cluster/v1.5.6/tiup-cluster` (wd:/data/tidb/.tiup/data/SlKYAsl) failed: exit status 1
复制代码
$tiup cluster display tidb-test
复制代码
输出:
实际上也是没有启动成功
说明 pd-server 进程是存在的,但是不能对外提供服务
查看日志:
[2021/10/09 16:39:02.211 +08:00] [WARN] [probing_status.go:70] ["prober detected unhealthy status"] [round-tripper-name=ROUND_TRIPPER_RAFT_MESSAGE] [remote-peer-id=d13032871d13be7f] [rtt=0s] [error="dial tcp 10.12.16.226:2380: connect: connection refused"]
[2021/10/09 16:39:02.211 +08:00] [WARN] [probing_status.go:70] ["prober detected unhealthy status"] [round-tripper-name=ROUND_TRIPPER_SNAPSHOT] [remote-peer-id=d13032871d13be7f] [rtt=0s] [error="dial tcp 10.12.16.226:2380: connect: connection refused"]
[2021/10/09 16:39:02.211 +08:00] [WARN] [probing_status.go:70] ["prober detected unhealthy status"] [round-tripper-name=ROUND_TRIPPER_SNAPSHOT] [remote-peer-id=32a1a8544e3c1c6f] [rtt=0s] [error="dial tcp 10.12.16.227:2380: connect: connection refused"]
[2021/10/09 16:39:02.211 +08:00] [WARN] [probing_status.go:70] ["prober detected unhealthy status"] [round-tripper-name=ROUND_TRIPPER_RAFT_MESSAGE] [remote-peer-id=32a1a8544e3c1c6f] [rtt=0s] [error="dial tcp 10.12.16.227:2380: connect: connection refused"]
复制代码
提示有 remote-peer-id,单实例集群启动不应该有 remote-peer-id 才对,查看启动脚本
$ cat /etc/systemd/system/pd-2379.service
复制代码
[Unit]
Description=pd service
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
LimitNOFILE=1000000
LimitSTACK=10485760
User=tidb
ExecStart=/data/tidb/tidb-deploy/pd-2379/scripts/run_pd.sh
Restart=no
RestartSec=15s
[Install]
WantedBy=multi-user.target
复制代码
在 10.12.16.225 上
$ rm -rf pd-2379 #原因:刚才启动时initial-cluster指定了三个节点,集群信息已经初始化到数据目录
$ tiup cluster start tidb-test -N 10.12.16.225:2379
$ tiup cluster display tidb-test
复制代码
发现集群 pd 已经是 up 状态
4、修改新 pd 集群的 cluster-id 和 alloc-id
$ tiup pd-recover -endpoints http://125.94.237.5:2379 -cluster-id 7016973815389845033 -alloc-id 6000
复制代码
输出:
Starting component `pd-recover`: /data/tidb/.tiup/components/pd-recover/v5.2.1/pd-recover -endpoints http://10.12.16.225:2379 -cluster-id 7016973815389845033 -alloc-id 6000
recover success! please restart the PD cluster
复制代码
5、重启 pd 集群
$ tiup cluster restart tidb-test -N 10.12.16.225:2379
复制代码
$ tiup cluster display tidb-test
复制代码
此时整个集群正常,可以对外提供服务
6、扩容 pd 集群
7、重启整个集群
略
总结:
1、pd 集群只是存储元数据信息,并且是通过 tikv 心跳上报,故 pd 集群的所有数据丢失后,整个 tidb 集群可以通过重建 pd 集群修复;
2、如果用到了 TiCDC,那么 changefeed 的配置需要备份,否则 pd 数据全部丢失后,无法恢复 changefeed 任务;
3、重建 pd 集群需要知道 pd 老集群的 cluster-id 和 alloc-id,日常备份这两个值即可。
4、一些动态修改的调度策略调整,修复后就会变成默认值,这个需要修复后及时调整到之前的。
评论