如何使用Ansible到设立了生产Elasticsearch集群

介绍

在本教程中,我们将向您展示如何使用配置管理工具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专用网络),则必须使用VPN才能保护Elasticsearch免受未经授权的访问。 每个服务器必须在同一个专用网络上,因为Elasticsearch没有在其HTTP接口中内置安全性。 不得与不信任的计算机共享专用网络。

假设

我们将假设您要用作Elasticsearch节点的所有服务器都有一个名为“tun0”的VPN接口,如上面链接的教程中所述。 如果他们不这样做,你宁愿你ES节点听不同的接口上,你将不得不作出适当的修改site.yml Playbook上的文件。

我们假设你的剧本位于一个名为ansible-tinc在本地计算机的主目录。

下载ansible-elasticsearch手册

Elastic提供了一个Ansible角色,可用于轻松地设置Elasticsearch集群。 要使用它,我们只需将它添加到我们的ansible-tinc剧本,并定义了一些主机组并指定相应的角色组。 同样,如果你尚未遵循的前提VPN教程,可以发现在这里

首先,切换到您的Tinc Ansible Playbook所在的目录:

cd ~/ansible-tinc

然后克隆ansible-elasticsearch的作用,这是可以弹性的GitHub的帐户,到PlayBook的roles目录:

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

将角色重命名为“elasticsearch”:

mv ansible-elasticsearch elasticsearch

更新site.yml

让我们编辑主剧本文件, 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: truenode.data: false

一定要更新高亮显示的主机名在discovery.zen.ping.unicast.hosts变量相匹配的Ansible库存主机名(或VPN的IP地址),您的一些Elasticsearch服务器组成。 这将允许这些节点发现Elasticsearch集群。 在这个例子中,我们使用node01node02node03因为那些都是在必备VPN教程中使用的主机名。 另外,如果您的VPN接口被命名为比“TUN0”以外的东西,更新network.host相应变量。

如果要使用不同版本的Elasticsearch,更新es_version 请注意,此配置不会为以前的版本2.2工作,因为旧版本不接受逗号分隔列出了network.host变量。

更新es_heap_size到大致是你专用的主服务器上的可用内存的一半的值。 例如,如果您的服务器有大约4 GB的可用空间,请将堆大小设置为“2g”。

既然属于任何主机elasticsearch_master_nodes Ansible主机组将被配置为专用主Elasticsearch节点。

将Elasticsearch主数据角色映射到组

在文件的底部,映射主资格和数据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: truenode.data: true

一定要更新高亮显示的主机名在discovery.zen.ping.unicast.hosts变量相匹配的Ansible库存主机名(或VPN的IP地址),您的一些Elasticsearch服务器组成。 另外,如果您的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: falsenode.data: true

一定要更新高亮显示的主机名在discovery.zen.ping.unicast.hosts变量相匹配的Ansible库存主机名(或VPN的IP地址),您的一些Elasticsearch服务器组成。 另外,如果您的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.ymlhosts都设置,您就可以通过运行剧本创建Elasticsearch集群。

使用此命令运行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) Failed to connect to localhost port 9200: Connection refused ,Elasticsearch是不是该服务器上运行。 这通常是由Elasticsearch配置错误造成site.yml文件,如不正确network.hostdiscovery.zen.ping.unicast.hosts条目。 除了查看该文件,还要检查你的服务器(在Elasticsearch记录/var/log/elasticsearch/ node01 -node1/production.log )的线索。

如果你想看到按照本教程制作剧本的例子,看看这个GitHub的信息库 这会帮助你看看有什么工作site.ymlhosts文件的样子。

结论

您的Elasticsearch集群应该运行在正常状态,并配置了一些基本的优化!

Elasticsearch还有许多其他配置选项,例如索引,分片和复制设置。 建议您稍后再次访问配置以及官方文档,以确保集群配置满足您的需求。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏