tessob wrote: 28 Apr 2018 06:45
Vladimir Kr. wrote: 27 Apr 2018 13:52
Вы пишите только в мастер, "Мастер ничего не знает о репликах", читаете только с реплик.
почему в реплике будет идентичное мастеру сразу после записи в мастер?
У нас топик "Синхронизация и репликация" мастер-мастер базы.
Вы решали задачу мастер-мастер репликации, путем приведения ее к мастер-слейв?
Перечитайте пункты 2 и 3 из первого поста. Если вы знаете как решить подобную задачу в реальном времени и в реальном мире, то напишите пожалуйста свою версию. Только имейте ввиду, что в реальном мире shit happens (сервера падают, провайдеры лажают, пакеты теряются). Мне и самому будет интересно узнать как "правильно" дизайнить распределенные системы.
Как тут правильно сказали, для общего решения задачи синхронизации мастер-мастер серверов нужно определиться с алгоритмом разрешения конфликтов при сравнении двух commited записей с двух и более серверов. Это не та-же задача, что клиент-сервер, из-за отсутствия комита на клиенте.
Конкретную задачу ТС#2 можно решить выбрав один из алгоритмов плюс возможено шардинг, но останется вопрос об адекватности синхронизации.
Другой вариант решения общей задачи мастер-мастер -- двухфазный коммит. При этом, транзакция на пользователе просто сломается, если обнаружен конфликт с commited записью на другом сервере. Это надежно, конфликтов нет, но медленно - надо проверить все сервера.
Объединяем эти два подхода, добавляем мастер-слейв:
как обычно, читаем с любого сервера.
используем двухфазный коммит, но только с одним сервером, там где запись (table row) помечена как мастер копия. Это может быть тот-же сервер, или другой, но он будет один. После коммита изменения на мастер сервере, нужно в бакграунде оповестить _все_ остальные сервера об изменении. Если мастер не найден, это то в случае, если сервер резко умер (или потерял связь), то нужно подтвержение от всех серверов о смене мастер метки конкретной записи. Если при этом (отсутствие сервера с мастер меткой) запись изменилась сразу в 2х местах, то смотри выше вариант с двухфазным комитом. Но лучше сервера гасить с передачей всех мастер меток на ближайший. При потере связи да и вообще в бакграунде нужно сравнить логи транзакций с ближайшим сервером, на предмет более свежих записей. Если добавить распределение мастер меток по шардингу регионов, то не будет тормозить на cross-region ХА commit.
Получается чуть сложнее, чем обычный двухфазный коммит, но ничего супер сложного. Надежно, сравнительно быстро, тру мастер-мастер с AZ & HA & DR.
Я не знаю как с Ораклом, да и с Постгресом тоже не в курсе всех особенностей их вариантов. Может у Касандры похожая реализация?