Настройка синхронной репликации | Tarantool
Документация на русском языке
поддерживается сообществом
Примеры и руководства Replication tutorials Настройка синхронной репликации

Настройка синхронной репликации

Начиная с версии Tarantool 2.5.1, синхронную репликацию можно включать для отдельных спейсов, используя параметр is_sync:

box.schema.create_space('test1', {is_sync = true})

Все транзакции, где выполняются DML-запросы к такому спейсу, становятся синхронными. Обратите внимание, что транзакции, где содержатся DDL-операции, в том числе запросы на очистку (truncate), синхронными не будут.

Управлять поведением синхронных транзакций можно с помощью глобальных параметров box.cfg:

box.cfg{replication_synchro_quorum = <количество экземпляров>}
box.cfg{replication_synchro_quorum = "N / 2 + 1"}

This option tells how many replicas should confirm the receipt of a synchronous transaction before it is committed. Since version 2.5.3, the parameter supports dynamic evaluation of the quorum number (see reference for the replication_synchro_quorum parameter for details). Since version 2.10.0, this option does not account for anonymous replicas. As a usage example, consider this:

-- Экземпляр 1
box.cfg{
    listen = 3313,
    replication_synchro_quorum = 2,
}
box.schema.user.grant('guest', 'super')
_ = box.schema.space.create('sync', {is_sync=true})
_ = _:create_index('pk')
-- Экземпляр 2
box.cfg{
    listen = 3314,
    replication = 'localhost:3313'
}
-- Экземпляр 1
box.space.sync:replace{1}

Операция replace(), вызванная на первом экземпляре, не будет завершена, пока второй экземпляр не подтвердит получение и успешное применение транзакции. Обратите внимание, что кворум равен 2, а реплика одна, но транзакция все же успешно проходит коммит. Это происходит потому, что мастер также участвует в кворуме.

Если второй экземпляр прекратит работу, первый не сможет выполнять коммиты для синхронных изменений.

-- Экземпляр 2
Ctrl+D
-- Экземпляр 1
tarantool> box.space.sync:replace{2}
---
- error: Quorum collection for a synchronous transaction is timed out
...

Транзакция не прошла коммит, поскольку за определенное время не был набран кворум. Время — ещё один параметр конфигурации:

box.cfg{replication_synchro_timeout = <время в секундах; может иметь тип float>}

Параметр указывает, сколько секунд синхронная транзакция будет ожидать репликации на кворуме. По истечении этого времени транзакция будет отменена.

Успешные коммиты синхронных транзакций персистентно сохраняются в журнал упреждающей записи (WAL) в виде особых записей CONFIRM. Сообщения об отмене транзакций сохраняются аналогичным образом в виде записей ROLLBACK.

Параметры timeout и quorum на репликах не используются. Если мастер прекратит работу, синхронные транзакции, которые находятся в обработке на репликах, будут ожидать выборов нового мастера.

Если транзакция была отменена, это не обязательно значит, что реплики получили сообщение ROLLBACK. Может возникнуть ситуация, когда мастер внезапно прекратит работу, а после этого коммит транзакции будет выполнен новым мастером. Учитывайте это в логике вашего приложения.

Синхронные транзакции лучше всего использовать в кластерах с полноячеистой топологией (full mesh). В этом случае реплики смогут общаться друг с другом и подтверждать некоторые транзакции, даже если откажет мастер.

Нашли ответ на свой вопрос?
Обратная связь