Elasticsearch EcosystemBigData

Elasticsearch安装配置

2017-10-28  本文已影响686人  坚持到底v2

1. 安装:

要求至少Java 8(推荐使用Oracle JDK version 1.8.0_121)并设置$JAVA_HOME。

# 下载tar包或rpm包。
tarName="elasticsearch-5.2.2.tar.gz"
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/${tarName}
tar -xf ${tarName}
dirName=`tar -tf "${tarName}" | head -1`
dirName=${dirName%%\/*}
cd ${dirName}
# 启动 elasticsearch
./bin/elasticsearch

# 以daemon方式运行
#-p指定pid文件
./bin/elasticsearch -d -p pid  

# 停止进程
kill `cat pid`

测试

elServer="10.162.159.24:9200"
curl -XGET "${elServer}/?pretty"

不能运行 提示"can not run elasticsearch as root" !

新建一个 elasticearch 用户 并切换过去执行 elasticearch

useradd elasticearch;
chown elasticearch:elasticearch `pwd`
mv `pwd` /home/elasticearch
cd /home/elasticearch
su - elasticearch 

2. 配置命令行参数

elasticsearch 默认从 $ES_HOME/config/elasticsearch.yml 文件中加载其配置。
所有可以在配置文件中指定的设置也可以在命令行上指定,使用 -E 语法,如下所示

./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1

一般来说,所有cluster-wide的设置应该写在配置文件中,所有node-wide的设置应该写在命令行上。


3. 目录结构

3.1 tar包安装方式的目录结构

3.2 RPM 安装方式的目录结构

https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html

RPM方式安装的elasticsearch 默认会从 /etc/elasticsearch/elasticsearch.yml 加载其配置

RPM方式安装的elasticsearch 还会使用 /etc/sysconfig/elasticsearch ,允许你设置如下的参数:

rpm包安装方式的目录结构

4. 配置elasticsearch

https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html

4.1 重要的配置项:

4.2 启动检查

我们有许多关于用户忍受不可预期的问题的体验,因为他们没有配置上述重要的设置。
这些Bootstrap检查会检阅elasticsearch和操作系的设置,并看看是否安全。
如果elasticsearch是在开发模式,Bootstrap检查只会warning 于log中。
如果是在生产模式下,任何的Bootstrap检查都会导致启动fail。

heap size check:

如果JVM启动时,initial和max heap size不一致,在JVM heap被resized时可能会导致暂停。
要通过heap size check,你必须配置heap size。
在 config/jvm.options中设置

-Xms2g
-Xmx2g

一般这个值有两个原则,

file descriptor check:

打开文件数量的检查,elasticsearch需要很多的file descriptor。
要通过检查,你必须配置 file descriptor ,确保将其设置为至少65536。

你可以通过如下API检查 max_file_descriptors 配置

GET _nodes/stats/process?filter_path=**.max_file_descriptors
curl -XGET "${elServer}/_nodes/stats/process?filter_path=**.max_file_descriptors"
memory lock check:

在 config/elasticsearch.yml 中设置

bootstrap.memory_lock: true

要查看该设置是否生效,通过如下的API请求,然后检查返回内容中的mlockall的值

GET _nodes?filter_path=**.mlockall
elServer="10.162.159.24:9200"
curl -XGET "${elServer}/_nodes?filter_path=**.mlockall"

如果你看到mlockall=false,那就意味着mlockall请求失败了。
你还可以在logs中搜索 “Unable to lock JVM Memory” 来获得更详细的信息。

要使这个设置生效,需要先配置其他的系统设置。
一般来说,最可能的原因是运行elasticsearch的用户没有权限来lock memory,这可以通过如下方式解决:

另一个可能的原因是临时文件目录/tmp被挂载为 noexec 。
这可以通过指定一个新的临时文件夹来解决,通过设置 ES_JAVA_OPTS,如下所示

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"

或在jvm.options配置文件中设置JVM flag。

maximum number of threads check:

elasticsearch执行是通过将查询分解成不同的阶段,然后在不同的阶段使用不同的thread pool Executors。
所以elasticsearch需要大量的线程。
你必须至少让elasticsearch能创建2048个线程。
这可以通过 /etc/security/limits.conf 的 nproc 设置来做到。

elasticsearch - nproc 2048
maximum size virtual memory check:

elasticsearch和Lucene使用 mmap 来增强影响map index到elasticsearch的地址空间。
这会保持特定的index data off the JVM heap但是在内存中来燃烧快速的access。
要使它生效,elasticsearch需要拥有unlimited address space。
maximum size virtual memory check强制elasticsearch进程拥有unlimited地址空间。
要通过这个检查,你必须配置你的系统允许elasticsearch进程用拥有unlimited地址空间的能力。
这可以通过 /etc/security/limits.conf 的 as = unlimited 来做到。

elasticsearch - as unlimited
maximum map count check:

和上面一个设置一样,使用 mmap,elasticsearch还要求有创建很多内存map区域的能力。
maximum map count check检查内核允许一个进程至少有 262144个memory内存区域。
要通过这个检查,你必须配置 sysctl vm.max_map_count >= 262144

client JVM check:

OpenJDK-derived JVMs提供了两种不同的JVMs:client JVM 和 server JVM。
这些JVMs使用不同的compilers来从Java bytecode产生不同的可执行maching code。
client JVM 被调优于启动速度和内存占用,server JVM 被调优于 性能最大化。
性能是两种JVM的本质区别。
client JVM check保证了elasticsearch没有运行于client JVM。
要通过这个检查,你必须使用server VM来启动elasticsearch。
在现代的操作系统中,使用server VM是默认选项。
另外,elasticsearch默认被配置为强制使用server VM。
在 jvm.options 中默认有 -server 选项。

use serial collector check:

openjdk-derived JVMs有很多种垃圾收集器,用于不同的workloads。
serial collector 非常适用于 single logical CPU 机器 或 非常小的heaps,但这些都不适用于elasticsearch。
使用这种collector会极大地破坏elasticsearch的性能。
要通过这个检查,你必须不能使用这种collector,默认情况下,JVM配置为使用CMS collector。
在 jvm.options 中默认有 -XX:+UseConcMarkSweepGC 选项。

system call filter check:

elasticsearch根据不同的操作系统安装不同风格的system call filters,例如在linux上是seccomp。
这些system call filters被安装,是用于阻止执行system calls来forking的防御机制,防御任意代码执行于elasticsearch之上。
system call filter check保证了如果system call filter被启用了,它们被成功安装。
要通过这个检查,你必须修复那些任何阻止system call filter被安装的Configuration errors(通过检查logs),或者禁用system call filters(自负风险),通过在 /etc/security/limits.conf 中设置

bootstrap.system_call_filter: false
OnError and OnOutOfMemoryError checks:

JVM的选项 OnError 和 OnOutOfMemoryError 使得 如果 JVM遭遇了一个fatal error(OnError)或一个OutOfMemoryError(OnOutOfMemoryError)时可以执行任意代码。
但是默认情况下,elasticsearch的system call filter(seccomp)是启用的,并且这些filters会阻止forking。
因此,使用OnError或OnOutOfMemoryError和system call filters是矛盾的。
这个检查阻止elasticsearch启动,如果system call filter被启用的同时这两个选项也开启。
这个check总是强制的。要通过这个检查,就不要启用OnError或OnOutOfMemoryError

替代方案是升级到Java 8u92然后使用 ExitOnOutOfMemoryError

G1GC check:

JDK8提供的早期版本的HotSpot JVM 已知确认有问题,当G1GC collector被启用时会导致 index corruption 。
G1GC check会检测这些早期版本的HotSpot JVM。

4.3 重要的操作系统配置

(1) 理想状态下,elasticsearch应该霸占整个server。

要达到这个目的,你应该配置elasticsearch尽可能多地使用操作系统的资源。

(2) 默认情况下,elasticsearch假设你工作于开发模式下,这些重要的配置只是会记录为log中的warning。

当你设置了类似 network.host的配置项之后,elasticsearch会假设你已经在生产环境下,并且会将warning升级为Exception。
这会导致elasticsearch启动失败。

(3) 在哪里配置操作系统设置基于你的安装方式和你使用的操作系统。

使用ulimit设置:

(必须使用root,而且limit的设置只应用于当前session)

sudo su
ulimit -n 65536
su elasticsearch
通过 /etc/security/limits.conf 设置:

(可以为特定用户永久设置),在这个文件中增加:

elasticsearch - nofile 65536
通过 /etc/sysconfig/elasticsearch 文件设置:

当使用RPM包安装时,可以通过这个文件进行设置环境变量和system settings。

通过 systemd Configuration 设置:

当使用RPM包安装于使用systemd的系统时,limits必须通过systemd配置。
systemd的服务文件 /usr/lib/systemd/system/elasticsearch.service 包含了默认的配置。
要覆盖这个默认配置,可以增加一个文件于 /etc/systemd/system/elasticsearch.service.d/elasticsearch.conf 并配置一些更改,例如:

[Service]
LimitMEMLOCK=infinity
设置JVM选项:

设置JVM选项(包括系统属性和JVM选项)的推荐方法是通过 jvm.options 配置文件。
该文件默认位置为 config/jvm.options。
这个文件的每一行都必须是以 - 开头,你可以在其中增加自己的JVM选项。
另一种方式是通过 ES_JAVA_OPTS 环境变量,例如:

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"

这个环境变量可以在 /etc/sysconfig/elasticsearch 中指定。

设置 JVM heap size:

默认情况下,elasticsearch告诉JVM使用最小heap size和最大heap size为2GB。
当在生产环境中时,需要增加这个值。
在 jvm.options 中通过 -Xms 和 -Xmx 来设置这个值。
这个值的大小取决于 可用内存的大小。好的规则如下:

还可以通过环境变量配置JAVA 选项:

ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch 
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch 

(5) 禁用swapping :

大部分操作系统都尝试使用尽可能多的文件系统缓存并急切地swap out未使用的应用程序缓存。
这会导致JVM heap被swapped out to disk。
swapping对于性能和node的稳定性来说是很坏的,应该尽可能阻止它发生。
它会导致垃圾回收达数分钟而不是毫秒级别。

启用 bootstrap.memory_lock :

第一个选项是使用 mlockall 来尝试lock进程地址到RAM中,阻止任何的elasticsearch 内存被swapped out。
在配置文件中设置:

bootstrap.memory_lock: true

注意:mlockall可能会导致JVM或shell session退出,如果它尝试分配了超过了可用的内存!
在elasticsearch启动后你可以看到这个配置是否生效了,通过

GET _nodes?filter_path=**.mlockall
elServer="10.162.159.24:9200"
curl -XGET "${elServer}/_nodes?filter_path=**.mlockall"

如果你看到 mlockall=false,那就意味着mlockall请求失败了。你还会在logs中看到一行更详细的信息

Unable to lock JVM Memory.

一般来说,最可能的原因是运行elasticsearch的用户没有权限来lock memory,这可以通过如下方式解决:

另一个可能的原因是临时文件目录/tmp被挂载为 noexec 。
这可以通过指定一个新的临时文件夹来解决,通过设置 ES_JAVA_OPTS,如下所示

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"

或在jvm.options配置文件中设置JVM flag。

第二个选项是彻底禁用swap
一般来说elasticsearch独立运行于一个box中,并且它的Memory usage通过JVM选项操纵。
那就不需要启用swapped。
在linux操作系统中,你可以通过如下命令来来禁用它:

sudo swapoff -a

要永久禁用,就编辑 /etc/fstab 并注释任何包含swap的行。

另一个选项是设置 vm.swappiness=1 。

这不会影响整个操作系统在紧急情况下的swap。

File Descriptors :

elasticsearch需要使用大量的文件描述符,如果用超了,会是灾难性的并很可能导致数据丢失。
确保将其设置为至少65536。

你可以通过如下API检查 max_file_descriptors 配置

GET _nodes/stats/process?filter_path=**.max_file_descriptors
elServer="10.162.159.24:9200"
curl -XGET "${elServer}/_nodes/stats/process?filter_path=**.max_file_descriptors"
Virutal memory:

elasticsearch默认使用 hybrid mmapfs / niofs 文件夹存储它的indices。
操作系统默认的mmap counts limits一般都太小了,可能会导致内存溢出。

你可以使用root执行下面的命令来增加这个limits:

sysctl -w vm.max_map_count=262144

要永久设置,就更新 /etc/sysctl.conf 中的 vm.max_map_count 设置。
RPM包安装方式会自动设置,不需要额外的配置。

number of threads:

elasticsearch使用很多的thread pools来执行不同类型的操作。
要确保elasticsearch至少可以创建2048个线程。
可以通过使用root用户执行 ulimit -u 2048 来临时设置,或通过 /etc/security/limits.conf 设置 nproc=2048来永久设置。

elasticsearch - nproc 2048

2.6 升级 elasticsearch

https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-upgrade.html

2.7 停止elasticsearch

当elasticsearch检测到VM遇到这样的错误时,它会尝试log error并halt VM。
当elasticsearch开始了这样的一个shutdown,它不会馋鬼的shutdown,其进程也会返回一个特定的状态码来指示发生了什么错误。

3. API 约定

elasticsearch REST APIs使用HTTP返回JSON数据。

3.1 Multiple Indices:

所有的index参数都支持多个,可以简单的 test1,test2,...,_all表示所有Indices,
支持通配符,test* 或 *test 或 te*t 或 *test* ,
还支持 + 和 -,例如 +test* , -test3 。

3.2 date math support in index names:

例子: index的名称使用了date math

GET /<logstash-{now/d}>/_search
GET /%3Clogstash-%7Bnow%2Fd%7D%3E/_search
elServer="10.162.159.24:9200"
curl -XGET "${elServer}/%3Clogstash-%7Bnow%2Fd%7D%3E/_search" -H 'Content-Type: application/json' -d'
      {
        "query" : {
          "match": {
            "test": "data"
          }
        }
      }

注意 < > 需要urlcode

格式为 <static_name{date_math_expr{date_format|time_zone}}>

3.3 通用选项

3.4 URL-based access control:

4. Modules

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html

这个章节包含各个modules,它们负责elasticsearch功能的各个方面。
每个module都可能包含静态配置(在每个node上通过 elasticsearch.yml 文件配置)和动态配置(通过 Cluster APIs中的cluster-update-settings 进行动态配置)。

这个章节包含的模块有:

4.1 Cluster-level routing and shard allocation

(控制 where、when、how shards被分配到nodes上) :
master的一个主要职能就是决定哪些shards被分配到哪些nodes上,和什么时候在nodes之间移动shards以达到rebalance集群。

4.1.1 Cluster level shard Allocation:

shard Allocation是分配shards到nodes上的过程。
这可以发生在 initial recovery时、replica Allocation时、rebalancing时、或当nodes被增加或移除时。
这部分设置主要是动态设置,关于shard Allocation settings、shard rebalancing settings、shard balancing heuristics(启发法)。

4.1.2 Disk-based Shard Allocation:

elasticsearch在决定是否分配新的shards到那个节点之前,或将shards从那个节点重新分配到别处之前,会将可用的磁盘空间作为考虑的因素。 这部分设置可以是静态配置,也可以动态更改(使用cluster-update-settings API)。

4.1.3 Shard Allocation Awareness:

当在同一个物理主机上运行多个VMs时,或在多个机架上运行、或在多个可awareness的zones上运行时,很有可能同一台server上、同一个机架上、或同一个zone上会同时发生crash。
如果elasticsearch可以识别你的硬件的物理配置,它就可以确保primary shards和它的replica shards分开存放。
这部分设置可以是静态配置,也可以动态更改(使用cluster-update-settings API)。

4.1.4 Shard Allocation Filtering:

虽然 Index Shard Allocation APIs提供了per-index级别的设置来控制shards到nodes的Allocation,cluster-level shard Allocation Filtering还能允许你允许或禁止任意index的shards到特定nodes的Allocation。
经典使用案例是当你想decommission(使退役) 一个节点时,并且你想将shards从那个节点移到其他节点。
使用动态 APIs 设置

4.1.5 Miscellaneous(混杂的) cluster settings:

包括Metadata、index tombstones(墓碑)、Logger的设置。

4.2 Discovery

(nodes如何彼此发现来组成集群) :
负责发现集群中的节点,并选举master node。
注意,elasticsearch是一个基于点到点的系统,nodes之间直接互相通信。
所有的main APIs(index、delete、search)并不和master节点通信。
master节点的职责是维护整个cluster的状态,还有当节点加入或离开集群时重新分配shards。
集群的状态发生更改时,集群的状态会通知到集群中其他节点(传播方式基于实际的Discovery实现方式)。
Zen Discovery是elasticsearch内置的Discovery module,也是默认值。
Zen Discovery和其他module集成在一起使用,例如,节点之间所有的通信使用transport module完成。
它被分成了几个子modules,包括ping、unicast、master election、fault detection、cluster state updates、no master block

4.3 Gateway

(在recovery可以开始之前需要多少nodes加入到集群中):
Local gateway module存储在整个集群重启时的集群状态和shards data。
这部分设置主要是静态配置,必须配置好于master node

4.4 HTTP

(控制HTTP REST Interface的设置):
http module允许你通过HTTP暴露elasticsearch APIs。
这部分配置通过 elasticsearch.yml 配置。
包括

还可以禁用HTTP, ( http.enabled=false )。
elasticsearch节点(还有Java clients)之间的内部通信使用 transport interface通信,不是HTTP。所以在那些不准备提供HTTP APIs的节点上禁用HTTP APIs也是有用的。

4.5 Indices

(全局的index相关的设置):
indices module控制index相关的设置,这些设置全局管理所有的indices,而不是per-index级别。
可用的设置包括:

4.6 Network

(默认的network设置) :
elasticsearch默认只绑定到localhost。
常用的network设置有:

4.7 Node client

(加入到集群但是不扮演master node的角色) :
集群中的每个节点默认都可以处理HTTP和transport traffic。
transport layer只用于节点(还有Java TransportClient)之间的通信;
HTTP layer只用于外部REST client的访问。
集群中的所有节点都知道其他所有的节点,并转发client请求到相应的节点,每个节点都服务于一个或多个用途:

默认情况下,节点是 master-eligible和data node,而且可以当作 ingest node(虽然不建议)。
随着集群的增长,建议master node和data node也分开。

4.8 Painless

(elasticsearch使用的内置的脚本语言,被设计为让elasticsearch尽可能地安全)

4.9 Plugins

(使用扩展的插件) :

4.10 Scripting

(使用Lucene表达式、Groovy、Python、Javascript的自定义的脚本。你也可以使用内置的脚本语言Painless来编写脚本) : https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html

scripting module让你能够使用脚本来evaluate自定义的表达式。
例如,你可以使用脚本来返回一个“script fields”作为搜索请求的一部分。
默认的脚本语言是 Painless。
额外的 lang 插件让你能够运行其他语言的脚本。
一般用途的语言有 painless、groovy、javascript、python,特定用途的语言(不灵活,但对特定任务有很好的性能)有 expression、mustache、java。

如何使用?

"script":{"lang":"...","inline"|"sorted"|"filter":"...","params":{ ... } }

4.11 Snapshot/Restore

(使用 snapshot/restore 备份你的data) :
snapshot and restore module 允许你创建单独Indices或整个集群的snapshots到一个远端repository,像共享文件系统、S3、HDFS。
这些snapshots不是档案文件,因为它们只能被可以识别index的elasticsearch版本恢复。
这意味着 在2.x版本创建的snapshots可以被恢复到5.x,在1.x版本创建的snapshots可以被恢复到2.x,但是1.x版本创建的snapshots不能被恢复到5.x。

4.12 Thread pools

(elasticsearch使用的专用的thread pools的信息) :
一个节点持有几个thread pools以达到改善threads的内存消耗。
许多这样的pools一般还有一个queues与它们关联,这些queues允许pending requests而不是丢弃他们。
一些重要的thread pools有:

4.13 Transport

(配置transport networking layer,用于Elasticsearch在内部nodes之间通信用的使用) :
Transport机制是完全异步的,这意味着没有任何一个thread会阻塞等待一个response。
这样做的好处是首先解决了C10k problem,同时也是scatter(broadcast)/gather操作的理想解决方案,例如在elasticsearch中的search操作。

TCP Transport是Transport module的一个实现。它有如下设置:

transport.tcp.port : 默认是 9300-9400
transport.host : 
...

4.14 Tribe nodes

(加入一个或多个clusters的tribe node,并扮演它们之间联邦 client的角色) :
tribe node 会检索其连接的所有集群的集群状态,并将它们合并成一个全局的集群状态。
有了这些信息在手上,它能够对所有集群的节点执行读写操作,就像它们在本地一样。
要想让一个节点称为tribe node,只需要简单的在 elasticsearch.yml 中配置:

tribe:
        t1: 
            cluster.name:   cluster_one
        t2: 
            cluster.name:   cluster_two 

t1和t2是任意的名称,表示要连接到的集群。


5. Index Modules

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html
Index Modules are modules created per index,并控制一个index相关的方方面面。
index level settings可以被设置为per-index。可以是动态设置,也可以静态设置。


6. Ingest Node

https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html
ingest=提取

你可以使用ingest node在实际的indexing 发生之前 来预处理documents,这些预处理操作会拦截bulk和index请求,应用transformations,然后将documents传回给index或bulk APIs。

你可以让任意的节点具有ingest功能,也可以设置专门的ingest node(推荐)。
ingest默认是在所有节点上启用的。
要禁用它就在 elasticsearch.yml 中设置:

node.ingest: false

7. How to

https://www.elastic.co/guide/en/elasticsearch/reference/current/how-to.html

7.1 常规推荐

7.2 Recipes(食谱)

7.3 调优 indexing speed

7.4 调优 search speed

7.5 调优 disk usage

上一篇下一篇

猜你喜欢

热点阅读