如何在CentOS 7上设置生产Elasticsearch集群

介绍

Elasticsearch是一种流行的开源搜索服务器,用于实时分布式搜索和数据分析。当用于开发以外的任何其他任务时,Elasticsearch应作为集群跨多个服务器部署,以获得最佳性能,稳定性和可伸缩性。

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

虽然手动设置Elasticsearch集群对于学习很有用,但强烈建议在任何集群设置中使用配置管理工具。

准备

您必须至少有三个CentOS 7服务器才能完成本教程,因为Elasticsearch集群应至少具有3个符合主节点的节点。如果要拥有专用的主节点和数据节点,则主节点至少需要3台服务器,数据节点需要额外的服务器。

没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

假设

本教程假设您的服务器正在使用Ansible和Tinc VPN,无论您的服务器使用何种物理网络,这都将提供专用网络功能。

如果您使用的是共享专用网络,则必须使用VPN来保护Elasticsearch免受未经授权的访问。每个服务器必须位于同一个专用网络上,因为Elasticsearch在其HTTP接口中没有内置安全性。不得与您不信任的任何计算机共享专用网络。

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

安装Java 8

Elasticsearch需要Java,所以我们现在就安装它。我们将安装最新版本的Oracle Java 8,因为这是Elasticsearch推荐的。但是,如果您决定走这条路,它应该可以与OpenJDK一起使用。遵循本节中的步骤意味着您接受Java SE的Oracle二进制许可协议。

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

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

cd ~
wget --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(如果您下载了其他版本,请在此处替换文件名):

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

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

您可以删除先前下载的存档文件:

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

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

安装Elasticsearch

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

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

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

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

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:

sudo yum -y install elasticsearch

请务必在所有Elasticsearch服务器上重复此步骤。

Elasticsearch现已安装,但需要先配置才能使用它。

配置Elasticsearch集群

现在是时候编辑Elasticsearch配置了。在所有Elasticsearch服务器上完成这些步骤。

打开Elasticsearch配置文件以进行编辑:

sudo vi /etc/elasticsearch/elasticsearch.yml

后续部分将说明如何修改配置。

绑定到VPN IP地址或接口

您需要限制对Elasticsearch实例的外部访问,因此外人无法访问您的数据或通过HTTP API关闭您的Elasticsearch集群。换句话说,您必须配置Elasticsearch,以便它只允许访问您的专用网络(VPN)上的服务器。为此,我们需要将每个节点配置为绑定到VPN IP地址,即vpn_ip,或接口“tun0”。

找到指定network.host的行,取消注释,并将其值替换为相应服务器的VPN IP地址(例如,node01的VPN IP地址为10.0.0.1)或接口名称。由于我们的VPN接口在所有服务器上都被命名为“tun0”,因此我们可以使用相同的线路配置所有服务器:

network.host: [_tun0_, _local_]

请注意添加“local”,它将Elasticsearch配置为也侦听所有环回设备。这将允许您,在本地使用Elasticsearch HTTP API 让每个服务器向localhost发送请求。如果您不包含此项,Elasticsearch将仅响应对VPN 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的行并取消注释。将其值替换为所有其他节点的VPN IP地址或主机名(解析为VPN IP地址)的字符串数组。

例如,如果您有三台服务器node01node02以及node03与各自的VPN的IP地址10.0.0.110.0.0.2以及10.0.0.3,你可以使用这条线:

discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]

或者,如果您的所有服务器都配置了基于名称的VPN IP地址解析(通过DNS或/etc/hosts),您可以使用以下行:

discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]

注意:Ansible Playbook 会自动在每台服务器上创建条目/etc/hosts,将每个VPN服务器的库存主机名(在Ansible hosts文件中指定)解析为其VPN IP地址。

保存并退出

您的服务器现在已配置为构成基本Elasticsearch集群。您需要更新更多设置,但在我们验证群集正常工作后,我们将会看到这些设置。

保存并退出elasticsearch.yml

启动Elasticsearch

现在启动Elasticsearch:

sudo systemctl start elasticsearch

然后运行此命令以在启动时启动Elasticsearch:

sudo systemctl enable elasticsearch

请务必在所有Elasticsearch服务器上配置Elasticsearch Cluster。

检查群集状态

如果一切都配置正确,您的Elasticsearch集群应该已启动并正在运行。在继续之前,让我们验证它是否正常工作。您可以通过从任何Elasticsearch节点查询Elasticsearch来执行此操作。

从任何Elasticsearch服务器,运行此命令以打印群集的状态:

curl -XGET 'http://localhost:9200/_cluster/state?pretty'

您应该看到输出,指示名为“production”的集群正在运行。它还应表明您配置的所有节点都是成员:

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配置:

sudo vi /etc/elasticsearch/elasticsearch.yml

找到指定bootstrap.mlockall的行并取消注释:

bootstrap.mlockall: true

保存并退出。

接下来,打开/etc/sysconfig/elasticsearch文件进行编辑:

sudo vi /etc/sysconfig/elasticsearch

首先,查找ES_HEAP_SIZE,取消注释,并将其设置为可用内存的大约50%。例如,如果您有大约4 GB的可用空间,则应将其设置为2 GB(2g):

ES_HEAP_SIZE=2g

接下来,找到MAX_LOCKED_MEMORY=unlimited并取消注释。当你完成时它应该是这样的:

MAX_LOCKED_MEMORY=unlimited

保存并退出。

要编辑的最后一个文件是Elasticsearch systemd单元文件。打开它进行编辑:

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

查找LimitMEMLOCK=infinity并取消注释。当你完成时它应该是这样的:

LimitMEMLOCK=infinity

保存并退出。

现在重新加载systemctl守护程序并重新启动Elasticsearch以将更改置于适当位置:

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

请务必在所有Elasticsearch服务器上重复此步骤。

验证Mlockall状态

要验证mlockall是否在所有Elasticsearch节点上运行,请从任何节点运行此命令:

curl http://localhost:9200/_nodes/process?pretty

每个节点都应该有一行说明"mlockall" : true,表示内存锁定已启用且正常工作:

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用户的所有进程:

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中打开文件描述符的最大数量,只需更改单个设置即可。

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

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

查找LimitNOFILE并将其设置为您想要的限制。例如,如果要限制128k描述符,请将其更改为131070

LimitNOFILE=131070

保存并退出。

现在重新加载systemctl守护程序并重新启动Elasticsearch以将更改置于适当位置:

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

然后按照上一小节的说明验证限制是否已增加。

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

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

Elasticsearch节点有两种常见类型:masterdata。主节点执行群集范围的操作,例如管理索引和确定哪些数据节点应存储特定数据分片。数据节点保存索引文档的分片,并处理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 systemctl restart elasticsearch

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

您可以使用curl -XGET 'http://localhost:9200/_cluster/state?pretty'命令查询集群以查看哪些节点配置为专用主节点:。具有data: falsemaster: true的任何节点都是专用主节点。

如何配置专用数据节点

要配置专用数据节点 - 不符合主要条件的数据节点 - 编辑节点的Elasticsearch配置:

sudo vi /etc/elasticsearch/elasticsearch.yml

添加以下两行:

node.master: false 
node.data: true

第一行node.master: false指定节点不符合主节点。第二行node.data: true是默认设置,允许节点作为数据节点。

保存并退出。

现在重新启动Elasticsearch节点以使更改生效:

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动态设置最小主节点设置。为此,请在任何节点上运行此命令(将突出显示的数字替换为您的仲裁):

curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
    "persistent" : {
        "discovery.zen.minimum_master_nodes" : 2
    }
}'
{
  "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

如何访问Elasticsearch

您可以通过向任何节点的VPN IP地址发送请求来访问Elasticsearch HTTP API,或者如教程中所示,通过从其中一个节点向localhost发送请求来访问Elasticsearch HTTP API 。

客户端服务器可以通过任何节点的VPN IP地址访问您的Elasticsearch集群,这意味着客户端服务器也必须是VPN的一部分。

如果您有其他需要连接到群集的软件(如Kibana或Logstash),通常可以通过为应用程序提供一个或多个Elasticsearch节点的VPN IP地址来配置连接。

结论

您的Elasticsearch集群应该运行在健康状态,并配置了一些基本优化!

Elasticsearch还有许多其他未在此处介绍的配置选项,例如索引,分片和复制设置。建议您稍后重新访问配置以及官方文档,以确保您的群集配置满足您的需求。

想要了解更多关于设置生产Elasticsearch集群的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Set Up a Production Elasticsearch Cluster on CentOS 7》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

如何备份ElasticSearch索引数据到HDFS上

4093
来自专栏你不就像风一样

深入理解跨域SSO原理与技术

​ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登...

1951
来自专栏云计算教程系列

如何在Apache上配置重定向

HTTP重定向是将一个域名或地址指向另一个域名或地址的方式。有几种不同的重定向,每种重定向都对浏览器造成的影响不同,两种最常见的类型是临时重定向和永久重定向。

2343
来自专栏运维前线

Elasticsearch API 使用介绍

API文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.htm...

2216
来自专栏CodingBlock

Postman用法简介-Http请求模拟工具

  在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下,这样的话就非常需要有一个比较给力的Http请求模拟工具,...

3267
来自专栏Python小屋

Python实现带有阻塞和超时放弃功能的队列结构

本文代码对Python列表进行封装并模拟了队列结构,入队时如果队列已满则阻塞当前线程,超时则放弃;出队时如果队列已空则阻塞当前线程,超时则放弃。 import ...

3784
来自专栏Laoqi's Linux运维专列

KVM虚拟主机管理篇

5793
来自专栏农夫安全

Apache默认目录解读和加固分析

? 删除无用文件 操作目的删除默认安装时的无用文件检查方法检查Apache目录下是否存在无用文件加固方法删除默认安装的HTML文件 # cd /usr/loc...

3728
来自专栏IT可乐

RabbitMQ详解(二)------消息通信的概念

  说到消息通信,可能我们首先会想到的是邮箱,QQ,微信,短信等等这些通信方式,这些通信方式都有发送者,接收者,还有一个中间存储离线消息的容器。但是这些通信方式...

1453

使用Puppet模块创建LAMP堆栈

在Puppet中,模块是服务器配置的构建块。模块安装和配置包,创建目录,并生成用户在模块中包含的任何其他服务器更改。Puppet模块旨在执行特定任务的所有部分,...

1403

扫码关注云+社区

领取腾讯云代金券