6.12 Механизм блокировки для операций AdminAPI
Ранее разные экземпляры MySQL Shell могли подключаться и обрабатывать операции AdminAPI одновременно на одном ресурсе. Это могло привести к несогласованному состоянию и ошибкам, например, если
и Cluster.addInstance() обрабатывались параллельно.Cluster.setPrimaryInstance()
Типы блокировки
AdminAPI использует MySQL Locking Service для предоставления следующих типов блокировки:
Блокировка чтения или совместная блокировка: разрешает одновременное выполнение некоторых операций, блокируя эксклюзивные операции. Если операция пытается получить общую блокировку, но не может из-за наличия эксклюзивной блокировки, операция прерывается без внесения каких-либо изменений. Если текущая операция имеет общую блокировку, а новая операция требует общей блокировки, новой операции разрешен доступ.
Блокировка записи или эксклюзивная блокировка: блокирует выполнение всех других операций до завершения текущей операции и освобождения эксклюзивной блокировки. Если операция пытается получить эксклюзивную блокировку, но не может из-за наличия существующей блокировки, операция прерывается без внесения каких-либо изменений.
Подробнее см.
В следующих таблицах перечислены блокировки для каждой операции AdminAPI:
Блокировка DBA: перечисляет блокировки для
dba.операций.operationNameБлокировка кластера: перечисляет блокировки для
операций.Cluster.operationNameБлокировка ClusterSet: перечисляет блокировки для
операций.ClusterSet.operationNameБлокировка InnoDB ReplicaSet: перечисляет блокировки для
операций.ReplicaSet.operationName
Операции, не требующие блокировок, не перечислены.
На практике, если вы пытаетесь выполнить операцию, в то время как другая операция, которую нельзя выполнить одновременно, всё ещё выполняется, вы получите ошибку, указывающую на то, что блокировка необходимого ресурса не может быть получена. В этом случае вам следует дождаться завершения выполняемой операции, удерживающей блокировку, и только после этого пытаться обработать следующую операцию. Например:
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
| Операция | Тип блокировки |
|---|---|
| Эксклюзивная на целевом экземпляре |
| Эксклюзивная на целевом экземпляре |
|
Эксклюзивная на всех доступных узлах кластера. Если кластер является кластером реплик и является частью ClusterSet, он также присоединяется к ClusterSet в рамках операции. В этом случае операция также получает те же блокировки, что и |
|
|
| Эксклюзивная блокировка на целевом экземпляре. |
| Эксклюзивная блокировка на целевом экземпляре. |
| Эксклюзивная блокировка на ClusterSet и первичном кластере, если топология — ClusterSet, или на кластере, если топология — автономный кластер, и на целевом экземпляре. |
Блокировка кластера
В этом разделе перечислены блокировки для операций . cluster.operationName
Таблица 6.2 Блокировки операций кластера
| Операция | Тип блокировки кластера | Тип блокировки целевого экземпляра |
|---|---|---|
| Эксклюзивная | Эксклюзивная |
| Эксклюзивная | |
| Эксклюзивная | |
| Эксклюзивная | |
| Эксклюзивная | |
| Эксклюзивная | |
| Разделяемая | Эксклюзивная |
| Эксклюзивная | Эксклюзивная |
| Эксклюзивная | |
| Эксклюзивная | |
|
Эксклюзивная За исключением вариантов | |
|
Эксклюзивная За исключением вариантов | |
| Эксклюзивная | |
| Разделяемая | |
| Разделяемая | |
| Эксклюзивная | |
| Эксклюзивная | |
| Эксклюзивная |
Блокировка набора кластеров
В этом разделе перечислены блокировки для операций . clusterSet.operationName
Таблица 6.3 Блокировки операций набора кластеров
| Операция | Тип блокировки набора кластеров | Тип блокировки основного кластера | Тип блокировки целевого кластера |
|---|---|---|---|
| Разделяемая | Эксклюзивная на экземпляре, используемом для создания нового кластера реплик. | |
| Эксклюзивная на всех кластерах реплик. | ||
| Разделяемая | Разделяемая | Эксклюзивная |
| Эксклюзивная. | Эксклюзивная | Эксклюзивная |
| Эксклюзивная |
Эксклюзивная (только если | |
| Эксклюзивная | Эксклюзивная |
Блокировка набора реплик InnoDB
В этом разделе перечислены блокировки для операций . replicaSet.operationName
Таблица 6.4 Блокировки операций набора реплик
| Операция | Тип блокировки основного экземпляра | Тип блокировки целевого экземпляра |
|---|---|---|
| Эксклюзивная на целевом экземпляре и на всех доступных членах набора реплик на момент операции. | |
| Эксклюзивная | Эксклюзивная на целевом экземпляре и на всех доступных членах набора реплик на момент операции. |
| Разделяемая | Эксклюзивная |
| Разделяемая | Эксклюзивная |
| Разделяемая | Эксклюзивная |
| Разделяемая |
© 2025 Oracle
Licensed under the GPLv2 License.