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 鎖定

本節列出 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 鎖定

本節列出 clusterSet.operationName 操作的鎖定。

表 6.3 ClusterSet 操作鎖定

操作 ClusterSet 鎖定類型 主要叢集鎖定類型 目標叢集鎖定類型

createReplicaCluster()

共用

用於建立新複本叢集的執行個體的獨佔鎖定。

execute()

共用

共用

所有複本叢集的共用鎖定。

forcePrimaryCluster()

所有複本叢集的獨佔鎖定。

rejoinCluster()

共用

共用

獨佔

removeCluster()

獨佔鎖定。

獨佔

獨佔

setOption()

獨佔

獨佔

(僅限設定 replicationAllowedHost 時)

setPrimaryCluster()

獨佔

獨佔


InnoDB ReplicaSet 鎖定

本節列出 replicaSet.operationName 操作的鎖定。

表 6.4 ReplicaSet 操作鎖定

操作 ReplicaSet 鎖定類型 主要執行個體鎖定類型 目標執行個體鎖定類型

addInstance()

獨佔

獨佔

dissolve()

獨佔

execute()

共用

forcePrimaryInstance()

獨佔

rejoinInstance()

共用

獨佔

removeInstance()

獨佔

獨佔

removeRouterMetadata()

共用

rescan()

獨佔

setInstanceOption()

獨佔

setOption()

獨佔

setPrimaryInstance()

獨佔

setupAdminAccount()

共用

setupRouterAccount()

共用