Skip to content

Commit ef8b77c

Browse files
huangwentai-wendeliSecloud
authored andcommitted
fix(backend): mongo亲和性优化调整最终版 TencentBlueKing#14312
1 parent fca0964 commit ef8b77c

File tree

12 files changed

+69
-55
lines changed

12 files changed

+69
-55
lines changed

dbm-ui/backend/configuration/constants.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ class AffinityEnum(StrStructuredEnum):
7777
NONE = EnumField("NONE", _("无"))
7878
MAX_EACH_ZONE_EQUAL = EnumField("MAX_EACH_ZONE_EQUAL", _("每个subzone尽量均匀分布"))
7979
# mongodb专属
80-
MAJORITY_ELECTION_DISTRI = EnumField("MAJORITY_ELECTION_DISTRI", _("跨园区(弱)"))
80+
CROSS_SUBZONE_STRONG = EnumField("CROSS_SUBZONE_STRONG", _("跨园区(强)"))
81+
CROSS_SUBZONE_WEAK = EnumField("CROSS_SUBZONE_WEAK", _("跨园区(弱)"))
8182

8283

8384
class DBType(StrStructuredEnum):

dbm-ui/backend/flow/utils/mongodb/calculate_cluster.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ def machine_order_by_tolerance(disaster_tolerance_level: str, machine_set: list)
3939

4040
machines = []
4141
# 主从节点分布在不同的机房
42-
if disaster_tolerance_level in [AffinityEnum.CROS_SUBZONE, AffinityEnum.MAJORITY_ELECTION_DISTRI]:
42+
if disaster_tolerance_level in [
43+
AffinityEnum.CROSS_SUBZONE_STRONG,
44+
AffinityEnum.CROSS_SUBZONE_WEAK,
45+
]:
4346
mongo_machine_set = deepcopy(machine_set)
4447
machines.append(mongo_machine_set[0])
4548
mongo_machine_set.remove(mongo_machine_set[0])

dbm-ui/backend/ticket/builders/__init__.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ def patch_info_common_affinity(
300300
replace_key: str = None,
301301
tolerance: Union[Callable, float] = None,
302302
no_need_affinity: bool = False,
303+
tolerance_type: str = None,
303304
):
304305
"""
305306
针对批量扩容、替换补充亲和性参数
@@ -308,6 +309,7 @@ def patch_info_common_affinity(
308309
@param replace_key 替换实例key
309310
@param tolerance: 亲和性容忍度
310311
@param no_need_affinity: 是否需要亲和性
312+
@param tolerance_type: 亲和性容忍度类型
311313
"""
312314
# 获得infos中的集群信息
313315
from backend.ticket.builders.common.base import fetch_cluster_ids
@@ -360,9 +362,7 @@ def __get_exclusive_hosts():
360362

361363
for info in infos:
362364
cluster = cluster_map[fetch_cluster_ids(info)[0]]
363-
cluster_tolerance = (
364-
tolerance(cluster, remain_machine_type) if isinstance(tolerance, Callable) else tolerance
365-
)
365+
cluster_tolerance = tolerance(cluster, tolerance_type) if isinstance(tolerance, Callable) else tolerance
366366
exclusive_hosts = cluster__remain_hosts_map.get(cluster.id, [])
367367
self.patch_common_affinity(info, role, cluster, exclusive_hosts, cluster_tolerance, no_need_affinity)
368368

@@ -384,7 +384,11 @@ def patch_info_affinity_location(self, roles=None, replace_zone=None):
384384
for info in self.ticket_data["infos"]:
385385
cluster = cluster_id_map[fetch_cluster_ids(info)[0]]
386386
affinity = cluster.disaster_tolerance_level
387-
if affinity in [AffinityEnum.CROS_SUBZONE, AffinityEnum.MAJORITY_ELECTION_DISTRI] and machine_zone_map:
387+
if (
388+
affinity
389+
in [AffinityEnum.CROS_SUBZONE, AffinityEnum.CROSS_SUBZONE_STRONG, AffinityEnum.CROSS_SUBZONE_WEAK]
390+
and machine_zone_map
391+
):
388392
replace_zone = [machine_zone_map[fetch_host_ips(info["old_nodes"])[0]]]
389393
else:
390394
replace_zone = []

dbm-ui/backend/ticket/builders/common/base.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,7 @@
2323

2424
from backend.configuration.constants import MASTER_DOMAIN_INITIAL_VALUE, PLAT_BIZ_ID, AffinityEnum
2525
from backend.constants import DOMAIN_PATTERN
26-
from backend.db_meta.enums import (
27-
AccessLayer,
28-
ClusterPhase,
29-
ClusterType,
30-
InstanceInnerRole,
31-
InstanceStatus,
32-
MachineType,
33-
)
26+
from backend.db_meta.enums import AccessLayer, ClusterPhase, ClusterType, InstanceInnerRole, InstanceStatus
3427
from backend.db_meta.enums.comm import SystemTagEnum
3528
from backend.db_meta.models import Cluster, ExtraProcessInstance, Machine, ProxyInstance, Spec, StorageInstance
3629
from backend.db_services.dbbase.constants import IpDest, IpSource
@@ -146,16 +139,21 @@ def format_bigdata_resource_spec(attrs: Dict[str, Any]) -> Dict[str, Any]:
146139
resource_spec["location_spec"] = resource_spec.get("location_spec") or cluster_location_spec
147140

148141

149-
def get_mongodb_cluster_tolerance(cluster, role=None):
150-
if cluster.disaster_tolerance_level == AffinityEnum.CROS_SUBZONE.value:
151-
# 跨园区强的情况下, mongos亲和性容忍度是0.5
152-
if role == MachineType.MONGOS:
153-
tolerance = 0.5
154-
else:
155-
tolerance = 0.33
142+
def get_mongodb_cluster_tolerance(disaster_tolerance_level, role=None):
143+
tolerance_map = {
144+
# 跨园区-强
145+
"CROSS_SUBZONE_STRONG": {"mongos": 0.33, "mongodb": 0.33, "mongo_config": 0.33},
146+
# 跨园区-弱
147+
"CROSS_SUBZONE_WEAK": {"mongos": 0.5, "mongodb": 0.5, "mongo_config": 0.5},
148+
# 跨机架
149+
"CROSS_RACK": {"mongos": 0.5, "mongodb": 0.33, "mongo_config": 0.33},
150+
# 指定园区
151+
"SAME_SUBZONE_CROSS_SWTICH": {"mongos": 0.5, "mongodb": 0.33, "mongo_config": 0.33},
152+
}
153+
if tolerance_map.get(disaster_tolerance_level):
154+
return tolerance_map[disaster_tolerance_level][role]
156155
else:
157-
tolerance = 0.5
158-
return tolerance
156+
return 0.5
159157

160158

161159
class HostInfoSerializer(serializers.Serializer):

dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_add_shard_nodes.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,16 @@ def format_ticket_data(self):
5858
class MongoDBReplicaAddShardNodesResourceParamBuilder(BaseMongoDBOperateResourceParamBuilder):
5959
def format(self):
6060
self.patch_info_common_affinity(
61-
role="shard_nodes", remain_machine_type=MachineType.MONGODB, tolerance=get_mongodb_cluster_tolerance
61+
role="shard_nodes",
62+
remain_machine_type=MachineType.MONGODB,
63+
tolerance=get_mongodb_cluster_tolerance,
64+
tolerance_type="mongodb",
6265
)
6366

6467
def post_callback(self):
6568
with self.next_flow_manager() as next_flow:
6669
for info in next_flow.details["ticket_data"]["infos"]:
67-
info["add_shard_nodes"] = [info.pop("shard_nodes")]
70+
info["add_shard_nodes"] = info.pop("shard_nodes")
6871

6972

7073
@builders.BuilderFactory.register(TicketType.MONGODB_REPLICA_ADD_SHARD_NODES, is_apply=True)

dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_apply.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
from backend.flow.engine.controller.mongodb import MongoDBController
2020
from backend.iam_app.dataclass.actions import ActionEnum
2121
from backend.ticket import builders
22-
from backend.ticket.builders.common.base import TicketBaseValidateSerializerMixin, get_ticket_zone_list
22+
from backend.ticket.builders.common.base import (
23+
TicketBaseValidateSerializerMixin,
24+
get_mongodb_cluster_tolerance,
25+
get_ticket_zone_list,
26+
)
2327
from backend.ticket.builders.mongodb.base import (
2428
BaseMongoDBOperateResourceParamBuilder,
2529
BaseMongoReplicaSetTicketFlowBuilder,
@@ -90,10 +94,9 @@ def format_ticket_data(self):
9094
class MongoReplicaSetResourceParamBuilder(BaseMongoDBOperateResourceParamBuilder):
9195
def format(self):
9296
for info in self.ticket_data["infos"]:
93-
if info["resource_spec"]["mongo_machine_set"]["affinity"] == AffinityEnum.CROS_SUBZONE.value:
94-
info["resource_spec"]["mongo_machine_set"]["tolerance"] = 0.33
95-
else:
96-
info["resource_spec"]["mongo_machine_set"]["tolerance"] = 0.5
97+
info["resource_spec"]["mongo_machine_set"]["tolerance"] = get_mongodb_cluster_tolerance(
98+
info["resource_spec"]["mongo_machine_set"]["affinity"], "mongodb"
99+
)
97100

98101
def post_callback(self):
99102
next_flow = self.ticket.next_flow()

dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_cutoff.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def format(self):
4444
remain_machine_type=MachineType.MONGODB,
4545
replace_key="mongodb",
4646
tolerance=get_mongodb_cluster_tolerance,
47+
tolerance_type="mongodb",
4748
)
4849

4950
super().format()

dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_migrate.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ def format_ticket_data(self):
5858
class MongoDBReplicasetMigrateResourceParamBuilder(BaseMongoDBOperateResourceParamBuilder):
5959
def format(self):
6060
# 资源申请的一些参数补充
61-
self.patch_info_common_affinity(role="mongodb", tolerance=get_mongodb_cluster_tolerance)
61+
self.patch_info_common_affinity(
62+
role="mongodb", tolerance=get_mongodb_cluster_tolerance, tolerance_type="mongodb"
63+
)
6264

6365

6466
@builders.BuilderFactory.register(TicketType.MONGODB_REPLICASET_MIGRATE, is_recycle=True)

dbm-ui/backend/ticket/builders/mongodb/mongo_shard_add_shard_nodes.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
from django.utils.translation import gettext_lazy as _
1616
from rest_framework import serializers
1717

18-
from backend.configuration.constants import AffinityEnum
1918
from backend.db_meta.enums import MachineType, MachineTypeInstanceRoleMap
2019
from backend.db_meta.models import AppCache, Cluster
2120
from backend.db_services.dbbase.constants import IpSource
2221
from backend.db_services.mongodb.resources.query import MongoDBListRetrieveResource
2322
from backend.flow.engine.controller.mongodb import MongoDBController
2423
from backend.ticket import builders
24+
from backend.ticket.builders.common.base import get_mongodb_cluster_tolerance
2525
from backend.ticket.builders.mongodb.base import (
2626
BaseMongoDBOperateDetailSerializer,
2727
BaseMongoDBOperateResourceParamBuilder,
@@ -77,10 +77,8 @@ def format(self):
7777
id__cluster = {cluster.id: cluster for cluster in Cluster.objects.filter(id__in=cluster_ids)}
7878
for info in self.ticket_data["infos"]:
7979
cluster = id__cluster[info["cluster_id"]]
80-
if cluster.disaster_tolerance_level == AffinityEnum.CROS_SUBZONE.value:
81-
tolerance = 0.33
82-
else:
83-
tolerance = 0.5
80+
tolerance = get_mongodb_cluster_tolerance(cluster.disaster_tolerance_level, "mongodb")
81+
8482
group_num = info["shards_num"] // info["node_replica_count"]
8583
old_shard_nodes = info["resource_spec"].pop("shard_nodes")
8684
old_shard_nodes["count"] = old_shard_nodes["count"] // group_num

dbm-ui/backend/ticket/builders/mongodb/mongo_shard_apply.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
from backend.flow.engine.controller.mongodb import MongoDBController
1919
from backend.iam_app.dataclass.actions import ActionEnum
2020
from backend.ticket import builders
21-
from backend.ticket.builders.common.base import TicketBaseValidateSerializerMixin, get_ticket_zone_list
21+
from backend.ticket.builders.common.base import (
22+
TicketBaseValidateSerializerMixin,
23+
get_mongodb_cluster_tolerance,
24+
get_ticket_zone_list,
25+
)
2226
from backend.ticket.builders.mongodb.base import (
2327
BaseMongoDBOperateResourceParamBuilder,
2428
BaseMongoShardedTicketFlowBuilder,
@@ -82,14 +86,16 @@ def format_ticket_data(self):
8286
class MongoShardedClusterResourceParamBuilder(BaseMongoDBOperateResourceParamBuilder):
8387
def format(self):
8488
"""格式化mongodb申请的组数"""
85-
if self.ticket_data["disaster_tolerance_level"] == AffinityEnum.CROS_SUBZONE.value:
86-
self.ticket_data["resource_spec"]["mongodb"]["tolerance"] = 0.33
87-
self.ticket_data["resource_spec"]["mongo_config"]["tolerance"] = 0.33
88-
self.ticket_data["resource_spec"]["mongos"]["tolerance"] = 0.5
89-
else:
90-
self.ticket_data["resource_spec"]["mongodb"]["tolerance"] = 0.5
91-
self.ticket_data["resource_spec"]["mongo_config"]["tolerance"] = 0.5
92-
self.ticket_data["resource_spec"]["mongos"]["tolerance"] = 0.5
89+
self.ticket_data["resource_spec"]["mongodb"] = get_mongodb_cluster_tolerance(
90+
self.ticket_data["disaster_tolerance_level"], "mongodb"
91+
)
92+
self.ticket_data["resource_spec"]["mongo_config"] = get_mongodb_cluster_tolerance(
93+
self.ticket_data["disaster_tolerance_level"], "mongo_config"
94+
)
95+
self.ticket_data["resource_spec"]["mongos"] = get_mongodb_cluster_tolerance(
96+
self.ticket_data["disaster_tolerance_level"], "mongos"
97+
)
98+
9399
resource_spec = self.ticket_data["resource_spec"]
94100
self.format_mongo_resource_spec(resource_spec, self.ticket_data["shard_machine_group"])
95101

0 commit comments

Comments
 (0)