CockroachDB — распределённая SQL-база, которая говорит по протоколу PostgreSQL, но хранит данные иначе: таблицы разбиты на диапазоны, каждый диапазон реплицируется через Raft, а узел, принявший запрос, сам находит нужную реплику. Это даёт горизонтальное масштабирование и устойчивость к отказу машин без ручного шардирования. Ниже — запуск локального кластера, работа с SQL, настройка репликации, диагностика и резервное копирование.
Чем CockroachDB отличается от PostgreSQL
Совместимость с протоколом PostgreSQL не означает совместимости со всеми расширениями. Драйверы и ORM обычно работают без изменений, но PL/pgSQL, часть системных каталогов и расширения вроде PostGIS отсутствуют. Транзакции сериализуемые по умолчанию, поэтому конфликтующие операции могут завершаться ошибкой 40001, и приложение должно уметь повторять транзакцию.
- Данные автоматически делятся на диапазоны примерно по 512 МБ.
- Каждый диапазон имеет несколько реплик, обычно три.
- Лидер диапазона выбирается через Raft и меняется при отказе узла.
- SQL-узел и хранилище совмещены: любой узел принимает запросы.
Отсюда практическое следствие: задержка записи зависит от кворума, а не только от диска. Кластер из двух узлов не даёт преимуществ — кворум из двух реплик теряет доступность при отказе одной.
Выбирать CockroachDB имеет смысл, когда кластер должен переживать отказ машины или стойки без участия администратора, а данные уже не помещаются на один сервер. Для небольшого проекта с единственным узлом проще PostgreSQL: меньше накладных расходов на кворум и полная совместимость с расширениями.
Локальный кластер из трёх узлов
Для стенда хватит трёх процессов на одной машине с разными портами и каталогами. Флаг --insecure отключает TLS и подходит только для локальных экспериментов.
cockroach start --insecure --store=node1 \
--listen-addr=localhost:26257 --http-addr=localhost:8080 \
--join=localhost:26257,localhost:26258,localhost:26259
cockroach start --insecure --store=node2 \
--listen-addr=localhost:26258 --http-addr=localhost:8081 \
--join=localhost:26257,localhost:26258,localhost:26259
Третий узел запускают по той же схеме с портами 26259 и 8082. Все процессы должны указывать одинаковый список --join, иначе узлы образуют разные кластеры и SQL-запросы будут видеть только часть данных. Каталог --store нельзя переиспользовать от другого кластера.
Инициализация и первые запросы
Инициализация выполняется один раз и только после того, как все узлы запущены. Затем подключаются встроенным клиентом и создают базу.
cockroach init --insecure --host=localhost:26257
cockroach sql --insecure --host=localhost:26257
CREATE DATABASE shop;
CREATE TABLE shop.orders (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), total DECIMAL);
INSERT INTO shop.orders (total) VALUES (199.90);
SELECT * FROM shop.orders;
Строка подключения для приложения выглядит как обычная для PostgreSQL, только с sslmode=disable на стенде: postgresql://root@localhost:26257/shop?sslmode=disable. Порт 26257 — SQL, 8080 — веб-консоль с метриками, планами запросов и состоянием диапазонов.
Репликация и зоны
По умолчанию база получает три реплики. Для небольшого кластера это нормально, для одноузлового стенда — нет: start-single-node сам выставляет одну реплику. Проверить и изменить настройку можно через зоны.
ALTER DATABASE shop CONFIGURE ZONE USING num_replicas = 3;
SHOW ZONES;
SHOW RANGES FROM TABLE shop.orders;
SELECT range_id, start_key, end_key FROM [SHOW RANGES FROM TABLE shop.orders];
Зоны позволяют привязать данные к регионам или стойкам через constraints. Это полезно, когда нужно держать копию рядом с пользователями, но требует осознанной настройки: неверное ограничение может сделать размещение реплик невозможным, и диапазон останется с меньшим числом копий.
Диагностика и нагрузка
Встроенный генератор нагрузки создаёт реалистичный поток запросов и помогает понять поведение кластера до переноса продакшена. Состояние узлов и план запроса смотрят отдельными командами.
cockroach workload init movr 'postgresql://root@localhost:26257?sslmode=disable'
cockroach workload run movr --duration=3m 'postgresql://root@localhost:26257?sslmode=disable'
cockroach node status --insecure --host=localhost:26257
EXPLAIN ANALYZE SELECT * FROM shop.orders WHERE total > 100;
Метрики доступны по HTTP на порту 8080 в формате Prometheus, поэтому кластер подключается к существующему мониторингу без отдельного экспортёра. Отдельного внимания заслуживает показатель under-replicated ranges: если он растёт, часть данных осталась без нужного числа копий.
EXPLAIN ANALYZE показывает, какие узлы участвовали в запросе и сколько строк прошло по сети. Если план содержит full scan там, где ожидался индекс, помогает CREATE INDEX ... STORING или пересмотр первичного ключа. Для сбора диагностики при обращении в поддержку используют cockroach debug zip: архив содержит логи, метрики и схемы, но может включать чувствительные данные.
Резервное копирование
Резервные копии делаются средствами SQL и пишутся в объектное хранилище или локальный каталог. Важно указывать AS OF SYSTEM TIME, чтобы снимок был согласованным и не блокировал запись.
BACKUP DATABASE shop INTO 's3://backups/cockroach?AWS_ACCESS_KEY_ID=...&AWS_SECRET_ACCESS_KEY=...' AS OF SYSTEM TIME '-10s';
SHOW BACKUPS IN 's3://backups/cockroach';
RESTORE DATABASE shop FROM LATEST IN 's3://backups/cockroach' WITH into_db = 'shop_restore';
Ключи доступа лучше передавать не в тексте команды, а через переменные окружения или параметры кластера: история оболочки и журналы заданий не должны хранить секреты. Расписание создаётся через CREATE SCHEDULE FOR BACKUP, а проверять восстановление нужно регулярно: копия, которую ни разу не разворачивали, считается непроверенной на практике.
Безопасность вместо insecure
В продакшене --insecure недопустим: без TLS любой, кто добрался до порта, получает полный доступ. Правильный путь — собственный центр сертификации и отдельные сертификаты для узлов и клиентов.
cockroach cert create-ca --certs-dir=certs --ca-key=my-safe-directory/ca.key
cockroach cert create-node localhost 10.0.0.11 --certs-dir=certs --ca-key=my-safe-directory/ca.key
cockroach cert create-client root --certs-dir=certs --ca-key=my-safe-directory/ca.key
cockroach sql --certs-dir=certs --host=localhost:26257
После перехода на сертификаты создают отдельных пользователей и роли, а root оставляют только для административных задач. Часть возможностей относится к платной редакции, поэтому условия стоит проверить на официальном сайте до выбора.
Итог
CockroachDB полезна там, где нужна SQL-база с автоматической репликацией и ростом без ручного шардирования. Начинать стоит с трёх узлов, проверить поведение при отказе одного из них, настроить повтор транзакций в приложении и только потом переносить нагрузку. Главные грабли — совместимость расширений, конфликтующие транзакции и неверные зоны размещения.