Настройка кластера Elasticsearch + Cassandra

Кластер — это определенное количество серверов, объединенных в группу и образующих единый ресурс. Данное решение позволяет повысить надёжность, доступность и производительность системы и предназначено для исключения простоев в её работе.

Платформа Arta Synergy использует хранилище Cassandra и индексатор Elasticsearch, позволяющие создавать кластеры как для распределения нагрузки, так и для сохранения доступности данных.

В данной инструкции приведены минимальные настройки следующей конфигурации:

Figure 3.8. Конфигурация серверов

Конфигурация серверов

Примечание

На всех серверах время должно быть синхронизировано.

MySQL

На сервере Synergy для MySQL нужно указать пути к БД в конфигурационном файле standalone-onesynergy.xml, а также логин и пароль пользователя с доступом к MySQL, если они отличаются от установленных по умолчанию:

                <xa-datasource jndi-name="java:/SynergyDS" pool-name="synergy_ds" enabled="true" use-ccm="fals$
                    <xa-datasource-property name="URL">
        -->                jdbc:mysql://192.168.2.3:3306/synergy?useUnicode=true&amp;characterEncoding=utf8
                    </xa-datasource-property>
                    <driver>com.mysql</driver>
                    <xa-pool>
                        <min-pool-size>20</min-pool-size>
                        <max-pool-size>400</max-pool-size>
                        <is-same-rm-override>false</is-same-rm-override>
                        <interleaving>false</interleaving>
                        <pad-xid>false</pad-xid>
                        <wrap-xa-resource>false</wrap-xa-resource>
                    </xa-pool>
                    <security>
         -->               <user-name>root</user-name>
         -->               <password>root</password>
                    </security>
           ...  
                </xa-datasource>

Аналогично для StorageDS, для версий Arta Synergy ниже 4.1 - jbpm.

В нашем примере сервер MySQL имеет ip-адрес 192.168.2.3 и стандартные учётные данные пользователя. Для применения изменений Wildfly/ JBoss должен быть перезапущен.

Затем на сервере MySQL нужно дать все права пользователю, который будет подключаться с сервера Synergy:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'ip-адрес_сервера_Synergy' WITH GRANT OPTION IDENTIFIED BY 'root';

mysql> FLUSH PRIVILEGES;

Проверить подключение с сервера Synergy можно так:

# mysql -u {username} -p'{password}' -h {remote server ip or name} -P {port} -D {DB name}

В нашем случае:

# mysql -uroot -proot -h 192.168.2.3 -P 3306 -D synergy

Elasticsearch

В рассматриваемой конфигурации используется один главный узел и 3 узла с данными Elasticsearch. Главный узел в примере не хранит данные и используется только для извлечения данных и группирования результатов.

Настройки на сервере Synergy осуществляются в файле /opt/synergy/jboss/standalone/configuration/arta/elasticConfiguration.xml, где нужно указать ip-адрес главного узла:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.arta.kz/xml/ns/ai"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.arta.kz/xml/ns/ai http://www.arta.kz/xml/ns/ai/index.xsd">
    <!-- URL доступа к серверу Elasticsearch -->
    <url>http://192.168.2.111:9200/</url>
    ...
</configuration>

Также следует убедиться, что в нужных конфигурационных файлах (fileIndex.xml, docIndex.xml, formIndex.xml) индексатором установлен Elasticsearch. Для применения изменений Wildfly/ JBoss должен быть перезапущен.

На сервере главного узла в файле /etc/elasticsearch/elasticsearch.yml нужно раскомментировать либо добавить следующие параметры:

cluster.name: elastic_cluster - имя кластера, указывается на всех нодах кластера;

node.name: elastic_master - имя данного узла;

network.host: 192.168.2.111 - указать ip-адрес узла;

discovery.zen.ping.unicast.hosts: ["192.168.4.0", "192.168.0.155", "192.168.2.158", "192.168.2.111"] - перечислить ip-адреса всех нод кластера;

discovery.zen.minimum_master_nodes: 1 - число серверов объединения процессов, требуемых для кворума кластера, так как в конфигурации используется один главный узел, нужно указать 1;

Примечание

В кластере должно использоваться нечётное число главных узлов, например, 1, 3, 5. В этом параметре используется число, равное n/2 +1, где n - количество главных узлов.

node.master: true - назначает экземпляр Elasticsearch главным узлом;

node.data: false - параметр указывает, что узел не будет хранить данные.

На 3 серверах, содержащих узлы Elasticsearch с данными, должны быть указаны такие параметры:

cluster.name: elastic_cluster

node.name: имя_узла

network.host: ip_адрес_данного_узла

discovery.zen.ping.unicast.hosts: ["192.168.4.0", "192.168.0.155", "192.168.2.158", "192.168.2.111"]

discovery.zen.minimum_master_nodes: 1

node.master: false - указать, что узел не является главным;

node.data: true - узел будет хранить данные;

Для применения изменений нужно перезапустить Elasticsearch на всех нодах.

Проверить состояние узлов можно так:

# curl 'http://192.168.2.158:9200/_cat/nodes?v'
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.2.111           41          98  29    1.50    1.41     1.31 mi        *      elastic_master
192.168.4.0             31          99  15    2.58    2.36     2.19 di        -      cassel1
192.168.0.155           26          99  15    2.58    2.36     2.19 di        -      cassel2
192.168.2.158           16          98  28    1.50    1.41     1.31 di        -      cassel3

Проверить состояние кластера:

# curl 'http://192.168.2.158:9200/_cluster/health?pretty'
{
  "cluster_name" : "elastic_cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 340,
  "active_shards" : 1020,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

Статус кластера определяется на уровне шардов (фрагментов). Возможные статусы:

  • green - все фрагменты доступны;

  • yellow - основной фрагмент размещён, но некоторые реплики фрагментов пока нет;

  • red - часть фрагментов недоступна.

Примечание

Каждый документ хранится в одном основном фрагменте (shard). Когда документ индексируется, он сперва индексируется на основном фрагменте, а затем на всех его копиях (replicas).

Cassandra

Настройки на сервере Synergy производятся в конфигурационных файлах /opt/synergy/jboss/standalone/configuration/arta/jcr/jcr-cassandra.xml и /opt/synergy/jboss/standalone/configuration/arta/jcr/ss4c-cassandra.xml.

В них следует указать ip-адреса всех нод Cassandra, в hostName добавить ip одной из нод и выбрать уровень согласованности:

<configuration>
    <nodes>
        <node>
            <host>192.168.4.0</host>
            <port>9042</port>
        </node>
    </nodes>
    <nodes>
        <node>
            <host>192.168.0.155</host>
            <port>9042</port>
        </node>
    </nodes>
    <nodes>
        <node>
            <host>192.168.2.158</host>
            <port>9042</port>
        </node>
    </nodes>
    <hostName>192.168.4.0</hostName>
    ...
    <consistency-level>QUORUM</consistency-level>
</configuration>

Выбранный в данном случае уровень QUORUM означает, что координатор кластера дожидается подтверждения записи от более чем половины узлов, в описываемой конфигурации от 2. Уровни согласованности можно подробнее изучить в официальной документации.

Нужно также проверить, что в standalone-onesynergy.xml в секции resource-adapters отсутствуют либо закомментированы строки, относящие к хранилищу Jackrabbit

Для применения изменений Wildfly/ JBoss должен быть перезапущен.

На серверах, содержащих ноды Cassandra, нужно указать следующие параметры в /etc/cassandra/cassandra.yaml:

cluster_name: 'Synergy Cluster' - имя кластера Cassandra;

listen_address: ip-адрес_узла - для каждого узла указать его ip;

rpc_address: ip-адрес_узла - для каждого узла указать его ip;

seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          - seeds: "192.168.4.0, 192.168.0.155" - перечислить ip-адреса раздающих узлов кластера. Не нужно делать все узлы кластера раздающими.

Более подробно настройка параметров для промышленного развёртывания описана в соответствующем разделе.

Затем нужно перезапустить Cassandra на всех серверах кластера. Состояние кластера можно проверить так:

# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens       Owns (effective)  Host ID                               Rack
UN  192.168.0.155  250.21 MB  256          100.0%            35c9844a-ae5e-429a-bff0-4a3b9c29b8c3  rack1
UN  192.168.2.158  250.3 MB   256          100.0%            21b89eea-9779-46d5-9ac8-7096f03764a7  rack1
UN  192.168.4.0    250.24 MB  256          100.0%            ecf9e4a8-4500-4462-aeb8-31f33c1c7bfb  rack1