МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
____________________________
Кафедра ____________________________
РЕФЕРАТ
на тему: «Классификация и сравнение NoSQL-систем»
Выполнил(а): ____________________________
Группа: ____________________________
Проверил(а): ____________________________
2026
Содержание
- 3
- 6
- 9
- 12
1. Эволюция и мотивация NoSQL
Термин NoSQL появился в 1998 году как название легковесной базы данных, но широкое распространение получил лишь в 2009 году, когда Йохан Оскарссон употребил его на конференции в Сан-Франциско. Сегодня под NoSQL понимают целый класс систем управления базами данных, которые принципиально отказываются от реляционной модели и языка SQL. Отказ этот не прихоть, а ответ на конкретные инженерные вызовы, с которыми столкнулись интернет-компании первого десятилетия XXI века.
Реляционные СУБД доминировали на рынке почти сорок лет. Они предлагали строгую схему данных, транзакции с гарантиями ACID и мощный декларативный язык запросов. Но у этой модели есть фундаментальное ограничение: вертикальное масштабирование. Чтобы обработать больше запросов, нужно купить более мощный сервер. Увеличение объёмов данных упирается в расширение дискового пространства на одной машине. Стоимость такого оборудования растёт экспоненциально, а физические пределы шины памяти и процессорного времени наступают быстро.
В 2007 году инженеры Facebook столкнулись с этой проблемой при разработке системы обмена сообщениями. Они обнаружили, что реляционная база данных MySQL не справляется с нагрузкой в миллионы одновременных пользователей, и были вынуждены построить собственное решение на базе Cassandra. Аналогичные проблемы решали в Amazon, где в 2007 году запустили DynamoDB, чтобы справиться с пиковыми нагрузками на корзину покупок в праздничные дни. Эти проекты показали: для распределённых систем нужен иной подход, основанный на горизонтальном масштабировании.
Горизонтальное масштабирование означает добавление обычных серверов в кластер вместо замены одного мощного. Данные распределяются по узлам, и каждый узел обрабатывает лишь свою часть нагрузки. Такой подход дешевле и надёжнее, но требует пересмотра архитектуры
хранения. Реляционная модель с её строгими связями между таблицами плохо поддаётся шардингу: распределение связанных данных по разным узлам делает JOIN-запросы крайне медленными. Кроме того, обеспечение ACID-транзакций в распределённой среде требует постоянной координации между узлами, что резко снижает производительность.
Именно эти проблемы призван решить NoSQL. Отказ от строгой схемы позволяет хранить разнородные данные без предварительной нормализации. Отсутствие поддержки JOIN-запросов компенсируется денормализацией и хранением данных в том виде, в котором они используются приложением. Гарантии ACID заменяются моделью BASE (Basically Available, Soft state, Eventual consistency), которая допускает временную несогласованность данных ради сохранения доступности системы. Это радикально другой компромисс: вместо строгой корректности в каждый момент времени выбирается высокая скорость и устойчивость к сбоям.
По моделям данных NoSQL-системы делятся на четыре основных типа. Хранилища типа «ключ-значение» (Redis, Riak) представляют данные как простые пары, где значение извлекается по уникальному ключу. Они обеспечивают максимальную скорость операций и чаще всего используются для кэширования и управления сессиями. Документные базы (MongoDB, CouchDB) хранят данные в форматах JSON или BSON, позволяя группировать связанные поля в один документ. Это удобно для каталогов товаров, блогов и любых приложений с гибкой структурой данных.
Колоночные системы (Cassandra, HBase) организуют данные по столбцам, а не по строкам, как в реляционных базах. Такая структура идеальна для аналитических запросов по отдельным атрибутам и для хранения временных рядов, где важно быстро считывать большие объёмы однотипных данных. Наконец, графовые базы (Neo4j, OrientDB) моделируют связи между сущностями как рёбра графа. Они незаменимы для социальных сетей, систем рекомендаций и задач
поиска кратчайших путей, где количество связей между объектами превышает количество самих объектов.
Важно понимать: NoSQL не является заменой реляционных СУБД в общем смысле. Для банковских транзакций или систем учёта кадров, где критична строгая согласованность, реляционные базы остаются предпочтительным выбором. Но там, где объёмы данных измеряются терабайтами, а нагрузка растёт непредсказуемо, NoSQL предлагает рабочую альтернативу, построенную на иных принципах масштабирования и согласованности. Эволюция этого класса систем продолжается: появляются гибридные решения, такие как NewSQL, пытающиеся объединить ACID-гарантии с горизонтальным масштабированием.
2. Сравнение производительности и масштабируемости
Производительность NoSQL-систем напрямую зависит от того, как модель данных организует физическое хранение. Системы класса «ключ-значение», такие как Redis или Memcached, достигают минимальной задержки чтения и записи, поскольку обращение происходит по хешу ключа без сканирования индексов. В Redis операции записи в память выполняются за микросекунды, а чтение с диска через снапшоты RDB происходит на порядок медленнее, но всё равно обгоняет реляционные аналоги. Документные базы вроде MongoDB добавляют накладные расходы на разбор JSON и обновление индексов, поэтому их скорость записи ниже. Зато чтение целого документа целиком обходится дешевле, чем сборка сущности из нескольких таблиц.
Скорость чтения в колоночных системах достигается за счёт хранения данных по столбцам, а не по строкам. Cassandra при работе с временными рядами показывает пропускную способность записи около 1 миллиона операций в секунду на кластере из трёх узлов. Графовые системы, например Neo4j, проигрывают в массовых операциях, но выигрывают в глубине обхода связей. Чтение пути между узлами в графе выполняется за время, пропорциональное длине пути, а не размеру всей выборки. Это критически важно для социальных графов.
Горизонтальное масштабирование опирается на шардинг, то есть распределение данных по узлам кластера по ключу. В Cassandra используется консистентное хеширование с виртуальными токенами, которое позволяет добавлять узлы без полной перебалансировки. Репликация обеспечивает отказоустойчивость: каждая запись дублируется на N узлов, где N задаётся фактором репликации. В MongoDB шардирование управляется через mongos-роутер, который направляет запросы в нужный шард. Распределённые кластеры в HBase полагаются на ZooKeeper для координации и отслеживания региона-серверов.
Ключевое влияние на производительность оказывает выбор между строгой согласованностью ACID и ослабленной BASE. ACID требует блокировок и двухфазного коммита, что увеличивает задержку при распределённых транзакциях. В MongoDB с транзакциями на нескольких шардах латентность вырастает в 2-3 раза по сравнению с одиночным документом. BASE допускает конечную согласованность, когда узел возвращает данные, которые могут быть устаревшими в течение короткого окна. Зато запись обрабатывается без ожидания подтверждения от всех реплик. Cassandra позволяет настроить уровень согласованности QUORUM, где задержка растёт линейно с числом подтверждающих узлов. При уровне ONE запись выполняется на одном узле, и это даёт минимальную задержку.
Сравнительный анализ масштабируемости показывает чёткое разделение. Колоночные и документные системы проектировались для горизонтального роста: Cassandra линейно масштабируется до сотен узлов, а MongoDB поддерживает автоматическое распределение данных и балансировку через шардинг. Графовые системы сталкиваются с фундаментальной проблемой: при распределении графа по узлам рёбра между разными узлами создают сетевые переходы, которые резко замедляют обходы. Neo4j в кластерной конфигурации использует кэширование и репликацию, но глубина обхода свыше 5-6 уровней приводит к деградации производительности на порядок. Поэтому графовые базы чаще используют в режиме одного мощного узла с репликами для чтения, а не для горизонтального масштабирования записи.
Показатели из реальных тестов подтверждают эту картину. В бенчмарках Yahoo! Cloud Serving Benchmark для Cassandra при 100% записи и 50 узлах достигается суммарная пропускная способность 250 тысяч операций в секунду. Neo4j на том же объёме данных выдаёт не более 10 тысяч операций, если запросы включают многошаговые обходы. MongoDB в конфигурации из 12 шардов обрабатывает смешанную нагрузку чтения и записи в 60/40 со средней задержкой 5 миллисекунд, что
превышает показатели реляционных систем на аналогичном оборудовании в 3-4 раза. Эти цифры приведены в отчётах компании MongoDB за 2023 год. Они иллюстрируют, что выбор модели данных определяет не только функциональность, но и порядок величины производительности.
3. Согласованность и CAP-теорема
Если производительность определяет, как быстро система отвечает, то согласованность определяет, насколько честен этот ответ. В распределённой базе данных, где данные живут на множестве узлов, вопрос «какую версию записи я вижу?» становится вопросом архитектурного компромисса. Именно здесь в игру вступает CAP-теорема, сформулированная Эриком Брюером в 2000 году и доказанная Сетом Гилбертом и Нэнси Линч спустя два года.
Формулировка теоремы предельно лаконична: распределённая система не может одновременно гарантировать согласованность, доступность и устойчивость к разделению. Под согласованностью здесь понимается линейная согласованность: любой читающий узел немедленно видит результат последней успешной записи, как будто система имеет единственную копию данных. Доступность означает, что каждый запрос к работающему узлу завершается успешным ответом, без таймаутов и ошибок. Устойчивость к разделению допускает, что сеть может разорваться на изолированные сегменты, и система продолжит корректно функционировать. Сетевое разделение в распределённой системе неизбежно, поэтому на практике выбор сводится к тому, чем пожертвовать: согласованностью или доступностью. Именно этот выбор определяет поведение системы в момент сбоя и, шире, её повседневную семантику.
Практические системы почти никогда не работают в крайних точках спектра, они выбирают одну из моделей согласованности, каждая из которых ослабляет требование линейности в обмен на доступность или задержку. Строгая согласованность, она же линейная, требует, чтобы все операции выглядели выполненными в едином глобальном порядке. Её обеспечивает, например, ZooKeeper, но ценой высокой задержки при записи: каждый узел должен синхронизироваться с остальными. Конечная согласованность, наоборот, гарантирует лишь, что при отсутствии новых обновлений все реплики со временем придут к одному
состоянию. Время сходимости не определено, что делает эту модель рискованной для финансовых транзакций, но идеальной для лент новостей или счётчиков просмотров. Между ними расположены причинная согласованность, которая упорядочивает операции, связанные отношением «произошло до», но допускает расхождения в параллельных ветках, и сессионная согласованность, гарантирующая, что клиент в рамках одной сессии видит свои собственные записи, но не обязательно видит записи других клиентов.
Каждая модель имеет свою цену. Строгая согласованность превращает сетевой сбой в недоступность: если часть узлов не может договориться о порядке операций, система отвечает ошибкой. Конечная согласованность, напротив, позволяет каждому узлу принимать записи независимо, но порождает конфликты, которые нужно разрешать. Эти конфликты могут быть техническими и содержательными: например, два пользователя одновременно редактируют один документ, и система должна решить, какая версия победит.
Конкретные реализации хорошо иллюстрируют этот компромисс. Cassandra, колоночная система, разработанная в Facebook, по умолчанию использует конечную согласованность. Запись отправляется на один или несколько узлов, и клиент не ждёт подтверждения от всех реплик. При этом Cassandra предоставляет механизм QUORUM: если клиент требует согласованности, он дожидается ответа от большинства узлов. Это гибкая настройка, но она ложится на разработчика, который должен понимать, что чтение с одного узла может вернуть устаревшие данные. MongoDB, документная система, долгое время предлагала только строгую согласованность на уровне первичной реплики, что ограничивало её масштабируемость. Начиная с версии 5.0, MongoDB разрешает настраивать уровень согласованности для каждого запроса, позволяя читать с вторичных реплик с задержкой до определённого момента. Riak, основанный на идеях DynamoDB, известен своей моделью «последний пишущий побеждает», но с настраиваемыми параметрами N, R, W: N, число реплик, R, число узлов,
подтверждающих чтение, W, число узлов, подтверждающих запись. Установив R + W > N, можно добиться строгой согласованности, пожертвовав доступностью в момент разделения.
Этот выбор не является чисто техническим. Он отражает бизнес-требования: банковский перевод требует строгой согласованности, иначе деньги могут исчезнуть или задвоиться; корзина интернет-магазина может быть конечной, потому что потеря одной позиции менее критична, чем полная недоступность сайта в час пик. Проектирование NoSQL-системы всегда начинается с вопроса: что произойдёт, если данные разойдутся? Ответ на этот вопрос определяет, какую модель согласованности выбрать и какую цену заплатить.
4. Критерии выбора и практические рекомендации
Выбор конкретной NoSQL-системы редко бывает однозначным. Обычно он сводится к поиску баланса между четырьмя основными параметрами: моделью данных, требованиями к производительности, характером масштабирования и допустимым уровнем согласованности. Начнём с модели данных, так как именно она определяет, насколько естественно прикладная задача ложится на структуру хранения. Для социальной сети, где профиль пользователя включает разнородные поля, удобнее документная модель MongoDB, чем жёсткая схема реляционной СУБД. Графовые системы вроде Neo4j незаменимы, когда суть запроса заключается в анализе связей (например, при поиске друзей друзей).
Производительность и масштабируемость также диктуют свои условия. Если приложение требует отклика на чтение за миллисекунды и работает преимущественно в памяти, выбор очевиден: Redis. Он хранит данные в оперативной памяти, что даёт задержку менее миллисекунды, но ограничивает объём хранимых данных стоимостью RAM. Напротив, Cassandra, построенная на колоночной модели, оптимизирована для записи огромных потоков данных на диски в распределённом кластере. Её архитектура позволяет линейно масштабироваться за счёт добавления узлов без простоев. Это критично для систем, работающих с временными рядами телеметрии или логами.
Согласованность, в свою очередь, становится решающим фактором в финансовых транзакциях, где потеря данных недопустима. Здесь приходится жертвовать доступностью или производительностью, выбирая системы с сильной согласованностью (например, MongoDB при настройке большинства операций на чтение с первичного узла). В сценариях же, где допустима конечная согласованность (скажем, при обновлении ленты новостей), Cassandra обеспечивает высокую доступность и скорость ценой возможной временной рассинхронизации данных на разных узлах.
Сопоставление типов систем с типовыми сценариями использования даёт чёткую картину. Для IoT-платформ, где датчики генерируют миллионы событий в секунду, колоночные базы данных (Cassandra, HBase) подходят лучше всего: они быстро пишут большими партиями и эффективно хранят данные, сгруппированные по времени. Для аналитики, требующей агрегации больших объёмов данных, часто используют документные или колоночные хранилища, но с учётом их способности выполнять сложные запросы. Социальные сети, сочетающие профили, посты и связи, редко обходятся одной системой: обычно применяют комбинацию MongoDB для хранения контента и Redis для кэширования горячих данных.
Конкретные рекомендации вытекают из описанных свойств. Для кэширования часто запрашиваемых данных выбор Redis оправдан не только скоростью, но и развитыми структурами данных: списками, множествами и хешами. Они позволяют реализовать рейтинги или очереди без дополнительного кода. Для документооборота, где структура документов меняется со временем, MongoDB предоставляет гибкую схему и встроенную поддержку транзакций в последних версиях. Это закрывает потребности большинства бизнес-приложений. Cassandra становится выбором для систем мониторинга, где каждое измерение снабжается меткой времени: её модель хранения по ключу и времени гарантирует высокую скорость записи и чтения по диапазонам дат.
Итоговый вывод сводится к тому, что NoSQL-системы не являются универсальной заменой реляционным базам. Они закрывают те задачи, где последние бессильны из-за объёмов данных или требований к горизонтальному масштабированию. Главный ограничитель NoSQL, это сложность выполнения многотабличных запросов и обеспечения строгой согласованности. Разработчикам приходится перекладывать часть логики на прикладной уровень. Однако при правильном выборе модели данных и системы под конкретную нагрузку NoSQL даёт выигрыш в производительности на порядок по сравнению с традиционными СУБД.
Практическая рекомендация проста: не выбирать систему по принципу «модная технология», а начинать с анализа структуры данных, частоты запросов и допустимого компромисса между скоростью и точностью информации.
Нужна такая же работа по своей теме? Соберём структуру, текст и источники в этом же оформлении.