- PVSM.RU - https://www.pvsm.ru -

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

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

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

Введение

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

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

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

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

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

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

Подготовка

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

  • Три сервера с 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 первого сервера.

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

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

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

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

Уведомительный восклицательный знак (!) в блоке 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 узлов:

Знакомство с СУБД CockroachDB и создание отказоустойчивого кластера с ней на Ubuntu 16.04 - 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 [6].

Заключение

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

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

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

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

Автор: jambo

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/replikatsiya/254427

Ссылки в тексте:

[1] CockroachDB: https://github.com/cockroachdb/cockroach/

[2] модели масштабируемости CockroachDB: https://www.cockroachlabs.com/docs/automated-scaling-and-repair.html

[3] replication zones: https://www.cockroachlabs.com/docs/configure-replication-zones.html

[4] создание сертификатов: https://www.cockroachlabs.com/docs/deploy-cockroachdb-on-digital-ocean.html#step-4-generate-certificates

[5] официальной документации: https://www.cockroachlabs.com/docs/start-a-node.html

[6] документации CockroachDB: https://www.cockroachlabs.com/docs/build-an-app-with-cockroachdb.html

[7] рекомендуемые настройки: https://www.cockroachlabs.com/docs/recommended-production-settings.html

[8] www.cockroachlabs.com/docs: https://www.cockroachlabs.com/docs/

[9] Источник: https://habrahabr.ru/post/327640/