Как настроить кластер OrientDB в Ubuntu 16.04

Вступление

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

Однако слово «кластер» в OrientDB может относиться к двум различным понятиям:

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

  2. У вас также может быть кластер в OrientDBdatabase, который представляет собой группу записей аналогичного типа или значения. Такой кластер может также существовать на нескольких серверах или быть ограниченным одним сервером.

В этой статье основное внимание уделяется кластеру первого типа, т.е. кластер узлов. В кластерном режиме OrientDB работает в распределенной архитектуре с несколькими ведущими или без хозяев, что означает, что каждый узел в кластере работает на равной основе и может читать / записывать записи друг друга. Однако узел также может присоединиться к кластеру какreplica, где он работает в режиме только для чтения.

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

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

  • Три сервера Ubuntu 16.04 с достаточным количеством оперативной памяти для поддержки кластера. Это будет варьироваться в зависимости от ваших потребностей и от того, как вы настраиваете OrientDB, но 4 ГБ каждый является хорошим значением по умолчанию.

  • Учетная запись пользователя sudo без полномочий root и брандмауэр настроилиon each server с использованиемthis Initial Server Setup with Ubuntu 16.04 tutorial.

  • Java должна быть установлена ​​на всех серверах, что вы можете сделать, выполнивthe JDK 8 step of this Java installation guide. OpenJDK JRE также работает, поэтому, если вы не хотите принимать лицензию Oracle, вы можете установить JRE по умолчанию, используя тот же учебник.

  • OrientDB установилon each server, следуяStep 1 of the single server OrientDB installation guide точно так, как написано. При желании вы также можете выполнить Шаг 2, чтобы ограничить объем необходимой оперативной памяти; ожидается, что распределенный загрузочный скрипт OrientDB будет иметь как минимум 4 ГБ ОЗУ и не сможет запуститься, если обнаружит меньше, если вы не измените это.

  • OrientDB настроен как служба Systemdon each server, следуяSteps 5 and 6 of the single server OrientDB installation guide, останавливаясь после перезагрузки модулей (т.е. без запуска сервиса). Единственное изменение, которое вам нужно сделать, - это файл, который вы указали дляExecStart в файле модуля. В исходном руководстве используетсяserver.sh, но здесь используетсяdserver.sh для распределенного режима.

[[шаг-1 -—- генерация-root-пароля-и-orientdb-instance-name]] == Шаг 1. Генерация корневого пароля и имени экземпляра OrientDB

Сначала мы запустим сценарий распределенного сервераdserver.sh, чтобы сгенерировать учетные данные, необходимые экземпляру OrientDB для работы в кластере. В частности, это позволит нам установить пароль и имя root для экземпляра OrientDB. Вам нужно будет выполнить этот шаг наall three servers.

Для начала перейдите в каталог установки.

cd /opt/orientdb

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

sudo bin/dserver.sh

При первом запуске распределенного сервера вам будет предложено указать пароль для учетной записи пользователяroot. Это внутренняя учетная запись OrientDB, которая будет использоваться для доступа к серверу для таких вещей, как OrientDB Studio, веб-интерфейс для управления OrientDB и подключение к OrientDB из консоли. Если вы не укажете пароль здесь, он будет создан автоматически. Однако лучше указать один из них, так что делайте это, когда выдается следующее приглашение:

Output+---------------------------------------------------------------+
|                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, которое может совпадать с именем облачного сервера, на котором он работает.

Output+---------------------------------------------------------------+
|         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

Когда скрипт завершит работу, вы увидите следующую строку:

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

На этом этапе вы можете завершить процесс, используяCTRL+C. Теперь, когда OrientDB установлен, нам нужно изменить несколько файлов конфигурации, чтобы он работал как кластер.

[[step-2 -—- configuring-orientdb-to-function-in-distribution-mode]] == Шаг 2 - Настройка OrientDB для работы в распределенном режиме

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

  1. hazelcast.xml: параметры, определенные в этом файле, делают возможным автоматическое обнаружение узлов.

  2. default-distributed-db-config.json: этот файл предназначен исключительно для использования в распределенной среде и используется для определения поведения узла для каждой базы данных.

  3. orientdb-server-config.xml: это основной файл конфигурации OrientDB, который необходимо изменить как в распределенном, так и в автономном режиме.

На этом этапе мы изменим каждый файл, начиная сhazelcast.xml.

Изменение файлаhazelcast.xml

Самый важный параметр, который вам нужно настроить вhazelcast.xml, - это механизм, который каждый узел будет использовать для присоединения к кластеру. В этом разделе мы рассмотрим два механизма:IP Multicast иTCP/IP-cluster. В первом случае вы указываете адрес многоадресной рассылки и порт, который будет использоваться каждым узлом для автоматического обнаружения сети, к которой он принадлежит. С последним, IP-адрес каждого члена кластера должен быть указан. Поскольку многоадресная рассылка IP не поддерживается в DigitalOcean, здесь мы будем использовать TCP / IP-кластер.

Для начала откройте файл для редактирования:

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

Файл не очень длинный. Это усеченная версия, показывающая только те части файла, которые вы хотите изменить:

/opt/orientdb/config/hazelcast.xml

. . .
    
        orientdb
        orientdb
    
    
        . . .
    
    
        2434
        
            
                235.1.1.1
                2434
            
        
    

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

  • group > name: этот элемент определяет имя кластера. Вы можете выбрать все, что вам нравится.

  • group > password: определяет пароль, используемый для шифрования широковещательных сообщений, отправляемых каждым участником для присоединения к кластеру. Выберите надежный пароль здесь.

  • network > port: определяет порт, используемый для автоматического обнаружения узлов. Атрибутauto-increment дает указание механизму начать с определенного порта и продолжать попытки других, если этот порт используется. Если установить значение false, определенный порт будет использоваться для связи, и обнаружение узла не будет выполнено, если порт уже используется. Для этой статьи атрибут будет отключен.

  • Элементыjoin > multicast используются для определения параметров многоадресной рассылки IP. Вы не будете использовать многоадресную IP-рассылку, поэтому мы их проигнорируем. Это означает, что мы установим атрибутenabled в значение false.

  • join > tcp-ip: используется для определения параметров, связанных с TCP / IP-кластером. Атрибутenabled используется для его включения.

  • join > tcp-ip > member: определяет каждого члена кластера. Существуют и другие подходы к определению каждого участника, но мы будем придерживаться этого, где указан IP-адрес каждого участника (по одному на строку).

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

/opt/orientdb/config/hazelcast.xml

. . .
    
        clusterName
        clusterPassword
    
    
        . . .
    
    
        2434
        
            
                235.1.1.1
                2434
            
            
                your_master_server_ip_1
                your_master_server_ip_2
                your_replica_server_ip
            
        
    

Сохраните и закройте файл, когда вы закончите редактировать его. Далее идет второй файл в нашем списке.

Изменение файлаdefault-distributed-db-config.json

Как и в случае сhazelcast.xml, мы внесем лишь несколько изменений в/opt/orientdb/config/default-distributed-db-config.json. Именно в этом файле вы указываете роль (мастер или реплика), которую каждый сервер должен играть в кластере.

Откройте его для редактирования.

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

Соответствующая часть файла показана в блоке кода ниже:

/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 - количество доступных главных узлов в кластере. Узлы реплики не учитываются при расчете большинства. Если оставить значение по умолчанию в кластере с двумя основными узлами, кворум никогда не будет сформирован, если один из узлов выйдет из строя.

  • executionMode: определяет режим выполнения клиента - синхронный или асинхронный. Значение по умолчанию позволяет клиенту решить.

  • readYourWrites: указывает, считается ли ответ узла достижением кворума записи.

  • newNodeStrategy: что происходит, когда новый узел присоединяется к кластеру. При значении по умолчанию узел автоматически регистрируется в списке серверов.

Мы добавим следующие параметры:

  • hotAlignment: указывает, что произойдет, если узел выйдет из строя, а затем вернется в оперативный режим. Если этот параметр включен, сообщения синхронизации хранятся в распределенной очереди, когда узел находится в автономном режиме. Когда он возвращается в оперативный режим, он запускает фазу синхронизации, опрашивая все сообщения синхронизации в очереди.

  • servers: используется для указания роли (мастер или реплика) узлов в кластере. По умолчанию звездочка* используется для обозначения того, что все узлы на сервере будут мастерами. Поскольку мы намерены создать кластер, который включает в себя два мастера и одну реплику, мы изменим этот параметр, чтобы он соответствовал, указав имя каждого узла и роль, которую он будет играть в кластере. Имя - это то, что вы настроили на шаге 1.

Когда вы закончите изменять файл, он должен выглядеть следующим образом:

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

{
  "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 в памяти в OrientDB. В этом файле можно изменить имя, которое вы дали экземпляру OrientDB (или автоматически сгенерировал скрипт) на шаге 1.

Откройте его для редактирования.

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

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

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

. . .

    
        
        
    

. . .

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

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

. . .

    
        
        
    

. . .

Когда вы закончите редактирование файла, сохраните и закройте его.

Единственное, что осталось до того, как мы сможем запустить и протестировать кластер, это разрешить трафик OrientDB через брандмауэр.

[[шаг-3 -—- Allow-orientdb-traffic-through-the-firewall]] == Шаг 3 - Разрешение трафика OrientDB через брандмауэр

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

  • 2424, используется для двоичной связи

  • 2434, используется для обмена кластерными сообщениями

Откройте порты2424 и2480.

sudo ufw allow 2424
sudo ufw allow 2434

[.Примечание]##

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

sudo ufw allow 2480

Далее перезапустите UFW.

sudo systemctl restart ufw

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

[[step-4 -—- start-and-testing-the-orientdb-cluster]] == Шаг 4 - Запуск и тестирование кластера OrientDB

На каждом сервере убедитесь, что служба включена, чтобы она запускалась при загрузке.

sudo systemctl enable orientdb

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

sudo systemctl start orientdb

Проверьте состояние процесса, чтобы убедиться, что они запущены правильно.

sudo systemctl status orientdb

Вы увидите вывод, который выглядит следующим образом:

Output● 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

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

Когда процесс запущен правильно, давайте проверим, работает ли кластер правильно. На любом из трех узлов отфильтруйте записи системного журнала, относящиеся к кластеру:

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

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

Output-------------------+------+------------------------------------+-----+---------+-------------------+
|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, чтобы остановить этот вывод.

Чтобы проверить репликацию новых данных в кластере, вам нужно сгенерировать некоторые данные на одном сервере, а затем посмотреть, реплицируются ли они на другие серверы. On one of the master servers, запустите консоль с помощью следующей пары команд:

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

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

OutputOrientDB 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

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

[.note] #Note: Если вы получаете сообщение об ошибке «Permission denied» или подобное, проверьте разрешения в каталоге/opt/orientdb/databases. Учетная запись, создающая базу данных из консоли, должна иметь разрешения на чтение и запись в эту папку. Вы можете узнать больше вthis Linux permissions tutorial.
#

Прямо сейчасCallMeMaybe по-прежнему остается пустой базой данных. Просто для того, чтобы получить некоторые тестовые данные, давайте добавим к ним класс:

create class Artist

Затем вставьте в него запись:

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

Убедитесь, что новая база данных теперь содержит только что вставленную запись:

select id, age, name from Artist

Если все прошло хорошо, результат должен быть примерно таким:

Output+----+----+----+------+
|#   |id  |age |name  |
+----+----+----+------+
|0   |1   |35  |sammy |
+----+----+----+------+

1 item(s) found. Query executed in 0.216 sec(s).

Вы можете выйти из консоли сейчас.

exit

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

ssh sammy@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, состоящий из трех узлов, выполняющих разные роли (мастер или реплика). С такой настройкой легко изменить количество узлов. Еще проще, интереснее и меньше задач будет использоватьa configuration management tool like Ansible для автоматизации развертывания такого кластера.

На данный момент вам, возможно, захочетсяconsult this OrientDB security guide узнать, как защитить каждый узел в кластере. Официальная документация по администрированию OrientDB доступна наproject’s documentation site, а для получения дополнительной информации о Hazelcast посетитеthe Hazelcast documentation.

Related