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.yml
server 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: cockroachinsecure
server 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: cockroachroot
server 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.yml
server ./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:
Удачных экспериментов!