如何使用 Ansible 设置具有集群的生产 Elasticsearch 服务器
在本文中,我们将学习如何使用 Ansible 在 CentOS7 上配置和安装生产 Elasticsearch 集群,以确保 Elasticsearch 节点免受外部网络的攻击。我们将使用 VPN 服务连接到集群。
Elasticsearch 是一款非常流行的开源搜索服务器,可用于实时分布式搜索和数据分析,以提高性能、稳定性和可扩展性,我们需要将 Elasticsearch 作为集群部署在多台服务器上。
先决条件
我们需要至少三个具有私有网络的 CentOS 7 服务器环境,因为所需的 Elasticsearch 集群为 3 个主节点,如果我们计划使用一个主节点和一个数据节点,那么我们还需要为数据节点添加额外的服务器。请确保我们拥有唯一的 Ansible 清单主机名。
假设我们已经配置了 VPN 服务器,并且能够使用 VPN 连接到每台服务器,并且接口名称为“tun0”,或者我们可以更改 Elasticsearch 在不同接口上的监听,我们可以在 site.yml 文件中进行相应的更改。
下载 Ansible-Elasticsearch Playbook
Elasticsearch 提供了一个 Ansible 角色,可用于设置 Elasticsearch 集群,为此,我们需要将其添加到我们的 ansible-tinc playbook 中,并定义主机组并将适当的角色分配给这些组。
转到服务器中的 ansible-tinc 文件夹
# cd ~/ansible-tinc
我们需要克隆 Elastic 的 Github 存储库中的 ansible-elasticsearch 角色
# cd roles # git clone https://github.com/elastic/ansible-elasticsearch Initialized empty Git repository in /root/ansible-elasticsearch/.git/ remote: Counting objects: 1192, done. remote: Total 1192 (delta 0), reused 0 (delta 0), pack-reused 1192 Receiving objects: 100% (1192/1192), 167.42 KiB | 86 KiB/s, done. Resolving deltas: 100% (640/640), done. # mv ansible-elasticsearch elasticsearch
更新 Ansible site.yml 中的主 playbook
我们需要将所有三个不同的 Elasticsearch 角色映射到三个不同的 Ansible 主机组,这将允许我们创建专用的主节点、专用的数据节点和主 Elasticsearch 节点。
映射组的 Elasticsearch 专用主角色
$ cd ~/ansible-playbook $ vi 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** 定义相同。
现在,在 **elasticsearch_master_nodes** 中配置的主机被配置为专用的主 Elasticsearch 节点。
映射组中的 Elasticsearch 主/数据角色
在主 playbook site.yml 的底部,通过添加以下配置将主节点资格和数据 elasticsearch 角色映射到 elasticsearch_master-data_nodes 组。
- 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** 定义相同。
将 **es_version** 设置为为专用主角色配置的相同值。
将 Elasticsearch 专用数据角色映射到组
我们需要将以下配置添加到主 playbook site.yml 中,以便为 elasticsearch_data_nodes 组中的专用数据 elasticsearch 角色。
- 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**。
保存配置文件并退出
更新主机清单文件
要创建 Elasticsearch 节点,只需将主机添加到 Ansible 清单文件中的主机文件中
# vi hosts [vpn] node01 vpn_ip=10.0.0.1 ansible_host=10.2.2.1 node02 vpn_ip=10.0.0.2 ansible_host=192.168.100.100 node03 vpn_ip=10.0.0.3 ansible_host=192.168.100.101 node04 vpn_ip=10.0.0.4 ansible_host=192.168.100.102 [removevpn]
现在我们必须添加三个在 site.yml 文件中映射的组
[elasticsearch_master_nodes] [elasticsearch_master_data_nodes] [elasticsearch_data_nodes]
Ansible 清单中的总主机文件应如下所示
[vpn] node01 vpn_ip=10.0.0.1 ansible_host=10.2.2.1 node02 vpn_ip=10.0.0.2 ansible_host=192.168.100.100 node03 vpn_ip=10.0.0.3 ansible_host=192.168.100.101 node04 vpn_ip=10.0.0.4 ansible_host=192.168.100.102 [removevpn] [elasticsearch_master_nodes] node01 node02 node03 [elasticsearch_master_data_nodes] [elasticsearch_data_nodes] node04
创建 Elasticseach 集群
由于我们已经配置了 Elasticsearch 集群服务器所需的所有设置,因此以下是创建 Elasticsearch 集群的命令
# ansible-playbook site.yml
Playbook 运行完成后,elasticsearch 集群应该已经启动并运行。
验证 Elasticsearch 集群状态
在任何三个服务器中,我们需要运行以下命令
# curl -XGET 'https://127.0.0.1:9200/_cluster/state?pretty' Output: Cluster State: { "cluster_name" : "production", "version" : 8, "state_uuid" : "SgTyb0vNTTu2rdKPrc6tkQ", "master_node" : "OzqNzte9RYWSXS6OkGhveA", "blocks" : { }, "nodes" : { "OzqMzte9RYWDXS6OkGhveA" : { "name" : "node02-node1", "transport_address" : "192.168.100.2:9300", "attributes" : { "data" : "false", "master" : "true" } }, "7bohaaYVTee$HvSgBFp-2g" : { "name" : "node04-node1", "transport_address" : "192.168.100.4:9300", "attributes" : { "master" : "false" } }, "cBat9IgPQwKU_GPF8L3Y1g" : { "name" : "node03-node1", "transport_address" : "192.168.100..3:9300", "attributes" : { "master" : "false" } }, ...
如果我们能够看到上述输出,则 Elasticsearch 集群服务器工作正常并正在运行。
由于我们已经完成了配置和设置,因此我们可以配置 Elasticsearch 集群以运行在健康状态下,因为 Elasticsearch 还有许多其他功能和配置选项未涵盖,有关高级功能的更多信息,您可以参考官方文档。