Настройка кластера OrientDB в Ubuntu 16.04

OrientDB — это многомодельная база данных NoSQL с поддержкой графиков и документных баз данных. Это приложение Java может работать в любой операционной системе. OrientDB совместима с ACID и поддерживает кластеризацию и репликацию с несколькими мастерами, что упрощает горизонтальное масштабирование.

Понятие «кластер» в OrientDB имеет несколько значений:

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

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

Требования

  • Три сервера Ubuntu 16.04 (объем RAM должен быть рассчитан на поддержку кластера, 4GB должно хватить).
  • Пользователь с доступом к sudo (читайте руководство по начальной настройке сервера).
  • Брандмауэр.
  • Java на всех серверах (установить Java вам поможет это руководство). OpenJDK JRE также подойдет.
  • OrientDB на каждом сервере кластера. Установка СУБД описана здесь.
  • Настроенный сервис OrientDB (подробнее – здесь). Единственное изменение, которое вам нужно будет внести – это файл, который указывается в ExecStart. В исходном руководстве используется server.sh, но здесь используется dserver.sh (чтобы обозначить распределенный режим).

1: Root-пароль и имя OrientDB

Запустите сценарий dserver.sh, чтобы сгенерировать учетные данные для экземпляра OrientDB. Это поможет выбрать пароль root и имя экземпляра OrientDB.

Примечание: Выполните этот раздел на всех трех серверах.

Откройте каталог установки.

cd /opt/orientdb

Запустите распределенный сервер.

sudo bin/dserver.sh

При первом запуске распределенного сервера будет предложено указать пароль для учетной записи пользователя root. Это внутренняя учетная запись OrientDB, которая будет использоваться для доступа к серверу, для работы с OrientDB Studio (веб-интерфейсом OrientDB) и подключения к OrientDB с консоли. Если вы не укажете пароль, он будет сгенерирован автоматически. Рекомендуется выбрать пароль самостоятельно.

+---------------------------------------------------------------+
|                WARNING: FIRST RUN CONFIGURATION               |
+---------------------------------------------------------------+
| This is the first time the server is running. Please type a   |
| password of your choice for the 'root' user or leave it blank |
| to auto-generate it.                                          |
|                                                               |
| To avoid this message set the environment variable or JVM     |
| setting ORIENTDB_ROOT_PASSWORD to the root password to use.   |
+---------------------------------------------------------------+
Root password [BLANK=auto generate it]: *****
Please confirm the root password: *****

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

+---------------------------------------------------------------+
|         WARNING: FIRST DISTRIBUTED RUN CONFIGURATION          |
+---------------------------------------------------------------+
| This is the first time that the server is running as          |
| distributed. Please type the name you want to assign to the   |
| current server node.                                          |
|                                                               |
| To avoid this message set the environment variable or JVM     |
| setting ORIENTDB_NODE_NAME to the server node name to use.    |
+---------------------------------------------------------------+
Node name [BLANK=auto generate it]: node-name

Когда сценарий закончит работу, вы увидите:

2017-06-01 02:24:00:717 INFO  OrientDB Server is active v2.2.20 (build 76ab59e72943d0ba196188ed100c882be4315139). [OServer]

На этом этапе вы можете прервать процесс с помощью CTRL + C. Теперь нужно настроить кластер.

2: Настройка распределенного режима OrientDB

Чтобы экземпляр OrientDB работал как нода кластера, необходимо изменить три файла в его каталоге конфигурации:

  • hazelcast.xml: настраивает автоматическое обнаружение доступных нод.
  • default-distributed-db-config.json: предназначен исключительно для распределенной среды; он определяет поведение ноды для каждой базы данных.
  • orientdb-server-config.xml: основной конфигурационный файл OrientDB. В нем нужно указать режим работы OrientDB (распределенный или автономный).

Файл hazelcast.xml

Главный параметр, который нужно настроить в hazelcast.xml – это механизм, с помощью которого ноды подключаются к кластеру. Рассмотрим механизмы IP Multicast и TCP/IP-cluster. В первом случае нужно указать групповой адрес и порт, который прослушивает каждая нода; механизм IP Multicast автоматически обнаружит сеть. Во втором случае нужно указать IP-адрес каждого члена кластера. В руководстве используется второй механизм, TCP/IP-cluster.

Откройте файл:

sudo nano /opt/orientdb/config/hazelcast.xml

Файл не очень объемный. Изменить нужно следующие разделы файла:

. . .
<group>
<name>orientdb</name>
<password>orientdb</password>
</group>
<properties>
. . .
</properties>
<network>
<port auto-increment="true">2434</port>
<join>
<multicast enabled="true">
<multicast-group>235.1.1.1</multicast-group>
<multicast-port>2434</multicast-port>
</multicast>
</join>
</network>

Отключите многоадресную передачу IP, добавьте запись, которая включает TCP/IP- cluster и укажите ноды кластера. Рассмотрим каждый тег подробнее:

  • group > name: определяет имя кластера. Выберите любое имя.
  • group > password: определяет пароль для шифрования широковещательных сообщений, отправленных каждым членом для присоединения к кластеру. Выберите надежный пароль.
  • network > port: указывает порт для автоматического обнаружения нод. Атрибут auto-increment сообщает механизму номер порта, с которого можно начать; если этот порт используется, механизм проверит другие порты. Значение false определяет, что для соединения будет использоваться конкретный порт; обнаружение ноды завершится неудачно, если этот порт уже используется. В этом руководстве атрибут auto-increment будет отключен.
  • join > multicast: эти элементы используются для определения параметров многоадресной передачи IP. Поскольку в руководстве использовать многоадресную передачу IP мы не будем, атрибут enabled должен иметь значение false.
  • join > tcp-ip: определяет параметры TCP/IP-cluster. Атрибут enabled включает этот параметр.
  • join > tcp-ip > member: определяет все члены кластера. Существуют другие подходы к определению членов кластера, но в данном случае используется этот метод. Укажите IP-адрес каждого члена (по одному на строку).

Окончательная версия файла будет выглядеть так:

. . .
<group>
<name>clusterName</name>
<password>clusterPassword</password>
</group>
<properties>
. . .
</properties>
<network>
<port auto-increment="false">2434</port>
<join>
<multicast enabled="false">
<multicast-group>235.1.1.1</multicast-group>
<multicast-port>2434</multicast-port>
</multicast>
<tcp-ip enabled="true">
<member>your_master_server_ip_1</member>
<member>your_master_server_ip_2</member>
<member>your_replica_server_ip</member>
</tcp-ip>
</join>
</network>

Сохраните и закройте файл.

Файл default-distributed-db-config.json

В файл /opt/orientdb/config/default-distributed-db-config.json нужно внести всего несколько поправок. В этом файле можно указать роль ноды в кластере (master или replica).

Откройте файл:

sudo nano /opt/orientdb/config/default-distributed-db-config.json

Найдите следующий блок в файле:

{
"autoDeploy": true,
"readQuorum": 1,
"writeQuorum": "majority",
"executionMode": "undefined",
"readYourWrites": true,
"newNodeStrategy": "static",
"servers": {
"*": "master"
},
. . .
}

  • autoDeploy: указывает, следует ли развертывать базу данных для новой ноды, у которой нет БД.
  • readQuorum: Количество ответов от нод кластера необходимо согласовать, прежде чем отвечать клиенту. Установите значение 1 чтобы отключить эту функцию.
  • writeQuorum: определяет количество нод, которые должны ответить, прежде чем ответ будет отправлен клиенту. По умолчанию установлено значение majority. Оно вычисляется с помощью выражения (N/2) + 1, где N – количество доступных master нод в кластере. Ноды replica не учитываются при подсчете большинства. Если оставить значение по умолчанию в кластере с двумя нодами master, кворум никогда не будет достигнут в случае сбоя одной из них.
  • executionMode: определяет режим выполнения клиента (синхронный или асинхронный). По умолчанию значение зависит от клиента.
  • readYourWrites: указывает, учитывается ли ответ ноды для достижения кворума записи.
  • newNodeStrategy: говорит, что происходит, когда новая нода присоединяется к кластеру. При значении по умолчанию нода автоматически регистрируется в списке серверов.
  • Добавьте в файл следующие параметры:
  • hotAlignment: указывает, что произойдет, если нода остановится, а затем снова появится в сети. Сообщения синхронизации (если они включены) сохраняются в распределенной очереди, когда нода находится в автономном режиме. Когда она возвращается в сеть, она синхронизируется с помощью сообщений.
  • servers: определяет роль ноды в кластере (master или replica). По умолчанию звездочка * значит, что все ноды на сервере будут исполнять роль master. Чтобы создать кластер, который включает в себя два master и один сервер replica, измените этот параметр. Укажите имя каждой ноды и ее роль в кластере. Имя было выбрано в разделе 1.

В результате получится такой файл:

{
"replication": true,
"hotAlignment" : true,
"autoDeploy": true,
"readQuorum": 1,
"writeQuorum": "majority",
"executionMode": "undefined",
"readYourWrites": true,
"newNodeStrategy": "static",
"servers": {
"orientdb_server_name_1": "master",
"orientdb_server_name_2": "master",
"orientdb_server_name_3": "replica"
},
...
}

Сохраните и закройте файл.

Файл orientdb-server-config.xml

В файле /opt/orientdb/config/orientdb-server-config.xml есть параметр, который используется для включения и отключения кластеризации с помощью Hazelcast In-Memory Data Grid в OrientDB. Имя, которое вы предоставили экземпляру OrientDB в разделе 1, можно изменить в этом файле.

Откройте файл:

sudo nano /opt/orientdb/config/orientdb-server-config.xml

Найдите в начале файла следующий раздел. Обратите внимание, что значение параметра NodeName — это имя, которое вы указали в шаге 1:

. . .
<handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin">
<parameters>
<parameter value="${distributed}" name="enabled"/>
<parameter value="${ORIENTDB_HOME}/config/default-distributed-db-config.json" na$
<parameter value="${ORIENTDB_HOME}/config/hazelcast.xml" name="configuration.haz$
<parameter value="orientdb_server_name_1" name="nodeName"/>
</parameters>
</handler>
. . .

Чтобы включить кластеризацию, параметр enabled должен иметь значение true. Измените значение параметра. В результате файл выглядит так:

. . .
<handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin">
<parameters>
<parameter value="true" name="enabled"/>
<parameter value="${ORIENTDB_HOME}/config/default-distributed-db-config.json" na$
<parameter value="${ORIENTDB_HOME}/config/hazelcast.xml" name="configuration.haz$
<parameter value="orientdb_server_name_1" name="nodeName"/>
</parameters>
</handler>
. . .

Сохраните и закройте файл.

Осталось только разблокировать трафик OrientDB в брандмауэре.

3: Настройка брандмауэра

Если сейчас вы попытаетесь запустить кластер, трафик OrientDB будет заблокирован брандмауэром. Откорректируйте правила и разблокируйте трафик через следующие порты:

  • 2424 для бинарной связи.
  • 2434 для кластерных соединений.

Откройте эти порты.

sudo ufw allow 2424
sudo ufw allow 2434

Примечание: Порт 2480 используется для доступа к веб-интерфейсу OrientDB Studio. Он использует HTTP, потому соединение небезопасно. Однако если вы хотите открыть трафик по этому порту, введите:

sudo ufw allow 2480

Запустите UFW.

sudo systemctl restart ufw

Система OrientDB уже настроена как сервис Systemd (в руководстве по установке), поэтому теперь можно запустить кластер.

4: Запуск и тестирование кластера OrientDB

На каждом сервере добавьте сервис в автозагрузку.

sudo systemctl enable orientdb

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

sudo systemctl start orientdb

Проверьте состояние процессов.

sudo systemctl status orientdb
orientdb.service - OrientDB Server
Loaded: loaded (/etc/systemd/system/orientdb.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2017-06-01 02:45:53 UTC; 7s ago

Если сервер не запускается, найдите подсказки в выводе. Потенциальные источники ошибок: нехватка оперативной памяти, отсутствие Java JRE и файл JSON, который не прошел проверку. Не забудьте перезапустить OrientDB, если вы вносите изменения в любой из файлов, перечисленных в разделе 2.

Теперь нужно проверить работу кластера. На любой ноде отфильтруйте записи syslog, связанные с кластером:

sudo tail -f /var/log/syslog | grep -i dserver

С помощью этой команды вы можете убедиться, что все члены кластера находятся в сети (пример вывода можно найти ниже). Звездочка указывает, какой master является сервером-координатором.

-------------------+------+------------------------------------+-----+---------+-------------------+
|Name              |Status|Databases                           |Conns|StartedOn|Binary             |
-------------------+------+------------------------------------+-----+---------+-------------------+
|orientdb-replica-1|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:26:00 |111.111.111.111
|orientdb-master-2 |ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:25:13 |222.222.222.222
|orientdb-master-1*|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|6    |01:24:46 |333.333.333.333

Если серверы и их базы данных находятся в сети, есть вероятность, что кластер работает правильно. При подключении к одной из баз данных из консоли вы увидите аналогичный вывод, но с дополнительной информацией. Вы можете нажать CTRL+C, чтобы остановить этот вывод.

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

cd /opt/orientdb/bin
sudo ./console.sh

Последняя команда должна выдавать следующий вывод при запуске консоли (командная строка изменится на orientdb>).

OrientDB console v.2.2.17 (build UNKNOWN@r98dbf8a2b8d43e4af09f1b12fa7ae9dfdbd23f26; 2017-02-02 07:01:26+0000) www.orientdb.com
Type 'help' to display all the supported commands.
Installing extensions for GREMLIN language v.2.6.0
orientdb>

Теперь подключитесь к экземпляру сервера OrientDB. Эта команда просто подключается к экземпляру OrientDB, с помощью учетной записи пользователя root. Пароль был создан в разделе 3.

connect remote:localhost root root-password

Для примера создайте БД CallMeMaybe:

create database remote:localhost/CallMeMaybe root root-password plocal

Примечание: Если вы получили сообщение об ошибке Permission Denied или ему подобное, проверьте привилегии на каталог /opt/orientdb/databases. У учетной записи, создающей базу данных с консоли, должны быть права на чтение и запись этого каталога. Вы можете узнать больше о привилегиях Linux здесь.

На данный момент БД CallMeMaybe пуста. Добавьте в нее какие-нибудь данные, например класс.

create class Artist

Добавьте в него запись:

insert into Artist (id, name, age) values (01,'8host', 35)

Убедитесь, что запись появилась в БД.

select id, age, name from Artist

Вы увидите:

+----+----+----+------+
|#   |id  |age |name  |
+----+----+----+------+
|0   |1   |35  |8host |
+----+----+----+------+
1 item(s) found. Query executed in 0.216 sec(s).

Чтобы закрыть консоль, введите:

exit

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

ssh 8host@another_orientdb_server_ip

Запустите консоль:

cd /opt/orientdb/bin
sudo ./console.sh

Подключитесь к БД как admin, стандартный пользователь OrientDB.

connect remote:localhost/CallMeMaybe admin admin

Повторите запрос:

select id, age, name from Artist

Вы должны получить ту же таблицу.

Закройте консоль.

exit

Кластер из трех нод поддерживает репликацию данных.

Заключение

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

Читайте также:

Tags: ,