Почему мастер-мастер репликация может быть проблемной
Что проверяют
Понимаете ли вы, что мастер-мастер это размен согласованности на доступность и локальность записи, а не способ ускорить запись. От бэкендера ждут и второго слоя ответа: какой код приходится писать поверх такой базы.
Как отвечать
Основная проблема в том, что две транзакции на разных узлах коммитятся независимо, а расходятся уже после. Отсюда перечень:
- Конфликты изменений одной строки. Правило разрешения надо выбрать заранее, и самый популярный вариант, побеждает последняя запись, сравнивает временные метки разных машин: при расхождении часов теряется более свежее изменение, причём молча.
- Уникальные ключи. Автоинкремент выдаёт одинаковые значения на обоих узлах, при схождении прилетает нарушение уникальности, репликация встаёт, и дальше идёт ручное разбирательство. Лечится разными диапазонами счётчиков либо генерацией идентификаторов в приложении.
- Инварианты, которые проверяются чтением перед записью. Проверка остатка проходит на одном узле, списание идёт на другом: локально всё корректно, глобально остаток ушёл в минус.
- Разрыв сети между узлами. Оба живы, оба принимают записи, расхождение растёт, и это уже не отказ, а два разных состояния системы.
- Чтение своей записи. Клиента перекинуло на второй узел, а его изменение туда ещё не доехало.
В коде на Go из этого следует: идентификаторы генерируются на стороне сервиса, обработчики идемпотентны, повтор операции безопасен, а сессию пользователя лучше прибивать к одному узлу. Оправдан такой режим в основном там, где узлы пишут непересекающиеся наборы ключей, например по регионам.
Где спотыкаются
Называют мастер-мастер способом масштабировать запись. Пропускная способность не растёт: каждый узел всё равно применяет и свои, и чужие изменения. Растут доступность и близость к пользователю.
Считают выбор последней записи решением конфликтов. Это не решение, а решение о том, чью запись выбросить, и вдобавок завязанное на синхронность часов.
Забывают, что репликация останавливается. Конфликт уникального индекса это не «данные разъехались», а вставший поток репликации и растущее отставание, пока его не расшивают руками.