MongoDB против Redis против Cassandra за быстрое решение для временного хранения строк - PullRequest
39 голосов
/ 10 июня 2010

Я создаю систему, которая отслеживает и проверяет показы объявлений и клики.Это означает, что имеется много команд вставки (в среднем около 90 / с, пик достигает 250) и некоторые операции чтения, но основное внимание уделяется производительности и ее быстродействию.

Система в настоящее время включенаMongoDB, но с тех пор меня познакомили с Кассандрой и Редисом.Было бы хорошей идеей перейти к одному из этих двух решений, а не остаться на MongoDB?Почему или почему нет?

Спасибо

Ответы [ 9 ]

28 голосов
/ 17 января 2012

Для такого решения по уборке я бы рекомендовал многоступенчатый подход. Redis хорош в режиме реального времени . Redis спроектирован как хранилище ключей / значений в памяти и обладает некоторыми очень полезными преимуществами работы с базой данных памяти: O (1) операции со списком. Пока на сервере есть ОЗУ, Redis не будет замедлять продвижение до конца ваших списков, что хорошо, когда вам нужно вставлять элементы с такой высокой скоростью. К сожалению, Redis не может работать с наборами данных, превышающими объем ОЗУ, который у вас есть (он только записывает на диск, чтение для перезапуска сервера или в случае сбоя системы), и масштабирование должно быть сделано вами и вашей заявкой . (Распространенным способом является распределение ключей по многочисленным серверам, что реализуется некоторыми драйверами Redis, особенно драйверами для Ruby on Rails.) Redis также поддерживает простые сообщения публикации / подписки, которые иногда могут быть полезны.

В этом сценарии Redis является «первым этапом». Для каждого конкретного типа события вы создаете список в Redis с уникальным именем; например, у нас есть «просмотренная страница» и «ссылка нажата». Для простоты мы хотим убедиться, что данные в каждом списке имеют одинаковую структуру; При переходе по ссылке могут быть пользовательский токен, имя ссылки и URL, а на просматриваемой странице могут быть только пользовательский токен и URL. Ваша первая задача - узнать, что это произошло, и все необходимые данные выдвигаются.

Далее у нас есть несколько простых рабочих, которые забирают эту неистово вставленную информацию из рук Редиса, прося ее убрать элемент из конца списка и передать его. Работник может выполнить любые корректировки / дедупликации / поиска идентификаторов, необходимые для правильного хранения данных и передачи их на более постоянное место хранения. Запустите столько рабочих, сколько вам нужно, чтобы нагрузка на память Redis была приемлемой. Вы можете написать работникам все, что пожелаете (Node.js, C #, Java, ...), при условии, что у него есть драйвер Redis (большинство веб-языков делают это сейчас) и один для желаемого хранилища (SQL, Mongo и т. Д.). )

MongoDB хорош в хранилище документов . В отличие от Redis, он может работать с базами данных, большими, чем RAM, и поддерживает сегментирование / репликацию самостоятельно. Преимущество MongoDB перед опциями на основе SQL заключается в том, что вам не нужно иметь заранее определенную схему, вы можете в любое время изменить способ хранения данных.

Однако я бы предложил Redis или Mongo для этапа «первого шага» хранения данных для обработки и использовать традиционную настройку SQL (возможно, Postgres или MSSQL) для хранения данных после обработки. Отслеживание поведения клиента звучит для меня как реляционные данные, так как вы можете выбрать «Показать всех, кто просматривает эту страницу» или «Сколько страниц этот человек просматривал в этот день» или «В какой день было больше всего зрителей?» ». В аналитических целях могут быть даже более сложные объединения или запросы, и зрелые решения SQL могут многое сделать для вас; NoSQL (в частности, Mongo или Redis) не может выполнять объединения или сложные запросы к различным наборам данных.

21 голосов
/ 10 июня 2010

В настоящее время я работаю в очень большой рекламной сети, и мы пишем в простые файлы:)

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

Если вы ищете невероятно быструю скорость, другой вариант -сохранить несколько показов в локальной памяти и затем каждую минуту очищать их от диска.Конечно, это в основном то, что Монго и Редис делают для вас.Не самая веская причина для переезда.

12 голосов
/ 26 марта 2011

Все три решения (четыре, если вы считаете плоские файлы) дадут вам быстрые записи.Нереляционные (nosql) решения обеспечат настраиваемую отказоустойчивость и в целях аварийного восстановления.

В масштабах наша тестовая среда с тремя узлами MongoDB может обрабатывать 2-3 тыс. Смешанных транзакций в секунду.На 8 узлах мы можем обрабатывать 12–15 тыс. Смешанных транзакций в секунду.Кассандра может масштабироваться еще выше.250 операций чтения (или должны быть) без проблем.

Более важный вопрос: что вы хотите сделать с этими данными?Оперативная отчетность?Анализ временных рядов?Специальный анализ шаблонов?отчеты в режиме реального времени?

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

Cassandra - это магазин ключевых ценностей.Вы определяете статический столбец или набор столбцов, которые будут действовать как ваш основной индекс сразу.Все запросы к Cassandra должны быть настроены на этот индекс.Вы можете поставить на него вторичную, но это примерно так далеко.Конечно, вы можете использовать MapReduce для сканирования хранилища на предмет неключевой атрибуции, но это будет просто: последовательное сканирование хранилища.Кассандра также не имеет понятия «нравится» или операций регулярного выражения на узлах сервера.Если вы хотите найти всех клиентов, чье имя начинается с «Alex», вам придется просмотреть всю коллекцию, вытащить имя для каждой записи и запустить его через регулярное выражение на стороне клиента.

Я недостаточно знаком с Redis, чтобы говорить об этом разумно.Извините.

Если вы оцениваете нереляционные платформы, вы также можете рассмотреть CouchDB и Riak.

Надеюсь, это поможет.

9 голосов
/ 13 сентября 2010

Только что нашел это: http://blog.axant.it/archives/236

Цитируем наиболее интересную часть:

Этот второй график о Redis RPUSH против Mongo $ PUSH против Mongo insert, и я нахожу этоГрафик, чтобы быть действительно интересным.До 5000 записей mongodb $ push быстрее даже по сравнению с Redis RPUSH, затем он становится невероятно медленным, вероятно, тип массива mongodb имеет линейное время вставки, и поэтому он становится медленнее и медленнее.mongodb может получить немного производительности, предоставляя тип списка вставки с постоянным временем, но даже с типом массива с линейным временем (который может гарантировать поиск с постоянным временем), он имеет свои приложения для небольших наборов данных.

Полагаю, все зависит, по крайней мере, от типа данных и объема.Наилучшим советом, вероятно, было бы сравнить ваш типичный набор данных и увидеть себя.

6 голосов
/ 04 декабря 2014

В соответствии с бенчмаркинговыми базами данных NoSQL ( скачать здесь ) я рекомендую Cassandra.enter image description here

3 голосов
/ 10 июня 2010

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

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

2 голосов
/ 09 сентября 2011

Я могу получить около 30 тыс. Вставок в секунду с MongoDB на простом Dell за 350 долларов.Если вам нужно только около 2 тыс. Вставок в секунду, я бы использовал MongoDB и осколил его для масштабируемости.Возможно, вы также захотите сделать что-нибудь с Node.js или что-то подобное, чтобы сделать вещи более асинхронными.

2 голосов
/ 01 марта 2011

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

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

SQLite теперь поддерживает ведение журнала записи, что также может обеспечить достаточную производительность.

0 голосов
/ 06 июля 2011

У меня есть практический опыт работы с mongodb, couchdb и cassandra.Я преобразовал множество файлов в строку base64 и вставил эти строки в nosql.
mongodb - самый быстрый.Кассандра самая медленная.couchdb тоже медленный.

Я думаю, что MySQL будет намного быстрее, чем все они, но я еще не пробовал MySQL для моего теста.

...