Ответ
Выбор между SQL (реляционные) и NoSQL (нереляционные) базами данных — ключевое архитектурное решение в DevOps.
Реляционные БД (SQL)
- Модель данных: Строгая, предопределенная схема в виде таблиц со строками и столбцами. Связи между таблицами устанавливаются через внешние ключи.
- Язык запросов: SQL (стандартизированный, мощный для сложных JOIN-запросов и агрегаций).
- Свойства транзакций: Поддерживают ACID (Атомарность, Согласованность, Изоляция, Долговечность). Гарантируют целостность данных.
- Масштабирование: В первую очередь вертикальное (увеличение мощности сервера). Репликация и шардирование (горизонтальное масштабирование) сложны.
- Примеры: PostgreSQL, MySQL, MariaDB, Oracle, SQL Server.
- Использование в DevOps: Требуют тщательного планирования схемы, миграций (используются инструменты вроде Liquibase, Flyway), резервного копирования и настройки репликации.
Нереляционные БД (NoSQL)
- Модель данных: Гибкая или схема-независимая. Основные типы:
- Документные (MongoDB, Couchbase): Хранение JSON-подобных документов.
- Ключ-значение (Redis, DynamoDB): Простой доступ по ключу.
- Колоночные (Cassandra, ScyllaDB): Оптимизированы для запросов по столбцам, а не строкам.
- Графовые (Neo4j): Хранение связей между сущностями.
- Гибкость: Структура данных может меняться со временем без сложных миграций.
- Свойства: Следуют CAP-теореме (Consistency, Availability, Partition Tolerance). Часто жертвуют строгой согласованностью (C) в пользу доступности (A) и устойчивости к разделению (P), предлагая eventual consistency.
- Масштабирование: Заточены под горизонтальное масштабирование (добавление узлов в кластер).
DevOps-перспектива: Критерии выбора
| Критерий | Выбрать SQL | Выбрать NoSQL |
|---|---|---|
| Структура данных | Четкая, неизменная, со сложными связями. | Динамическая, неоднородная, иерархическая (документы). |
| Целостность данных | Критически важна (финансовые транзакции). | Может быть ослаблена в пользу скорости и доступности. |
| Масштабирование | Предсказуемый рост, вертикальное масштабирование. | Огромные объемы данных/трафика, горизонтальное масштабирование. |
| Тип нагрузки | Сложные аналитические запросы, отчеты. | Высокая скорость записи/чтения, низкая задержка (кэш, сессии). |
Пример инфраструктуры как код (Terraform) для создания кластера БД:
# Пример для AWS RDS (SQL) - управляемый сервис
resource "aws_db_instance" "postgres" {
engine = "postgres"
instance_class = "db.t3.micro"
allocated_storage = 20
name = "mydb"
username = var.db_username
password = var.db_password
vpc_security_group_ids = [aws_security_group.rds.id]
db_subnet_group_name = aws_db_subnet_group.main.name
}
# Пример для MongoDB Atlas (NoSQL) через провайдер
resource "mongodbatlas_cluster" "app_cluster" {
project_id = var.atlas_project_id
name = "app-cluster"
provider_name = "TENANT"
backing_provider_name = "AWS"
provider_region_name = "EU_WEST_1"
provider_instance_size_name = "M10"
}