
CockreachDB — это СУБД класса NewSQL, что означает, что она сочетает в себе сегментирование и репликацию систем управления базами данных NoSQL с надежностью систем SQL. Он реплицирует все данные между узлами, используя алгоритм консенсуса Raft. В этой статье я расскажу, как развернуть кластер CockreachDB локально и управлять им на языке программирования Go.
Требования
- Докер
- докер-компоновка
- Go
Запуск кластера
Следующий скрипт docker-compose.yml сделает это за нас.
version: "3.7"
services:
cockroach-1:
image: cockroachdb/cockroach:v21.2.0
ports:
- 8080:8080
- 26257:26257
networks:
- cockroach-net
volumes:
- type: volume
source: cockroach-1-data
target: /cockroach/cockroach-data
container_name: cockroachdocker-compose.ymlserver
command:
- start
- --insecure
- --join=cockroach-1,cockroach-2,cockroach-3
cockroach-2:
image: cockroachdb/cockroach:v21.2.0
networks:
- cockroach-net
volumes:
- type: volume
source: cockroach-2-data
target: /cockroach/cockroach-data
container_name: cockroachinsecureserver
command:
- start
- --insecure
- --join=cockroach-1,cockroach-2,cockroach-3
cockroach-3:
image: cockroachdb/cockroach:v21.2.0
networks:
- cockroach-net
volumes:
- type: volume
source: cockroach-3-data
target: /cockroach/cockroach-data
container_name: cockroachrootserver
command:
- start
- --insecure
- --join=cockroach-1,cockroach-2,cockroach-3
volumes:
cockroach-1-data:
cockroach-2-data:
cockroach-3-data:
networks:
cockroach-net:
driver: bridge
Как видите, необходимо создать мостовую сеть для экземпляров CockreachDB. Это заставит контейнеры общаться как единый кластер, сохраняя их изолированными от внешних сетей [➥].
Я запустил кластер в режиме insecure, так как не хочу возиться с настройкой SSL сертификатов для сервиса. Также необходимо указать адреса всех экземпляров в аргументах командной строки для каждого контейнера.
Затем нам нужно запустить все это, выполнив следующую команду:
docker-compose up
Он загрузит все необходимые изображения и создаст контейнеры. После этого нам нужно инициализировать кластер:
docker exec -it cockroachdocker-compose.ymlserver ./cockroach init --insecure
Он подключится к первому контейнеру и вызовет инициализатор базы данных из своей оболочки. Если все настроено правильно, вывод сообщит нам об успешной инициализации кластера.
Написание и чтение в Go
Я буду использовать библиотеку sqlx, чтобы упростить работу с CRUD. Также CockreachDB использует стандартный драйвер PostgreSQL.
Раздел подключения прост:
Мы входим как root и подключаемся к базе данных defaultdb. sslmode установлен в disable, потому что мы запустили кластер в режиме insecure.
Мы определяем нашу структуру данных для сохранения в БД следующим образом:
Теперь давайте создадим новую базу данных и будем использовать ее:
С этого момента все операции будут выполняться в контексте базы данных project_db. Время создать таблицу:
Первое, что вы могли заметить, это тип поля id. Это не INT, BIGINT или что-то в этом роде, а UUID. UUID — это случайно сгенерированное 128-битное число, используемое для идентификации одного объекта в базе данных. Мы не можем использовать автоматически увеличивающиеся целочисленные идентификаторы, потому что хранилище распределено и реплицировано. А преимущество UUID в том, что каждый из них существенно отличается от других. Вероятность создания двух одинаковых UUID в одном и том же пространстве крайне мала. Вот почему они используются в распределенных ориентированных на документы СУБД, таких как MongoDB, для уникальной идентификации записей.
Теперь давайте запишем некоторые данные:
Точно так же вы делаете это с PostgreSQL, поэтому код, который полагался на него, легко запускать с помощью CockreachDB. Последнее, что нужно прочитать сохраненные данные:
Вывод будет таким:
Здесь вы можете увидеть, как UUID выглядит в формате печати. Возможно, вы сталкивались с ними раньше (например, каждый раздел данных в Linux имеет свой собственный UUID).
Также CockroachDB предоставляет панель инструментов для порта 8080:

Удачных экспериментов!