介绍
在本教程中,我们将向您展示如何使用配置管理工具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
加入这些线路组:
- 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
变量相匹配的Ansible库存主机名(或VPN的IP地址),您的一些Elasticsearch服务器组成。 这将允许这些节点发现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主数据角色映射到组
在文件的底部,映射主资格和数据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
。
一定要更新高亮显示的主机名在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
通过添加这些行组:
- 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
变量相匹配的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地址):
[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
。
[elasticsearch_master_nodes]
[elasticsearch_master_data_nodes]
[elasticsearch_data_nodes]
现在将您的Elasticsearch主机分布在新的主机组中,具体取决于您希望集群由哪些Elasticsearch节点组成。 例如,如果您需要三个专用主节点和一个专用数据节点,则您的库存文件应如下所示:
[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
都设置,您就可以通过运行剧本创建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.host
或discovery.zen.ping.unicast.hosts
条目。 除了查看该文件,还要检查你的服务器(在Elasticsearch记录/var/log/elasticsearch/ node01 -node1/production.log
)的线索。
如果你想看到按照本教程制作剧本的例子,看看这个GitHub的信息库 。 这会帮助你看看有什么工作site.yml
和hosts
文件的样子。
结论
您的Elasticsearch集群应该运行在正常状态,并配置了一些基本的优化!
Elasticsearch还有许多其他配置选项,例如索引,分片和复制设置。 建议您稍后再次访问配置以及官方文档,以确保集群配置满足您的需求。