Что такое нереляционные (NoSQL) базы данных?

«Что такое нереляционные (NoSQL) базы данных?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нереляционные базы данных (NoSQL) — это широкий класс систем хранения данных, которые не используют реляционную модель с таблицами, строками, столбцами и строгими схемами, связанными через SQL. Они созданы для решения проблем, с которыми плохо справляются традиционные RDBMS: горизонтальное масштабирование, работа с неструктурированными данными и высокая скорость операций записи/чтения.

Основные типы NoSQL БД и их применение в DevOps/современных стеках:

Тип Примеры Модель данных Типичное использование в DevOps-контексте
Документные MongoDB, Couchbase JSON/BSON документы Хранение конфигураций, профилей пользователей, данных каталогов.
Ключ-значение Redis, Amazon DynamoDB Простая пара ключ-значение Кэширование, сессии, очереди, счётчики, конфигурация feature flags.
Колоночные Apache Cassandra, ScyllaDB Данные хранятся по столбцам, а не по строкам Масштабируемое хранение метрик (мониторинг), логов, аналитических данных.
Графовые Neo4j, Amazon Neptune Узлы и рёбра, представляющие связи Анализ зависимостей инфраструктуры, обнаружение мошенничества, рекомендательные системы.

Преимущества NoSQL с точки зрения DevOps:

  • Горизонтальная масштабируемость (Scale-out): Легче распределить нагрузку на множество серверов, добавляя ноды в кластер.
  • Гибкость схемы: Можно добавлять новые поля в записи без дорогостоящих операций ALTER TABLE и простоев.
  • Высокая доступность: Многие NoSQL БД изначально проектируются как распределённые и отказоустойчивые (репликация, шардирование).
  • Оптимизация под конкретные паттерны доступа: Например, Redis для сверхбыстрого кэша.

Недостатки и компромиссы:

  • Отсутствие или ослабленные гарантии ACID: Часто предлагается модель BASE (Basically Available, Soft state, Eventual consistency) — согласованность в конечном счёте.
  • Отсутствие JOIN: Связи между данными часто должны обрабатываться на уровне приложения.
  • Меньшая стандартизация: Каждая БД имеет свой собственный API и язык запросов.

Пример работы с Redis (ключ-значение) для кэширования:

# Записать значение в кэш
redis-cli SET "user:session:abc123" '{"userId": 456, "role": "admin"}'

# Установить время жизни (TTL) в 3600 секунд
redis-cli EXPIRE "user:session:abc123" 3600

# Получить значение
redis-cli GET "user:session:abc123"