Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

box.info.synchro

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: 1    confirm_lag: 0    term: 2    age: 0    len: 0    busy: false  quorum: 1...

Пример 2:

Пример на GitHub: box_info_synchro

В этом примере используются два экземпляра:

  • instance001 будет лидером.
  • instance002 — экземпляр-последователь.
groups:  group001:    replicasets:      replicaset001:        instances:          instance001:            database:              mode: rw            replication:              synchro_quorum: 2              synchro_timeout: 1000            iproto:              listen:              - uri: '127.0.0.1:3301'          instance002:            database:              mode: ro            iproto:              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: 1    confirm_lag: 0    term: 2    age: 0    len: 0    busy: false  quorum: 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: 1    confirm_lag: 0    term: 2    age: 5.2658250015229    len: 3    busy: false  quorum: 2...

Теперь поле len равно 3. Это означает, что в очереди ожидают 3 транзакции.