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:

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