如何在 CentOS 7 上建立生产型 Elasticsearch 集群

介绍

Elasticsearch 是一个流行的开源搜索服务器,用于实时分布式搜索和数据分析,当用于开发以外的任何事情时,Elasticsearch 应该在多个服务器上部署作为一个群集,以获得最佳的性能,稳定性和可扩展性。

本教程将向您展示如何在CentOS 7上安装和配置生产Elasticsearch集群,在云服务器环境中。

虽然手动设置 Elasticsearch 集群有助于学习,但在任何集群设置中强烈建议使用配置管理工具. 如果您想要使用 Ansible 部署 Elasticsearch 集群,请遵循本教程: 如何使用 Ansible 设置生产 Elasticsearch 集群

前提条件

您必须至少有三台 CentOS 7 服务器来完成本教程,因为一个 Elasticsearch 集群应该至少有 3 个主资格节点. 如果您想要有专用的主节点和数据节点,您需要至少 3 个主节点的服务器以及数据节点的额外服务器。

如果您更喜欢使用Ubuntu,请参阅本教程: 如何在Ubuntu 14.04上设置生产弹性搜索集群

假设

本教程假设您的服务器正在使用一个VPN,如下所述: 如何使用Ansible和TincVPN来保护您的服务器基础设施

如果您正在使用共享的私人网络,例如DigitalOcean Private Networking,您必须使用VPN来保护Elasticsearch免受未经授权的访问。每个服务器必须在同一个私人网络上,因为Elasticsearch没有HTTP界面内嵌入的安全性。

我们将将您的服务器的VPN IP地址称为vpn_ip。我们还将假设它们都有一个名为tun0的VPN接口,如上文链接的教程中所述。

安装Java 8

Elasticsearch 需要 Java,所以我们现在将安装它。我们将安装 Oracle Java 8 的最新版本,因为这就是 Elasticsearch 推荐的。 但是,如果您决定沿着这个路径运行,它应该与 OpenJDK 很好。

在所有 Elasticsearch 服务器上完成此步骤。

转到您的主目录并下载Oracle Java 8(更新73,本文写作时最新的) JDK RPM,使用以下命令:

1cd ~
2wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"

然后用这个 yum 命令安装 RPM (如果您下载了不同的版本,请在这里更换文件名):

1sudo yum -y localinstall jdk-8u73-linux-x64.rpm

现在Java应该在/usr/java/jdk1.8.0_73/jre/bin/java上安装,并从/usr/bin/java上链接。

您可以删除您之前下载的档案文件:

1rm ~/jdk-8u73-linux-x64.rpm

现在 Java 8 已安装,让我们安装 ElasticSearch。

安装 Elasticsearch

Elasticsearch 可以通过添加 Elastic 的包库来与包管理器一起安装。

运行以下命令将 Elasticsearch 公共 GPG 键导入 rpm:

1sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

为 Elasticsearch 创建一个新的 yum 存储文件. 请注意,这是一个单一的命令:

1echo '[elasticsearch-2.x]
2name=Elasticsearch repository for 2.x packages
3baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
4gpgcheck=1
5gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
6enabled=1
7' | sudo tee /etc/yum.repos.d/elasticsearch.repo

使用此命令安装 Elasticsearch:

1sudo yum -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 systemctl start elasticsearch

然后运行此命令来启动 Elasticsearch 启动:

1sudo systemctl enable elasticsearch

请确保在所有 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/sysconfig/elasticsearch 文件进行编辑:

1sudo vi /etc/sysconfig/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 systemd 单元文件。

1sudo vi /usr/lib/systemd/system/elasticsearch.service

查找并放弃评论 LimitMEMLOCK=infinity. 当你完成时,它应该是这样的:

1[label /usr/lib/systemd/system/elasticsearch.service — LimitMEMLOCK]
2LimitMEMLOCK=infinity

保存和退出。

现在,重新加载 systemctl 对象并重新启动 Elasticsearch 以将更改置于位置:

1sudo systemctl daemon-reload
2sudo systemctl restart elasticsearch

请确保在所有 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 中增加开放的文件描述器的最大数目,您只需要更改一个设置。

打开 /usr/lib/systemd/system/elasticsearch.service 文件进行编辑:

1sudo vi /usr/lib/systemd/system/elasticsearch.service

例如,如果您想要限制 128k 描述符,请将其更改为 131070:

1[label /usr/lib/systemd/system/elasticsearch.service — LimitNOFILE]
2LimitNOFILE=131070

保存和退出。

现在,重新加载 systemctl 对象并重新启动 Elasticsearch 以将更改置于位置:

1sudo systemctl daemon-reload
2sudo systemctl restart elasticsearch

然后按照上一个子段来验证是否增加了限制。

请确保在任何需要更高的文件描述极限的 Elasticsearch 服务器上重复此步骤。

配置专用主和数据节点(可选)

Elasticsearch 节点有两种常见类型: masterdata. 主节点执行集群广泛的操作,例如管理索引并确定哪些数据节点应该存储特定数据片段。

默认情况下,每个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 systemctl restart elasticsearch

请确保在其他专用主节点上重复此步骤。

您可以查询群集以查看哪些节点是用这个命令配置为专用主节点: `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 systemctl restart elasticsearch

请确保在其他专用数据节点上重复此步骤。

您可以查询群集以查看哪些节点被配置为专用数据节点,使用此命令: `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 还有许多其他配置选项,这些选项不包括在这里,例如索引、碎片和复制设置,建议您稍后再访问配置,以及官方文档,以确保您的集群配置符合您的需求。

Published At
Categories with 技术
comments powered by Disqus