Как использовать Ansible для настройки производственного кластера Elasticsearch

Вступление

В этом руководстве мы покажем, как использовать Ansible, инструмент управления конфигурацией, для установки производственного кластера Elasticsearch на Ubuntu 14.04 или CentOS 7 в среде облачного сервера. Мы будем опираться на How Use Ansible и Tinc VPN защитить вашу серверную инфраструктуру, чтобы гарантировать, что ваши узлы Elasticsearch будут защищены от компьютеров вне вашей собственной сети.

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

Предпосылки

У вас должно быть как минимум три сервера Ubuntu 14.04 или CentOS 7 с частной сетью, чтобы завершить это учебное пособие, поскольку кластер Elasticsearch должен иметь как минимум 3 подходящих для мастера узла. Если вы хотите иметь выделенные главные узлы и узлы данных, вам потребуется как минимум 3 сервера для главных узлов плюс дополнительные серверы для любых узлов данных. Также обратите внимание, что если вы планируете использовать размер кучи Elasticsearch по умолчанию 2 ГБ, вашим серверам должно быть выделено как минимум 4 ГБ памяти.

После получения ваших серверов настройте их для использования ячеистой VPN с этим учебным пособием: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- серверная инфраструктура [Как использовать Ansible и Tinc VPN для защиты вашей серверной инфраструктуры]. Убедитесь, что у каждого сервера есть уникальное имя узла инвентаризации Ansible.

Если вы используете частную сеть, такую ​​как DigitalOcean Private Networking, ваши серверы смогут безопасно обмениваться данными с другими серверами с той же учетной записью или группой в том же регионе. Это особенно важно при использовании Elasticsearch, поскольку в его HTTP-интерфейсе нет встроенной защиты.

Предположения

Предположим, что все серверы, которые вы хотите использовать в качестве узлов Elasticsearch, имеют интерфейс VPN с именем «tun0», как описано в учебном руководстве, указанном выше. Если они этого не делают, и вы бы предпочли, чтобы ваши узлы ES ​​прослушивали другой интерфейс, вам придется внести соответствующие изменения в файл + site.yml + в Playbook.

Мы также предполагаем, что ваша Playbook находится в каталоге с именем + ansible-tinc + в домашнем каталоге вашего локального компьютера.

Скачать сборник игр ansible -asticsearch

Elastic предоставляет роль Ansible, которую можно использовать для простой настройки кластера Elasticsearch. Чтобы использовать его, нам просто нужно добавить его в нашу + ansible-tinc + playbook и определить несколько групп хостов и назначить соответствующие роли группам. Опять же, если вы еще не выполнили обязательное руководство по VPN, его можно найти по адресу https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure- ваша-серверная инфраструктура [здесь].

Сначала перейдите в каталог, в котором находится ваша Tinc Ansible Playbook:

cd ~/ansible-tinc

Затем клонируйте роль + ansible -asticsearch +, доступную в учетной записи Elastic на GitHub, в каталог Playbook + role +:

cd roles
git clone https://github.com/elastic/ansible-elasticsearch

Переименуйте роль в «asticsearch »:

mv ansible-elasticsearch elasticsearch

Обновление site.yml

Давайте отредактируем основной файл Playbook + site.yml +, чтобы сопоставить три разные роли Elasticsearch с тремя разными группами хостов Ansible. Это позволит нам создавать выделенные основные, выделенные данные и узлы Elasticsearch, отвечающие требованиям мастера и данных, просто добавив узлы в соответствующие группы.

Вернитесь в каталог Ansible Playbook:

cd ~/ansible-playbook

В вашем любимом редакторе отредактируйте новый файл с именем +asticsearch.yml +. Мы будем использовать + vi +:

vi site.yml

Карта Elasticsearch Выделенный Мастер Роль группы

В нижней части файла сопоставьте выделенную роль master +asticsearch + с группой +asticsearch_master_nodes +, добавив следующие строки:

site.yml - выделенные мастер-узлы

- hosts: elasticsearch_master_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false,  http.port: 9200, transport.tcp.port: 9300, node.data: false, node.master: true, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

Эта роль создаст выделенные главные узлы, потому что она настраивает узлы со следующими значениями: + node.master: true + и + node.data: false +.

Обязательно обновите выделенные имена хостов в переменной + discovery.zen.ping.unicast.hosts +, чтобы они соответствовали именам хостов инвентаризации Ansible (или IP-адресам VPN) некоторых ваших серверов Elasticsearch. Это позволит этим узлам обнаружить кластер Elasticsearch. В этом примере мы используем + node01 +, + node02 + и + node03 +, потому что это были имена хостов, используемые в обязательном учебном пособии по VPN. Кроме того, если ваш интерфейс VPN имеет имя, отличное от «tun0», обновите переменную + network.host соответствующим образом.

Если вы хотите использовать другую версию Elasticsearch, обновите + es_version +. Обратите внимание, что эта конфигурация не будет работать для версий до 2.2, так как более старые версии не принимают списки, разделенные запятыми, для переменной + network.host +.

Обновите + es_heap_size + до значения, которое составляет примерно половину свободной памяти на ваших выделенных главных серверах. Например, если на вашем сервере свободно около 4 ГБ, установите размер кучи «2g».

Теперь любые хосты, принадлежащие группе Ansible хостов +asticsearch_master_nodes +, будут настроены как выделенные главные узлы Elasticsearch.

Сопоставьте Elasticsearch Master / Data Role с группой

В нижней части файла отобразите роль master-elitable и data +asticsearch + в группу +asticsearch_master_data_nodes +, добавив следующие строки:

site.yml - узлы-мастера / данные

- hosts: elasticsearch_master_data_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: true, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

Эта роль создаст узлы данных, которые имеют право на мастер, потому что она настраивает узлы со следующими значениями: + node.master: true + и + node.data: true +.

Обязательно обновите выделенные имена хостов в переменной + discovery.zen.ping.unicast.hosts +, чтобы они соответствовали именам хостов инвентаризации Ansible (или IP-адресам VPN) некоторых ваших серверов Elasticsearch. Кроме того, если ваш интерфейс VPN имеет имя, отличное от «tun0», обновите переменную + network.host соответствующим образом.

Установите для + es_version + то же значение, которое вы использовали для выделенной главной роли.

Обновите + es_heap_size + до значения, которое составляет примерно половину свободной памяти на ваших главных серверах / серверах данных.

Теперь любые хосты, которые принадлежат к группе хостов +asticsearch_master_data_nodes + Ansible, будут настроены как узлы данных, которые имеют право на мастер.

Сопоставьте роль данных Elasticsearch с выделенной группой

В нижней части файла отобразите выделенную роль данных + +asticsearch + в группу +asticsearch_data_nodes + `, добавив следующие строки:

site.yml - выделенные узлы данных

- hosts: elasticsearch_data_nodes
 roles:
   - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: ", , ", network.host: "__, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: false, bootstrap.mlockall: true } }
 vars:
   es_major_version: "2.x"
   es_version: "2.2.1"
   es_heap_size: ""
   es_cluster_name: "production"

Эта роль создаст выделенные узлы данных, потому что она настраивает узлы со следующими значениями: + node.master: false + и + node.data: true +.

Обязательно обновите выделенные имена хостов в переменной + discovery.zen.ping.unicast.hosts +, чтобы они соответствовали именам хостов инвентаризации Ansible (или IP-адресам VPN) некоторых ваших серверов Elasticsearch. Кроме того, если ваш интерфейс VPN имеет имя, отличное от «tun0», обновите переменную + network.host соответствующим образом.

Установите для + es_version + то же значение, которое вы использовали в предыдущих ролях.

Обновите + es_heap_size + до значения, которое составляет примерно половину свободной памяти на ваших выделенных серверах данных.

Теперь все хосты, которые принадлежат группе хостов +asticsearch_data_nodes + Ansible, будут настроены как выделенные узлы Elasticsearch данных.

Сохранить и выйти

Теперь, когда вы определили три роли и сопоставили их с группами хостов, вы можете сохранить и выйти из + site.yml +.

Не стесняйтесь добавлять дополнительные роли Elasticsearch и сопоставления групп хостов позже.

Обновить файл инвентаризации хоста

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

Отредактируйте файл инвентаризации Ansible + hosts +:

vi hosts

Если вы следовали обязательному руководству, ваш файл должен выглядеть примерно так (с именами хостов и IP-адресами вашего сервера):

Инвентаризация Ansible hosts - Исходный файл

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

Теперь добавьте три группы, которые соответствуют отображениям, которые мы определили в + site.yml +.

Инвентаризация Ansible хостов - Elasticsearch группы

[elasticsearch_master_nodes]

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]

Теперь распределите ваши хосты Elasticsearch по новым группам хостов, в зависимости от типов узлов Elasticsearch, из которых вы хотите, чтобы ваш кластер состоял. Например, если вы хотите три выделенных главных узла и один выделенный узел данных, ваш файл инвентаризации будет выглядеть примерно так:

Инвентарь Ansible hosts - Полный пример

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

[elasticsearch_master_nodes]
node01
node02
node03

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]
node04

После того, как файл инвентаризации отобразит желаемую настройку Elasticsearch (и VPN), сохраните и выйдите.

Создать Elasticsearch Cluster

Теперь, когда настроены + site.yml + и + hosts +, вы готовы создать свой кластер Elasticsearch, запустив Playbook.

Запустите Playbook с этой командой:

ansible-playbook site.yml

После того, как Playbook завершит работу, ваш кластер Elasticsearch должен быть запущен. Следующим шагом является проверка того, что все работает правильно.

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

На любом из ваших серверов Elasticsearch выполните эту команду, чтобы напечатать состояние кластера:

curl -XGET 'http://localhost:9200/_cluster/state?pretty'

Вы должны увидеть выходные данные, которые указывают, что работает кластер с именем «production». Также следует указать, что все настроенные вами узлы являются членами:

Cluster State:{
 "cluster_name" : "production",
 "version" : 8,
 "state_uuid" : "SgTyn0vNTTu2rdKPrc6tkQ",
 "master_node" : "OzqMzte9RYWSXS6OkGhveA",
 "blocks" : { },
 "nodes" : {
   "OzqMzte9RYWSXS6OkGhveA" : {
     "name" : "node02-node1",
     "transport_address" : "10.0.0.2:9300",
     "attributes" : {
       "data" : "false",
       "master" : "true"
     }
   },
   "7bohaaYVTeeOHvSgBFp-2g" : {
     "name" : "node04-node1",
     "transport_address" : "10.0.0.4:9300",
     "attributes" : {
       "master" : "false"
     }
   },
   "cBat9IgPQwKU_DPF8L3Y1g" : {
     "name" : "node03-node1",
     "transport_address" : "10.0.0.3:9300",
     "attributes" : {
       "master" : "false"
     }
   },
...

Если вы видите вывод, похожий на этот, ваш кластер Elasticsearch запущен! Если некоторые из ваших узлов отсутствуют, просмотрите список Ansible + hosts +, чтобы убедиться, что ваши группы хостов определены правильно.

Поиск проблемы

Если вы получили + curl: (7) Не удалось подключиться к локальному порту 9200: соединение отклонено +, Elasticsearch не работает на этом сервере. Обычно это вызвано ошибками конфигурации Elasticsearch в файле + site.yml +, такими как неправильные записи + network.host + или + discovery.zen.ping.unicast.hosts +. В дополнение к просмотру этого файла также проверьте журналы Elasticsearch на своих серверах (+ / var / log /asticsearch / -node1 / production.log +) на наличие подсказок.

Если вы хотите увидеть пример Playbook, созданный в соответствии с этим учебным пособием, посмотрите this репозиторий GitHub. Это должно помочь вам увидеть, как выглядят рабочие файлы + site.yml + и + hosts +.

Заключение

Ваш кластер Elasticsearch должен работать в исправном состоянии и иметь некоторые базовые оптимизации!

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

Related