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] 、 site 、 global ,分别表示特定网卡节点绑定的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
链接://www.greatytc.com/p/6a700cc61913