18 марта 2011 г.

Подборка статей о производительности MongoDb, MongoDb vs Redis и прочее

На данный момент тема NOSQL (not only SQL) хранилищ поднимается всё чаще. В NOSQL видят решение для многих приложений, т.к. считается, что такие решения более производительны и позволяют казалось бы проще делать репликацию данных, масштабировать веб-приложение.
Я остановил свой выбор на MongoDb по ряду причин:
  1. Приемлемая производительность, которая выще, чем у реляционных баз, но всё же ниже, чем у in-memory data grid решений.
  2. Полноценный язык запросов, а не map-reduce механизм, что позволяет писать приложения практически также, как и на SQL.
  3. Простота, наличие готовых коннекторов, прекрасная поддержка.
Следует отметить, что в MongoDb я вижу прежде всего замену персистентным хранилищам, т.е. хранилищам для бизнес-данных приложения, а не скажем данных сессий. Как показывает вот этот анализ производительности, MongoDb хоть и кажется более производительным, обладает рядом ограничений.
  1. Преаллокация места под файлы данных может существенно увеличивать потребляемое место на диске при большом количестве маленьких баз данных, поэтому подход «один клиент - одна база данных» уже перестаёт работать (попросту требует заметно больше места).
  2. Неожиданные блокировки: удаление строк или формирование индексов делает всю базу недоступной на время выполнения операции.
  3. Медленное восстановление данных на уровне отдельных баз, а не таблиц, как в MySQL.
  4. Максимальное использование RAM. Это означает, что чем больше оперативной памяти у сервера, тем выше производительность, т.к. MongoDb старается загружать в ОЗУ как можно больше данных, фактически выступая в роли memcached.
  5. MongoDb не атомарна. Это означает, что при определенных условиях, данные могут попросту не записаться. Согласитесь, это может быть неприемлемо для платежных систем, однако для систем логирования может быть вполне неплохим решением. 
Redis vs MongoDb
Глупо сравнивать memcached и Oracle! Если вам нужно кешировать данные и обращаться к ним по ключу, а также важно, чтобы эти данные были персистентны — Redis для вас. 
Redis это чуть больше, чем memcached. А MongoDb это другая парадигма.
Если же вам нужно хранить слабоструктурированные данные, документы — используйте объектно-ориентированные базы данных, например MongoDb.
Если же ваше приложение требует атомарности, то MongoDb не для вас.
Решайте сами. 

Парадигма Redis и парадигма MongoDb
Точка зрения MongoDb: что происходит с реляционными базами данных, когда они используются для более простых задач, не требующих того функционала, который в них есть? Они становятся раздутыми, медленными, их тяжело реплицировать/shard'ить. Но модель данных с таблицами, индексами и комплексными запросами над этими данными, удобна и хороша.
Точка зрения Redis: проблемы реляционных баз данных обусловлены немасштабируемой моделью данных.

Простой тест производительности MongoDb vs Redis

Используя данный тест на языке Python я получил следующие результаты. Нужно признаться, что тест достаточно синтетический, но кратное различие в скорости дают возможность примерно сравнить эти две базы данных для работы с кешем.

$ ./cache_benchmark.py 10000 
Completed mongo_set: 10000 ops in 1.47 seconds : 6802.7 ops/sec 
Completed mongo_get: 10000 ops in 2.34 seconds : 4273.5 ops/sec 
Completed redis_set: 10000 ops in 0.83 seconds : 12048.2 ops/sec 
Completed redis_get: 10000 ops in 0.92 seconds : 10869.6 ops/sec

Ссылки о Redis, MongoDb и Redis vs MongoDb
  1. http://antirez.com/post/MongoDB-and-Redis.html - мысли о MongoDb и Redis
  2. http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb/ - история миграции веб-приложения http://serverdensity.com с MySQL на MongoDb. При этом используется и MySQL там, где нужна транзакционность.
  3. http://milancermak.posterous.com/benchmarking-tornados-sessions-0 - реализация механизма сессий с использованием встроенных функций Tornado Web Server, а также с использованием MongoDb, Redis, MySQL
  4. http://blog.jasonmooberry.com/2009/08/mongodb-and-symfony-yes-part-1-inserts/http://blog.jasonmooberry.com/2009/08/mongodb-and-symfony-yes-part-2-simple-queries/- MongoDb и PHP-фреймворк Symfony
  5. http://habrahabr.ru/blogs/webdev/74683/ - MongoDb vs MySQL в Ruby и PHP


3 комментария:

AskerTV комментирует...
Этот комментарий был удален автором.
AskerTV комментирует...


It's widely mentioned that Redis is "Blazing Fast" and mongoDB is fast too. But, I'm having trouble finding actual numbers comparing the results of the two. Given similar configurations, features and operations (and maybe showing how the factor changes with different configurations and operations), etc, is Redis 10x faster?, 2x faster?, 5x faster?

I'm ONLY speaking of performance. I understand that mongoDB is a different tool and has a richer feature set. This is not the "Is mongoDB better than Redis" debate. I'm asking, by what margin does Redis outperform mongoDB?

At this point, even cheap benchmarks are better than no benchmarks.

Thanks in advance


6 Answers

Rough results from the following benchmark: 2x write, 3x read.
....

Владимир Игнатьев комментирует...

May I suppose that following article could help to you> http://byterot.blogspot.ru/2012/11/nosql-benchmark-redis-mongodb-ravendb-cassandra-sqlserver.html