为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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集群到底是什么情况,反正只要一滚动更新就会报错,不知道怎么让它恢复正常。啰嗦的话比较多,不知道问题说明白了没有。
若提问为性能优化、故障排查 类问题,请下载脚本 运行。终端输出的打印结果,请务必全选 并复制粘贴上传。
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上去,这个问题解决了应该就好了
小王同学
2020 年2 月 18 日 13:16
7
可以通过监控查看下当前的 pd leader 的节点,查看下 当前 pd leader 的日志是否有异常、或者 error 信息。
有一个,fatal run server faild,cancled when waiting embed etcd to be ready,不过这是已经下线那个节点的错。其它的pd看起来都是正常的,而且数据库仍然可以接入数据、查询数据。现在的问题锁定到了pd-ctl无法使用,总是将请求转发到已经下线的pd上,这样肯定会报错
谢谢,已经找到问题了,一直把请求转发到了pd1上,我想或许是因为环境变量的问题。之前一直在bashrc中设置环境变量,root和tidb都找了,没发现,才想起来还有profile没有看,一看果然在,估计是之前测试的时候设置错了。不好意思,添麻烦了
方便总结一下结论么 ? 以便后面其他的同学排查问题哈,先感谢支持~
其实这也算我操作失误,环境变量设错位置了,排查了好久,还是经验不够 pd-control那一节讲了四种连接方式,貌似是使用环境变量那种方式优先级最高,如果设置环境变量(我设置在了/etc/profile中)的话,使用-u参数指定可用pd地址是不起作用的。大概就是这样。扩容缩容这边确实遇到了不少麻烦,感谢你们的解答!
2 个赞
好的。
问题现象:我按照教程缩容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 个赞
system
(system)
关闭
2022 年10 月 31 日 19:11
19
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。