Bentax
@Bentax
PM at AllUnic

Как лучше синхронизировать 20 бд?

Есть около 20 бд (sql, pg) с данными о заказах клиентов (продажах). Каждую секунду появляется новый заказ в каждой бд. Требуется собирать информацию для расчёта всех продаж на сервер (21-й). Перекачка по крону напрямую из бд в бд. Алгоритм понятен, используем timestamp, проверяемся, обновляемся. НО! При перекачке возможны потери информации. Надо проверять, все ли данные скачаны. В случае потери данных присылать сообщение. Вопрос, может через промежуточный файл проверку устраивать? Даст ли это скорость/надёжность? Как грамотно построить архитектуру?
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ответы на вопрос 3
@galaxy
Я бы настроил logical replication нужной таблицы (таблиц)

Только таблицы в DB1-21 придется положить в разные схемы, т.к. постгрес не умеет реплицировать в таблицу с другим именем. Т.е получится что-то типа:

DB1 (schema1.table) -> DB21 (schema1.table)
DB2 (schema2.table) -> DB21 (schema2.table)
DB3 (schema2.table) -> DB21 (schema3.table)
...

Дальше уже объединяйте данные в DB21 из schemaN.table как вам надо. Можно (вроде... честно говоря не проверял) сделать таблицы schemaN.table партициями общей таблицы, например. Или организовать materialized view.

Также можно подключить таблицы с DB1-20 через foreign data wrapper и перекачивать с них данные (тут уже ваша задача написать скрипт/запрос так, чтобы ничего не пропадало и не тормозило).

Это, конечно, все при условии, что у вас базы могут коннектиться друг к другу.
Ответ написан
Комментировать
@Miron11
Пишу sql 20 лет. Срок :)
Архитектура синхронизации данных на самом деле содержится в структурах данных передовых создателей СУБД. Прекрасный пример для подражания - SQL Server.
У него, начиная с версии 2008 или 2012 есть опция обратной проверки странички файла хранящих данные - сумма кратно усеченных значений из 8 полей. Если функция и значение разнятся, страничка объявляется испорченной, после чего включается механизм подгружающий копию той же странички с машины, где эта страничка "здоровая".
Как разбить данные в таблице на блоки / странички, какая функция лучше для подсчета и как осуществить коммуникации между базами это наверное параметры, которые Вы можете подсказать. Если Вас заинтересовал этот подход, пожалуйста напишите, чтобы сделать полноценное решение.
Ответ написан
Комментировать
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Есть вариант использовать Kafka. В каждой из 20 баз данных устанавливается плагин который публикует все измения данных в Kafka. В Kafka, используя KSQL потоки данных объединяются в один и уже объединенный результирующий поток пишется в результирующую базу.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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