GrabDuck

Знакомство с СУБД CockroachDB и создание отказоустойчивого кластера с ней на Ubuntu 16.04

:

Предисловие от переводчика: CockroachDB — достаточно молодая реляционная СУБД с открытым кодом (лицензия Apache 2.0), изначально созданная быть распределённой (с горизонтальным масштабированием «из коробки») и отказоустойчивой. Её авторы из компании Cockroach Labs, созданной в 2015 году, задаются целью «совместить богатство функциональности SQL с горизонтальной доступностью, привычной для NoSQL-решений». Данное руководство написано одним из сотрудников компании-разработчика и опубликовано на сайте облачного провайдера DigitalOcean для того, чтобы познакомить ИТ-специалистов с этой СУБД и продемонстрировать её использование.

Введение


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

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

Подробности о том, как это работает, описаны в официальной документации по модели масштабируемости CockroachDB. (Прим. перев.: при достижении одним из узлов лимита на объём хранимых данных CockroachDB попытается перераспределить данные по другим узлам, где ещё доступно свободное место. Фактор репликации определяется настройками replication zones.)

Обратите внимание, что на момент создания этого руководства [и его перевода — прим. перев.] CockroachDB имела статус бета-версии, поэтому рекомендуется использовать этот документ как способ знакомства с технологией, а не для деплоя продукта для использования в критически важном программном обеспечении.

Руководство не обеспечивает безопасного доступа к административному интерфейсу кластера; каждый может к нему обратиться, зная правильный URL. Если вы собираетесь использовать такую конфигурацию в production, не забудьте закрыть доступ к порту 8080 правилами firewall.


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

Подготовка


Перед тем, как начать, потребуются:
  • Три сервера с Ubuntu 16.04 с 2+ Гб RAM и включённой опцией Private Networking [для DigitalOcean]. Все они должны находиться в одном регионе. В качестве их имён далее в статье будут использоваться: cockroach-01, cockroach-02, cockroach-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_01_private_ip. Чтобы узнать внутренний IP в DigitalOcean, зайдите в панель управления и посмотрите на поле Private IP в верхнем блоке информации.

1. Установка CockroachDB


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

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

$ ssh sammy@cockroach_01_public_ip
$ wget https://binaries.cockroachdb.com/cockroach-latest.linux-amd64.tgz?s=do
$ tar -xf cockroach-latest.linux-amd64.tgz?s=do --strip=1 cockroach-latest.linux-amd64/cockroach
$ sudo mv 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). После этого можно настроить сам кластер.

2. Настройка первого узла


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

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

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

Она запустит узел без 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 гарантирует наличие трёх копий всех данных, обеспечивая их восстановление в случае падения одного из узлов.

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


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

Выполните такую же команду на третьем сервере ( cockroach-03), указав там его внутренний IP. Присоедините его тоже к первому узлу:
$ cockroach start --insecure --background \
    --advertise-host=cockroach_03_private_ip \
    --join=cockroach_01_private_ip:26257

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

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

4 (опционально). Демонстрация переноса данных между узлами


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

На первом узле cockroach-01 сгенерируйте данные:

$ cockroach gen example-data | cockroach sql

Появится база данных для экспериментов startrek. Теперь можно запустить SQL-клиент и увидеть список баз данных в кластере:
$ cockroach sql
> SHOW DATABASES;
+--------------------+
|      Database      |
+--------------------+
| information_schema |
| pg_catalog         |
| startrek           |
| system             |
+--------------------+

Обратите внимание, что CockroachDB работает с собственным SQL-диалектом, обладающим расширениями стандарта SQL, которые отличаются от предлагаемых другими СУБД.

На втором узле cockroach-02 можно выполнить те же команды:
$ cockroach sql
> SHOW DATABASES;

Легко увидеть, что созданные на одном узле данные (база данных startrek) доступны и на других узлах. Просмотреть список существующих в кластере баз данных можно на вкладке DATABASES интерфейса Admin UI на любом из узлов (например, http://cockroach_01_public_ip:8080/#/databases/).

5 (опционально). Удаление узла из кластера


CockroachDB гарантирует доступность и целостность данных в случае отказа сервера. СУБД остаётся устойчивой в случае отказа (n-1)/2 узлов, где n — общее количество узлов в кластере. Таким образом, в нашем примере с тремя узлами возможно падение одного узла (без потери каких-либо данных).

Чтобы это продемонстрировать, удалим один узел из кластера и посмотрим, доступны ли по-прежнему данные. Затем (в пункте 6) снова присоединим узел к кластеру и убедимся, что он получит все изменения, случившиеся за время его отказа.

На втором узле cockroach-02 запустите SQL-клиент и посчитайте количество строк в таблице quotes:

$ cockroach sql
> SELECT COUNT(*) FROM startrek.quotes;

Ответом будет 200 строк. Выйти из SQL-клиента можно нажатием на <Ctrl>+<c>.

Теперь удалите этот узел из кластера и убедитесь, что данные остались на других узлах. Для этого на узле cockroach-02 завершите процесс CockroachDB командой:

$ cockroach quit

Зайдите на другой узел (например, cockroach-03), запустите SQL-клиент и проверьте количество строк той же таблицы:
$ cockroach sql
 SELECT COUNT(*) FROM startrek.quotes;

Те же 200 строк доступны после отключения одного из узлов.

6 (опционально). Повторное присоединение узла к кластеру


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

На одном из работающих узлов (например, cockroach-03) удалите часть данных из таблицы quotes:


> DELETE FROM startrek.quotes WHERE episode > 50;
> SELECT COUNT(*) FROM startrek.quotes;

Осталось 133 строки. Вернитесь на узел, исключённый из кластера ( cockroach-02), и снова запустите его:
$ cockroach start --insecure --background \
    --advertise-host=cockroach_02_private_ip \
    --join=cockroach_01_private_ip:26257

Здесь же запустите SQL-клиент и проверьте количество строк в таблице quotes
$ cockroach sql
> SELECT COUNT(*) FROM startrek.quotes;

Вывод должен снова показывать 133. Таким образом, находившийся в offline узел получил изменения при возвращении в кластер.

Чтобы удалить все сгенерированные ранее данные, выполните в cockroach sql:


> DROP TABLE quotes;
> DROP TABLE episodes;
> DROP DATABASE startrek;

7 (опционально). Подключение приложения


Для использования СУБД CockroachDB из приложения требуются:
  1. драйвер, поддерживаемый приложением (CockroachDB работает с драйверами для PostgreSQL);
  2. строка подключения.

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

Выберите и установите драйвер из списка совместимых с PostgreSQL клиентов для своего приложения.

Обратите внимание, что хотя CockroachDB и поддерживает протокол PostgreSQL, синтаксис её языка SQL отличается и посему эта СУБД не является готовой заменой PostgreSQL.

Строка подключения должна указывать на порт 26257 и IP-адрес любого из узлов кластера. Заметьте, что firewall должен разрешать подключения на этот порт.

Например, подключение в PHP/PDO для пользователя sammy к базе данных bank на локальной машине ( localhost) будет выглядеть так:

PDO('pgsql:host=localhost;port=26257;dbname=bank;sslmode=disable',
    'sammy', null, array(
      PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_EMULATE_PREPARES => true,
  ));

Многочисленные примеры по использованию драйверов клиента PostgreSQL для разных языков программирования доступны в документации CockroachDB.

Заключение


Созданный кластер из трёх узлов помог продемонстрировать базовые функции СУБД CockroachDB и возможность подключения к ней приложения.

Поскольку CockroachDB активно развивается, однажды в своей панели управления вы увидите сообщение о доступности новой версии продукта ( There is a newer version of CockroachDB available). По кнопке Update будет доступна ссылка на обновлённый бинарный файл, скачивание и установка которого на данный момент требует ручного вмешательства.

Для горизонтального масштабирования инсталляции СУБД, т.е. добавления новых узлов, нужно повторить шаги, выполнявшиеся для второго и третьего узлов: достаточно установить исполняемый файл cockroach и запустить его с подключением к кластеру.

Перед запуском CockroachDB в production, пожалуйста, изучите рекомендуемые настройки. Основная ссылка на официальную документацию по продукту (на английском языке) — www.cockroachlabs.com/docs.

Обновлено (11 мая): финальный релиз CockroachDB 1.0 уже состоялся. В его официальном анонсе заявляется, что СУБД используется в production компаниями Baidu и Heroic Labs.