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


Отправить комментарий