Skip to content

Commit d24c4c6

Browse files
ymakedaqiSecloud
authored andcommitted
feat(dbm-services): 导出数据在放到中转机器操作 #11134
1 parent bb2a642 commit d24c4c6

File tree

9 files changed

+107
-9
lines changed

9 files changed

+107
-9
lines changed

dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/dbconsole_dump.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ func (c *DbConsoleDumpComp) Init() (err error) {
121121
User: user,
122122
Pwd: pwd,
123123
}.Conn()
124+
if err != nil {
125+
logger.Error("connect to %s:%d failed,err:%s", host, port, err.Error())
126+
return err
127+
}
124128
defer func() {
125129
if conn != nil {
126130
conn.Close()

dbm-services/mysql/db-tools/dbactuator/pkg/util/osutil/mountpoint.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,5 +170,8 @@ func GetMostSuitableMountPoint() (FileSystem, error) {
170170
}
171171
}
172172
}
173+
if maxAvFs == (FileSystem{}) {
174+
return FileSystem{}, fmt.Errorf("no suitable data mount point found")
175+
}
173176
return maxAvFs, nil
174177
}

dbm-ui/backend/db_proxy/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class ExtensionType(str, StructuredEnum):
3838
DRS = EnumField("DRS", _("SQL 远程执行服务"))
3939
DBHA = EnumField("DBHA", _("数据库高可用服务"))
4040
REDIS_DTS = EnumField("REDIS_DTS", _("Redis DTS服务"))
41+
CONSOLE_DUMP_CENTER = EnumField("CONSOLE_DUMP_CENTER", _("控制台转储中心"))
4142

4243

4344
class ExtensionServiceStatus(str, StructuredEnum):

dbm-ui/backend/flow/engine/bamboo/scene/mysql/dbconsole.py

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from dataclasses import asdict
1313
from typing import Dict, Optional
1414

15+
from django.utils.crypto import get_random_string
1516
from django.utils.translation import ugettext as _
1617

1718
from backend.components.db_remote_service.client import DRSApi
@@ -20,12 +21,21 @@
2021
from backend.db_meta.enums.cluster_type import ClusterType
2122
from backend.db_meta.enums.instance_role import InstanceRole, TenDBClusterSpiderRole
2223
from backend.db_meta.models import Cluster, ProxyInstance, StorageInstance
23-
from backend.flow.consts import LONG_JOB_TIMEOUT
24+
from backend.db_proxy.constants import ExtensionType
25+
from backend.db_proxy.models import DBExtension
26+
from backend.flow.consts import ACCOUNT_PREFIX, LONG_JOB_TIMEOUT
2427
from backend.flow.engine.bamboo.scene.common.builder import Builder
2528
from backend.flow.engine.bamboo.scene.common.get_file_list import GetFileList
29+
from backend.flow.plugins.components.collections.mysql.create_user import AddUserComponent
30+
from backend.flow.plugins.components.collections.mysql.drop_user import DropUserComponent
2631
from backend.flow.plugins.components.collections.mysql.exec_actuator_script import ExecuteDBActuatorScriptComponent
2732
from backend.flow.plugins.components.collections.mysql.trans_flies import TransFileComponent
28-
from backend.flow.utils.mysql.mysql_act_dataclass import DownloadMediaKwargs, ExecActuatorKwargs
33+
from backend.flow.utils.mysql.mysql_act_dataclass import (
34+
AddTempUserKwargs,
35+
DownloadMediaKwargs,
36+
DropUserKwargs,
37+
ExecActuatorKwargs,
38+
)
2939
from backend.flow.utils.mysql.mysql_act_playload import MysqlActPayload
3040

3141
logger = logging.getLogger("flow")
@@ -46,15 +56,53 @@ def __init__(self, root_id: str, data: Optional[Dict]):
4656
self.dbconsole_dump_file_name = self.data["dump_file_name"]
4757

4858
def dump_flow(self):
49-
p = Builder(root_id=self.root_id, data=self.data, need_random_pass_cluster_ids=[self.cluster_id])
5059
ro_instance_info = self.__get_read_instance(self.cluster)
5160
bk_cloud_id = ro_instance_info["bk_cloud_id"]
5261
exec_ip = ro_instance_info["ip"]
62+
# 判断是否配置中转机
63+
dump_center = DBExtension.get_latest_extension(
64+
bk_cloud_id=bk_cloud_id, extension_type=ExtensionType.CONSOLE_DUMP_CENTER
65+
)
66+
if dump_center:
67+
p = Builder(root_id=self.root_id, data=self.data)
68+
else:
69+
p = Builder(root_id=self.root_id, data=self.data, need_random_pass_cluster_ids=[self.cluster_id])
5370
# 此处可以根据延迟来考虑是否需要抛出错误
5471
if ro_instance_info["instance_role"] == InstanceRole.BACKEND_SLAVE:
5572
behind_master_sec = self.get_slave_delay_second(exec_ip, ro_instance_info["port"], bk_cloud_id)
5673
logger.info(f"slave delay sec: {behind_master_sec}")
5774

75+
flow_context = ro_instance_info
76+
# 定义切换流程中用的账号密码,密码是随机生成16位字符串,并利用公钥进行加密
77+
ran_str = get_random_string(length=16)
78+
random_account = f"{ACCOUNT_PREFIX}{get_random_string(length=8)}"
79+
if dump_center:
80+
exec_ip = dump_center.details["ip"]
81+
add_temp_user_kwargs = AddTempUserKwargs(
82+
bk_cloud_id=bk_cloud_id,
83+
hosts=[exec_ip],
84+
user=random_account,
85+
psw=ran_str,
86+
address="{}{}{}".format(ro_instance_info["ip"], IP_PORT_DIVIDER, ro_instance_info["port"]),
87+
dbname="%",
88+
dml_ddl_priv="SELECT,SHOW VIEW,TRIGGER, EVENT",
89+
global_priv="",
90+
)
91+
drop_user_kwargs = DropUserKwargs(
92+
bk_cloud_id=bk_cloud_id,
93+
host=exec_ip,
94+
user=random_account,
95+
address="{}{}{}".format(ro_instance_info["ip"], IP_PORT_DIVIDER, ro_instance_info["port"]),
96+
)
97+
p.add_act(
98+
act_name=_("创建临时用户"),
99+
act_component_code=AddUserComponent.code,
100+
kwargs=asdict(add_temp_user_kwargs),
101+
)
102+
flow_context["dump_center"] = True
103+
flow_context["random_account"] = random_account
104+
flow_context["random_password"] = ran_str
105+
# 下发db-actuator介质
58106
p.add_act(
59107
act_name=_("下发db-actuator介质"),
60108
act_component_code=TransFileComponent.code,
@@ -75,11 +123,13 @@ def dump_flow(self):
75123
job_timeout=LONG_JOB_TIMEOUT,
76124
bk_cloud_id=bk_cloud_id,
77125
exec_ip=exec_ip,
78-
cluster=ro_instance_info,
126+
cluster=flow_context,
79127
get_mysql_payload_func=MysqlActPayload.get_dbconsole_schema_payload.__name__,
80128
)
81129
),
82130
)
131+
if dump_center:
132+
p.add_act(act_name=_("删除临时用户"), act_component_code=DropUserComponent.code, kwargs=asdict(drop_user_kwargs))
83133
# 运行pipeine
84134
p.run_pipeline(is_drop_random_user=True)
85135

dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ def master_fail_over_flow(self):
183183
cluster_sw_kwargs.get_mysql_payload_func = MysqlActPayload.get_change_master_payload.__name__
184184
acts_list.append(
185185
{
186-
"act_name": _("salve节点同步新master数据"),
186+
"act_name": _("slave节点同步新master数据"),
187187
"act_component_code": ExecuteDBActuatorScriptComponent.code,
188188
"kwargs": asdict(cluster_sw_kwargs),
189189
}

dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ def master_slave_switch_flow(self):
347347
cluster_sw_kwargs.get_mysql_payload_func = MysqlActPayload.get_change_master_payload.__name__
348348
acts_list.append(
349349
{
350-
"act_name": _("salve节点同步新master数据"),
350+
"act_name": _("slave节点同步新master数据"),
351351
"act_component_code": ExecuteDBActuatorScriptComponent.code,
352352
"kwargs": asdict(cluster_sw_kwargs),
353353
}

dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ def restore_local_slave_flow(self):
690690
kwargs=asdict(InstanceUserCloneKwargs(clone_data=clone_data)),
691691
)
692692

693-
# 这里区分是standby还是普通salve添加域名
693+
# 这里区分是standby还是普通slave添加域名
694694
if target_slave.is_stand_by:
695695
domain_map = get_standby_dns(cluster_model.id)
696696
domain_add_list = []

dbm-ui/backend/flow/plugins/components/collections/mysql/create_user.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,41 @@ class CreateUserComponent(Component):
5757
name = __name__
5858
code = "mysql_create_user"
5959
bound_service = CreateUserService
60+
61+
62+
class AddUserService(BaseService):
63+
"""
64+
通用add user组件
65+
"""
66+
67+
def _execute(self, data, parent_data) -> bool:
68+
kwargs = data.get_one_of_inputs("kwargs")
69+
global_data = data.get_one_of_inputs("global_data")
70+
71+
try:
72+
DBPrivManagerApi.add_priv_without_account_rule(
73+
params={
74+
"bk_cloud_id": kwargs["bk_cloud_id"],
75+
"bk_biz_id": global_data["bk_biz_id"],
76+
"operator": global_data["created_by"],
77+
"user": kwargs["user"],
78+
"psw": kwargs["psw"],
79+
"hosts": kwargs["hosts"],
80+
"dbname": kwargs["dbname"],
81+
"dml_ddl_priv": kwargs["dml_ddl_priv"],
82+
"global_priv": kwargs["global_priv"],
83+
"address": kwargs["address"],
84+
}
85+
)
86+
self.log_info(_("在「{}」创建临时用户「{}@{}」成功").format(kwargs["address"], kwargs["user"], kwargs["hosts"]))
87+
except Exception as e: # pylint: disable=broad-except
88+
self.log_error(_("创建用户接口异常,相关信息: {}").format(e))
89+
return False
90+
91+
return True
92+
93+
94+
class AddUserComponent(Component):
95+
name = __name__
96+
code = "mysql_add_user"
97+
bound_service = AddUserService

dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2474,14 +2474,16 @@ def get_dbconsole_schema_payload(self, **kwargs):
24742474
db_cloud_token = AsymmetricHandler.encrypt(
24752475
name=AsymmetricCipherConfigType.PROXYPASS.value, content=f"{bk_cloud_id}_dbactuator_token"
24762476
)
2477-
2477+
if self.cluster.get("dump_center"):
2478+
self.account["admin_user"] = self.cluster["random_account"]
2479+
self.account["admin_pwd"] = self.cluster["random_password"]
24782480
return {
24792481
"db_type": DBActuatorTypeEnum.MySQL.value,
24802482
"action": DBActuatorActionEnum.MysqlDumpData.value,
24812483
"payload": {
24822484
"general": {"runtime_account": self.account},
24832485
"extend": {
2484-
"host": kwargs["ip"],
2486+
"host": self.cluster["ip"],
24852487
"port": self.cluster["port"],
24862488
"charset": self.ticket_data["charset"],
24872489
"dump_detail": {

0 commit comments

Comments
 (0)