Частые крупные, многозаписные обновления в MongoDB, Lucene и т. Д. - PullRequest
0 голосов
/ 15 марта 2011

Я работаю над созданием высокоуровневого веб-приложения со следующими характеристиками:

  • Миллионы записей
  • Сильно проиндексирован / доступен для поиска по различным критериям
  • переменная схема документа
  • Регулярные обновления в блоках по 10K - 200K записей одновременно
  • Данные должны оставаться высокодоступными во время обновлений
  • Должен эффективно масштабироваться горизонтально

Сегодня это приложение существует в MySQL, и мы страдаем от нескольких огромных проблем, в частности, из-за того, что его сложно адаптировать к гибкой схеме, и что крупные массовые обновления блокируют данные на 10-15 секунд за раз, что недопустимо , Некоторые из этих вещей могут быть решены путем улучшения проектирования баз данных в контексте MySQL, однако я ищу лучшее решение «следующего поколения».

Я никогда не использовал MongoDB, но его набор функций, казалось, наиболее близко соответствовал тому, что я ищу, так что это было моей первой областью интереса. У меня есть некоторые вещи, которые меня волнуют, такие как разбиение данных, возможность находить-обновлять-возвращать в одном выражении и, конечно, гибкость схемы NoSQL.

В MongoDB есть две вещи, в которых я не уверен:

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

  2. Мне нужен открытый текстовый поиск

Это второе требование привело меня к Lucene (или, возможно, к Solr, если я оставил его внешним) в качестве магазина поиска. Я прочитал несколько случаев, когда Lucene использовался полностью вместо базы данных NoSQL, такой как MongoDB, что заставило меня задуматься, не усложняю ли я вещи, пытаясь использовать оба в одном приложении - возможно, я должен просто хранить все напрямую в Lucene и запустить его так?

Учитывая вышеприведенные требования, кажется ли, что комбинация MongoDB и Lucene сделает эту работу эффективной? Если нет, то может быть лучше попытаться заняться этим целиком в Lucene?

1 Ответ

1 голос
/ 15 марта 2011

В настоящее время с MongoDB обновления блокируются на уровне сервера.Есть несколько открытых JIRA для решения этой проблемы, запланированных для v1.9-2.0.Я полагаю, что текущий план состоит в том, чтобы производить записи, чтобы чтения могли работать лучше.

С учетом вышесказанного, существует множество отличных способов масштабирования MongoDB для сверхвысокого параллелизма, многие из которых аналогичны для MySQL.Один из таких примеров - использование RAID 10. Другой - использование master-slave, когда вы пишете в master и читаете из slave.

Вам также необходимо учитывать, должны ли ваши «записанные» данные быть 1) долговечными и2) доступны через рабов немедленно.Драйверы mongodb позволяют вам указать, хотите ли вы, чтобы данные записывались на диск немедленно (или зависали в памяти для следующего fsync), и позволяли вам указывать, сколько ведомых устройств должны записывать данные.И то, и другое замедляет запись в MongoDB, что, как отмечалось выше, может повлиять на производительность чтения.

MongoDB также почти не имеет возможности для полнотекстового поиска, который есть у Solr \ Lucene, и вы, вероятно, захотите использовать обавсе вместе.В настоящее время я использую и Solr, и MongoDB вместе и доволен этим.

...