Подтвердить что ты не робот

Какую базу данных NoSQL следует использовать для ведения журнала?

Есть ли у вас опыт работы с базами данных NoSQL для масштабируемых приложений? Я провел некоторое исследование по базам данных NoSQL для регистрации и обнаружил, что MongoDB, по-видимому, является хорошим выбором. Кроме того, я нашел log4mongo-net, что кажется очень простым вариантом.

Вы рекомендовали бы такой подход? Есть ли другие предложения?

4b9b3361

Ответ 1

Я решил пересмотреть этот принятый ответ, поскольку состояние искусства значительно изменилось за последние 18 месяцев, и существуют гораздо лучшие альтернативы.

Новый ответ

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

Сильное каротажное решение должно охватывать по меньшей мере следующие этапы:

  • Collection
  • Транспорт
  • Обработка
  • Хранение
  • Поиск
  • Визуализация

MongoDB как выбор только решает использование хранилища (хотя и немного плохо). После анализа всей цепочки существует более подходящее решение.

@KazukiOhta упоминает несколько вариантов. В настоящее время мое предпочтительное решение для конечного конца:

Исходное использование ElasticSearch для хранения данных журнала использует текущее лучшее решение NoSQL для порождения для ведения журнала и поиска. Тот факт, что Logstash-Forwarder/Logstash/ElasticSearch/Kibana3 находится под зонтиком ElasticSearch, делает еще более убедительный аргумент.

Так как Logstash также может выступать в качестве прокси-сервера Graphite, очень сложная цепочка может быть построена для связанной задачи сбора и анализа показателей (а не только журналов).

Старый ответ

MongoDB Capped Collections чрезвычайно популярны и подходит для ведения журнала, с добавленным бонусом "меньше схемы", что обычно является семантическим подходом для ведения журнала. Часто мы знаем только то, что мы хотим хорошо записывать в проект, или после того, как определенные проблемы были обнаружены в процессе производства. Реляционные базы данных или строгие схемы, как правило, трудно изменить в этих случаях, и попытки сделать их "гибкими" имеют тенденцию просто делать их "медленными" и трудными в использовании или понимании.

Но если вы хотите управлять своими журналами в темноте и делать лазеры и делать их похожими на вас из космоса всегда Graylog2, который использует MongoDB как часть своей общей инфраструктуры, но обеспечивает намного больше, например, общий, расширяемый формат, выделенный сервер сбора журналов, распределенная архитектура и фанковый интерфейс.

Ответ 2

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

Люди объединяют журналы с помощью обычной группировки или MapReduce, но это не так быстро. Особенно MongoDB MapReduce работает только в одном потоке, и его накладные расходы на JavaScript огромны. Новая структура агрегации могла решить эту проблему.

Когда вы используете MongoDB для ведения журнала, проблема заключается в конфликте блокировки с высокой пропускной способностью записи. Хотя вкладка MongoDB по умолчанию является стилем "огонь и забухание", вызов большого количества вставки() вызывает серьезное нарушение блокировки записи. Это может повлиять на производительность приложения и не позволяет читателям собирать/фильтровать сохраненные журналы.

В одном решении может использоваться структура коллектора журналов, например Fluentd, Logstash, или Flume. Эти демоны должны запускаться на каждом узле приложения и извлекать журналы из процессов приложений.

Fluentd plus MongoDB

Они буферизуют журналы и асинхронно записывают данные в другие системы, такие как MongoDB/PostgreSQL/и т.д. Запись выполняется партиями, поэтому она намного эффективнее чем писать напрямую из приложений. В этой ссылке описывается, как помещать журналы в Fluentd из программы PHP.

Вот несколько уроков о MongoDB + Fluentd.

Проблема MongoDB заключается в том, что она начинает замедляться, когда объем данных превышает объем памяти. В этот момент вы можете переключиться на другие решения, такие как Apache Hadoop или Cassandra. Если у вас есть распределенный уровень журналирования, упомянутый выше, вы можете мгновенно переключиться на другое решение по мере роста. В этом руководстве описывается, как хранить журналы в HDFS с помощью Fluentd.

Ответ 3

Вы должны указать, какие сообщения в журналах создаются вашим приложением. Если вы только регистрируете партии и множество простых сообщений журнала, MongoDB - очень хороший выбор, поскольку он масштабируется так хорошо. Но если вам нужен сложный материал аутентификации или много иерархии, я бы использовал традиционные rdbms.