Задать вопрос
@alex_alexey

Как в PostgreSQL организовать синхронизацию данных между геораспределенными копиями?

есть игровой бекенд рядом крутиться бд PostgreSQL и таких несколько копий пример в Амстердам и Сингапур
какими механизмимами можно организовать синхронизацию данных базках в таких ситуация?
  • Вопрос задан
  • 235 просмотров
Подписаться 1 Средний 2 комментария
Помогут разобраться в теме Все курсы
  • Учебный центр IBS
    QPT PostgreSQL 16. Оптимизация запросов
    1 неделя
    Далее
  • Яндекс Практикум
    Фулстек-разработчик
    16 месяцев
    Далее
  • REBRAIN
    Greenplum в Yandex MPP Analytics for PostgreSQL
    5 недель
    Далее
Пригласить эксперта
Ответы на вопрос 4
opium
@opium
Просто люблю качественно работать
Если пишешь только в одну точку, а Сингапур readonly — async streaming replication, самый простой вариант. Multi-master в постгресе из коробки нет нормального: logical replication конфликты не резолвит автоматом и может встать. Из реального есть EDB PGD (бывший BDR), но платное. Для игрового бекенда имхо проще шардить по регионам на уровне приложения, а общие данные типа лидербордов гонять через очередь.
Ответ написан
Vamp
@Vamp
Посмотрите в сторону yugabyteDB. Если двумя словами - это распределённый постгрес. Там есть синхронная георепликация, есть асинхронная. Ещё можно их миксануть.
Ответ написан
@rPman
Так как все говорят про репликацию, это правильно и красиво... выдам свой необычный вариант (бывают случаи, когда это оправдано).

Можно вместо синхронизации данных (все всё знают) и получения проблем из-за этого (например когда обновлений много, передача данных всем занимает время, появляются лаги), можно наоборот, полностью отказаться от синхронизации данных, но запросы получения данных отправлять сразу на все узлы (потребует значительную переделку запросов, особенно на модификацию, затрагивающую глобальные данные).

Условный пример, узлы собирают данные (много записей), каждый узел пишет только у себя, а затем на их основе происходит работа с ними (аналитика и маленький объем данных на чтение). Например запрос на подсчет суммы, отправляем запрос на каждую ноду одновременно, затем складываем результат. Если нужны запросы, затрагивающие глобально данные (например посчитать количество дубликатов), то так или иначе их придется где то собирать, поэтому можно совместить подход, таблицы реплицируются... есть еще нестрогие количества HyperLogLog (глобально собираются вычисляемые по данным значения типа хеша и по ним проводится анализ).. в общем децентрализованная аналитика во всей красе, там где математически можно разделять (как с поиском суммы) там это идеально подходит.

Типовой пример, где это подходит - сбор и анализ логов распределенного приложения. Поток данных огромен, зачем его собирать обрабатывать централизованно, когда можно и хранить на каждой ноде свою часть и запросы на фильтрацию делать там же (с оговорками, если после смерти ноды логи терять неохота, их можно реплицировать соседу, исключительно как бакап, но это все еще распределенное хранение)
Ответ написан
Комментировать
@veslavc
я подобную задачу решаю с помощью kafka
правда у нас всего две БД которые нужно реплицировать, но идея может быть расширена на много серверов.
ограничение: единая точка записи в БД
технология:
сервис который пишет в БД (например какой-то API) данные транзакции сериализует и продюссирует в топик кафки
на топик подписаны консюмеры, которые стоят рядом с каждой БД и повторяют транзакции из топика в свою БД
да, у меня БД "append only" но для update можно придумать какой-то timestamp что бы не перетереть более актуальные записи
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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