Elasticsearch安装配置

作者: simonsgj | 来源:发表于2018-11-29 17:05 被阅读0次

    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

    相关文章

      网友评论

        本文标题:Elasticsearch安装配置

        本文链接:https://www.haomeiwen.com/subject/muzxcqtx.html