Skip to content

Commit 52254a2

Browse files
zhangzhw8iSecloud
authored andcommitted
fix(backend): 修复当 spider 集群存在异常节点时的查询问题 #7479
1 parent 7bf9a9f commit 52254a2

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

dbm-ui/backend/components/db_remote_service/client.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ def __init__(self):
4040
default_timeout=self.DRS_MYSQL_TIMEOUT,
4141
)
4242

43+
self.short_rpc = ProxyAPI(
44+
method="POST",
45+
base=self.BASE_DOMAIN,
46+
url="mysql/rpc",
47+
module=self.MODULE,
48+
ssl=ssl_flag,
49+
description=_("DB 远程执行(短耗时)"),
50+
)
51+
4352
self.proxyrpc = ProxyAPI(
4453
method="POST",
4554
base=self.BASE_DOMAIN,

dbm-ui/backend/db_meta/models/cluster.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
)
4646
from backend.db_meta.exceptions import ClusterExclusiveOperateException, DBMetaException
4747
from backend.db_services.version.constants import LATEST, PredixyVersion, TwemproxyVersion
48+
from backend.exceptions import ApiError
4849
from backend.flow.consts import DEFAULT_RIAK_PORT
4950
from backend.ticket.constants import TicketType
5051
from backend.ticket.models import ClusterOperateRecord
@@ -361,21 +362,24 @@ def tendbcluster_ctl_primary_address(self) -> str:
361362
if self.cluster_type != ClusterType.TenDBCluster.value:
362363
raise DBMetaException(message=_("{} 类型集群没有中控节点".format(self.cluster_type)))
363364

365+
# 取一个状态正常的 spider-master 接入层
364366
spider_instance = self.proxyinstance_set.filter(
365-
tendbclusterspiderext__spider_role=TenDBClusterSpiderRole.SPIDER_MASTER
366-
).first() # 随便拿一个spider-master接入层
367+
tendbclusterspiderext__spider_role=TenDBClusterSpiderRole.SPIDER_MASTER,
368+
status=InstanceStatus.RUNNING.value,
369+
).first()
367370

368371
ctl_address = "{}{}{}".format(spider_instance.machine.ip, IP_PORT_DIVIDER, spider_instance.port + 1000)
369372

370373
logger.info("ctl address: {}".format(ctl_address))
371-
res = DRSApi.rpc(
374+
res = DRSApi.short_rpc(
372375
{
373376
"addresses": [ctl_address],
374377
"cmds": ["tdbctl get primary"],
375378
"force": False,
376379
"bk_cloud_id": self.bk_cloud_id,
377380
}
378381
)
382+
379383
logger.info("tdbctl get primary res: {}".format(res))
380384

381385
if res[0]["error_msg"]:
@@ -440,24 +444,31 @@ def get_cluster_id__primary_address_map(cls, cluster_ids: List[int]) -> Dict[int
440444
logger.error(_("集群id:{} {} 类型集群没有中控节点".format(cluster.id, cluster.cluster_type)))
441445
continue
442446

447+
# 取一个状态正常的 spider-master 接入层
443448
spider_instance = cluster.proxyinstance_set.filter(
444-
tendbclusterspiderext__spider_role=TenDBClusterSpiderRole.SPIDER_MASTER
445-
).first() # 随便拿一个spider-master接入层
449+
tendbclusterspiderext__spider_role=TenDBClusterSpiderRole.SPIDER_MASTER,
450+
status=InstanceStatus.RUNNING.value,
451+
).first()
446452

447453
ctl_address = "{}{}{}".format(spider_instance.machine.ip, IP_PORT_DIVIDER, spider_instance.port + 1000)
448454
addresses.append(ctl_address)
449455
ctl_address__cluster_id_map[ctl_address] = cluster.id
450456

451457
logger.info("addresses: {}".format(addresses))
452458

453-
res = DRSApi.rpc(
454-
{
455-
"addresses": addresses,
456-
"cmds": ["tdbctl get primary"],
457-
"force": False,
458-
"bk_cloud_id": bk_cloud_id,
459-
}
460-
)
459+
try:
460+
res = DRSApi.short_rpc(
461+
{
462+
"addresses": addresses,
463+
"cmds": ["tdbctl get primary"],
464+
"force": False,
465+
"bk_cloud_id": bk_cloud_id,
466+
}
467+
)
468+
except ApiError as e:
469+
logger.error(_("get primary failed: {}".format(e)))
470+
continue
471+
461472
logger.info("tdbctl get primary res: {}".format(res))
462473

463474
for item in res:

dbm-ui/backend/db_services/mysql/resources/tendbcluster/query.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,5 +291,6 @@ def retrieve_instance(cls, bk_biz_id: int, cluster_id: int, instance: str) -> di
291291

292292
@classmethod
293293
def get_cluster_primary(cls, cluster_ids: list) -> list:
294+
"""获取集群主节点信息"""
294295
cluster_id__primary_address_map = Cluster.get_cluster_id__primary_address_map(cluster_ids)
295296
return [{"cluster_id": k, "primary": v} for k, v in cluster_id__primary_address_map.items()]

0 commit comments

Comments
 (0)