Elasticsearch是一种流行的开源搜索服务器,用于实时分布式搜索和数据分析。当用于开发以外的任何其他任务时,Elasticsearch应作为集群跨多个服务器部署,以获得最佳性能,稳定性和可伸缩性。
本教程将向您展示如何在云服务器环境中的Ubuntu 14.04上安装和配置生产Elasticsearch集群。
虽然手动设置Elasticsearch集群对于学习很有用,但强烈建议在任何集群设置中使用配置管理工具。
您必须至少有三个Ubuntu 14.04服务器才能完成本教程,因为Elasticsearch集群应至少具有3个符合主节点的节点。如果要拥有专用的主节点和数据节点,则主节点至少需要3台服务器,数据节点需要额外的服务器。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
如果您更喜欢使用CentOS,请查看本教程:如何在CentOS 7上设置生产Elasticsearch集群
本教程假设您的服务器正在使用V**网络,无论您的服务器使用何种物理网络,这都将提供专用网络功能。
如果您使用的是共享专用网络,则必须使用V**来保护Elasticsearch免受未经授权的访问。每个服务器必须位于同一个专用网络上,因为Elasticsearch在其HTTP接口中没有内置安全性。不得与您不信任的任何计算机共享专用网络。
我们将您服务器的V** IP地址称为V**_ip
。我们还假设它们都有一个名为“tun0”的V**接口,如上面链接的教程中所述。
Elasticsearch需要Java,所以我们现在就安装它。我们将安装最新版本的Oracle Java 8,因为这是Elasticsearch推荐的。但是,如果您决定走这条路,它应该可以与OpenJDK一起使用。
在所有Elasticsearch服务器上完成此步骤。:
sudo add-apt-repository -y ppa:webupd8team/java
更新您的apt包数据库:
sudo apt-get update
使用此命令安装最新稳定版本的Oracle Java 8(并接受弹出的许可协议):
sudo apt-get -y install oracle-java8-installer
请务必在所有Elasticsearch服务器上重复此步骤。
现在已经安装了Java 8,让我们安装ElasticSearch。
通过添加Elastic的包源列表,可以将Elasticsearch与包管理器一起安装。在所有Elasticsearch服务器上完成此步骤。
运行以下命令将Elasticsearch公共GPG密钥导入apt:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
如果你的提示只是挂在那里,它可能正在等待你的用户密码(授权sudo
命令)。如果是这种情况,请输入您的密码。
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
更新您的apt包数据库:
sudo apt-get update
使用以下命令安装Elasticsearch:
sudo apt-get -y install elasticsearch
请务必在所有Elasticsearch服务器上重复这些步骤。
Elasticsearch现已安装,但需要先配置才能使用它。
现在是时候编辑Elasticsearch配置了。在所有Elasticsearch服务器上完成这些步骤。
打开Elasticsearch配置文件以进行编辑:
sudo vi /etc/elasticsearch/elasticsearch.yml
后续部分将说明如何修改配置。
您需要限制对Elasticsearch实例的外部访问,因此外人无法访问您的数据或通过HTTP API关闭您的Elasticsearch集群。换句话说,您必须配置Elasticsearch,以便它只允许访问您的专用网络(V**)上的服务器。为此,我们需要将每个节点配置为绑定到V** IP地址V**_ip
,或接口“tun0”。
找到指定的network.host
行,取消注释,并将其值替换为相应服务器的V** IP地址(例如,将node01替换为10.0.0.1
)或接口名称。由于我们的V**接口在所有服务器上都被命名为“tun0”,因此我们可以使用相同的线路配置所有服务器:
network.host: [_tun0_, _local_]
请注意添加“local”,它将Elasticsearch配置为也侦听所有环回设备。这将允许您通过从每个服务器向localhost
发送请求,以在本地使用Elasticsearch HTTP API 。如果您不包含此项,Elasticsearch将仅响应对V** IP地址的请求。
警告:由于Elasticsearch没有任何内置安全性,因此不要将此设置为任何您无法控制或信任的服务器可访问的IP地址,这一点非常重要。不要将Elasticsearch绑定到公共或共享专用网络 IP地址!
接下来,设置群集的名称,这将允许您的Elasticsearch节点加入并形成群集。您将需要使用唯一的描述性名称(在您的网络中)。
找到指定的cluster.name
行,取消注释,并将其值替换为所需的群集名称。在本教程中,我们将命名我们的集群“production”:
cluster.name: production
接下来,我们将设置每个节点的名称。这应该是一个在集群中唯一的描述性名称。
找到指定的node.name
行,取消注释,并将其值替换为所需的节点名称。在本教程中,我们将使用${HOSTNAME}
环境变量将每个节点名称设置为服务器的主机名:
node.name: ${HOSTNAME}
如果您愿意,可以手动命名节点,但请确保指定唯一的名称。如果你不介意随机命名你的节点,你也可以将node.name
注释掉。
接下来,您需要配置一个初始的节点列表,这些节点将被联系以发现并形成一个集群。这在单播网络中是必需的。
找到指定和取消注释的discovery.zen.ping.unicast.hosts
行。将其值替换为所有其他节点的V** IP地址或主机名(解析为V** IP地址)的字符串数组。
例如,如果您有三台服务器node01
,node02
以及node03
与各自的V**的IP地址10.0.0.1
,10.0.0.2
以及10.0.0.3
,你可以使用这条线:
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
或者,如果您的所有服务器都配置了基于名称的V** IP地址解析(通过DNS或/etc/hosts
),您可以使用以下行:
discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]
注意:Ansible Playbook 会自动在每台服务器上创建/etc/hosts
条目,将每个V**服务器的库存主机名(在Ansible hosts
文件中指定)解析为其V** IP地址。
您的服务器现在已配置为构成基本Elasticsearch集群。您需要更新更多设置,但在我们验证群集正常工作后,我们将会看到这些设置。
保存并退出elasticsearch.yml
。
现在启动Elasticsearch:
sudo service elasticsearch restart
然后运行此命令以在启动时启动Elasticsearch:
sudo update-rc.d elasticsearch defaults 95 10
请务必在所有Elasticsearch服务器上重复这些步骤(配置Elasticsearch Cluster)。
如果一切都配置正确,您的Elasticsearch集群应该已启动并正在运行。在继续之前,让我们验证它是否正常工作。您可以通过从任何Elasticsearch节点查询Elasticsearch来执行此操作。
从任何Elasticsearch服务器,运行此命令以打印群集的状态:
curl -XGET 'http://localhost:9200/_cluster/state?pretty'
您应该看到输出,指示名为“production”的集群正在运行。它还应表明您配置的所有节点都是成员:
{
"cluster_name" : "production",
"version" : 36,
"state_uuid" : "MIkS5sk7TQCl31beb45kfQ",
"master_node" : "k6k2UObVQ0S-IFoRLmDcvA",
"blocks" : { },
"nodes" : {
"Jx_YC2sTQY6ayACU43_i3Q" : {
"name" : "node02",
"transport_address" : "10.0.0.2:9300",
"attributes" : { }
},
"k6k2UObVQ0S-IFoRLmDcvA" : {
"name" : "node01",
"transport_address" : "10.0.0.1:9300",
"attributes" : { }
},
"kQgZZUXATkSpduZxNwHfYQ" : {
"name" : "node03",
"transport_address" : "10.0.0.3:9300",
"attributes" : { }
}
},
...
如果您看到与此类似的输出,则您的Elasticsearch集群正在运行!如果缺少任何节点,请在继续之前查看相关节点的配置。
接下来,我们将介绍您应该为Elasticsearch集群考虑的一些配置设置。
Elastic建议不惜一切代价避免交换Elasticsearch流程,因为它会对性能和稳定性产生负面影响。避免过度交换的一种方法是配置Elasticsearch来锁定它所需的内存。
在所有Elasticsearch服务器上完成此步骤。
编辑Elasticsearch配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
找到指定并取消注释的bootstrap.mlockall
行:
bootstrap.mlockall: true
保存并退出。
接下来,打开/etc/default/elasticsearch
文件进行编辑:
sudo vi /etc/default/elasticsearch
首先,查找ES_HEAP_SIZE
,取消注释,并将其设置为可用内存的大约50%。例如,如果您有大约4 GB的可用空间,则应将其设置为2 GB(2g
):
ES_HEAP_SIZE=2g
接下来,找到并取消注释MAX_LOCKED_MEMORY=unlimited
。当你完成时它应该是这样的:
MAX_LOCKED_MEMORY=unlimited
保存并退出。
现在重新启动Elasticsearch以将更改置于适当位置:
sudo service elasticsearch restart
请务必在所有Elasticsearch服务器上重复此步骤。
要验证是否mlockall
在所有Elasticsearch节点上运行,请从任何节点运行此命令:
curl http://localhost:9200/_nodes/process?pretty
每个节点都应该有一行说明"mlockall" : true
,表示内存锁定已启用且正常工作:
...
"nodes" : {
"kQgZZUXATkSpduZxNwHfYQ" : {
"name" : "es03",
"transport_address" : "10.0.0.3:9300",
"host" : "10.0.0.3",
"ip" : "10.0.0.3",
"version" : "2.2.0",
"build" : "8ff36d1",
"http_address" : "10.0.0.3:9200",
"process" : {
"refresh_interval_in_millis" : 1000,
"id" : 1650,
"mlockall" : true
}
...
如果mlockall
在任何节点为false,请查看节点的设置并重新启动Elasticsearch。Elasticsearch无法启动的常见原因是ES_HEAP_SIZE
设置得太高。
默认情况下,您的Elasticsearch节点应具有64k的“打开文件描述符限制”。本节将向您展示如何验证这一点,如果您愿意,还可以增加它。
首先,找到Elasticsearch进程的进程ID(PID)。一种简单的方法是使用该ps
命令列出属于该elasticsearch
用户的所有进程:
ps -u elasticsearch
你应该看到看起来像这样的输出。第一列中的数字是Elasticsearch(java)进程的PID:
PID TTY TIME CMD
11708 ? 00:00:10 java
然后运行此命令以显示Elasticsearch进程的打开文件限制(使用上一步骤中您自己的PID替换突出显示的数字):
cat /proc/11708/limits | grep 'Max open files'
Max open files 65535 65535 files
第二列和第三列中的数字分别表示软限制和硬限制,为64k(65535)。这对于许多设置都可以,但您可能希望增加此设置。
要增加Elasticsearch中打开文件描述符的最大数量,只需更改单个设置即可。
打开/etc/default/elasticsearch
文件进行编辑:
sudo vi /etc/default/elasticsearch
查找MAX_OPEN_FILES
,取消注释,并将其设置为您想要的限制。例如,如果要限制128k描述符,请将其更改为131070
:
MAX_OPEN_FILES=131070
保存并退出。
现在重新启动Elasticsearch以将更改置于适当位置:
sudo service elasticsearch restart
然后按照上一小节的说明验证限制是否已增加。
请务必在需要更高文件描述符限制的任何Elasticsearch服务器上重复此步骤。
Elasticsearch节点有两种常见类型:master和data。主节点执行群集范围的操作,例如管理索引和确定哪些数据节点应存储特定数据分片。数据节点保存索引文档的分片,并处理CRUD,搜索和聚合操作。作为一般规则,数据节点消耗大量的CPU,内存和I / O.
默认情况下,每个Elasticsearch节点都配置为“符合主节点”的数据节点,这意味着它们存储数据(并执行资源密集型操作),并有可能被选为主节点。对于一个小集群,这通常很好; 但是,大型Elasticsearch集群应配置专用主节点,以便主节点的稳定性不会受到密集数据节点工作的影响。
在配置专用主节点之前,请确保您的群集至少具有3个符合主节点的节点。这对于避免裂脑情况非常重要,这种情况会在网络出现故障时导致数据不一致。
要配置专用主节点,请编辑节点的Elasticsearch配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
添加以下两行:
node.master: true
node.data: false
第一行node.master: true
是用来指定节点符合主节点,实际上是默认设置。第二行node.data: false
将会限制节点成为数据节点。
保存并退出。
现在重新启动Elasticsearch节点以使更改生效:
sudo service elasticsearch restart
请务必在其他专用主节点上重复此步骤。
您可以使用以下命令查询集群以查看哪些节点配置为专用主节点:curl -XGET 'http://localhost:9200/_cluster/state?pretty'
。具有data: false
和master: true
的任何节点都是专用主节点。
要配置专用数据节点 - 不符合主要条件的数据节点 - 编辑节点的Elasticsearch配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
添加以下两行:
node.master: false
node.data: true
第一行node.master: false
指定节点不符合主节点。第二行node.data: true
是默认设置,允许节点作为数据节点。
保存并退出。
现在重新启动Elasticsearch节点以使更改生效:
sudo service elasticsearch restart
请务必在其他专用数据节点上重复此步骤。
您可以使用以下命令查询群集以查看哪些节点配置为专用数据节点:curl -XGET 'http://localhost:9200/_cluster/state?pretty'
。列出master: false
和未列出的任何节点data: false
都是专用数据节点。
运行Elasticsearch集群时,必须设置为集群正常运行而需要运行的符合主节点的最小节点数,这有时称为仲裁。这是为了在一个或多个节点失去与群集其余部分的连接的情况下确保数据一致性,从而防止所谓的“裂脑”情况。
要计算群集应具有的最小主节点数,请计算n / 2 + 1
,其中n是健康群集中“符合主要条件”节点的总数,然后将结果向下舍入为最接近的整数。例如,对于3节点群集,仲裁为2。
注意:确保在仲裁计算中包括所有符合条件的节点,包括符合主条件的任何数据节点(默认设置)。
可以通过Elasticsearch HTTP API动态设置最小主节点设置。为此,请在任何节点上运行此命令(将突出显示的数字替换为您的仲裁):
curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
"persistent" : {
"discovery.zen.minimum_master_nodes" : 2
}
}'
Output:{
"acknowledged" : true,
"persistent" : {
"discovery" : {
"zen" : {
"minimum_master_nodes" : "2"
}
}
},
"transient" : { }
}
注意:此命令是“持久”设置,这意味着最小主节点设置将在完全群集重新启动后继续存在并覆盖Elasticsearch配置文件。另外,这个设置可以被指定为在/etc/elasticsearch.yml
中的discovery.zen.minimum_master_nodes: 2
,如果您还没有设置动态。
如果要稍后检查此设置,可以运行以下命令:
curl -XGET localhost:9200/_cluster/settings?pretty
您可以通过向任何节点的V** IP地址发送请求来访问Elasticsearch HTTP API,或者如教程中所示,通过从其中一个节点发送请求至localhost
来访问Elasticsearch HTTP API 。
客户端服务器可以通过任何节点的V** IP地址访问您的Elasticsearch集群,这意味着客户端服务器也必须是V**的一部分。
如果您有其他需要连接到群集的软件(如Kibana或Logstash),通常可以通过为应用程序提供一个或多个Elasticsearch节点的V** IP地址来配置连接。
您的Elasticsearch集群应该运行在健康状态,并配置了一些基本优化!
Elasticsearch还有许多其他未在此处介绍的配置选项,例如索引,分片和复制设置。建议您稍后重新访问配置以及官方文档,以确保您的群集配置满足您的需求。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Set Up a Production Elasticsearch Cluster on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。