Использование ElasticSeach в качестве основного источника для части моей БД

Я видел много подобных вопросов в этой теме ( включая этот, в котором рассказывается о том, как ElasticSearch версии 6 преодолел многие из своих ограничений в качестве основного хранилища данных), но мне все еще не ясно следующее:

Я создаю веб-сайт для покупок в Интернете и использую MySQL в качестве базы данных.

Это упрощенная версия моей БД (пользователи могут размещать продукт на сайте для продажи)

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

Я могу придумать 2 решения для достижения этой цели:

  1. Дублирующая таблица продуктов в MySQL и ES
  2. Держите User и ProductReview в MySQL и Product в ES

Насколько я знаю, если я использую вариант 1, то я могу использовать go-mysql -asticsearch для синхронизации MySQL с ES: это хорошее решение?

Я более склонен использовать вариант 2, так как он проще и мне не нужно беспокоиться о синхронизации данных. Что касается меня в этой опции:

  • Надежна ли ES как основной источник данных?
  • В какой-то момент, если мне придется изменить структуру таблицы Product, смогу ли я сделать это без удаления и повторного создания индекса продукта?
  • В случае с MySQL я обычно беру резервную копию Prod DB и восстанавливаю ее на тестовой базе данных... Можно ли выполнить резервное копирование и восстановление из Prod в тестовую версию с использованием ES?

У меня нет опыта работы с ES/NoSQL, и я буду признателен за любые советы.

2 ответа

Решение

Позвольте мне начать с того, что Elasticsearch НЕ является базой данных в строгом смысле этого слова и в идеале не должен использоваться как таковой. Тем не менее, ничто не мешает вам сделать это (и многие люди делают это), и, по словам хороших людей в Elastic, они никогда не будут стремиться сделать ES настоящей базой данных. Основная цель ES - быть быстрой и надежной поисковой и аналитической системой, и точка.

Если вы можете, вы всегда должны хранить другой основной источник правды, из которого вы можете легко (заново) построить свои индексы ES в любое время, если что-то пойдет на юг.

В вашем случае вариант 1, кажется, является подходящим вариантом, поскольку все, что вы хотите сделать, - это позволить пользователям искать ваши продукты, поэтому нет смысла синхронизировать другие таблицы в ES.

Вариант 2 звучит привлекательно, но только если вы решите использовать только ES, чего не стоит делать, если вы хотите полагаться на транзакции (у ES нет поддержки транзакций). Еще одна вещь, которую вам нужно знать, это то, что если у вас есть только данные в ES, и ваш индекс по какой-то причине поврежден (во время обновления, ошибки в ES, ошибки в вашем коде и т. Д.), Ваши данные исчезнут и ваш бизнес будет страдать.

Итак, чтобы ответить на ваши вопросы более точно:

  1. ES может быть надежным источником правды, если вы вложите в игру достаточно усилий и денег. Однако у вас, вероятно, нет миллионов продуктов и пользователей (пока), поэтому кластер высокой доступности с минимум тремя узлами для поиска в нескольких тысячах продуктов с несколькими полями не выглядит хорошей затратами.

  2. Когда ваша таблица продуктов изменяется, легко переиндексировать таблицу в ES (или даже в режиме реального времени), и если у вас есть несколько тысяч продуктов, она может идти достаточно быстро, чтобы вам не пришлось об этом беспокоиться. Если по какой-либо причине синхронизация не удалась, вы можете запустить процесс снова, не тратя слишком много времени. С техникой псевдонима с нулевым временем простоя вы можете сделать это, не влияя на ваших пользователей.

  3. ES также предоставляет возможности создания снимков / восстановления, так что вы можете сделать снимок PROD и установить его в кластере TEST с помощью одного вызова REST.

Есть много подходов для решения этой проблемы... это то, что я в итоге сделал:

Я выбрал вариант 1 и создал Synchronizer для периодического копирования своих продуктов в Elasticsearch. На самом деле это было довольно просто... Я реализовал метод, описанный здесь: Как синхронизировать базу данных с ElasticSearch, используя Elasticsearch NEST Client

Другие вопросы по тегам