@quest2017

Репликация. Правильно ли я понимаю?

В highload решениях часто применяют такую вещь: пишем на master SQL (на который мы только пишем) данные с которого реплицируется на один или несколько slave SQL (с которых мы только читаем).

SQL (я использую Postgresql) гарантирует ACID где буква «C» означает Consistency — Согласованность. Представим ситуацию: есть сервера «A» (master), «B» (slave) и «C» (slave). На сервер «A» в транзакции заносятся атомарно два ключа «X» и «Y». Далее эти ключи с серера «A» должны реплицироваться на сервера «B» и «C». И будут реплицированны атомарно, оба.

Предположим вы читаем данные: случайно выбираем сервер «B» и читаем ключ «X», случайно выбираем сервер «С» и читаем ключ «Y».

Вопрос: возможна ли ситуация когда ключи «X» и «Y» уже реплицированны на сервер «B», но еще не реплицированны на сервер «C»? При асинхронной репликации? При синхронной репликации? Ведь это разные устройста и подобная несогласованность пусть очень короткое время по идее должна быть возможна. Гарантируется ли согласованность в системе из нескольких реплицируемых серверов?
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
гарантирует ACID где буква «C» означает Consistency — Согласованность.

В пределах одного кластера postgresql. Т.е. одного сервера.

возможна ли ситуация когда ключи «X» и «Y» уже реплицированны на сервер «B», но еще не реплицированны на сервер «C»? При асинхронной репликации?

By design. Потому это и названо асинхронной репликой. Между коммитом на мастере и приходом каждого отдельного асинхронного слейва в это состояние всегда будет какой-то временной лаг.
Но timeline один на всех, т.к. его ведёт мастер. Ситуация, что на B записан только X, а на C только Y - исключена.

Синхронная реплика - мастер не ответит клиенту "записано" пока не получит отклик от синхронных реплик из synchronous_standby_names, что те получили эти wal (дефолт, гарантирует, что данные есть минимум на двух машинах и при внезапном сбое вы их не потеряете), применили эти изменения (synchronous_commit=remote_write соответственно два кластера postgresql синхронны. Из-за CAP теоремы теоретически возможно, что при сбое мастера на слейве эта транзакция будет уже записана, а на мастере значится как прерванная. Не знаю, что именно по этому поводу сделано).
Внимание, что при потере работоспособности синхронной реплики мастер будет доступен только на чтение. Все пишущие транзакции будут ждать возвращения синхронной реплики.

Гарантируется ли согласованность в системе из нескольких реплицируемых серверов?

Смотря чем вам допустимо жертвовать для этого. См. CAP теорему.

Это, разумеется, справедливо только для встроенной бинарной потоковой репликации WAL. Логическая в 10 будет жить по своим особым правилам, как и сторонние триггерные решения.
Ответ написан
Комментировать
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
Вопрос: возможна ли ситуация когда ключи «X» и «Y» уже реплицированны на сервер «B», но еще не реплицированны на сервер «C»? При асинхронной репликации? При синхронной репликации?

да, возможно, причем при обоих типах репликации. особенно если скорости доступа между мастером и обоими слэйвами значительно отличаются.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы