Введение
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
).
- 26257 — для взаимодействия между узлами и с приложением (
- Опционально: установите и настройте 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 из приложения требуются:
- драйвер, поддерживаемый приложением (CockroachDB работает с драйверами для PostgreSQL);
- строка подключения.
Далее показан общий пример — для вашего приложения могут понадобиться другие данные.
Выберите и установите драйвер из списка совместимых с 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.
Комментарии (16)
YourChief
04.05.2017 23:10Уже релиз первой версии близится, а ни одного бенчмарка не видно.
shurup
05.05.2017 05:41+1Ощущение, что ждут финального релиза… Вот тут что-то пытаются сделать.
There's a generic KV, YCSB, and TPC-H. TPC-C isn't added yet, but likely will be in the near future.
(Нашел в issue #2650: perf: does cockroach have some benchmark tool?)
blind_oracle
05.05.2017 11:03+2Он уже несколько лет близится :)
Я когда выбирал БД для своего проекта, тестировал таракана. Скорость не особо порадовала, в кластере из 3 нод на достаточно неплохом оборудовании скорость записи была около 3к запросов в секунду даже большим кол-вом потоков. В итоге забил на него и взял Кассандру, не жалею — на том же «железе» выдает х15 TPS.youROCK
05.05.2017 12:37Они выпустили 1.0rc1, так что релиз сейчас всё же немножко ближе, чем несколько лет назад :). Сами авторы не рекомендовали использовать в продакшене эту базу до наступления 1.0. Ну и они честно говорили, что не пытались особо не оптимизировать производительность до недавнего времени.
dmrt
05.05.2017 11:19Какие книжки читали создатели CockroachDB?
shurup
05.05.2017 12:38+1Если всерьёз хочется оценить их техническую адекватность и подготовку, есть большой документ про архитектуру CockroachDB.
Компанию основали выходцы из Google, работавшие там над Google File System (которая с BigTable), а среди их инвесторов — директор Hortonworks, CEO в CoreOS и соучредитель Cloudera.
YourChief
05.05.2017 11:48Приведу один яркий комментарий из обсуждения новости на news.ycombinator.com по поводу этой базы:
chillydawg 77 days ago [-]
But why scale something when you can just run one postgres instance and provide 10000x the performance?youROCK
05.05.2017 12:42+2Причин несколько:
1. Automatic failover. Если вы хотите работать без downtime в случае проблем с мастером, то вам нужна подобная база
2. Ограниченность диска одной ноды. Зачастую в больших системах нагрузка на базы в плане RPS не очень большая за счет кеширования, а вот самих данных очень много и они не помещаются на один узел ни при каких условиях
3. Если у вас всё же есть несколько нод по причине (2), то вам нужны распределенные транзакции. Мне неизвестно ни об одной opensource базе данных, которая бы распределенные транзакции поддерживала на уровне CockroachDB (т.е. вы просто делаете транзакцию и не думаете о том, на каком наборе узлов она выполняется, и база гарантирует, что если транзакция закоммитилась, то данные будут доступны даже при фейле N узлов, а если транзакция не закоммитилась, то данных не будет нигде, в том числе в случае временных фейлов N узлов, участвовавших в транзакции).
В общем, если вам нравится SQL и транзакции, и вам нужен большой кластер, то особого выбора у вас нет.YourChief
05.05.2017 14:52Фэйловер и без таких систем давно научились организовывать. Остаются только соображения ёмкости/производительности. Большой кластер с пропускной способностью 20-40 QPS? Это лишено смысла.
Дело они делают, конечно же, нужное, но в таком виде как сейчас их кластер не может конкурировать с одиночной инсталляцией.
blind_oracle
05.05.2017 15:18+1Касаемо транзакций — я бы не особо доверял заверениям о «Distributed ACID», все же CAP-теорему не так просто обмануть. Тот же гугль со своим Spanner обошел ее ограничения используя свои приватные ДЦ и атомные часы /
GPS для идеальной синхронизации времени.
Хотя я конечно глубоко в таракана не глядел.
nesselrode
07.05.2017 05:55Не совсем понятно, что с версией под windows. Скачал архив, размером в 2хх байт, а в нем exe в 0 байт… С оф. сайта
yusman
Не узнаю вас в гриме. :-)
shurup
А они и не скрывают, что особенно хорошо видно в контексте клиентских библиотек… :-) Вот такое сравнение PgSQL с Cockroach встречал. Уже старое, правда, но вряд ли многое принципиально изменилось.