介绍
在本教程中,我们将向您展示如何使用配置管理工具 Ansible 在云服务器环境中的 Ubuntu 14.04 或 CentOS 7 上安装生产 Elasticsearch 集群。 我们将在 如何使用 Ansible 和 Tinc VPN 来保护您的服务器基础架构 教程的基础上构建,以确保您的 Elasticsearch 节点不受您自己网络之外的计算机的影响。
Elasticsearch 是一种流行的开源搜索服务器,用于实时分布式搜索和分析数据。 当用于开发以外的任何事情时,Elasticsearch 应该作为一个集群部署在多台服务器上,以获得最佳性能、稳定性和可扩展性。
先决条件
要完成本教程,您必须至少拥有三个 Ubuntu 14.04 或 CentOS 7 服务器和专用网络,因为 Elasticsearch 集群应该至少有 3 个符合主节点资格的节点。 如果您想拥有专用的主节点和数据节点,您将需要至少 3 台服务器用于主节点,再加上额外的服务器用于任何数据节点。 另请注意,如果您计划使用 2 GB 的默认 Elasticsearch 堆大小,则应为您的服务器分配至少 4 GB 的内存。
获得服务器后,通过本教程将它们配置为使用网状 VPN:如何使用 Ansible 和 Tinc VPN 保护您的服务器基础架构。 确保每台服务器都有一个唯一的 Ansible 清单主机名。
如果您使用的是专用网络,例如 DigitalOcean Private Networking,您的服务器将能够与同一区域内同一帐户或团队的其他服务器安全通信。 这在使用 Elasticsearch 时尤为重要,因为它的 HTTP 接口中没有内置安全性。
假设
我们将假设您要用作 Elasticsearch 节点的所有服务器都有一个名为“tun0”的 VPN 接口,如上面链接的教程中所述。 如果他们不这样做,并且您希望 ES 节点在不同的接口上侦听,则必须在 Playbook 的 site.yml
文件中进行适当的更改。
我们还将假设您的 Playbook 位于本地计算机主目录中名为 ansible-tinc
的目录中。
下载 ansible-elasticsearch 剧本
Elastic 提供了一个 Ansible 角色,可用于轻松设置 Elasticsearch 集群。 要使用它,我们只需将它添加到我们的 ansible-tinc
剧本并定义一些主机组并为这些组分配适当的角色。 同样,如果您还没有遵循必备 VPN 教程,可以在 此处 找到它。
首先,切换到 Tinc Ansible Playbook 所在的目录:
cd ~/ansible-tinc
然后将 Elastic 的 GitHub 帐户上的 ansible-elasticsearch
角色克隆到 Playbook 的 roles
目录:
cd roles git clone https://github.com/elastic/ansible-elasticsearch
将角色重命名为“elasticsearch”:
mv ansible-elasticsearch elasticsearch
更新 site.yml
让我们编辑主 Playbook 文件 site.yml
,将三个不同的 Elasticsearch 角色映射到三个不同的 Ansible 主机组。 这将允许我们通过简单地将主机添加到适当的组来创建专用的主节点、专用数据和主合格/数据 Elasticsearch 节点。
切换回 Ansible Playbook 的目录:
cd ~/ansible-playbook
在您喜欢的编辑器中,编辑一个名为 elasticsearch.yml
的新文件。 我们将使用 vi
:
vi site.yml
将 Elasticsearch 专用主角色映射到组
在文件底部,通过添加以下行将专用主 elasticsearch
角色映射到 elasticsearch_master_nodes
组:
site.yml — 专用主节点
- hosts: elasticsearch_master_nodes roles: - { 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 } } vars: es_major_version: "2.x" es_version: "2.2.1" es_heap_size: "2g" es_cluster_name: "production"
此角色将创建专用主节点,因为它使用以下值配置节点:node.master: true
和 node.data: false
。
请务必更新 discovery.zen.ping.unicast.hosts
变量中突出显示的主机名,以匹配您的一些 Elasticsearch 服务器的 Ansible 清单主机名(或 VPN IP 地址)。 这将允许这些节点发现 Elasticsearch 集群。 在示例中,我们使用 node01
、node02
和 node03
,因为这些是必备 VPN 教程中使用的主机名。 此外,如果您的 VPN 接口的名称不是“tun0”,请相应地更新 network.host
变量。
如果您想使用不同版本的 Elasticsearch,请更新 es_version
。 请注意,此配置不适用于 2.2 之前的版本,因为旧版本不接受 network.host
变量的逗号分隔列表。
将 es_heap_size
更新为大约是专用主服务器上可用内存的一半的值。 例如,如果您的服务器有大约 4 GB 可用空间,请将堆大小设置为“2g”。
现在,属于 elasticsearch_master_nodes
Ansible 主机组的任何主机都将被配置为专用的主 Elasticsearch 节点。
将 Elasticsearch 主/数据角色映射到组
在文件的底部,通过添加以下行将 master-eligible 和 data elasticsearch
角色映射到 elasticsearch_master_data_nodes
组:
site.yml — 主合格/数据节点
- hosts: elasticsearch_master_data_nodes roles: - { 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 } } vars: es_major_version: "2.x" es_version: "2.2.1" es_heap_size: "2g" es_cluster_name: "production"
此角色将创建符合主节点资格的数据节点,因为它使用以下值配置节点:node.master: true
和 node.data: true
。
请务必更新 discovery.zen.ping.unicast.hosts
变量中突出显示的主机名,以匹配您的一些 Elasticsearch 服务器的 Ansible 清单主机名(或 VPN IP 地址)。 此外,如果您的 VPN 接口的名称不是“tun0”,请相应地更新 network.host
变量。
将 es_version
设置为您用于专用主角色的相同值。
将 es_heap_size
更新为大约是您的主合格/数据服务器上可用内存的一半的值。
现在,任何属于 elasticsearch_master_data_nodes
Ansible 主机组的主机都将被配置为符合主控条件的数据节点。
将 Elasticsearch 专用数据角色映射到组
在文件的底部,通过添加以下行将专用数据 elasticsearch
角色映射到 elasticsearch_data_nodes
组:
site.yml - 专用数据节点
- hosts: elasticsearch_data_nodes roles: - { 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 } } vars: es_major_version: "2.x" es_version: "2.2.1" es_heap_size: "2g" es_cluster_name: "production"
此角色将创建专用数据节点,因为它使用以下值配置节点:node.master: false
和 node.data: true
。
请务必更新 discovery.zen.ping.unicast.hosts
变量中突出显示的主机名,以匹配您的一些 Elasticsearch 服务器的 Ansible 清单主机名(或 VPN IP 地址)。 此外,如果您的 VPN 接口的名称不是“tun0”,请相应地更新 network.host
变量。
将 es_version
设置为您在之前角色中使用的相同值。
将 es_heap_size
更新为大约是专用数据服务器上可用内存的一半的值。
现在任何属于 elasticsearch_data_nodes
Ansible 主机组的主机都将被配置为专用数据 Elasticsearch 节点。
保存并退出
现在您已经定义了三个角色,并将它们映射到主机组,您可以保存并退出 site.yml
。
以后可以随意添加更多 Elasticsearch 角色和主机组映射。
更新主机清单文件
现在新的 Elasticsearch 角色已映射到主机组,您只需将主机添加到适当的主机组即可创建不同类型的 Elasticsearch 节点。
编辑 Ansible hosts
清单文件:
vi hosts
如果您遵循了先决条件教程,您的文件应该如下所示(带有您的服务器主机名和 IP 地址):
Ansible 主机清单 - 原始文件
[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 主机清单 — 完整示例
[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]
主机组中,以便所有节点可以通过 VPN 相互通信。 此外,任何需要连接到 Elasticsearch 集群的服务器也必须在 [vpn]
主机组中定义。
一旦您的清单文件反映了您所需的 Elasticsearch(和 VPN)设置,保存并退出。
创建 Elasticsearch 集群
现在 site.yml
和 hosts
已设置好,您可以通过运行 Playbook 来创建 Elasticsearch 集群了。
使用以下命令运行 Playbook:
ansible-playbook site.yml
Playbook 完成运行后,您的 Elasticsearch 集群应该已启动并运行。 下一步是验证一切是否正常。
验证 Elasticsearch 集群状态
在您的任何 Elasticsearch 服务器上,运行以下命令来打印集群的状态:
curl -XGET 'http://localhost:9200/_cluster/state?pretty'
您应该看到指示名为“生产”的集群正在运行的输出。 它还应该表明您配置的所有节点都是成员:
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) Failed to connect to localhost port 9200: Connection refused
,则 Elasticsearch 没有在该服务器上运行。 这通常是由 site.yml
文件中的 Elasticsearch 配置错误引起的,例如不正确的 network.host
或 discovery.zen.ping.unicast.hosts
条目。 除了查看该文件之外,还要检查服务器 (/var/log/elasticsearch/node01-node1/production.log
) 上的 Elasticsearch 日志以获取线索。
如果您想查看按照本教程制作的 Playbook 示例,请查看 这个 GitHub 存储库 。 这应该可以帮助您了解有效的 site.yml
和 hosts
文件的样子。
结论
您的 Elasticsearch 集群应该在健康状态下运行,并且配置了一些基本优化!
Elasticsearch 有许多其他的配置选项,这里没有介绍,例如索引、分片和复制设置。 建议您稍后重新访问您的配置以及官方文档,以确保您的集群配置满足您的需求。