介绍
Elasticsearch 是一个流行的开源搜索服务器,用于实时分布式搜索和数据分析,当用于开发以外的任何事情时,Elasticsearch 应该在多个服务器上部署作为一个群集,以获得最佳的性能,稳定性和可扩展性。
本教程将向您展示如何在云服务器环境中安装和配置Ubuntu 14.04上的生产Elasticsearch集群。
虽然手动设置 Elasticsearch 集群有助于学习,但在任何集群设置中强烈建议使用配置管理工具. 如果您想要使用 Ansible 部署 Elasticsearch 集群,请遵循本教程: 如何使用 Ansible 设置生产 Elasticsearch 集群。
前提条件
您必须至少有三个Ubuntu 14.04服务器来完成本教程,因为Elasticsearch集群应该至少有3个合格的主节点. 如果您想要有专用的主节点和数据节点,您将需要至少3个服务器为您的主节点以及额外的服务器为您的数据节点。
如果您更喜欢使用 CentOS,请参阅本教程: 如何在CentOS 7上设置生产弹性搜索集群
假设
本教程假设您的服务器正在使用一个VPN,如下所述: 如何使用Ansible和TincVPN来保护您的服务器基础设施。
如果您正在使用共享的私人网络,您必须使用VPN来保护Elasticsearch免受未经授权的访问. 每个服务器必须在同一个私人网络上,因为Elasticsearch没有HTTP界面内置的安全性。
我们将将您的服务器的VPN IP地址称为vpn_ip
。我们还将假设它们都有一个名为tun0
的VPN接口,如上文链接的教程中所述。
安装Java 8
Elasticsearch 需要 Java,所以我们现在会安装它,我们会安装 Oracle Java 8 的最新版本,因为这就是 Elasticsearch 推荐的。
在所有 Elasticsearch 服务器上完成此步骤。
将 Oracle Java PPA 添加到 apt:
1sudo add-apt-repository -y ppa:webupd8team/java
更新您的 apt 数据库:
1sudo apt-get update
使用此命令安装 Oracle Java 8 的最新稳定版本(并接受出现的许可协议):
1sudo apt-get -y install oracle-java8-installer
请确保在所有 Elasticsearch 服务器上重复此步骤。
现在 Java 8 已安装,让我们安装 ElasticSearch。
安装 Elasticsearch
Elasticsearch 可以通过添加 Elastic 的包源列表来与包管理器一起安装,在所有 Elasticsearch 服务器上完成此步骤。
运行以下命令将 Elasticsearch 公共 GPG 密钥导入 apt:
1wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
如果你的提示只是挂在那里,它可能正在等待你的用户密码(授权sudo
命令)。
创建 Elasticsearch 源列表:
1echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
更新您的 apt 数据库:
1sudo apt-get update
使用此命令安装 Elasticsearch:
1sudo apt-get -y install elasticsearch
请确保在所有 Elasticsearch 服务器上重复这些步骤。
Elasticsearch 现在已安装,但需要配置才能使用它。
配置 Elasticsearch 集群
现在是时候编辑 Elasticsearch 配置了,在所有 Elasticsearch 服务器上完成这些步骤。
打开 Elasticsearch 配置文件以编辑:
1sudo vi /etc/elasticsearch/elasticsearch.yml
下面的部分将解释如何更改配置。
连接到 VPN IP 地址或接口
您将希望限制对您的 Elasticsearch 实例的外部访问,以便外部人无法访问您的数据或关闭您的 Elasticsearch 集群通过 HTTP API. 换句话说,您必须配置 Elasticsearch 以仅允许访问您的私人网络(VPN)上的服务器。
找到指定的network.host
的行,放弃评论,并用相应服务器的VPN IP地址(例如,node01的10.0.0.1
)或界面名替换其值,因为我们的VPN界面在所有服务器上都被命名为tun0
,所以我们可以将所有服务器配置为相同的行:
1[label elasticsearch.yml — network.host]
2network.host: [_tun0_, _local_]
注意添加了_local_
,该功能将Elasticsearch配置为在所有循环设备上也收听。这将允许您从每个服务器本地使用Elasticsearch HTTP API,通过向localhost
发送请求。
<$>[警告] **警告:**由于Elasticsearch没有内置的安全性,所以非常重要的是不要将此设置为任何您无法控制或信任的服务器可以访问的IP地址。
设置集群名称
接下来,设置您的集群的名称,这将允许您的 Elasticsearch节点加入并形成集群。
找出指定的字符串cluster.name
,不评论它,并用您想要的集群名称代替其值。
1[label elasticsearch.yml — cluster.name]
2cluster.name: production
设置节点名称
接下来,我们将设置每个节点的名称,这应该是一个在集群中独特的描述性名称。
在本教程中,我们将使用${HOSTNAME}
环境变量将每个节点名设置为服务器的主机名:
1[label elasticsearch.yml — node.name]
2node.name: ${HOSTNAME}
如果您喜欢,您可以手动命名节点,但请确保您指定独特的名称. 如果您不介意随机命名节点,您也可以留下node.name
评论。
探险家探险家
接下来,您需要配置一个初始的节点列表,这些节点将被联系到发现并形成一个群集。
找到指定的discovery.zen.ping.unicast.hosts
的行,然后放弃评论,将其值替换为所有其他节点的VPN IP地址或主机名(解决VPN IP地址)的一系列字符串。
例如,如果您有三個伺服器「node01」、「node02」和「node03」與各自的 VPN IP 地址「10.0.0.1」、「10.0.0.2」和「10.0.0.3」,您可以使用這個行:
1[label elasticsearch.yml — hosts by IP address]
2discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
或者,如果您的所有服务器都配置了他们的VPN IP地址的基于名称的分辨率(通过DNS或‘/etc/hosts’),您可以使用以下行:
1[label elasticsearch.yml — hosts by name]
2discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]
<$>[注]
**注:**在 前提 VPN 教程中的 Ansible Playbook 自动在每个服务器上创建 /etc/hosts
条目,将每个 VPN 服务器的 **库存主机名(在 Ansible hosts
文件中指定)解决为其 VPN IP 地址。
保存和退出
您的服务器现在已配置为构建一个基本的 Elasticsearch 集群. 您将需要更新的设置,但在我们验证集群工作后,我们将访问这些设置。
保存并退出elasticsearch.yml
。
启动 Elasticsearch
现在开始 Elasticsearch:
1sudo service elasticsearch restart
然后运行此命令来启动 Elasticsearch 启动:
1sudo update-rc.d elasticsearch defaults 95 10
请确保在所有 Elasticsearch 服务器上重复这些步骤(Configure Elasticsearch Cluster。
查看克拉斯特州
如果一切都是正确配置的,那么您的 Elasticsearch 集群应该启动并运行。 继续前,让我们检查它是否正常工作。
从您的任何 Elasticsearch 服务器中运行此命令来打印群集的状态:
1curl -XGET 'http://localhost:9200/_cluster/state?pretty'
您应该看到输出表示一个名为生产
的集群正在运行,它还应该表示您配置的所有节点都是会员:
1[secondary_label Cluster State:]
2{
3 "cluster_name" : "production",
4 "version" : 36,
5 "state_uuid" : "MIkS5sk7TQCl31beb45kfQ",
6 "master_node" : "k6k2UObVQ0S-IFoRLmDcvA",
7 "blocks" : { },
8 "nodes" : {
9 "Jx_YC2sTQY6ayACU43_i3Q" : {
10 "name" : "node02",
11 "transport_address" : "10.0.0.2:9300",
12 "attributes" : { }
13 },
14 "k6k2UObVQ0S-IFoRLmDcvA" : {
15 "name" : "node01",
16 "transport_address" : "10.0.0.1:9300",
17 "attributes" : { }
18 },
19 "kQgZZUXATkSpduZxNwHfYQ" : {
20 "name" : "node03",
21 "transport_address" : "10.0.0.3:9300",
22 "attributes" : { }
23 }
24 },
25...
如果您看到类似于此的输出,则您的 Elasticsearch 集群正在运行! 如果您缺少任何节点,请在继续前检查有关节点(s)的配置。
接下来,我们将讨论一些配置设置,您应该考虑您的Elasticsearch集群。
允许记忆锁定
Elastic 建议避免不惜一切代价更换 Elasticsearch 流程,因为它对性能和稳定性产生负面影响.避免过度更换的方法之一是配置 Elasticsearch 以锁定所需的内存。
在所有 Elasticsearch 服务器上完成此步骤。
编辑 Elasticsearch 配置:
1sudo vi /etc/elasticsearch/elasticsearch.yml
尋找指定「bootstrap.mlockall」的行,然後放棄評論:
1[label elasticsearch.yml — bootstrap.mlockall]
2bootstrap.mlockall: true
保存和退出。
接下来,打开 /etc/default/elasticsearch
文件进行编辑:
1sudo vi /etc/default/elasticsearch
首先,查找ES_HEAP_SIZE
,放弃评论,并将其设置为可用内存的50%。例如,如果您有大约4GB的免费内存,您应该将其设置为2GB(2g
):
1[label /etc/default/elasticsearch — ES_HEAP_SIZE]
2ES_HEAP_SIZE=2g
接下来,查找并删除MAX_LOCKED_MEMORY=unlimited
。
1[label /etc/default/elasticsearch — MAX_LOCKED_MEMORY]
2MAX_LOCKED_MEMORY=unlimited
保存和退出。
现在,重新启动 Elasticsearch 以实现更改:
1sudo service elasticsearch restart
请确保在所有 Elasticsearch 服务器上重复此步骤。
检查Mlockall状态
要验证mlockall
在您的所有 Elasticsearch 节点上工作,请从任何节点运行此命令:
1curl http://localhost:9200/_nodes/process?pretty
每个节点都应该有一个行,表示mlockall
: true`,表示已启用内存锁和工作:
1[secondary_label Nodes process output:]
2...
3 "nodes" : {
4 "kQgZZUXATkSpduZxNwHfYQ" : {
5 "name" : "es03",
6 "transport_address" : "10.0.0.3:9300",
7 "host" : "10.0.0.3",
8 "ip" : "10.0.0.3",
9 "version" : "2.2.0",
10 "build" : "8ff36d1",
11 "http_address" : "10.0.0.3:9200",
12 "process" : {
13 "refresh_interval_in_millis" : 1000,
14 "id" : 1650,
15 "mlockall" : true
16 }
17...
如果 mlockall
对您的任何节点都是错误的,请检查节点的设置并重新启动 Elasticsearch。
设置开放文件描述器限制(可选)
默认情况下,您的 Elasticsearch 节点应该具有 64k 的开放文件描述器限制
。
如何查看最多打开文件
首先,找到您的 Elasticsearch 进程的进程 ID(PID)。 一个简单的方法是使用ps
命令列出所有属于elasticsearch
用户的进程:
1ps -u elasticsearch
第一列中的数字是您的 Elasticsearch (java) 流程的 PID:
1[secondary_label Output:]
2 PID TTY TIME CMD
311708 ? 00:00:10 java
然后运行此命令来显示 Elasticsearch 流程的开放文件限制(从上一步中用您自己的 PID 取代突出的数字):
1cat /proc/11708/limits | grep 'Max open files'
1[secondary_label Output]
2Max open files 65535 65535 files
第二列和第三列中的数字分别表示软和硬限制为64k(65535)。
如何增加 Max 文件描述器限制
要在 Elasticsearch 中增加开放的文件描述器的最大数目,您只需要更改一个设置。
打开/etc/default/elasticsearch
文件来编辑:
1sudo vi /etc/default/elasticsearch
查找MAX_OPEN_FILES
,删除评论,并将其设置为您想要的限制,例如,如果您想要限制 128k 描述符,请将其更改为131070
:
1[label /etc/default/elasticsearch — MAX_OPEN_FILES]
2MAX_OPEN_FILES=131070
保存和退出。
现在,重新启动 Elasticsearch 以实现更改:
1sudo service elasticsearch restart
然后按照上一个子段来验证是否增加了限制。
请确保在任何需要更高的文件描述极限的 Elasticsearch 服务器上重复此步骤。
配置专用主和数据节点(可选)
Elasticsearch 节点有两种常见类型: master和 data. 主节点执行集群广泛的操作,例如管理索引并确定哪些数据节点应该存储特定数据片段。
默认情况下,每个Elasticsearch节点都被配置为主资格
的数据节点,这意味着它们存储数据(并执行资源密集的操作),并有可能被选为主节点。
如何配置专用主节点
在配置专用主节点之前,请确保您的集群至少有3个符合主资格的节点,以避免出现分裂状态,这可能导致网络故障时数据出现不一致。
要配置专用主节点,请编辑节点的 Elasticsearch 配置:
1sudo vi /etc/elasticsearch/elasticsearch.yml
添加以下两行:
1[label elasticsearch.yml — dedicated master]
2node.master: true
3node.data: false
第一个行, node.master: true
,指定节点是 master-eligible 并且实际上是默认设置. 第二行, node.data: false
,限制节点成为数据节点。
保存和退出。
现在,重新启动 Elasticsearch 节点以实现更改:
1sudo service elasticsearch restart
请确保在其他专用主节点上重复此步骤。
您可以查询群集以查看哪些节点是用这个命令配置为专用主节点: `curl -XGET 'http://localhost:9200/_cluster/state?pretty'。
如何配置专用数据节点
若要配置专用数据节点,即不是主权的数据节点,则可以编辑节点的 Elasticsearch 配置:
1sudo vi /etc/elasticsearch/elasticsearch.yml
添加以下两行:
1[label elasticsearch.yml — dedicated data]
2node.master: false
3node.data: true
第一行, node.master: false
,指明节点不符合 master 资格;第二行, node.data: true
,是默认设置,允许节点成为数据节点。
保存和退出。
现在,重新启动 Elasticsearch 节点以实现更改:
1sudo service elasticsearch restart
请确保在其他专用数据节点上重复此步骤。
您可以查询群集以查看哪些节点被配置为专用数据节点,使用此命令: `curl -XGET 'http://localhost:9200/_cluster/state?pretty'。
设置最小主节点
在运行 Elasticsearch 集群时,重要的是要设置需要运行的最小数目主资格节点,以便集群正常运作,这有时被称为 quorum。
要计算群集应有最小主节点的数目,请计算 n / 2 + 1
,其中 n 是健康群集中主资格
节点的总数,然后将结果圆到最接近的整数。
<$>[注] 注: 请确保在您的定数计算中包含所有主资格节点,包括所有主资格节点(默认设置)。
最小主节点设置可以动态设置,通过Elasticsearch HTTP API. 要做到这一点,请在任何节点上运行此命令(以您的定数代替突出号码):
1curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
2 "persistent" : {
3 "discovery.zen.minimum_master_nodes" : 2
4 }
5}'
1[secondary_label Output:]
2{
3 "acknowledged" : true,
4 "persistent" : {
5 "discovery" : {
6 "zen" : {
7 "minimum_master_nodes" : "2"
8 }
9 }
10 },
11 "transient" : { }
12}
<$>[注]
注: 这个命令是一个持久的
设置,这意味着最小主节点设置将生存到完整的集群重新启动和超过 Elasticsearch 配置文件。
如果您想稍后检查此设置,您可以运行此命令:
1curl -XGET localhost:9200/_cluster/settings?pretty
如何访问 Elasticsearch
您可以通过向 VPN IP 地址发送请求来访问 Elasticsearch HTTP API,或者如教程中所示,通过从其中一个节点发送请求到本地主机
。
您的 Elasticsearch 集群可以通过任何节点的 VPN IP 地址访问客户端服务器,这意味着客户端服务器也必须是 VPN 的一部分。
如果您有其他软件需要连接到您的集群,例如Kibana或Logstash,您通常可以通过提供您的应用程序一个或多个Elasticsearch节点的VPN IP地址来配置连接。
结论
您的 Elasticsearch 集群应该在健康状态下运行,并配置一些基本的优化!
Elasticsearch 还有许多其他配置选项,这些选项不包括在这里,例如索引、碎片和复制设置,建议您稍后再访问配置,以及官方文档,以确保您的集群配置符合您的需求。