MySQL Shell 9.0  /  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()

集群集和主集群上的独占锁(如果拓扑是集群集),或者集群上的独占锁(如果拓扑是独立集群),以及目标实例上的独占锁。


InnoDB 集群锁定

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

表 6.2 集群操作锁

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

addInstance()

独占

独占

createClusterSet()

独占

dissolve()

独占

execute()

共享

fenceAllTraffic()

独占

fenceWrites()

独占

forceQuorum()

独占

rejoinInstance()

共享

独占

removeInstance()

独占

独占

rescan()

独占

resetRecoveryAccountsPassword()

独占

setInstanceOption()

独占

除了选项 tagclusterName

setOption()

独占

除了选项 tagclusterName

setPrimaryInstance(

独占

setupAdminAccount()

共享

setupRouterAccount()

共享

switchToMultiPrimaryMode()

独占

switchToSinglePrimaryMode()

独占

unfenceWrites()

独占


InnoDB 集群集锁定

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

表 6.3 集群集操作锁

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

createReplicaCluster()

共享

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

execute()

共享

共享

所有副本集群上的共享锁。

forcePrimaryCluster()

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

rejoinCluster()

共享

共享

独占

removeCluster()

独占。

独占

独占

setOption()

独占

独占

(仅当设置了 replicationAllowedHost 时)

setPrimaryCluster()

独占

独占


InnoDB 副本集锁定

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

表 6.4 副本集操作锁

操作 副本集锁类型 主实例锁类型 目标实例锁类型

addInstance()

独占

独占

dissolve()

独占

execute()

共享

forcePrimaryInstance()

独占

rejoinInstance()

共享

独占

removeInstance()

独占

独占

removeRouterMetadata()

共享

rescan()

独占

setInstanceOption()

独占

setOption()

独占

setPrimaryInstance()

独占

setupAdminAccount()

共享

setupRouterAccount()

共享