2016-09-23 4 views
2

Я хочу настроить postgres и elasticsearch. Но прежде чем бросать данные в elasticsearch, я хочу предотвратить потерю данных при выходе из сети или сервера. Прочитав эту тему: https://gocardless.com/blog/syncing-postgres-to-elasticsearch-lessons-learned/. Я придумал 3 решения.Postgres with elasticsearch (держать в синхронизации) - nodeJS

  1. Создание таблицы базы данных еи: store, и добавлять новые/обновленные данные.

    • Во время запросов: вставьте данные в store.
    • Выберите новые данные: SELECT data FROM store WHERE modified > (:last modified time from elasticsearch)
    • Отправить "новый" данные к elasticsearch
  2. Используйте Redis для pub/sub запросов и сделать elasticsearch слушать/подписаться на предстоящие данные. Если поиск elasticsearch прерывается, данные будут находиться в очереди

  3. Попадание любых ошибок во время транзакции в поиск elastics и сохранение данных в безопасном месте (таблица: store). Затем выполните задание cron, которое возвращает данные.


Конечно, проще всего было бы вставить данные в elasticsearch сразу. Но при этом предотвращается хранение данных в безопасном месте во время сбоев. 1 слишком медленный, на мой взгляд, в отличие от 2. А для 3 требуется код обработки ошибок.

На данный момент 2 - мой вариант.


Есть ли лучшие способы сделать это? Я хотел бы услышать ваши мнения и новых предложений

: D

+0

Просто интересны, как будет обрабатывать удаления для случая 1. Я просто изучаю варианты, чтобы сделать именно то, что вы делать ... – FacePalm

+1

Кроме того, проверьте это ... https://qafoo.com/blog/086_how_to_synchronize_a_database_with_elastic_search.html – FacePalm

+0

@FacePalm см. anwser – Antartica

ответ

0

Redis (2) не является надежным.

Что я решил сделать, чтобы добавить данные в elasticsearch сразу и добавить данные в таблицу updates. Затем запустите функцию sync() прямо после подключения к клиенту elasticsearch (если кластер ушел раньше) + запускайте работу cron каждые 24 часа, чтобы запустить sync(). Все sync() - это самые последние данные (время или идентификатор) от updatesA и elasticsearch B и сравнивает, если есть записи A > B. Если это так, вставьте данные, используя массовый API.

Надеется, что это помогает :)

И я все еще открыт для предложений и Fedback ...