Elasticsearch安装配置

1. 安装:

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

# 下载tar包或rpm包。
tarName="elasticsearch-5.3.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}

#创建elastic账号运行如果用root账号运行则会报错(提示"can not run elasticsearch as root" !)
useradd elastic
chown elastic:elastic `pwd`
su  elastic

# 启动 elasticsearch
./bin/elasticsearch

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

# 测试是否运行
elServer="内网ip:9200"
curl -XGET "${elServer}/?pretty"

# 停止进程
kill -9 `cat pid`

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包安装方式的目录结构

  • home目录 :使用$ES_HOME表示
  • bin/ : 位置 $ES_HOME/bin,包含了elasticsearch和elasticsearch-plugin等脚本
  • conf/ :位置 $ES_HOME/config,包含了 配置文件 elasticsearch.yml 和 log4j2.properties,使用 path.conf 指定
  • data/ :位置 $ES_HOME/data,包含了每个index/shard的数据文件,可以指定多个位置,使用 path.data 指定
  • logs/ : 位置 $ES_HOME/logs,使用 path.logs 指定
  • plguins/ : 位置$ES_HOME/plugins
  • repo/ :使用 path.repo指定,没有默认位置,表示共享文件系统repository的位置。可以指定多个位置。
  • script/ :位置$ES_HOME/scripts,使用 path.scripts 指定。

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 ,允许你设置如下的参数:

  • ES_USER :默认 elasticsearch ,表示指定使用哪个用户运行elasticsearch。
  • ES_GROUP:默认是 elasticsearch。
  • JAVA_HOME:设置自定义的要使用的JAVA path
  • MAX_OPEN_FILES:打开文件的最大数量。默认是65536
  • MAX_LOCKED_MEMORY:最大locked memory size。如果你在elasticsearch.yml中使用了
  • bootstrap.memory_lock,则设置为unlimited 。
  • MAX_MAP_COUNT:内存map区域的最大数量。如果你使用mmapfs作为index存储类型,要确保这个值设置的够大。这个值是在启动elasticsearch之前,通过sysctl设置。默认值是 262144。
  • LOG_DIR :
  • DATA_DIR:
  • CONF_DIR:
  • ES_JAVA_OPTS:
  • RESTART_ON_UPGRADE:
rpm包安装方式的目录结构
  • home目录 默认是/usr/share/elasticsearch
  • bin目录 默认是 $ES_HOME/bin
  • conf目录 默认是 /etc/elasticsearch
  • 环境变量文件 默认是 /etc/sysconfig/elasticsearch
  • data/目录 默认是 /var/lib/elasticsearch
  • logs/目录 默认是 /var/log/elasticsearch
  • plugins目录 默认是 $ES_HOME/plugins
  • repo目录 默认没有配置。
  • scripts目录默认位置是 /etc/elasticsearch/scripts

4. 配置elasticsearch

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

  • (1) 配置文件格式为YAML。支持 path.data的语法或 path: data: /var/lib/elasticsearch语法。
  • (2) 如果你不想将配置写在配置文件中,使用 node.name: ${prompt.text} ,这样在启动时会让用户输入,但是这种用法不能用在服务或后台运行方式中
  • (3) 在命令行上设置默认值 -Edefault.node.name="XXX"

4.1 重要的配置项:

  • path.data 和 path.logs :如果使用的是tar包模式安装的,默认情况下,这两个文件夹位于$ES_HOME下的子文件夹,当升级elasticsearch时这两个文件夹很容易被删除,所以最好将其设置到其他位置。
    例如在 config/elasticsearch.yml 中设置
path.logs: /var/log/elasticsearch
 path.data: /var/data/elasticsearch
  • cluster.name : 在 config/elasticsearch.yml 中设置
cluster.name: logging-prod
  • node.name : 在 config/elasticsearch.yml 中设置
node.name: prod-data-2
node.name: ${HOSTNAME} #使用主机名
  • bootstrap.memory_lock:这个配置项对node的健康极其重要,JVM永远不swapped out to disk,即永远不使用交换分区将JVM交换到磁盘上。在 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” 来获得更详细的信息。
如果你看到mlockall=false,那就意味着mlockall请求失败了。
你还可以在logs中搜索 “Unable to lock JVM Memory” 来获得更详细的信息。

要使这个设置生效,需要先配置其他的系统设置。
一般来说,最可能的原因是运行elasticsearch的用户没有权限来lock memory,这可以通过如下方式解决:
(a) tar包方式安装的: 在运行elasticsearch之前使用root用户设置 ulimit -l unlimited ,或在 /etc/security/limits.conf 中设置 memlock=unlimited。( elasticsearch - memlock unlimited )
(b) rpm包安装于使用systemd 的系统的: 在环境变量配置文件中设置 LimitMEMLOCK=infinity

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

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

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

可选的方法还有 彻底禁用swap 和 设置 vm.swappiness=1 。 见后面的详述

  • network.host: 默认时,elasticsearch只绑定loopback地址,例如 127.0.0.1 and [::1]。在生产环境中,为了和其他nodes通信并组成一个集群,你的node需要绑定到一个non-loopback地址。虽然有很多关于network的设置,但是一般你只需要设置 network.host (在 /etc/security/limits.conf 中设置):
network.host: 192.168.1.10 ,127.0.0.1
  • discovery.zen.ping.unicast.hosts: elasticsearch会绑定到可用的loopback 地址,并且扫描9300到9305,尝试连接到同一个server上的其他nodes。
    这提供了一种自动集群的体验,而不用额外的配置。
    但是当真的集群来临时,你需要提供集群中一组其他种子节点(这些节点可能是live且可连接的),如下所示:(在 /etc/security/limits.conf 中设置)
discovery.zen.ping.unicast.hosts:
192.168.1.10:9300
#默认使用 transport.profiles.default.port,并且失败后使用 transport.tcp.port 
192.168.1.11
#会解析成IP地址
- seeds.mydomain.com

上面的数据格式在命令行怎么写?
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]

  • discovery.zen.minimum_master_nodes : 为了放弃数据丢失,这个参数极其重要。
    在 /etc/security/limits.conf 中设置

    discovery.zen.minimum_master_nodes: 2 #集群master节点数量/2+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

一般这个值有两个原则,

  • (a)不要超过物理内存的50%
  • (b)不要超过26G
file descriptor check:

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

  • 如果是用tar包的安装方式:
    先通过使用root用户 ulimit -n 65536 然后启动elasticsearch。
    或者 通过 /etc/security/limits.conf 文件设置 nofile 为65536。

    elasticsearch - nofile 65536 
    
    
  • RPM包安装方式的默认设置已经是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,这可以通过如下方式解决:

  • tar包方式安装的:
    在运行elasticsearch之前使用root用户设置 ulimit -l unlimited ,
    或在 /etc/security/limits.conf 中设置 memlock=unlimited。

    elasticsearch - memlock unlimited
    
    
  • rpm包安装于使用systemd 的系统的:
    在环境变量配置文件中设置 LimitMEMLOCK=infinity

另一个可能的原因是临时文件目录/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) 在哪里配置操作系统设置基于你的安装方式和你使用的操作系统。

  • 如果你是通过tar包安装的,system settings可以通过如下方式配置:
    (a) 通过 ulimit 进行临时配置
    (b) 通过 /etc/security/limits.conf 进行永久配置

  • 如果你是通过systemd方式安装,则可以通过systemd配置文件来设置。

使用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 来设置这个值。
这个值的大小取决于 可用内存的大小。好的规则如下:

  • (a) 将 Xms 和 Xmx 设置成一样的值

  • (b) 越多的heap设置,elasticsearch就能缓存更多的数据。
    但是注意太大的heap会导致你长时间的垃圾回收中断。

  • (c) 设置Xmx不要超过你的物理内存的50%,要为内核文件系统留有足够的内存。

  • (d) 不要设置Xmx 超过JVM 用于 压缩 object pointers的临界点,这个临界点大约为32GB。你可以通过查看日志中的一行(如下所示)来验证它:
    heap size [1.9gb], compressed ordinary object pointers [true]

  • (e) 最好是尝试停留在below the threshold for zero-based compressed oops;精确的临界值是变化的,但是26GB一般而言是安全的,但是在有些系统上可以达到30GB。你可以验证它,通过使用JVM选项 -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode 启动elasticsearch,并查找像下面的行:
    heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
    这显示了 zero-based compressed oops are enabled,而不是
    heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000

还可以通过环境变量配置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,这可以通过如下方式解决:

  • (1) tar包方式安装的:
    在运行elasticsearch之前使用root用户设置 ulimit -l unlimited ,或在 /etc/security/limits.conf 中设置 memlock=unlimited。

    elasticsearch - memlock unlimited
    
    
  • (2) rpm包安装于使用systemd系统的:
    在环境变量配置文件中设置 LimitMEMLOCK=infinity

另一个可能的原因是临时文件目录/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。

  • 如果是用tar包的安装方式:
    先通过使用root用户 ulimit -n 65536 然后启动elasticsearch。
    或者 通过 /etc/security/limits.conf 文件设置 nofile 为65536。

    elasticsearch - nofile 65536
    
    
  • RPM包安装方式的默认设置已经是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

  • (1) 一个常规的shutdown可以让elasticsearch有机会cleanup并close outstanding resources。例如一个node会将其自身从cluster中移除,sync translogs到磁盘上,执行其他的相关cleanup activities。
  • (2) 如果你使用service的方式运行elasticsearch,你可以通过systemctl stop的方式
  • (3) 如果你使用直接运行的方式运行elasticsearch,你可以通过Ctrl+C或发送SIGTERM信号。
  • (4) 在elasticsearch VM的生命周期内,可能会发生fatal errors,这会导致VM处于一个有问题的状态。这些erros包括内存溢出、VM的内部错误、严重的I/O错误。

当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 或 tet 或 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 通用选项

  • (1) ?pretty=true 表示返回的JSON有缩进,只在debugging时使用它!

  • (2) Date math

  • (3) response filtering: filter_path, 例子:

    GET /_search?q=elasticsearch&filter_path=took,hits.hits._id,hits.hits._score
    elServer="10.162.159.24:9200"
    curl -XGET "${elServer}/_search?q=elasticsearch&filter_path=took,hits.hits._id,hits.hits._score"
    
    
  • (4) flat settings: 当其设置为true时,返回的是flat格式的数据。

  • (5) Parameters: false是指 false、0、no、off 。其他的值都是 true。
    时间单位:2d = days h=hours m=minutes micros=microseconds nanos=nanoseconds
    byte size units:b=Bytes kb mb gb tb pb
    没有单位的quantities:k m g t p
    长度单位: mi或miles、yd或yards、ft或feet、in或inch、km或kilometers、m或meters、cm或centimiters、mm或millimeters、NM或nmi或nauticalmiles(海里)
    Fuzziness(模糊不清的):0,1,2=匹配任意一个 0..2 、3..5 、 >5
    启用Stack traces:默认情况下,当一个请求返回错误时,elasticsearch不包含stacktrace。你可以启用它,通过设置 error_trace=true。

  • Request body In query string: 对于一些非POST请求不接受Request body的库来说,你可以通过将Request body作为source的参数来代替。

3.4 URL-based access control:

  • (1) 很多用户使用with URL-based access control的代理来安全访问到elasticsearch indices。

  • (2) 对于 multi-search、multi-get和bulk请求,用户可以在URL中选择指定一个index,和在每个individual Request的Request body中。这会导致URL-based access control面临挑战。

  • (3) 要阻止用户覆盖URL中已经指定的index,可以在 config.yml 中设置

    rest.action.multi.allow_explicit_index: false
    
    

    这个值默认是true。当设置为false时,elasticsearch会拒绝这样的请求,
    什么样的请求?就是在Request body中显式指定了index 的请求。

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.port :(默认是9200-9300)、会绑定第一个可用的端口。
  • http.publish_port : HTTP客户端用来跟node通信的端口。用于当节点位于proxy或防火墙后面,并且 http.port 不能直接从外面访问。默认值和通过 http.port 的设置值相同。
  • http.bind_host: 默认值同 http.host 或 network.bind_host
  • http.publish_host: 默认值同 http.host 或 network.bind_host
  • http.host : 用于设置 http.bind_host 和 http.publish_host 。默认值同 network.host
  • ...

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

4.5 Indices

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

  • Circuit breaker: 设置内存使用的限制来避免内存溢出。
  • Fielddata cache:设置用于fielddata cache的in-memory的heap的使用量限制。
  • node query cache:
  • indexing buffer:
  • shard request cache:
  • recovery:

4.6 Network

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

  • network.host : 节点会绑定到这个hostname或IP地址,并发布这个host给其他节点。默认是 local ,其他可选的还有 [networkInterface]siteglobal ,分别表示特定网卡节点绑定的IP地址、site-local地址(例如 192.168.0.1)、全局地址(例如8.8.8.8)
  • discovery.zen.ping.unicast.hosts : 为了加入集群,节点需要知道集群中其他一些节点的IP地址。
  • http.port :
  • transport.tcp.port : 绑定的用于节点之间通信使用的端口。默认是9300-9400。
  • ...

4.7 Node client

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

  • master-eligible node: 设置 node.master:true ,也是默认值,这使得节点有资格被选举为master node,master node控制集群。
  • data node:设置 node.data:true ,也是默认值,data节点持有数据并执行数据相关的操作,例如CRUD、search和Aggregations。
  • ingest(摄取,吸收) node :设置 node.ingest:true ,也是默认值。ingest node可以应用一个 ingest pipeline到一个document,以便在index它之前转换并充实该document。这个工作很重,所以使用专门的ingest node,并且在master node和data node上设置 ingest.node:false
  • tribe node: 通过设置 tribe.* 相关设置,这些设置可以让节点可以连接多个集群并可以跨集群 执行search和其他操作 。

默认情况下,节点是 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。

  • 在snapshot或restore操作之前,你必须先注册一个snapshot repository到elasticsearch中。通过一个HTTP API
  • 一个repository可以包含同一个集群的多个snapshots。snapshots通过唯一的名称标识自己。

4.12 Thread pools

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

  • generic :通用操作(例如 后台的node recovery)使用。threadpool类型为scaling
  • index: index/delete操作使用。threadpool类型为fixed,其size是 # of available processors,queue size of 200.这个pool的最大size是 1 + # of available processors
  • search: count/search/suggest操作使用。threadpool类型为fixed,其size是 int((# of available_processors * 3) / 2) + 1, queue_size of 1000 。
  • get : get操作使用。threadpool类型为fixed,其size是 # of available processors, queue_size of 1000.
  • bulk : bulk操作使用。 threadpool类型为fixed,其size是 # of available processors, queue_size of 50 。这个pool的最大size是 1 + # of available processors
  • ...

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 常规推荐

  • 不要返回大的结果集:返回top documents是非常好的。如果你非要返回大的结果集,请使用Scroll API。
  • 避免大的documents: 默认的 http.max_context_length=100MB ,elasticsearch会拒绝index超过这个值得documents。你可以决定增大这个值,但是Lucene仍然有最大值为大约2GB。
  • 避免sparsity(数据稀疏):在Lucene后面的数据结构,是elasticsearch为了index和存储数据所依赖的,最好工作于抽魔的数据,例如所有的documents都拥有相同的fields。
  • 避免在相同的index中存放不相关的数据
  • 标准化document structures
  • 避免types:types可能听起来是一个不错的方式来存储多个tenants到一个单独的index中。但是它们不是:如果你的types不是有非常类似的mappings,你需要考虑将他们移动到专用的index中
  • 禁用 norms 和 doc_values on sparse(稀疏的、缺少的) fields:如果上面的建议都不符合你的情况,你可能要检查在你的sparse fields上你是否真的需要 norms 和 doc_values 。norms 可以被禁用,如果producing scores不是必须的,doc_values可以被禁用如果不使用sorting和Aggregations。注意不要轻易下这个决定,因为这些参数不能动态更改,所以你需要reindex,如果你意识到你需要 norms 或 doc_values。

7.2 Recipes(食谱)

  • mixing exact search with stemming(词干提取):
  • getting consistent scoring :
    (a) scores are not reproducible:
    (b) relevancy looks wrong:

7.3 调优 indexing speed

  • 使用bulk requests
  • 使用multiple workers/threads 来发送数据给elasticsearch:
  • 增加refresh间隔
  • 禁用refresh和replicas for initial loads
  • 禁用swapping
  • 为filesystem cache留出内存
  • 使用auto-generated ids
  • 使用更快的hardware
  • indexing buffer size

7.4 调优 search speed

  • 为filesystem cache留出内存
  • 使用更快的hardware
  • document 建模
  • Pre-index data
  • Mappings :一些数据是数字并不意味着它总是应该被mapped as a numeric field。有时应该被mapped as keyword 而不是integer 或 long。
  • avoid scripts:如果一定要使用,你应该选择 painless 和 expressions 引擎。
  • search rounded date: 在 日期类型的fields上的查询使用 now 一般不能cacheable。然而使用一个rounded date经常是可以接受的,并且可以使用缓存。
  • 强制合并 read-only indices:
  • warm up gloal ordinals:
  • warm up the filesystem cache

7.5 调优 disk usage

  • 禁用你不需要的features
  • 不要使用默认的动态string mappings
  • 禁用 _all
  • 使用 best_compression :
  • 使用smallest numeric type that is sufficient

作者:坚持到底v2
链接:https://www.jianshu.com/p/6a700cc61913

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容