Синхронизация данных на серверах geoПроблемаУ нас есть сервис, предоставляющий пользователям гео-данные населённых пунктов, улиц и домов разных стран.
Для обеспечения отказоустойчивости был создан второй сервис, полностью дублирующий функционал первого (копия приложения и базы данных
Opensearch).
В случае сбоя первого сервиса всегда можно быстро переключить нагрузку на второй.
Однако база геосервиса постоянно обновляется — данные вносятся как из публичных справочников (
ГАР), так и вручную.
Возникла потребность синхронизировать базы данных двух сервисов.
ЗадачаОбеспечить автоматическую синхронизацию данных между двумя независимыми БД
Opensearch, несмотря на то, что встроенной мастер-слэйв репликации в Opensearch нет.
РешениеМы разработали собственную схему синхронизации через
внутренний Git-репозиторий.
Были реализованы следующие доработки:
- В базу данных добавлена временная метка последнего редактирования для каждого документа.
- Созданы shell/PHP cron-скрипты:
мастер-сервис пушит все изменения в репозиторий,
вспомогательный сервис забирает обновления и применяет их к своей БД.
Как это работает- Пользователь или автоматическая система обновляет данные в мастер-сервисе.
- Изменения фиксируются во внутреннем Git-репозитории.
- Вспомогательный сервис периодически проверяет репозиторий и подтягивает новые данные.
- Его база данных обновляется синхронно с мастер-сервисом.
Результат- Обеспечена синхронизация данных между двумя независимыми сервисами.
- Повышена отказоустойчивость геосервиса.
- Реализован удобный и прозрачный механизм обновления без необходимости ручной поддержки.