如何使用 Ansible 设置生产型 Elasticsearch 集群

介绍

在本教程中,我们将向您展示如何使用Ansible,一个配置管理工具,在云服务器环境中安装Ubuntu 14.04或CentOS 7上的生产Elasticsearch集群。

Elasticsearch 是一个流行的开源搜索服务器,用于实时分布式搜索和数据分析,当用于开发以外的任何事情时,Elasticsearch 应该在多个服务器上部署作为一个群集,以获得最佳的性能,稳定性和可扩展性。

前提条件

您必须至少有三个 Ubuntu 14.04 或 CentOS 7 服务器,具有私人网络,以完成本教程,因为一个 Elasticsearch 集群应该至少有 3 个合格的主节点. 如果您想要有专用的主节点和数据节点,您将需要至少 3 个主节点的服务器以及任何数据节点的额外服务器。

获取服务器后,用本教程配置它们使用网格VPN: 如何使用Ansible和TincVPN来保护您的服务器基础设施 确保每个服务器都有一个独特的Ansible库存主机名。

如果您正在使用私人网络,例如DigitalOcean Private Networking,您的服务器将能够安全地与同一区域内的同一帐户或团队的其他服务器进行通信,这在使用Elasticsearch时尤其重要,因为它没有HTTP界面内嵌入的安全性。

假设

我们将假设你想要作为Elasticsearch节点使用的所有服务器都有一个名为tun0的VPN接口,如上文链接的教程中所述。

我们还将假设您的 Playbook 位于本地计算机主目录中的名为ansible-tinc的目录中。

点击下载 ansible-elasticsearch Playbook

Elastic 提供了一个 Ansible 角色,可以用来轻松设置一个 Elasticsearch 集群。 要使用它,我们只需要将其添加到我们的ansible-tinc播放簿中,并定义几个主机组,并将适当的角色分配给这些组。

首先,更改您的Tinc Ansible Playbook所在的目录:

1cd ~/ansible-tinc

然后将在 Elastic 的 GitHub 帐户中可用的ansible-elasticsearch角色克隆到 Playbook 的角色目录中:

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

重命名角色为elasticsearch:

1mv ansible-elasticsearch elasticsearch

网站更新.yml

让我们编辑 Playbook 主文件 site.yml,将三个不同的 Elasticsearch 角色绘制到三个不同的 Ansible 主机组. 这将使我们能够通过简单地将主机添加到相应的组中来创建专用主机、专用数据和主机可选/数据 Elasticsearch 节点。

回到 Ansible Playbook 的目录:

1cd ~/ansible-playbook

在你最喜欢的编辑器中,编辑一个名为elasticsearch.yml的新文件,我们会使用vi:

1vi site.yml

地图 Elasticsearch 专用大师角色到组

在文件的底部,将专用主elasticsearch角色与elasticsearch_master_nodes组进行地图,添加以下行:

1[label site.yml  Dedicated master nodes]
2- hosts: elasticsearch_master_nodes
3  roles:
4    - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: "node01, node02, node03", network.host: "_tun0_, _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 } }
5  vars:
6    es_major_version: "2.x"
7    es_version: "2.2.1"
8    es_heap_size: "2g"
9    es_cluster_name: "production"

此角色将创建专用主节点,因为它将节点配置为以下值: node.master: true 和 node.data: false。

请确保在discovery.zen.ping.unicast.hosts变量中更新突出的主机名,以匹配您的一些 Elasticsearch 服务器的 Ansible 库存主机名(或 VPN IP 地址)。这将允许这些节点发现 Elasticsearch 集群。例如,我们正在使用node01,node02node03,因为这些是先决条件 VPN 教程中使用的主机名。此外,如果您的 VPN 界面被命名为tun0,则应相应地更新network.host变量。

如果您想使用不同的 Elasticsearch 版本,请更新 es_version. 请注意,此配置不会适用于 2.2 之前的版本,因为较旧的版本不接受 network.host 变量的 comma 限制列表。

更新 es_heap_size 到大约一半的免费内存值,例如,如果您的服务器有大约 4 GB 免费,请将堆积大小设置为2g

现在,任何属于elasticsearch_master_nodes Ansible 主机组的主机将被配置为专用的主 Elasticsearch 节点。

地图 Elasticsearch 主/数据角色到组

在文件的底部,将主资格和数据elasticsearch角色与elasticsearch_master_data_nodes组进行地图,添加以下行:

1[label site.yml  Master-eligible/data nodes]
2- hosts: elasticsearch_master_data_nodes
3  roles:
4    - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: "node01, node02, node03", network.host: "_tun0_, _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 } }
5  vars:
6    es_major_version: "2.x"
7    es_version: "2.2.1"
8    es_heap_size: "2g"
9    es_cluster_name: "production"

此角色将创建具有主资格的数据节点,因为它将节点配置为以下值: node.master: true 和 node.data: true。

请确保在discovery.zen.ping.unicast.hosts变量中更新突出的主机名,以匹配您的一些 Elasticsearch 服务器的 Ansible 库存主机名(或 VPN IP 地址)。

将 'es_version' 设置为您用于专用主角的相同值。

更新 es_heap_size 到大约是您主资格/数据服务器的免费内存的一半的值。

现在,属于elasticsearch_master_data_nodes Ansible 主机组的任何主机都将配置为具有主资格的数据节点。

地图 Elasticsearch 专用数据角色组

在文件的底部,将专用数据elasticsearch角色转移到elasticsearch_data_nodes组,添加这些行:

1[label site.yml  Dedicated data nodes]
2- hosts: elasticsearch_data_nodes
3  roles:
4    - { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: "node01, node02, node03", network.host: "_tun0_, _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 } }
5  vars:
6    es_major_version: "2.x"
7    es_version: "2.2.1"
8    es_heap_size: "2g"
9    es_cluster_name: "production"

此角色将创建专用数据节点,因为它将节点配置为以下值: node.master: false 和 node.data: true。

请确保在discovery.zen.ping.unicast.hosts变量中更新突出的主机名,以匹配您的一些 Elasticsearch 服务器的 Ansible 库存主机名(或 VPN IP 地址)。

将 'es_version' 设置为您在之前的角色中使用的相同值。

更新 es_heap_size 到大约是专用数据服务器上可用内存的一半的值。

现在,属于elasticsearch_data_nodes Ansible 主机组的任何主机都将配置为专用数据 Elasticsearch 节点。

保存和退出

现在,您已经定义了三个角色,并将它们映射到主机组中,您可以保存并退出「site.yml」。

稍后可以免费添加更多 Elasticsearch 角色和主机组地图。

更新主机库存文件

现在,新的 Elasticsearch 角色已经与主机组进行了对照,您可以通过简单地将主机添加到相应的主机组来创建不同类型的 Elasticsearch 节点。

编辑 Ansible hosts 库存文件:

1vi hosts

如果您遵循前提教程,您的文件应该看起来像这样的东西(与您的服务器主机名和IP地址):

1[label Ansible hosts inventory — Original file]
2[vpn]
3node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
4node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
5node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
6node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129
7
8[removevpn]

现在添加三个组,这些组与我们在site.yml中定义的地图相匹配。

1[label Ansible hosts inventory — Elasticsearch groups]
2[elasticsearch_master_nodes]
3
4[elasticsearch_master_data_nodes]
5
6[elasticsearch_data_nodes]

现在将您的 Elasticsearch 主机分布到新主机组中,取决于您希望集群由哪些类型的 Elasticsearch 节点组成,例如,如果您想要三个专用主节点和一个专用数据节点,您的库存文件将看起来像这样:

 1[label Ansible hosts inventory — Complete example]
 2[vpn]
 3node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
 4node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
 5node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
 6node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129
 7
 8[removevpn]
 9
10[elasticsearch_master_nodes]
11node01
12node02
13node03
14
15[elasticsearch_master_data_nodes]
16
17[elasticsearch_data_nodes]
18node04

<$>[注] **注:**每个Elasticsearch节点也必须在[vpn]主机组中定义,以便所有节点可以通过VPN相互通信。

一旦你的库存文件反映了你想要的Elasticsearch(和VPN)设置,保存和退出。

创建 Elasticsearch 集群

现在site.yml主机已设置,您已经准备好通过运行 Playbook 来创建您的 Elasticsearch 集群。

使用此命令运行 Playbook:

1ansible-playbook site.yml

在 Playbook 完成运行后,您的 Elasticsearch 集群应该启动并运行。

检查 Elasticsearch 集群状态

从您的任何 Elasticsearch 服务器中运行此命令来打印群集的状态:

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

您应该看到输出表示一个名为生产的集群正在运行,它还应该表示您配置的所有节点都是会员:

 1[secondary_label Cluster State:]
 2{
 3  "cluster_name" : "production",
 4  "version" : 8,
 5  "state_uuid" : "SgTyn0vNTTu2rdKPrc6tkQ",
 6  "master_node" : "OzqMzte9RYWSXS6OkGhveA",
 7  "blocks" : { },
 8  "nodes" : {
 9    "OzqMzte9RYWSXS6OkGhveA" : {
10      "name" : "node02-node1",
11      "transport_address" : "10.0.0.2:9300",
12      "attributes" : {
13        "data" : "false",
14        "master" : "true"
15      }
16    },
17    "7bohaaYVTeeOHvSgBFp-2g" : {
18      "name" : "node04-node1",
19      "transport_address" : "10.0.0.4:9300",
20      "attributes" : {
21        "master" : "false"
22      }
23    },
24    "cBat9IgPQwKU_DPF8L3Y1g" : {
25      "name" : "node03-node1",
26      "transport_address" : "10.0.0.3:9300",
27      "attributes" : {
28        "master" : "false"
29      }
30    },
31...

如果您看到类似于此的输出,那么您的 Elasticsearch 集群正在运行! 如果您缺少一些节点,请审查您的 Ansible 主机 库存,以确保您的主机组被正确定义。

故障解析

如果您收到「curl: (7) 未能连接到 localhost 端口 9200: 连接被拒绝」,则 Elasticsearch 不会在该服务器上运行,这通常是由于site.yml文件中的 Elasticsearch 配置错误,例如错误的network.hostdiscovery.zen.ping.unicast.hosts条目。除了审查该文件外,还检查您的服务器上的 Elasticsearch 日志(`/var/log/elasticsearch/node01-node1/production.log)以获取线索。

如果你想看到通过遵循本教程制作的 Playbook 示例,请查看 这个 GitHub 存储库

结论

您的 Elasticsearch 集群应该在健康状态下运行,并配置一些基本的优化!

Elasticsearch 还有许多其他配置选项,这些选项不包括在这里,例如索引、碎片和复制设置,建议您稍后再访问配置,以及官方文档,以确保您的集群配置符合您的需求。

Published At
Categories with 技术
comments powered by Disqus