Решите безопасный импорт данных и основной обмен на веб-сайте с высоким трафиком

Привет коллеги-техники,

Давайте предположим, что у нас есть (PHP) веб-сайт с миллионами посетителей в месяц, и мы запускаем индекс SolR на веб-сайте с размещением 4 миллионов документов. Solr работает на 4 отдельных серверах, один из которых является главным, а остальные 3 реплицированы.

В Solr можно вставлять тысячи документов каждые 5 минут. Кроме того, пользователь может обновить свою учетную запись, что также должно вызвать обновление Solr.

Я ищу безопасную стратегию для быстрого и безопасного перестроения индекса, не пропуская ни одного документа. И иметь безопасную стратегию дельта / обновления. Я подумал о стратегии и хочу поделиться ею с экспертами здесь, чтобы услышать их мнение о том, стоит ли мне придерживаться такого подхода или могут ли они посоветовать что-то (совершенно) другое.

Solr DataImport

Для всех операций я хочу использовать один обработчик импорта данных. Я хочу смешать данные и дельта-импорт в один файл конфигурации, такой как http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport. Мы используем базу данных MySQL в качестве источника данных.

Восстановление индекса

Для восстановления индекса я имею в виду следующее; мы создаем новое ядро ​​с именем 'reindex' рядом с 'живым' ядром. С помощью dataimporthandler мы полностью перестраиваем весь набор документов (4 миллиона документов), что в общей сложности занимает около 1-2 часов. В живом индексе по-прежнему ежеминутно появляются обновления, вставки и удаления.

После восстановления, которое заняло около 1-2 часов, новый индекс больше не обновляется. Чтобы уменьшить задержку, мы делаем один "дельта" импорт для нового ядра, чтобы зафиксировать все изменения за последние 1-2 часа. Когда это будет сделано, сделайте замену ядра. Обычный обработчик импорта delta, который запускается каждую минуту, поднимет это новое ядро.

Передача обновлений в живое ядро

Чтобы сохранить работоспособность ядра, мы каждую минуту запускаем дельта-импорт. Из-за замены ядра ядро ​​reindex (которое теперь является активным ядром) будет отслеживаться и обновляться. Я предполагаю, что это не должно быть проблемой, если этот индекс задерживается на несколько минут, потому что dataimport.properties также будет поменяться местами? Дельта-импорт преодолел эти минуты задержки, но это должно быть возможно.

Я надеюсь, что вы понимаете мою ситуацию и мою стратегию и могли бы посоветовать, правильно ли я делаю это в ваших глазах. Также я хотел бы знать, есть ли какие-нибудь узкие места, о которых я не думал? Мы работаем с Solr версии 1.4.

У меня есть вопрос: как насчет репликации? Если главный сервер меняет ядро, как salves справляется с этим?

И есть ли риск потери документов при обмене и т. Д.?

Заранее спасибо!

2 ответа

Решение

Хороший (и сложный) вопрос!

Полный импорт - очень сложная операция, в общем случае лучше запускать дельта-запросы, чтобы обновлять индекс только до последних изменений в вашей RDMS. Я понял, почему вы меняете мастер, когда вам нужно выполнить полный импорт: вы обновляете живое ядро ​​с помощью delta-import, пока полный импорт выполняется на новом ядре, поскольку это занимает два часа. Звучит хорошо, пока полный импорт не используется так часто.

Что касается репликации, я бы позаботился о том, чтобы репликация не выполнялась до замены основного ядра. Для получения более подробной информации о том, как работает репликация, вы можете посмотреть вики Solr, если вы еще этого не сделали.

Кроме того, я бы удостоверился, что дельта-импорт не запущен на работающем ядре, прежде чем заменять главное ядро.

У нас немного измененная ситуация с нашей стороны. Существует два DataImportHandlers - один для полного импорта, другой для дельта-импорта. Импорт дельты запускается хроном каждые 3 часа и занимает минуты. Полный импорт около 10 млн документов занимает ~48 часов (безумие!). Большая часть этого связана с задержкой в ​​сети, поскольку огромное количество данных выбирается из таблицы MySQL для каждого документа. Эти две таблицы находятся на двух разных серверах MySQL и не могут быть объединены.

У нас есть "живое" ядро, которое имеет дельта-импорт. Мы представляем еще одно ядро ​​"rebuild" и выполняем полный индекс, который занимает ~48 часов. К этому времени мы отслеживаем все документы, которые были обновлены / удалены из "живого" ядра, а затем выполняем дельта-импорт в "перестроенном" ядре, чтобы привести их оба в одно и то же состояние. В обычный день, когда оба ядра находятся в одном и том же состоянии, мы меняем их местами и обслуживаем из ядра восстановления. (Кто будет следить за тем, чтобы ядро ​​перестроения выполняло полную индексацию, а также применило дельта-патчи?)

Иногда нам бы хотелось, чтобы и "живое", и "перестраиваемое" ядро ​​служили одновременно для "ab тестирования". В те времена и "живое", и "перестроенное" ядро ​​имели бы дельта-импорт для согласованности, и оба служили бы. Исходя из результатов, мы хотели бы сохранить один и удалить другой путем замены.

Чтобы сделать всю эту установку стабильной в рабочем состоянии, мы планируем внедрить процесс мониторинга, который будет проверять, индексируется ли ядро ​​"rebuild" или выполняется с этим. Если он проиндексирован, процесс монитора обновит его дельта-документами и активирует cron для дельта-индексации для обоих ядер. По завершении фазы ab одно ядро ​​будет выгружено, а другое ядро ​​заменено. Дополнительные кроны будут отключены.

В этой конструкции есть еще несколько движущихся частей, и надежность процесса мониторинга имеет решающее значение для бесперебойной работы. Любые предложения / альтернативы?

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