如何设立了生产Elasticsearch集群在Ubuntu 14.04

Elasticsearch是用于实时分布式搜索和分析数据的一个流行的开源搜索服务器。当用于发展比任何其他,Elasticsearch应该在多个服务器上部署为一个集群,以获得最佳性能,稳定性和可扩展性。 本教程将告诉你如何在Ubuntu 14.04安装和配置生产Elasticsearch集群,在云服务器环境中。

介绍

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

本教程将向您介绍如何在云服务器环境中在Ubuntu 14.04上安装和配置生产Elasticsearch集群。

虽然手动设置Elasticsearch集群对于学习很有用,但强烈建议在任何集群设置中使用配置管理工具。 如果你想使用Ansible部署一个集群Elasticsearch,本教程: 如何使用Ansible到设立了生产Elasticsearch集群

先决条件

您必须至少有三个Ubuntu 14.04服务器才能完成本教程,因为Elasticsearch集群应至少有3个符合主机资格的节点。 如果要具有专用的主节点和数据节点,则至少需要3个服务器用于主节点,以及为数据节点提供其他服务器。

如果你更喜欢使用CentOS的,而不是,看看这个教程: 如何建立一个生产Elasticsearch集群在CentOS 7

假设

本教程假定您的服务器使用的是像这里所描述的一个VPN: 如何使用Ansible和TINC VPN保护您的服务器基础架构 这将提供专用网络功能,而不管您的服务器正在使用的物理网络。

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

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

安装Java 8

Elasticsearch需要Java,所以我们现在就安装它。 我们将安装最新版本的Oracle Java 8,因为这是Elasticsearch推荐的版本。 然而,它应该与OpenJDK,如果你决定走这条路线工作正常。

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

添加Oracle Java PPA到apt:

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。

安装Elasticsearch

Elasticsearch可以通过添加Elastic的软件包源列表与软件包管理器一起安装。 在所有Elasticsearch服务器上完成此步骤。

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

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

如果你的提示只是挂在那里,它可能是在等待您的用户密码(授权sudo命令)。 如果是这种情况,请输入您的密码。

创建Elasticsearch源列表:

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 Cluster

现在是时候编辑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地址值(如10.0.0.1为NODE01)或接口的名称。 因为我们的VPN接口在我们的所有服务器上都命名为“tun0”,所以我们可以使用同一行配置所有服务器:

elasticsearch.yml - network.host
network.host: [_tun0_, _local_]

注意添加“_local_”,它将Elasticsearch配置为也在所有回送设备上侦听。 这将允许你在本地使用Elasticsearch HTTP API,从每个服务器,通过发送请求到localhost 如果您不包括此,Elasticsearch将只响应对VPN IP地址的请求。

警告:由于Elasticsearch没有任何内置的安全性,这是非常重要的,你不要将此设置为是,你不控制或信任的任何服务器访问的IP地址。 不绑定Elasticsearch到公共或共享专用网络 IP地址!

设置集群名称

接下来,设置集群的名称,这将允许您的Elasticsearch节点加入并形成集群。 您将要使用唯一(在您的网络中)的描述性名称。

查找指定线路cluster.name ,取消它,并与您的期望集群名替换它的值。 在本教程中,我们将命名集群“production”:

elasticsearch.yml - cluster.name
cluster.name: production

设置节点名称

接下来,我们将设置每个节点的名称。 这应该是在群集内是唯一的描述性名称。

查找指定线路node.name ,取消它,用你想要的节点名称替换它的值。 在本教程中,我们将通过每个节点名称设置为服务器的主机名${HOSTNAME}环境变量:

elasticsearch.yml - node.name
node.name: ${HOSTNAME}

如果您愿意,可以手动命名节点,但请确保指定唯一的名称。 您也可以留下node.name注释掉,如果你不介意随机命名的节点。

设置发现主机

接下来,您将需要配置将联系以发现和形成集群的节点的初始列表。 这在单播网络中是必要的。

查找指定的行discovery.zen.ping.unicast.hosts并取消它。 将其值替换为所有其他节点的VPN IP地址或主机名(解析为VPN IP地址)的字符串数组。

例如,如果您有三个服务器node01node02node03与各自VPN的IP地址10.0.0.110.0.0.210.0.0.3 ,您可以使用此行:

elasticsearch.yml - 主机的IP地址
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]

另外,如果所有的服务器都使用(通过DNS或他们的VPN的IP地址的基于域名的解析配置/etc/hosts ),您可以使用此行:

elasticsearch.yml - 主机名称
discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]

注:Ansible剧本的前提VPN教程会自动创建/etc/hosts每一个解决每个VPN服务器的主机名库存 (在Ansible指定服务器上的条目hosts文件中)的VPN的IP地址。

保存并退出

您的服务器现在配置为形成基本的Elasticsearch集群。 还有更多的设置,你想更新,但我们会得到那些后,我们验证了集群是否工作。

保存并退出elasticsearch.yml

启动Elasticsearch

现在启动Elasticsearch:

sudo service elasticsearch restart

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

sudo update-rc.d elasticsearch defaults 95 10

一定要重复这些步骤( 配置Elasticsearch集群在所有Elasticsearch服务器)。

检查集群状态

如果一切配置正确,您的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并取消它:

elasticsearch.yml - bootstrap.mlockall
bootstrap.mlockall: true

保存并退出。

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

sudo vi /etc/default/elasticsearch

首先,找到ES_HEAP_SIZE ,取消它,并将它设置为可用内存的50%左右。 例如,如果您有4 GB免费的,你应该将其设置为2 GB( 2g ):

/ etc / default / elasticsearch - ES_HEAP_SIZE
ES_HEAP_SIZE=2g

接下来,找到并取消MAX_LOCKED_MEMORY=unlimited 完成后应该看起来像这样:

/ etc / default / elasticsearch - MAX_LOCKED_MEMORY
MAX_LOCKED_MEMORY=unlimited

保存并退出。

现在重新启动Elasticsearch以将更改放置到位:

sudo service elasticsearch restart

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

验证Mlockall状态

要验证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对任何节点的假,查看节点的设置并重新启动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

/ etc / default / elasticsearch - MAX_OPEN_FILES
MAX_OPEN_FILES=131070

保存并退出。

现在重新启动Elasticsearch以将更改放置到位:

sudo service elasticsearch restart

然后按照上一小节验证限制已增加。

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

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

有两种常见的类型Elasticsearch节点: 数据 主节点执行群集范围的动作,例如管理索引并确定哪些数据节点应存储特定数据碎片。 数据节点保存您的索引文档的分片,并处理CRUD,搜索和聚合操作。 作为一般规则,数据节点消耗大量的CPU,内存和I / O。

默认情况下,每个Elasticsearch节点都配置为“符合主机资格”的数据节点,这意味着它们存储数据(并执行资源密集型操作),并有可能被选为主节点。 对于小群集,这通常很好; 大Elasticsearch群集,但是,应用专用主节点配置,使主节点的稳定性不能由密集数据节点的工作受到影响。

如何配置专用主节点

在配置专用主节点之前,请确保您的群集至少有3个符合主机资格的节点。 这是重要的,以避免裂脑情况,这可能会导致数据在网络故障的情况下的不一致。

要配置专用主节点,请编辑节点的Elasticsearch配置:

sudo vi /etc/elasticsearch/elasticsearch.yml

添加以下两行:

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: falsemaster: true是专用的主节点。

如何配置专用数据节点

要配置专用数据节点(不符合主机资格的数据节点),请编辑节点的Elasticsearch配置:

sudo vi /etc/elasticsearch/elasticsearch.yml

添加以下两行:

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
    }
}'
{
  "acknowledged" : true,
  "persistent" : {
    "discovery" : {
      "zen" : {
        "minimum_master_nodes" : "2"
      }
    }
  },
  "transient" : { }
}

注:此命令是一个“老大难”的设置,这意味着最低主节点的设置将生存满集群重启并覆盖Elasticsearch配置文件。 另外,这个设置可以指定为discovery.zen.minimum_master_nodes: 2/etc/elasticsearch.yml ,如果您还没有设置动态。

如果以后要检查此设置,可以运行以下命令:

curl -XGET localhost:9200/_cluster/settings?pretty

如何访问Elasticsearch

您可以通过发送请求到VPN的IP访问Elasticsearch HTTP API解决任何节点或者,这表现在本教程中,通过发送请求到localhost从节点之一。

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

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

结论

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

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