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 工作階段可能在重新啟動時取得對執行個體的存取權並鎖定它時,會有一段短暫的期間 (以毫秒為單位)。但是,叢集和/或 ClusterSet 的原始鎖定仍然存在,因此可能鎖定新重新啟動的執行個體的新命令無法要求叢集或 ClusterSet 鎖定。

DBA 鎖定

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

表 6.1 DBA 操作鎖定

操作 鎖定類型

configureInstance()

目標執行個體的獨佔鎖定

createCluster()

目標執行個體的獨佔鎖定

rebootClusterFromCompleteOutage()

所有可連線叢集成員的獨佔鎖定。

如果叢集是複本叢集,而且是 ClusterSet 的一部分,則也會做為操作的一部分重新加入 ClusterSet。在這種情況下,該操作也會取得與 clusterset.rejoinCluster() 相同的鎖定。

upgradeMetadata()

  • 叢集:叢集和目標執行個體的獨佔鎖定。

  • ClusterSet:ClusterSet、主要叢集和目標執行個體的獨佔鎖定。

createReplicaSet()

目標執行個體的獨佔鎖定。

configureReplicaSetInstance()

目標執行個體的獨佔鎖定。

upgradeMetadata()

如果拓撲是 ClusterSet,則在 ClusterSet 和主要叢集上,或者如果拓撲是獨立叢集,則在叢集上,以及目標執行個體上的獨佔鎖定。


叢集鎖定

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

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

表 6.3 ClusterSet 操作鎖定

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

createReplicaCluster()

共用

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

forcePrimaryCluster()

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

rejoinCluster()

共用

共用

獨佔

removeCluster()

獨佔。

獨佔

獨佔

setOption()

獨佔

獨佔

(僅在設定 replicationAllowedHost 時)

setPrimaryCluster()

獨佔

獨佔


InnoDB ReplicaSet 鎖定

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

表 6.4 ReplicaSet 操作鎖定

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

forcePrimaryInstance()

目標執行個體以及執行操作時 ReplicaSet 的所有可連線成員的獨佔鎖定。

setPrimaryInstance()

獨佔

目標執行個體以及執行操作時 ReplicaSet 的所有可連線成員的獨佔鎖定。

addInstance()

共用

獨佔

rejoinInstance()

共用

獨佔

removeInstance()

共用

獨佔

removeRouterMetadata()

共用