pd-ctl无法执行任何命令

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:2.1.5
  • 【问题描述】:部署了1tidb+3pd+3tikv,我用周末两天的时间大概插入了wm15亿数据,今天上午按照缩容pd的教程,把leader给删了(pd1,主要验证大数据量情况下leader自动切换问题),但是过了很久,使用pd-ctl都无法通过另外两个pd执行member命令,报错信息竟然是说pd1连接失败,按理说都已经下线关闭了不应该这样啊。然后我就执行滚动更新命令,报错说pd2无法get name,使用pd-ctl执行member,会处于阻塞状态,过了很久才提示:read tcp xxxx—>pd1:2379 read:read connection reset by peer 。最奇怪的是执行curl -v xxxx:2379/pd/api/v1/leader这个是有返回结果的,而且能够正常连接数据库,能够正常查数据。我现在也不清楚现在这个pd集群到底是什么情况,反正只要一滚动更新就会报错,不知道怎么让它恢复正常。啰嗦的话比较多,不知道问题说明白了没有。

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

  1. 通过 PD control 的 health 命令确认 member 状态;
  2. 通过 PD log 查看下线和为下线的 PD 的 log 信息是否有 Error 或者 Warn 告警信息,麻烦贴出来;

pd-ctl的任何命令都无法执行,一执行就报错connect refuced。看了一下日志,又出现了mismatch cluster id这种错误,我按照教程使用了pd-recover,滚动更新过程中报错,the tikv node xxx is not registered in this cluster,我反复确认了好多次,cluster id都没错的,后来检查发现tikv的启动脚本中,还存在已经被移除的pd连接串,我怀疑是之前滚动更新的时候,pd更新失败,导致滚动更新终止,tikv的配置没有更新,我把tikv启动脚本中的异常配置删掉后,再次滚动更新,报的错还是pd connect refused,使用pd-ctl还是无法执行任何命令。但是使用navicate能连接数据库,而且也能查数据,在浏览器中访问xxxx:2379/pd/api/v1/leader也有返回结果。太奇怪了

需要确认 PD 是否做过扩所容 ? 扩所容以后,PD 的 run_pd.sh 脚本中的参数配置是否为 join-cluster ,不是 inital-cluster ?

做过扩容,扩容滚动更新之后,新加节点的配置中还是join,但是其他pd配置中已经把新节点的配置添加到initial-cluster里面了

今天测试了很多遍,有一个现象很奇怪,或许是每次更新都失败的原因。我已经把pd1下线了,但是使用pd-ctl连接pd2或者pd3执行命令,报错的内容总是pd1的IP:2379 connect refused,pd-control三种连接方式都试过了,报错内容都是一样的。我就不明白,中间到底发生了什么,为什么会把对pd2、pd3请求转发到pd1上去,这个问题解决了应该就好了

可以通过监控查看下当前的 pd leader 的节点,查看下 当前 pd leader 的日志是否有异常、或者 error 信息。

有一个,fatal run server faild,cancled when waiting embed etcd to be ready,不过这是已经下线那个节点的错。其它的pd看起来都是正常的,而且数据库仍然可以接入数据、查询数据。现在的问题锁定到了pd-ctl无法使用,总是将请求转发到已经下线的pd上,这样肯定会报错

  1. 通过原 PD leader 日志判断一下 leader 是否已经完成 transfer 。
  2. 通过现在剩下的两个 PD 日志判断一下是否有 leader 已经完成 transfer 或者 选主操作。
  3. 然后将上面提到的信息,通过日志截图或者日志发送方式发出来,当然你也可以发我邮箱。zhongshu.li@pingcap.com

谢谢,已经找到问题了,一直把请求转发到了pd1上,我想或许是因为环境变量的问题。之前一直在bashrc中设置环境变量,root和tidb都找了,没发现,才想起来还有profile没有看,一看果然在,估计是之前测试的时候设置错了。不好意思,添麻烦了:sweat:

方便总结一下结论么 ? 以便后面其他的同学排查问题哈,先感谢支持~

其实这也算我操作失误,环境变量设错位置了,排查了好久,还是经验不够:sweat_smile:pd-control那一节讲了四种连接方式,貌似是使用环境变量那种方式优先级最高,如果设置环境变量(我设置在了/etc/profile中)的话,使用-u参数指定可用pd地址是不起作用的。大概就是这样。扩容缩容这边确实遇到了不少麻烦,感谢你们的解答!

2赞

:ok_hand: 可以描述的再详细点,感谢 ~

感谢分享,请将您的总结选为最佳答案,多谢

好的,多谢

好的。
问题现象:我按照教程缩容pd1节点,滚动更新的时候报错:pd2 get name failed。
我主要做了三块内容去排查问题:
1.我检查了所有的配置,应该是正确的;
2.使用浏览器访问 http://正常pd节点IP:2379/pd/api/v1/leader ,能返回pd集群的成员信息(2个pd,1个leader);
3.数据正常接入,也能查询数据;
按理说目前集群是在正常工作的,但是执行pd-ctl member -u http://正常pd节点IP:2379命令,却总是报错:pd1节点IP:2379 connect refused,无论连接哪一个正常pd节点,都返回同样的内容。我琢磨了一天,才想明白过来问题可能不是发生在pd组件上,可能是有个环境变量指向了pd1,后来终于在/etc/profile中找到了export PD_ADDR=http://pd1节点IP:2379这样一条环境变量,删掉之后再滚动更新就都正常了。

情况大概就是这样了,环境变量确实比较坑,它覆盖掉了pd-ctl传递的IP参数,而且在滚动更新的过程中,也会获取到这个值,所以环境变量才是导致出现各种问题的原因,使用的时候一定要注意。

2赞

:+1:

:+1: