pd 全部宕机后的异常情况和问题请教

【 TiDB 使用环境】生产
【 TiDB 版本】v6.5.0
【复现路径】

  1. tidb-a 和 tidb-b 的 pd 进程意外 Down 掉(display 显示);
  2. 使用位于 tidb-a 机器上的 tiup 对 tidb-b 的 1个pd、3个tikv进程进行缩容(没有 --force),缩容失败;
  3. 关闭 tidb-b 机器,在 tidb-a 上增加缩容参数 --force 成功缩容(提示缩容成功)
  4. 目前集群只剩下 tidb-a 上的 1个pd和3个tikv进程;
  5. 在 tidb-a 上使用 tiup 重启集群,tikv 无法连接本地 pd,启动失败(pd进程2379端口无限卡死);
  6. 启动 tidb-b 后,tidb-b 上的 pd 和 tikv 进程再度自动启动,此时 tidb-a 的集群能成功启动(但 tidb-a 上运行 tiup display 的集群信息里并没有包含任何 tidb-b 上的信息)
  7. 此时引入第三台物理机 tidb-c(配置相同),然后在 tidb-a 利用 tiup 单独进行 pd 扩容(提示扩容成功)
  8. 到此时,集群运行正常。

【遇到的问题:问题现象及影响】

  1. 如果希望对 tidb-b 物理机进行数据清空、下线维护,此时 tidb-b 上的 tikv 和 pd 进程如何能够安全关闭、卸载?(因为 tidb-a 上的 pd 似乎还在联络 tidb-b 的 pd 端口,即便集群信息里已经没有 tidb-b 的任何进程了)
  2. 在没有把 tikv 进程扩容到 tidb-c 机器上的情况下(只扩容了 pd),停掉 tidb-b 的 tikv 进程,是否会造成数据损失?
  3. 如何排查最开始 两台机器的 pd 进程 Down 掉的原因。

【资源配置】

当前集群共两台物理机(tidb-a、tidb-b两台):

  1. 每台物理机有4个nvme磁盘(1为系统盘,3为tikv盘)
  2. 各1个pd进程、3个tikv进程
    【附件:截图/日志/监控】

最新进展:

重新在 tidb-a 上对 tidb-b 的 pd 做单独扩容,然后再缩容。

目前 members 数据恢复正常,tidb-b 的 pd 彻底下线。

遗留问题:

tidb-b 的 tikv 进程还在运行,暂时不确定该如何操作。

最新进展(0710):

将 tikv 扩容了 tidb-c 上之后,停机 tidb-b,还是遇到了问题。

在 tidb-a 上查看某个 tikv 进程日志,发现还在连 tidb-c 的 tikv:

[2023/07/10 15:01:41.922 +08:00] [ERROR] [raft_client.rs:821] [“wait connect timeout”] [addr=tidb-b:20160] [store_id=19]

在 tidb-c 上查看某个 tikv 进程日志,也还在连 tidb-c 的 tikv:

[2023/07/10 15:38:54.303 +08:00] [ERROR] [raft_client.rs:821] [“wait connect timeout”] [addr=tidb-b:20161] [store_id=18]

真是个令人费解的集群。

调用三台 pd 输出当前 members 均显示:

{"members": [
		{
			"name": "pd-100-9",
			"member_id": 584547965617176002,
			"peer_urls": [
				"http://{tidb-b}:2380"
			],
			"client_urls": [
				"http://{tidb-b}:2379"
			],
			"deploy_path": "/home/tidb-deploy/pd-2379/bin",
			"binary_version": "v6.5.0",
			"git_hash": "d1a4433c3126c77fb2d5bb5720eefa0f2e05c166"
		},
		{
			"name": "pd-100-8",
			"member_id": 7993749446034719644,
			"peer_urls": [
				"http://{tidb-a}:2380"
			],
			"client_urls": [
				"http://{tidb-a}:2379"
			],
			"deploy_path": "/home/tidb-deploy/pd-2379/bin",
			"binary_version": "v6.5.0",
			"git_hash": "d1a4433c3126c77fb2d5bb5720eefa0f2e05c166"
		},
		{
			"name": "pd-100-10",
			"member_id": 16307004469217232564,
			"peer_urls": [
				"http://{tidb-c}:2380"
			],
			"client_urls": [
				"http://{tidb-c}:2379"
			],
			"deploy_path": "/home/tidb-deploy/pd-2379/bin",
			"binary_version": "v6.5.0",
			"git_hash": "d1a4433c3126c77fb2d5bb5720eefa0f2e05c166"
		}
	]}

为什么明明在 tidb-a 上对 tidb-b 进行了强制缩容,但 tidb-b 还存在于 members 组里呢。
是没有缩容成功吗?但 display 的时候显示的结果里,已经没有 tidb-b 机器上的任何部件了:

ID                   Role  Host            Ports        OS/Arch       Status  Data Dir                     Deploy Dir
--                   ----  ----            -----        -------       ------  --------                     ----------
{tidb-c}:2379  pd    {tidb-c}  2379/2380    linux/x86_64  Up      /home/tidb-data/pd-2379      /home/tidb-deploy/pd-2379
{tidb-a}:2379   pd    {tidb-a}   2379/2380    linux/x86_64  Up|L    /home/tidb-data/pd-2379      /home/tidb-deploy/pd-2379
{tidb-a}:20160  tikv  {tidb-a}   20160/20180  linux/x86_64  Up      /data1/tidb-data/tikv-20160  /data1/tidb-deploy/tikv-20160
{tidb-a}:20161  tikv  {tidb-a}   20161/20181  linux/x86_64  Up      /data2/tidb-data/tikv-20161  /data2/tidb-deploy/tikv-20161
{tidb-a}:20162  tikv  {tidb-a}   20162/20182  linux/x86_64  Up      /data3/tidb-data/tikv-20162  /data3/tidb-deploy/tikv-20162
Total nodes: 5

1.tiup cluster scale-in $cluster-name -N tidb-b

  1. 如果将 tikv 实例复制到 tidb-c 机器上,那么在关闭 tidb-b 的 tikv 进程之前,应该先将 tidb-c 上的 tikv 实例启动并加入集群,这种尝试并没有必要。。

3.找
tail -f tikv.log
tail -f pd.log

当时pddown掉之后为啥要直接进行缩容操作呢?现在tidb-b节点上的节点已经无法重新加入集群了,只能进行有损恢复试试了。。

感谢回复:

因为,当时在a上做restart操作总是连不上b,缩容后a才可以单独继续(除了 pd 无法正常启动)。

b 被认为系统内核可能存在问题,需要进行下线维护。

所以在当时两个 pd 都 Down 的时候,应该如何操作呢,有建议吗?

你好,感谢回复。

我在当前 a 上的 tiup 进行这一步的时候并不会成功,因为:

当前的集群信息里并没有 b 的任何信息(只是不清楚为什么 a 服务器上的 pd 启动 仍然需要依赖 b 服务器上的 pd)

由于上面提到的“a 服务器的 pd 启动事实上还需要依赖 b 服务器的 pd”,所以我现在不知道目前集群对 b 服务器的 tikv 还有没有依赖

我现在不清楚该如何确保 “当前集群可以不需要 b 服务器的任何服务”

当时pddown掉之后为啥要直接进行缩容操作呢?现在tidb-b节点上的节点已经无法重新加入集群了,只能进行有损恢复试试了。。

我现在不想要 b 重新加入集群,而是想让集群彻底摆脱 b (因为之前 b 关机时,a 的 pd 也启动失败,导致 a 的 tikv 也启动失败)

这个会报错:

Error: failed to destroy: cannot find node id ‘tidb-b:2379’ in topology

目前进展:

重新在 tidb-a 上对 tidb-b 的 pd 做单独扩容,然后再缩容。

目前 members 数据恢复正常,tidb-b 的 pd 彻底下线。

遗留问题:

tidb-b 的 tikv 进程还在运行,暂时不确定该如何操作。