MySQL Shell 8.4  /  MySQL AdminAPI  /  AdminAPI 操作的锁定机制

6.12 AdminAPI 操作的锁定机制

以前,不同 MySQL Shell 实例可以同时连接到同一资源并处理 AdminAPI 操作。这可能会导致不一致的状态和错误,例如,如果 Cluster.addInstance()Cluster.setPrimaryInstance() 并行处理。

锁定类型

AdminAPI 使用 MySQL 锁定服务来提供以下锁定类型

  • 读或共享锁:允许在阻止独占操作时并发执行某些操作。如果某个操作尝试获取共享锁,但由于存在独占锁而无法获取,则该操作将中止,而不会进行任何更改。如果当前操作具有共享锁,并且新操作需要共享锁,则允许新操作访问。

  • 写或独占锁:阻止执行所有其他操作,直到当前操作完成并释放独占锁。如果某个操作尝试获取独占锁,但由于存在现有锁而无法获取,则该操作将中止,而不会进行任何更改。

有关更多信息,请参阅 锁定服务

下表列出了每个 AdminAPI 操作的锁定

注意

未列出不需要锁的操作。

在实践中,如果您尝试在另一个无法并发执行的操作仍在运行时执行操作,则会收到一个错误,指示无法获取所需资源上的锁。在这种情况下,您应该等待持有锁的正在运行的操作完成,然后才能尝试处理下一个操作。例如

mysql-js> rs.addInstance("admin@rs2:3306");

ERROR: The operation cannot be executed because it failed to acquire the lock on
instance 'rs1:3306'. Another operation requiring exclusive access to the
instance is still in progress, please wait for it to finish and try again.

ReplicaSet.addInstance: Failed to acquire lock on instance 'rs1:3306' (MYSQLSH
51400)

在此示例中,ReplicaSet.addInstance() 失败,因为无法获取主实例 (rs1:3306) 上的锁,因为 ReplicaSet.setPrimaryInstance() 操作(或其他类似操作)仍在运行。

注意

如果实例作为克隆操作或请求的重启的一部分而重启,则该锁将被释放。因此,在以毫秒为单位的短时间内,另一个 Shell 会话可以在重启时访问该实例并锁定它。但是,集群和/或集群集上的原始锁仍然存在,因此可以锁定新重启实例的新命令无法请求集群或集群集锁。

DBA 锁定

本节列出 dba.operationName 操作的锁。

表 6.1 DBA 操作锁

操作 锁定类型

configureInstance()

目标实例上的独占锁

createCluster()

目标实例上的独占锁

rebootClusterFromCompleteOutage()

所有可联系集群成员上的独占锁。

如果集群是副本集群,并且是集群集的一部分,则它也会作为操作的一部分重新加入集群集。在这种情况下,该操作还会获取与 clusterset.rejoinCluster() 相同的锁。

upgradeMetadata()

  • 集群:集群和目标实例上的独占锁。

  • 集群集:集群集、主集群和目标实例上的独占锁。

createReplicaSet()

目标实例上的独占锁。

configureReplicaSetInstance()

目标实例上的独占锁。

upgradeMetadata()

如果拓扑是集群集,则在集群集和主集群上获取独占锁;如果拓扑是独立集群,则在集群和目标实例上获取独占锁。


集群锁定

本节列出 cluster.operationName 操作的锁。

表 6.2 集群操作锁

操作 集群锁定类型 目标实例锁定类型

addInstance()

独占

独占

createClusterSet()

独占

dissolve()

独占

fenceAllTraffic()

独占

fenceWrites()

独占

forceQuorum()

独占

rejoinInstance()

共享

独占

removeInstance()

独占

独占

rescan()

独占

resetRecoveryAccountsPassword()

独占

setInstanceOption()

独占

选项 tagclusterName 除外。

setOption()

独占

选项 tagclusterName 除外。

setPrimaryInstance(

独占

setupAdminAccount()

共享

setupRouterAccount()

共享

switchToMultiPrimaryMode()

独占

switchToSinglePrimaryMode()

独占

unfenceWrites()

独占


集群集锁定

本节列出 clusterSet.operationName 操作的锁。

表 6.3 集群集操作锁

操作 集群集锁定类型 主集群锁定类型 目标集群锁定类型

createReplicaCluster()

共享

用于创建新副本集群的实例上的独占锁。

forcePrimaryCluster()

所有副本集群上的独占锁。

rejoinCluster()

共享

共享

独占

removeCluster()

独占。

独占

独占

setOption()

独占

独占

(仅当设置了 replicationAllowedHost 时)

setPrimaryCluster()

独占

独占


InnoDB 副本集锁定

本节列出 replicaSet.operationName 操作的锁。

表 6.4 副本集操作锁

操作 主实例锁定类型 目标实例锁定类型

forcePrimaryInstance()

在操作时对目标实例和副本集的所有可联系成员进行独占。

setPrimaryInstance()

独占

在操作时对目标实例和副本集的所有可联系成员进行独占。

addInstance()

共享

独占

rejoinInstance()

共享

独占

removeInstance()

共享

独占

removeRouterMetadata()

共享