diff --git a/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py b/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py index 619cac0c41..84d1313379 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py @@ -13,7 +13,7 @@ from backend.configuration.constants import DBType from backend.db_meta import api, request_validator from backend.db_meta.api import common -from backend.db_meta.enums import ClusterType, InstanceRole, InstanceStatus, MachineType +from backend.db_meta.enums import ClusterType, InstancePhase, InstanceRole, InstanceStatus, MachineType from backend.db_meta.models import Cluster, Machine, StorageInstance, StorageInstanceTuple, TenDBClusterStorageSet from backend.db_package.models import Package from backend.flow.consts import MediumEnum @@ -64,6 +64,7 @@ def storage_create( "instance_role": InstanceRole.REMOTE_MASTER.value, "is_stand_by": True, # 标记实例属于切换组实例 "db_version": get_mysql_real_version(mysql_pkg.name), # 存储真正的版本号信息 + "phase": InstancePhase.TRANS_STAGE.value, }, ) if slave_ip is not None: @@ -85,6 +86,7 @@ def storage_create( "instance_role": InstanceRole.REMOTE_SLAVE.value, "is_stand_by": True, # 标记实例属于切换组实例 "db_version": get_mysql_real_version(mysql_pkg.name), # 存储真正的版本号信息 + "phase": InstancePhase.TRANS_STAGE.value, }, ) @@ -129,6 +131,17 @@ def switch_remote_node(cls, cluster_id: int, source: dict, target: dict): target_slave_obj.status = InstanceStatus.RUNNING target_master_obj.instance_role = InstanceRole.REMOTE_MASTER target_slave_obj.instance_role = InstanceRole.REMOTE_SLAVE + target_master_obj.phase = InstancePhase.ONLINE + target_slave_obj.phase = InstancePhase.ONLINE + # ip_port不相同实例表示裁撤替换。需要把源状态设置为UNAVAILABLE + if source_master_obj.ip_port != target_master_obj.ip_port: + source_master_obj.status = InstanceStatus.UNAVAILABLE + source_master_obj.phase = InstancePhase.OFFLINE + if source_slave_obj.ip_port != target_slave_obj.ip_port: + source_slave_obj.status = InstanceStatus.UNAVAILABLE + source_slave_obj.phase = InstancePhase.OFFLINE + source_master_obj.save() + source_slave_obj.save() target_master_obj.save() target_slave_obj.save() source_tuple = StorageInstanceTuple.objects.get(ejector=source_master_obj, receiver=source_slave_obj) diff --git a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_slave.py b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_slave.py index 481ddbacfd..4853eb6392 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_slave.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_slave.py @@ -12,7 +12,7 @@ from django.db import transaction -from backend.db_meta.enums import InstanceStatus +from backend.db_meta.enums import InstancePhase, InstanceStatus from backend.db_meta.models import Cluster, StorageInstance logger = logging.getLogger("root") @@ -37,11 +37,11 @@ def switch_slave(cluster_id: int, target_slave_ip: str, source_slave_ip: str, sl # target实例需要继承source实例的is_standby特性 target_storage_obj.is_stand_by = source_storage_obj.is_stand_by target_storage_obj.status = InstanceStatus.RUNNING.value + target_storage_obj.phase = InstancePhase.ONLINE.value target_storage_obj.save() - - # cluster_entry = cluster.clusterentry_set.get(entry=slave_domain) - # cluster_entry.storageinstance_set.remove(source_storage_obj) - # cluster_entry.storageinstance_set.add(target_storage_obj) + source_storage_obj.status = InstanceStatus.UNAVAILABLE.value + source_storage_obj.status = InstancePhase.OFFLINE.value + source_storage_obj.save() cluster_entry_list = cluster.clusterentry_set.filter(entry__in=slave_domain) for cluster_entry in cluster_entry_list: cluster_entry.storageinstance_set.remove(source_storage_obj) diff --git a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py index c09716641b..9c4db7bc96 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py @@ -12,7 +12,7 @@ from django.db import transaction -from backend.db_meta.enums import InstanceRoleInstanceInnerRoleMap, InstanceStatus +from backend.db_meta.enums import InstancePhase, InstanceRoleInstanceInnerRoleMap, InstanceStatus from backend.db_meta.models import Cluster, StorageInstance from backend.flow.utils.mysql.mysql_module_operate import MysqlCCTopoOperator @@ -34,6 +34,7 @@ def switch_storage(cluster_id: int, target_storage_ip: str, origin_storage_ip: s ) cluster.storageinstance_set.remove(origin_storage) target_storage.status = InstanceStatus.RUNNING.value + target_storage.phase = InstancePhase.ONLINE.value # target实例需要继承source实例的is_standby特性 target_storage.is_stand_by = origin_storage.is_stand_by if role: @@ -47,6 +48,9 @@ def switch_storage(cluster_id: int, target_storage_ip: str, origin_storage_ip: s cc_topo_operator.transfer_instances_to_cluster_module(instances=[target_storage], is_increment=True) else: target_storage.save() + origin_storage.status = InstanceStatus.UNAVAILABLE.value + origin_storage.phase = InstancePhase.OFFLINE.value + origin_storage.save() def change_proxy_storage_entry(cluster_id: int, master_ip: str, new_master_ip: str): diff --git a/dbm-ui/backend/db_meta/api/storage_instance/apis.py b/dbm-ui/backend/db_meta/api/storage_instance/apis.py index 20324fcc21..ef011f1c82 100644 --- a/dbm-ui/backend/db_meta/api/storage_instance/apis.py +++ b/dbm-ui/backend/db_meta/api/storage_instance/apis.py @@ -16,6 +16,7 @@ from backend.db_meta import request_validator from backend.db_meta.enums import ( AccessLayer, + InstancePhase, InstanceRoleInstanceInnerRoleMap, InstanceStatus, MachineTypeInstanceRoleMap, @@ -40,6 +41,7 @@ def create( name = ins.get("name", "") version = ins.get("db_version", "") is_stand_by = ins.get("is_stand_by", True) + phase = ins.get("phase", InstancePhase.ONLINE.value) machine_obj = Machine.objects.get(ip=ip) if machine_obj.access_layer != AccessLayer.STORAGE: @@ -70,6 +72,7 @@ def create( time_zone=time_zone, version=version, is_stand_by=is_stand_by, + phase=phase, ) ) return storage_objs diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py index 176ad0feb5..c4e92560b7 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py @@ -197,6 +197,7 @@ def tendb_ha_restore_slave_flow(self): cluster_model = Cluster.objects.get(id=cluster_id) master = cluster_model.storageinstance_set.get(instance_inner_role=InstanceInnerRole.MASTER.value) cluster = { + "add_slave_only": self.add_slave_only, "mysql_port": master.port, "cluster_id": cluster_model.id, "cluster_type": cluster_class.cluster_type, diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py b/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py index d23a2b8827..9fb0a1a998 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py @@ -23,6 +23,7 @@ ClusterPhase, ClusterType, InstanceInnerRole, + InstancePhase, InstanceRole, InstanceStatus, MachineType, @@ -234,6 +235,8 @@ def mysql_add_slave_info(self): port=self.cluster["master_port"], ) slave_storage.status = InstanceStatus.RUNNING.value + if self.cluster.get("add_slave_only", False): + slave_storage.phase = InstancePhase.ONLINE.value slave_storage.save() def mysql_restore_slave_change_cluster_info(self): @@ -735,6 +738,7 @@ def slave_recover_add_instance(self): "instance_role": InstanceRole.BACKEND_SLAVE.value, "is_stand_by": False, # 添加新建 "db_version": get_mysql_real_version(self.cluster["package"]), # 存储真正的版本号信息 + "phase": InstancePhase.TRANS_STAGE.value, } ) clusters.append( @@ -930,6 +934,7 @@ def migrate_cluster_add_instance(self): "instance_role": InstanceRole.BACKEND_REPEATER.value, "is_stand_by": False, # 添加新建 "db_version": get_mysql_real_version(mysql_pkg.name), # 存储真正的版本号信息 + "phase": InstancePhase.TRANS_STAGE.value, } ) storage_instances.append( @@ -939,6 +944,7 @@ def migrate_cluster_add_instance(self): "instance_role": InstanceRole.BACKEND_SLAVE.value, "is_stand_by": False, # 添加新建 "db_version": get_mysql_real_version(mysql_pkg.name), # 存储真正的版本号信息 + "phase": InstancePhase.TRANS_STAGE.value, } )