作者:我在听风想你
大家好,这次给大家带来一个新的问题解决实战,废话不多说,直接上干货。
现象:新创建分布式实例后,分布式实例新增实例子set失败(报错与Hang住)。
这个问题我们是这么发现的,需要创建一个新的分布式实例。新版本创建分布式实例默认会创建两个set此版本TDSQL为10.3.14.1.0,此版本创建实例时会默认新增一个set,如需添加其他set需进入实例后手动新增。于是我们进入到实例内手动新增set。
如图为新增子set配置,分片这里不需要指定,会根据创建实例的设置,自动从以创建的子set中分出一半。(不一定都是一半,要看具体子set数量)
于是我们进行创建:
我们认为可能是配置的时候误操作导致找不到可用资源,于是随后又试着创建了一遍,这一次发现创建子set未报错,但是一直Hang在50%这个进度不动。
进入到分布式实例中发现子set竟然创建出来了,这就很奇怪,之后细看有一点很不正常。
我们可以发现数据分片数并没有分过来,每台机器的延迟都超高,而且我们这个实例是最新创建的,一共也没几个实例,按道理说主机的端口是会按照顺序去排列的,不会是之前4005,一下子蹦到4011。(不适用之间有创建其他实例或在其他实例中添加子set的情况)
排查过程与问题解决:
通过报错我们可以发现是获取资源失败,没有有效的主机。(由于场景无法再复现,我便复述一遍。)首先我们要知道创建实例的流程,赤免运营平台以jason格式通过http传参给OSS API,OSS调用创建实例的函数,然后在zookeeper创建job,通知manager创建实例,manager在创建实例前要检查资源是否够,并且lock 资源后再创建资源。
那么问题应该是出在这个流程中的某一环节。我们先进到scheduler和manager的日志中查看是否会有更多的报错信息。经过排查,下发的流程都是没有问题的,已经到zookeeper,zookeeper也不是找不到可用的主机,而是无法lock住资源,指出DB资源异常。于是我们查看一下DB的监控。
我们发现DB设备存在告警。(但是这个告警并没有在赤兔告警页面显示出来)通过告警我们可以知道是DB机器存在隔离或故障的端口,这也证明了上文中说到的新增set的端口跳跃问题。于是我们去清除一下故障端口。登录到scheduler机器上的bin下/data/application/scheduler/bin/。查看所有资源的端口状态(看看有没有故障端口)
./resource_tool status_res all |grep port
端口的状态有如下:
used:成功运行的set的节点的端口状态
disabled:初始化set中,本节点运行失败,端口状态处于disabled(故障端口)
isolated:初始化set中,本节点运行成功,该set下其它节点运行失败,本节点的端口状态被置为isolated(隔离端口)
我们发现确实存在isolated端口和disabled端口。
清除故障端口(其中最后一个参数ip填的是资源组里available状态的ip 赤兔前台可以看到)
./resource_tool recover_res ip(master_ip)
如:./resource_tool recover_res 10.1.2.17
之后我们再次查看有没有故障端口,以及在chitu前台观察资源有没有被释放
后台:./resource_tool status_res all |grep port
赤兔前台:
之后我们再次验证创建,便没有问题了。超高延迟和数据分片未成功的问题我们将会在以后找机会复现,之后根据这两个问题的维度再给出解决办法。文章未尽之处欢迎读到此文章的各位老师们指证和讨论,让我们更加的了解和更好的维护这个产品。
【云贝教育】 腾讯云TDSQL认证课程上线,有不定期公开课
*禁止转载,可转发(转发文章请注明出处)