- PVSM.RU - https://www.pvsm.ru -
Предисловие от переводчика: CockroachDB [1] — достаточно молодая реляционная СУБД с открытым кодом (лицензия Apache 2.0), изначально созданная быть распределённой (с горизонтальным масштабированием «из коробки») и отказоустойчивой. Её авторы из компании Cockroach Labs, созданной в 2015 году, задаются целью «совместить богатство функциональности SQL с горизонтальной доступностью, привычной для NoSQL-решений». Данное руководство написано одним из сотрудников компании-разработчика и опубликовано на сайте облачного провайдера DigitalOcean с целью познакомить ИТ-специалистов с этой СУБД и продемонстрировать её использование.
CockroachDB — распределённая СУБД (SQL) с открытым кодом, обеспечивающая согласованность данных, масштабируемость и выживаемость.
Настройка CockroachDB проста: устанавливаете её на нескольких серверах (узлах) и объединяете их в единое целое для совместной работы (кластер). Все узлы кластера действуют «симметрично» и предлагают доступ к одинаковым данным. Если хранилище для данных необходимо увеличить, то при используемой архитектуре достаточно создать новые узлы и присоединить к кластеру.
Подробности о том, как это работает, описаны в официальной документации по модели масштабируемости CockroachDB [2]. (Прим. перев.: при достижении одним из узлов лимита на объём хранимых данных CockroachDB попытается перераспределить данные по другим узлам, где ещё доступно свободное место. Фактор репликации определяется настройками replication zones [3].)
Обратите внимание, что на момент создания этого руководства [и его перевода — прим. перев.] CockroachDB имела статус бета-версии, поэтому рекомендуется использовать этот документ как способ знакомства с технологией, а не для деплоя продукта для использования в критически важном программном обеспечении.
Руководство не обеспечивает безопасного доступа к административному интерфейсу кластера; каждый может к нему обратиться, зная правильный URL. Если вы собираетесь использовать такую конфигурацию в production, не забудьте закрыть доступ к порту 8080 правилами firewall.
Поскольку это руководство описывает небезопасную инсталляцию без использования шифрования с SSL, она не рекомендуется для использования в production. За подробностями о безопасной инсталляции можно обратиться к более полной статье, в которой описано создание сертификатов [4], а затем каталог с ними добавляется как параметр при запуске каждого из узлов.
Перед тем, как начать, потребуются:
cockroach-01
, cockroach-02
, cockroach-03
.sudo ufw allow 26257/tcp
);sudo ufw allow 8080/tcp
).
Узнайте внутренний и внешний IP-адреса каждого сервера. Далее в руководстве для них будут использоваться обозначения вида cockroach_01_public_ip
и cockroach_01_private_ip
. Чтобы узнать внутренний IP в DigitalOcean, зайдите в панель управления и посмотрите на поле Private IP в верхнем блоке информации.
На каждом узле кластера должен быть исполняемый файл 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
). После этого можно настроить сам кластер.
Первый узел 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).
О том, что узел успешно запущен, видно в интерфейсе:
Уведомительный восклицательный знак (!) в блоке 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_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 и просмотреть результат с помощью встроенного 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/
).
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 строк доступны после отключения одного из узлов.
Теперь продемонстрируем корректную реакцию 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;
Для использования СУБД CockroachDB из приложения требуются:
Далее показан общий пример — для вашего приложения могут понадобиться другие данные.
Выберите и установите драйвер из списка совместимых с 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/
Нажмите здесь для печати.