У меня есть следующая система управления:
Центральный офис с postgresql базой данных (основной), которая хранит данные обо всех удаленных судах и обрабатывает все идентификаторы. Каждое судно имеет свой собственный postgresql сервер (ведомый), который хранит данные об этом частном судне. Центральный сервер и удаленные серверы не подключены через сеть
Мне нужно организовать репликацию данных между серверами. Сервер Office имеет приоритет.
В настоящее время передача данных организована по следующей схеме:
- master создает файл экспорта, содержащий всю базу данных подчиненного устройства
- экспорт мастера файл передается по электронной почте и через спутник. inte rnet
- slave импортирует эти файлы, полностью переписывая свою собственную базу данных
- каждый раз, когда происходит изменение, slave помечает измененные строки, задавая значения c flags (
isAdded
, isModified
, isDeleted
) - slave создает файл экспорта, в который записываются все измененные строки
- файл экспорта slave передается по электронной почте и через спутник inte rnet
- главный файл подчиненного импорта:
- , если строка имеет флаг
isAdded = TRUE
, она создает новую строку (INSERT INTO ...
) - , если строка имеет флаг
isModified = TRUE
, она ищет для существующей строки и обновляет ее (UPDATE ... WHERE id = ...
) - , если строка имеет флаг
isDeleted = TRUE
, она ищет существующую строку и удаляет ее (DELETE ... FROM ... WHERE id = ...
)
- мастер сбрасывает
isAdded = NULL
, isModified = NULL
, isDeleted = NULL
флаги, которые в указывает, что строка принята сервером и ее идентификатор действителен. - master снова создает файл экспорта и т. д. ...
Эта схема репликации, очевидно, очень ошибочна - она Это было временное решение для перебора.
Основная проблема в том, что он работает, только если передача полудуплексная (если я правильно понимаю термин). Slave не может вносить изменения в базу данных, когда она уже создала свой файл экспорта, но не импортировала его из master.
Я хотел ввести некоторую репликацию, основанную на временных отметках, но главная проблема - неправильная дата и настройки времени на удаленных судах и невозможность подключения к NTP-серверам для синхронизации.
Я также хотел ввести некоторые виды импорта-экспорта для отслеживания изменений, но мне кажется, что я собираюсь заново изобрести колесо.
Существует ли какое-либо общее решение для автономной репликации на основе файлов, кроме разработки с нуля? Какой-то отраслевой стандарт?