介绍
Elasticsearch是一种流行的开源搜索服务器,用于实时分布式搜索和数据分析。当用于开发以外的任何其他任务时,Elasticsearch应作为集群跨多个服务器部署,以获得最佳性能,稳定性和可伸缩性。
本教程将向您展示如何在云服务器环境中在CentOS 7上安装和配置生产Elasticsearch集群。
虽然手动设置Elasticsearch集群对于学习很有用,但强烈建议在任何集群设置中使用配置管理工具。
准备
您必须至少有三个CentOS 7服务器才能完成本教程,因为Elasticsearch集群应至少具有3个符合主节点的节点。如果要拥有专用的主节点和数据节点,则主节点至少需要3台服务器,数据节点需要额外的服务器。
没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
假设
本教程假设您的服务器正在使用Ansible和Tinc V**,无论您的服务器使用何种物理网络,这都将提供专用网络功能。
如果您使用的是共享专用网络,则必须使用V**来保护Elasticsearch免受未经授权的访问。每个服务器必须位于同一个专用网络上,因为Elasticsearch在其HTTP接口中没有内置安全性。不得与您不信任的任何计算机共享专用网络。
我们将您服务器的V** IP地址称为V**_ip
。我们还假设它们都有一个名为“tun0”的V**接口,如上面链接的教程中所述。
安装Java 8
Elasticsearch需要Java,所以我们现在就安装它。我们将安装最新版本的Oracle Java 8,因为这是Elasticsearch推荐的。但是,如果您决定走这条路,它应该可以与OpenJDK一起使用。遵循本节中的步骤意味着您接受Java SE的Oracle二进制许可协议。
在所有Elasticsearch服务器上完成此步骤。
切换到您的主目录并使用以下命令下载Oracle Java 8(更新73,撰写本文时的最新版本)JDK RPM:
代码语言:javascript复制
cd ~
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http://www.oracle.com/; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"
然后使用此yum命令安装RPM(如果您下载了其他版本,请在此处替换文件名):
代码语言:javascript复制
sudo yum -y localinstall jdk-8u73-linux-x64.rpm
现在Java应该安装在/usr/java/jdk1.8.0_73/jre/bin/java
,并从/usr/bin/java
中链接。
您可以删除先前下载的存档文件:
代码语言:javascript复制
rm ~/jdk-8u73-linux-x64.rpm
现在已经安装了Java 8,让我们安装ElasticSearch。
安装Elasticsearch
通过添加Elastic的包存储库,可以将Elasticsearch与包管理器一起安装。
运行以下命令将Elasticsearch公共GPG密钥导入rpm:
代码语言:javascript复制
sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为Elasticsearch创建一个新的yum存储库文件。请注意,这是一个命令:
代码语言:javascript复制
echo '[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
' | sudo tee /etc/yum.repos.d/elasticsearch.repo
使用以下命令安装Elasticsearch:
代码语言:javascript复制
sudo yum -y install elasticsearch
请务必在所有Elasticsearch服务器上重复此步骤。
Elasticsearch现已安装,但需要先配置才能使用它。
配置Elasticsearch集群
现在是时候编辑Elasticsearch配置了。在所有Elasticsearch服务器上完成这些步骤。
打开Elasticsearch配置文件以进行编辑:
代码语言:javascript复制
sudo vi /etc/elasticsearch/elasticsearch.yml
后续部分将说明如何修改配置。
绑定到V** IP地址或接口
您需要限制对Elasticsearch实例的外部访问,因此外人无法访问您的数据或通过HTTP API关闭您的Elasticsearch集群。换句话说,您必须配置Elasticsearch,以便它只允许访问您的专用网络(V**)上的服务器。为此,我们需要将每个节点配置为绑定到V** IP地址,即V**_ip
,或接口“tun0”。
找到指定network.host
的行,取消注释,并将其值替换为相应服务器的V** IP地址(例如,node01的V** IP地址为10.0.0.1
)或接口名称。由于我们的V**接口在所有服务器上都被命名为“tun0”,因此我们可以使用相同的线路配置所有服务器:
代码语言:javascript复制
network.host: [_tun0_, _local_]
请注意添加“local”,它将Elasticsearch配置为也侦听所有环回设备。这将允许您,在本地使用Elasticsearch HTTP API 让每个服务器向localhost
发送请求。如果您不包含此项,Elasticsearch将仅响应对V** IP地址的请求。
警告:由于Elasticsearch没有任何内置安全性,因此不要将此设置为任何您无法控制或信任的服务器可访问的IP地址,这一点非常重要。不要将Elasticsearch绑定到公共或共享专用网络IP地址!
设置群集名称
接下来,设置群集的名称,这将允许您的Elasticsearch节点加入并形成群集。您将需要使用唯一的描述性名称(在您的网络中)。
找到指定cluster.name
的行,取消注释,并将其值替换为所需的群集名称。在本教程中,我们将命名我们的集群“production”:
代码语言:javascript复制
cluster.name: production
设置节点名称
接下来,我们将设置每个节点的名称。这应该是一个在集群中唯一的描述性名称。
找到指定的行node.name
,取消注释,并将其值替换为所需的节点名称。在本教程中,我们将使用${HOSTNAME}
环境变量将每个节点名称设置为服务器的主机名:
代码语言:javascript复制
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
,你可以使用这条线:
代码语言:javascript复制
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
或者,如果您的所有服务器都配置了基于名称的V** IP地址解析(通过DNS或/etc/hosts
),您可以使用以下行:
代码语言:javascript复制
discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]
注意:Ansible Playbook 会自动在每台服务器上创建条目/etc/hosts
,将每个V**服务器的库存主机名(在Ansible hosts
文件中指定)解析为其V** IP地址。
保存并退出
您的服务器现在已配置为构成基本Elasticsearch集群。您需要更新更多设置,但在我们验证群集正常工作后,我们将会看到这些设置。
保存并退出elasticsearch.yml
。
启动Elasticsearch
现在启动Elasticsearch:
代码语言:javascript复制
sudo systemctl start elasticsearch
然后运行此命令以在启动时启动Elasticsearch:
代码语言:javascript复制
sudo systemctl enable elasticsearch
请务必在所有Elasticsearch服务器上配置Elasticsearch Cluster。
检查群集状态
如果一切都配置正确,您的Elasticsearch集群应该已启动并正在运行。在继续之前,让我们验证它是否正常工作。您可以通过从任何Elasticsearch节点查询Elasticsearch来执行此操作。
从任何Elasticsearch服务器,运行此命令以打印群集的状态:
代码语言:javascript复制
curl -XGET 'http://localhost:9200/_cluster/state?pretty'
您应该看到输出,指示名为“production”的集群正在运行。它还应表明您配置的所有节点都是成员:
代码语言:javascript复制
Cluster State:{
"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配置:
代码语言:javascript复制
sudo vi /etc/elasticsearch/elasticsearch.yml
找到指定bootstrap.mlockall
的行并取消注释:
代码语言:javascript复制
bootstrap.mlockall: true
保存并退出。
接下来,打开/etc/sysconfig/elasticsearch
文件进行编辑:
代码语言:javascript复制
sudo vi /etc/sysconfig/elasticsearch
首先,查找ES_HEAP_SIZE
,取消注释,并将其设置为可用内存的大约50%。例如,如果您有大约4 GB的可用空间,则应将其设置为2 GB(2g
):
代码语言:javascript复制
ES_HEAP_SIZE=2g
接下来,找到MAX_LOCKED_MEMORY=unlimited
并取消注释。当你完成时它应该是这样的:
代码语言:javascript复制
MAX_LOCKED_MEMORY=unlimited
保存并退出。
要编辑的最后一个文件是Elasticsearch systemd单元文件。打开它进行编辑:
代码语言:javascript复制
sudo vi /usr/lib/systemd/system/elasticsearch.service
查找LimitMEMLOCK=infinity
并取消注释。当你完成时它应该是这样的:
代码语言:javascript复制
LimitMEMLOCK=infinity
保存并退出。
现在重新加载systemctl守护程序并重新启动Elasticsearch以将更改置于适当位置:
代码语言:javascript复制
sudo systemctl daemon-reload
sudo systemctl restart elasticsearch
请务必在所有Elasticsearch服务器上重复此步骤。
验证Mlockall状态
要验证mlockall
是否在所有Elasticsearch节点上运行,请从任何节点运行此命令:
代码语言:javascript复制
curl http://localhost:9200/_nodes/process?pretty
每个节点都应该有一行说明"mlockall" : true
,表示内存锁定已启用且正常工作:
代码语言:javascript复制
Nodes process output:...
"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
用户的所有进程:
代码语言:javascript复制
ps -u elasticsearch
你应该看到看起来像这样的输出。第一列中的数字是Elasticsearch(java)进程的PID:
代码语言:javascript复制
PID TTY TIME CMD
11708 ? 00:00:10 java
然后运行此命令以显示Elasticsearch进程的打开文件限制(使用上一步骤中您自己的PID替换突出显示的数字):
代码语言:javascript复制
cat /proc/11708/limits | grep 'Max open files'
代码语言:javascript复制
Max open files 65535 65535 files
第二列和第三列中的数字分别表示软限制和硬限制,为64k(65535)。这对于许多设置都可以,但您可能希望增加此设置。
如何增加最大文件描述符限制
要增加Elasticsearch中打开文件描述符的最大数量,只需更改单个设置即可。
打开/usr/lib/systemd/system/elasticsearch.service
文件进行编辑:
代码语言:javascript复制
sudo vi /usr/lib/systemd/system/elasticsearch.service
查找LimitNOFILE
并将其设置为您想要的限制。例如,如果要限制128k描述符,请将其更改为131070
:
代码语言:javascript复制
LimitNOFILE=131070
保存并退出。
现在重新加载systemctl守护程序并重新启动Elasticsearch以将更改置于适当位置:
代码语言:javascript复制
sudo systemctl daemon-reload
sudo systemctl restart elasticsearch
然后按照上一小节的说明验证限制是否已增加。
请务必在需要更高文件描述符限制的任何Elasticsearch服务器上重复此步骤。
配置专用主节点和数据节点(可选)
Elasticsearch节点有两种常见类型:master和data。主节点执行群集范围的操作,例如管理索引和确定哪些数据节点应存储特定数据分片。数据节点保存索引文档的分片,并处理CRUD,搜索和聚合操作。作为一般规则,数据节点消耗大量的CPU,内存和I / O.
默认情况下,每个Elasticsearch节点都配置为“符合主节点”的数据节点,这意味着它们存储数据(并执行资源密集型操作),并有可能被选为主节点。对于一个小集群,这通常很好; 但是,大型Elasticsearch集群应配置专用主节点,以便主节点的稳定性不会受到密集数据节点工作的影响。
如何配置专用主节点
在配置专用主节点之前,请确保您的群集至少具有3个符合主节点的节点。这对于避免裂脑情况非常重要,这种情况会在网络出现故障时导致数据不一致。
要配置专用主节点,请编辑节点的Elasticsearch配置:
代码语言:javascript复制
sudo vi /etc/elasticsearch/elasticsearch.yml
添加以下两行:
代码语言:javascript复制
node.master: true
node.data: false
第一行node.master: true
指定节点符合主节点,实际上是默认设置。第二行node.data: false
限制节点成为数据节点。
保存并退出。
现在重新启动Elasticsearch节点以使更改生效:
代码语言:javascript复制
sudo systemctl restart elasticsearch
请务必在其他专用主节点上重复此步骤。
您可以使用curl -XGET 'http://localhost:9200/_cluster/state?pretty'
命令查询集群以查看哪些节点配置为专用主节点:。具有data: false
和master: true
的任何节点都是专用主节点。
如何配置专用数据节点
要配置专用数据节点 - 不符合主要条件的数据节点 - 编辑节点的Elasticsearch配置:
代码语言:javascript复制
sudo vi /etc/elasticsearch/elasticsearch.yml
添加以下两行:
代码语言:javascript复制
node.master: false
node.data: true
第一行node.master: false
指定节点不符合主节点。第二行node.data: true
是默认设置,允许节点作为数据节点。
保存并退出。
现在重新启动Elasticsearch节点以使更改生效:
代码语言:javascript复制
sudo systemctl restart elasticsearch
请务必在其他专用数据节点上重复此步骤。
您可以使用curl -XGET 'http://localhost:9200/_cluster/state?pretty'
命令查询群集以查看哪些节点配置为专用数据节点:。列出master: false
和未列出的任何节点data: false
都是专用数据节点。
配置最小主节点
运行Elasticsearch集群时,必须设置为集群正常运行而需要运行的符合主节点的最小节点数,这有时称为仲裁。这是为了在一个或多个节点失去与群集其余部分的连接的情况下确保数据一致性,从而防止所谓的“裂脑”情况。
要计算群集应具有的最小主节点数,请计算n / 2 1
,其中n是健康群集中“符合主要条件”节点的总数,然后将结果向下舍入为最接近的整数。例如,对于3节点群集,仲裁为2。
注意:确保在仲裁计算中包括所有符合条件的节点,包括符合主条件的任何数据节点(默认设置)。
可以通过Elasticsearch HTTP API动态设置最小主节点设置。为此,请在任何节点上运行此命令(将突出显示的数字替换为您的仲裁):
代码语言:javascript复制
curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
"persistent" : {
"discovery.zen.minimum_master_nodes" : 2
}
}'
代码语言:javascript复制
{
"acknowledged" : true,
"persistent" : {
"discovery" : {
"zen" : {
"minimum_master_nodes" : "2"
}
}
},
"transient" : { }
}
注意:此命令是“持久”设置,这意味着最小主节点设置将在完全群集重新启动后继续存在并覆盖Elasticsearch配置文件。另外,如果您还没有设置动态,这个设置可以被指定为/etc/elasticsearch.yml
中的discovery.zen.minimum_master_nodes: 2
。
如果要稍后检查此设置,可以运行以下命令:
代码语言:javascript复制
curl -XGET localhost:9200/_cluster/settings?pretty
如何访问Elasticsearch
您可以通过向任何节点的V** IP地址发送请求来访问Elasticsearch HTTP API,或者如教程中所示,通过从其中一个节点向localhost
发送请求来访问Elasticsearch HTTP API 。
客户端服务器可以通过任何节点的V** IP地址访问您的Elasticsearch集群,这意味着客户端服务器也必须是V**的一部分。
如果您有其他需要连接到群集的软件(如Kibana或Logstash),通常可以通过为应用程序提供一个或多个Elasticsearch节点的V** IP地址来配置连接。
结论
您的Elasticsearch集群应该运行在健康状态,并配置了一些基本优化!
Elasticsearch还有许多其他未在此处介绍的配置选项,例如索引,分片和复制设置。建议您稍后重新访问配置以及官方文档,以确保您的群集配置满足您的需求。
想要了解更多关于设置生产Elasticsearch集群的相关教程,请前往腾讯云 社区学习更多知识。
参考文献:《How To Set Up a Production Elasticsearch Cluster on CentOS 7》