box.info.synchro
Начиная с версии 2.8.1.
Текущее состояние синхронной репликации.
При синхронной репликации транзакция считается зафиксированной только после достижения требуемого кворума. Пока транзакции собирают подтверждения от удаленных узлов, они ожидают в очереди.
Предоставляется следующая информация:
-
queue:-
owner(начиная с версии 2.10.0) — ID реплики, которой принадлежит очередь синхронных транзакций. Как только появляется экземпляр-владелец, все остальные экземпляры переходят в режим только для чтения. Если полеownerравно0, любой экземпляр может быть доступен для записи, но не может создавать синхронные транзакции. Чтобы получить или вернуть себе очередь, используйте box.ctl.promote() на экземпляре, который нужно повысить. Чтобы снять владение, вызовите box.ctl.demote() на владельце очереди синхронизации.Если выборы Raft включены и для параметра replication.election_mode задано значение
candidate, новый лидер Raft получает очередь автоматически после победы на выборах. Это означает, что значениеbox.info.synchro.queue.ownerстановится равным box.info.election.leader. При включенном Raft ручное вмешательство с помощьюbox.ctl.promote()илиbox.ctl.demote()не требуется. -
term(начиная с версии 2.10.0) — текущий терм очереди. Содержит терм последнего запросаPROMOTE. Обычно равен box.info.election.term. Однако значение терма очереди может быть меньше терма выборов. Это может произойти, когда начался новый раунд выборов, но ни один экземпляр еще не был повышен. -
len— количество записей, ожидающих в очереди в данный момент. -
busy(начиная с версии 2.10.0) — логическое значениеtrueуказывает, что экземпляр обрабатывает или записывает системный запрос, изменяющий очередь (например,PROMOTE,CONFIRMилиROLLBACK). Пока запрос не завершен, все остальные входящие синхронные транзакции и системные запросы будут отложены. -
age(начиная с версии 3.2.0) — время в секундах, в течение которого самая старая запись, находящаяся в очереди в данный момент, ожидает сбора кворума. -
confirm_lag(начиная с версии 3.2.0) — время в секундах, в течение которого последняя успешно подтвержденная запись ожидала сбора кворума.
-
-
quorum— результирующее значение параметра конфигурации replication.synchro_quorum. Начиная с версии 2.5.3, параметр можно задать в виде динамической формулы. В этом случае значениеquorumзависит от текущего количества реплик.
Пример 1:
В этом примере поле quorum равно 1. Это означает, что
синхронные транзакции работают как асинхронные. Значение 1
означает, что для фиксации достаточно успешной записи в WAL на мастере.
box_info_synchro:instance001> box.info.synchro---- queue:owner: 1confirm_lag: 0term: 2age: 0len: 0busy: falsequorum: 1...
Пример 2:
Пример на GitHub: box_info_synchro
В этом примере используются два экземпляра:
instance001будет лидером.instance002— экземпляр-последователь.
groups:group001:replicasets:replicaset001:instances:instance001:database:mode: rwreplication:synchro_quorum: 2synchro_timeout: 1000iproto:listen:- uri: '127.0.0.1:3301'instance002:database:mode: roiproto:listen:- uri: '127.0.0.1:3302'
На первом экземпляре выдайте пользователю роль super:
box_info_synchro:instance001> box.schema.user.grant('guest', 'super')
После этого используйте функцию box.ctl.promote() для получения
очереди:
box_info_synchro:instance001> box.ctl.promote()
Создайте спейс с именем sync и включите для него синхронную
репликацию:
box_info_synchro:instance001> s = box.schema.space.create("sync", {is_sync=true})
Затем создайте индекс:
box_info_synchro:instance001> _ = s:create_index('pk')
Проверьте текущее состояние синхронной репликации:
box_info_synchro:instance001> box.info.synchro---- queue:owner: 1confirm_lag: 0term: 2age: 0len: 0busy: falsequorum: 2...
На втором экземпляре смоделируйте сбой, как если бы экземпляр завершил работу или потерял связь с сетью:
box_info_synchro:instance002> os.exit(0)⨯ Connection was closed. Probably instance process isn't running anymore
На первом экземпляре попробуйте выполнить несколько синхронных
транзакций. Транзакции зависнут, так как для параметра
replication.synchro_quorum
задано значение 2, а второй экземпляр недоступен:
box_info_synchro:instance001> fiber = require('fiber')---...box_info_synchro:instance001> for i = 1, 3 do fiber.new(function() box.space.sync:replace{i} end) end---...
Снова вызовите команду box.info.synchro на первом экземпляре:
box_info_synchro:instance001> box.info.synchro---- queue:owner: 1confirm_lag: 0term: 2age: 5.2658250015229len: 3busy: falsequorum: 2...
Теперь поле len равно 3. Это означает, что в очереди ожидают 3
транзакции.