Руководтсво администратора/разработчика

Документация

Варианты СУБД

CockrouchDB

CockroachDB — распределённая СУБД (SQL) с открытым кодом, обеспечивающая согласованность данных, масштабируемость и выживаемость. (рекомендуется как быстрая и простая замена Postgres)


Подготовка

Поскольку CockrouchDB является распределённая СУБД (SQL) с открытым кодом, обеспечивающая согласованность данных, масштабируемость и выживаемость, то имеет смысл устанавливать его на несколько хостов (серверов).

Настройка CockroachDB проста. Все узлы кластера действуют «симметрично» и предлагают доступ к одинаковым данным. Если хранилище для данных необходимо увеличить, то при используемой архитектуре достаточно создать новые узлы и присоединить к кластеру.

Перед тем, как начать, потребуются:

  • Три сервера с Ubuntu 16.04 с 2+ Гб RAM и включённой опцией Private Networking [для DigitalOcean]. Все они должны находиться в одном регионе. В качестве их имён далее будут использоваться: cockroach-01cockroach-02cockroach-03.
  • На каждом сервере должен быть добавлен пользователь-администратор (не root, но с правами sudo).
  • У всех серверов должен быть разрешён TCP-трафик на двух портах. Если в качестве firewall настроен UFW, потребуется его настроить соответствующим образом:
    • 26257 — для взаимодействия между узлами и с приложением (sudo ufw allow 26257/tcp);
    • 8080 ­— для административного интерфейса Admin UI (sudo ufw allow 8080/tcp).
  • Опционально: установите и настройте NTP на каждом сервере. (Если разворачиваете СУБД для короткого тестирования, в этом нет необходимости.)

Узнайте внутренний и внешний IP-адреса каждого сервера. Далее в для них будут использоваться обозначения вида cockroach_01_public_ip и cockroach_02_private_ip и тд.


Установка

На каждом узле кластера должен быть исполняемый файл cockroach. Далее описана установка CockroachDB на первом сервере (cockroach-01), по аналогии с которой необходимо провести операции на остальных узлах.

Подключаемся по SSH к серверу, после чего в домашнем каталоге пользователя скачиваем и устанавливаем последнюю версию бинарника cockroach:
 

$ ssh sammy@cockroach_01_public_ip
$ wget -qO- https://binaries.cockroachdb.com/cockroach-v20.1.11.linux-amd64.tgz | tar xvz
$ sudo cp -i cockroach-v20.1.11.linux-amd64/cockroach /usr/local/bin/


Проверьте, что исполняемый файл СУБД доступен, узнав его версию:
 

$ cockroach version
Build Tag:v1.0-rc.1-dirty
Build Time: 2017/05/01 18:33:34
Distribution: CCL
Platform: linux amd64
Go Version: go1.8.1
C Compiler: gcc 6.3.0
Build SHA-1:2d4d1ab5c42efb5accf73c9876e6ffd934fdc9e6
Build Type: release


Если после этих шагов система не находит команду cockroach, убедитесь, что файл действительно был скачан, распакован и перемещён.

Повторите эти операции на двух других серверах, которые станут узлами кластера (cockroach-02 и cockroach-03). После этого можно настроить сам кластер.


Быстрый старт (автозапуск)

После загрузки cockroach на сервер желательно обеспечить бесперебойную работу сервиса после перезагрузки или потенциального падения. Для этого рекомендуем создать демона через использование утилиты systemd (для Linux-систем).

Данный пример демонстрирует создание сервиса для запуска cockroach в single-node режиме. Для кластера можно использовать запуск через создание сервисов на основании bash-скриптов, также необходимо будет учитывать записимости при создании сервиса (зависимости в systemd).

  1. Создаем файл сервиса
    # touch /etc/systemd/system/cockroach.service
    # chmod 664 /etc/systemd/system/cockroach.service
    # nano /etc/systemd/system/cockroach.service
  2. Содержимое файла
    [Unit]
    Description=Cockroach-01
    [Service]
    ExecStart=/usr/local/bin/cockroach start --insecure --background --advertise-host=cockroach-01 (или IP-адрес сервера)
    Type=idle
    User=root
    KillMode=process
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
  3. Обновление и запуск
    # systemctl daemon-reload
    # systemctl start cockroach.service
    # systemctl status cockroach.service
    Если вас устроило то, как работает сервис, добавьте его в автозагрузку:
    # systemctl enable cockroach.service
    

 

Минимальная безопасность

В незащищенном режиме наружу будут доступны порты 26257 и 8080. Чтобы обеспечить минимальную безопасность необходимо их закрыть и оставить только 22 порт, который обеспечит доступ по ssh. При необходимости работы с сервером из внешнего контура, необходимо открыть порты. Поскольку доступ к серверу осуществляется через внутренний интерфейс, то мы рекомендуем закрывать все доступные порты.

Для этого используем UWF-файервол:

sudo ufw deny 26257
sudo ufw deny 8080
sudo ufw allow 22

 


Настройка узлов (общедоступный режим)

Добавление первого узла

Первый узел CockroachDB — cockroach-01 — запустит кластер. Но ничего особенного в его конфигурации нет: он просто запускается как один сервер СУБД, к которому затем присоединяются другие.

Для запуска кластера надо выполнить на cockroach-01 следующую команду (вместо имени cockroach-01 можно указать IP-адрес):

cockroach start --insecure --background --advertise-host=cockroach-01


Она запустит узел без SSL-шифрования (--insecure), вернёт командную строку для дальнейшей работы (--background) и поднимет узел для общения с другими узлами через внутренний IP (--advertise-host). Указанный выше cockroach_01_private_ip надо заменить на реальный внутренний IP первого сервера.
 

Обратите внимание, что при запуске узла можно задать ему ряд дополнительных флагов, меняющих поведение сервера (например, каталог, в котором хранятся данные). Все эти флаги описаны в официальной документации (на английском языке).


Теперь, когда узел (и кластер) начал работать, можно посмотреть сведения о нём через панель управления административного интерфейса Admin UI, встроенного в CockroachDB для получения информации о кластере. Зайдите по адресу http://cockroach_01_public_ip:8080 (теперь уже используется публичный IP).

О том, что узел успешно запущен, видно в интерфейсе:
 


Уведомительный восклицательный знак (!) в блоке NODE при наведении курсора мыши даст пояснение: кластер имеет слабый уровень репликации (Low Replication), потому что у вас недостаточно узлов. С одним узлом, который запущен сейчас, данные не будут восстановлены в случае падения (о том, сколько требуется узлов для стабильной работы, читайте ниже, в пункте 5).

Ситуация исправится на следующем этапе, когда мы добавим два дополнительных сервера как два узла кластера. Имея три узла, CockroachDB гарантирует наличие трёх копий всех данных, обеспечивая их восстановление в случае падения одного из узлов.
 

Добавление второго и третьего узлов к кластеру


Запустите на сервере cockroach-02 команду cockroach так же, как это было сделано для первого узла на предыдущем этапе, но с единственным отличием. В параметрах СУБД мы укажем, что необходимо присоединиться к первому узлу через внутренний IP-адрес. В команде ниже замените обе переменные с IP (cockroach_02_private_ip и cockroach_01_private_ip):
 

$ cockroach start --insecure --background \
--advertise-host=cockroach-02 \
--join=cockroach-01:26257


Выполните такую же команду на третьем сервере (cockroach-03), указав там его внутренний IP. Присоедините его тоже к первому узлу:
 

$ cockroach start --insecure --background \
--advertise-host=cockroach-03 \
--join=cockroach-01:26257


Зайдите в административный интерфейс (Admin UI) любого узла (например, http://cockroach_03_public_ip:8080) и убедитесь, что кластер теперь состоит из 3 узлов:



Все узлы соединены между собой и имеют доступ к одним и тем же данным.


Настройка узлов (защищенный режим)

После установки желательно настроить безопасный многоузловой кластер, использую  TLS сертификаты для шифровани траффика и безопасного подключения клиентов.

 

Создание сертификатов

  1. Создайте два локальных каталога (на рабочей машине, НЕ на сервере):

    mkdir certs
    mkdir my-safe-directory
    • certs: директория, где будет сгенерирован свой сертификат CA и все сертификаты и ключи узлов и клиентов в этом кластере, а затем загрузите некоторые файлы на свои узлы.
    • my-safe-directory: директория, где будет сгенерирован свой ключ CA в этом кластере, а затем мы будем ссылаться на этот ключ при создании сертификатов узла и клиента. Это секретный ключ, его не стоит загружать его на другие узлы.
  2. Создайте сертификат и ключ CA:

    cockroach cert create-ca \
    --certs-dir=certs \
    --ca-key=my-safe-directory/ca.key
    
  3. Создайте сертификат и ключ для первого узла, выданные для всех общих имен, которые вы можете использовать для ссылки на узел, а также на экземпляры балансировщика нагрузки:

    cockroach cert create-node \
    <node1 internal IP address> \
    <node1 external IP address> \
    $(hostname) \
    localhost \
    127.0.0.1 \
    --certs-dir=certs \
    --ca-key=my-safe-directory/ca.key
    
  4. Загрузите сертификат CA, сертификат узла и ключ на первый узел:

    Если у вас настроен sftp-доступ к серверу или имеется другой способ скопировать файлы на сервер, то скопируйте файлы node.crt, node.key  и ca.key в директорию ~/certs на сервер, иначе выполните следующие команды:

    • ssh <username>@<node1 address> "mkdir certs"
      
      scp certs/ca.crt \
      certs/node.crt \
      certs/node.key \
      <username>@<node1 address>:~/certs
      
    • Удалите локальную копию сертификата узла и ключа:

      rm certs/node.crt certs/node.key
      

      Примечание:

      Это необходимо, поскольку сертификаты и ключи для дополнительных узлов также будут иметь имена node.crt и node.keyВ качестве альтернативы удалению этих файлов вы можете запускать следующие cockroach cert create-node команды с --overwrite флагом.

  5. Создайте сертификат и ключ для второго, третьего и других узлов. (повторяйте шаги 3–4 для каждого узла).

  6. Создайте клиентский сертификат и ключ для root-пользователя:

    cockroach cert create-client \
    root \
    --certs-dir=certs \
    --ca-key=my-safe-directory/ca.key
    
  7. Загрузите сертификат CA, сертификат клиента и ключ на машины, с которых будет осуществляться подключение к нодам кластера:

    ssh <username>@<workload address> "mkdir certs"
    
    scp certs/ca.crt \
    certs/client.root.crt \
    certs/client.root.key \
    <username>@<workload address>:~/certs
    

    Далее мы опишем процедуру настройки подключения к защищенному кластеру.

 

Запуск узлов

Выполните на каждом узле команду:

cockroach start \
--certs-dir=certs \
--advertise-addr=<node1 address> \
--join=<node1 address>,<node2 address>,<node3 address> \
--cache=.25 \
--max-sql-memory=.25 \
--background

Надо повторить данную команду для всех нод кластера, меняя параметры IP-адресов каждого узла.

На локальном компьютере запустите cockroach init команду, чтобы завершить процесс запуска узлов и объединить их в кластер:

cockroach init --certs-dir=certs --host=<address of any node>

После запуска узлов, мы можем получить доступ к web-интерфейсу cockroach-кластера, обратившись на любой из узлов по порту 8080

Для доступа к консоли необходимо создать пользователя, для этого подлючаемся к любому из узлов

cockroach sql --certs-dir=certs --host=<address>
и создаем пользователя, используя команду sql
CREATE USER craig WITH PASSWORD 'ваш_пароль';


Подключение RiderDB

1. Создание объкта "Подключения к БД"

При создании нового проекта создается SQLite база данных, в которую переносятся все необходимые данные для запуска нового проекта (шаблоны, объекты) и проект стартуется с использованием этой базы данных.

При переключении базы данных на CockrouchDB необходимо создать объект подключения и выбрать его в настройках проекта, сохранить конфигурацию и перестартовать проект.

Создание объекта "подключения"

Выберите пункт меню "Системные" - "БД" - "Подключение к БД" и создайте объект подключения

Пример создания объекта подключения в БД

  • Название - любое название
  • Драйвер - выберите из списка (база CockrouchDB совместима с PostgreSQL и использует тот же драйвер. Выбираем postgres
  • Соединение/путь - строка подключения к вашей созданой базы данных (включает указание пользователя/путь к серверу/название базы)

 

Для одного проекта может быть настроено несколко обектов "подлючений" для работы в разных окружениях или с разными базами данных.

 

2. Создайте базу данных

Buildbox реализуем механизм ведения архива состояний баз данных, а также механизм миграции баз данных между различными драйверами.

Для этого необходимо создать базу данных во вкладке "Архив БД" с необходимым драйвером. При создании объекта база данных создается автоматически и копирует данные из текущей базы (хранилища).

Для активации созданной БД необходимо нажать "Активировать" и перестартовать сервис RiderDB (API).

 

3. Активация созданного "Подключения к БД"

После создания объект подключения и объекта текущей базы данных, перейдите в настройке проекта и выбери во вкладке "RiderDB" созданное подключение, а также выберите базу данных, которая используется для вашего сервиса в данный момент.

Сохраните конфигурацию  (нажмите "Сохранить конфигурацию") и сделайте рестарт сервиса (нажмите "Перезагрузить")


Настройка сервера

После установки и настройки кластера необходимо выполнить минимальные настройки.

Поскольку каждый проект автоматически создает собственную базу данных, а а данные приложений хранятся в автоматически генерируемых таблицах текущей базы данных необходимо настроить пользователя с необходимыми правами.

1. Войдите на любой из хостов вашего кластера

cockroach sql --certs-dir=certs --host=IP_адрес_или_доменное_имя_сервера

2. Создайте роль (пользователя), которого вы будете указывать в строке соединения с БД с необходимыми правами (работает с версии v20.2.5 и выше)

CREATE USER ваш_пользователь WITH CREATEDB LOGIN PASSWORD 'пароль' VALID UNTIL '2040-10-10';

Внимание! Настройка повторяет действия, которые вы выполняете выше при добавления пользователя для доступа к UI-интерфейсу. Вы можете сразу указать параметр CREATEDB и использовать одного пользователя и для доступа к UI и для подключения к базе данных.


Строка соединения

Незащищенный режим

Для подключения к БД необходимо использовать следующий формат подключения

postgresql://root@{IP_или_доменное_имя_сервера}:26257?sslmode=disable

Пример:

postgresql://root@cr01.server.com:26257?sslmode=disable

Внимание! Данный режим желательно использовать только для отладки либо только в защищенном контуре.

 

Защищенный режим

Для подключения к БД необходимо использовать следующий формат подключения

postgresql://{имя_пользователя}:{пароль}@{IP_или_доменное_имя_сервера}:26257?sslmode=require

Пример:

postgresql://pguser:pass123@cr01.server.com:26257?sslmode=require