Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

Elasticsearch配置优化

三田寺円

前言

Elasticsearch具有良好的默认值,只需要很少的配置。

默认情况下,Elasticsearch的大部分配置都可以使用Cluster Update Settings API 在正在运行的群集上更改大多数设置 。

Elasticsearch有三个配置文件:

  • elasticsearch.yml 用于配置Elasticsearch
  • jvm.options 用于配置Elasticsearch JVM设置
  • log4j2.properties 用于配置Elasticsearch日志记录

Important Elasticsearch configuration

下面是一些重要参数。

  • Path settings

    在生产使用中,建议更改数据和日志文件夹的位置:

      path:
          logs: /var/log/elasticsearch
          data: /var/data/elasticsearch
    

    例如:

      $ mkdir -pv /data/backup/elasticsearch_backup
      $ mkdir -pv /data/elasticsearch/{elasticsearch_data,elasticsearch_logs}
    
      $ chown elasticsearch:elasticsearch /data/backup/elasticsearch_backup
      $ chown -R elasticsearch:elasticsearch /data/elasticsearch
    
  • Cluster name

    只有cluster.name相同的节点才能与群集中的所有其他节点一样,才能加入群集。默认名称是elasticsearch,但你应将其更改为适当的名称,该名称描述了群集的用途。

      cluster.name: logging-prod
    

    确保不要在不同的环境中重用相同的群集名称,否则最终可能会导致节点加入错误的群集。

  • Node name

    默认情况下,Elasticsearch将使用随机生成的UUID的前七个字符作为节点id。请注意节点ID是持久的,并且在节点重新启动时不会更改,因此默认节点名称也不会更改。

    但是我们应该配置一个更有意义的名称:

      node.name:prod-data-2
    
  • Network host

    默认情况下,Elasticsearch仅绑定到环回地址 - 例如127.0.0.1 和[::1]。这足以在服务器上运行单个开发节点。

    为了与其他服务器上的节点进行通信并形成集群,您的节点将需要绑定到非环回地址。

      network.host: 192.168.1.10
    

    只要您提供自定义设置network.host,Elasticsearch就会假定您从开发模式转为生产模式,并将许多系统启动检查从警告升级到异常。有关详细信息,请参阅开发模式与生产模式

  • Discovery settings

    Elasticsearch使用名为“Zen Discovery”的自定义发现实现进行节点到节点的群集和主选举。在投入生产之前,应该配置两个重要的发现设置。

    • discovery.zen.ping.unicast.hosts

      开箱即用,没有任何网络配置,Elasticsearch将绑定到可用的环回地址,并将扫描端口9300到9305以尝试连接到在同一服务器上运行的其他节点。这提供了自动群集体验,无需进行任何配置。

      当需要在其他服务器上形成具有节点的群集时,您必须提供群集中可能是实时且可联系的其他节点的种子列表。这可以指定如下:

        discovery.zen.ping.unicast.hosts:
        -  192.168.1.10:9300
        -  192.168.1.11
        -  seeds.mydomain.com
      
    • discovery.zen.minimum_master_nodes

      为防止数据丢失,必须配置 discovery.zen.minimum_master_nodes,以便每个符合主节点的节点都知道必须达到最大主节点数,才能形成集群。

      如果没有此设置,遭受网络故障的群集可能会将群集拆分为两个独立的群集 - 分裂的大脑 - 这将导致数据丢失。在通过minimum_master_nodes编辑避免裂脑的过程中提供了更详细的解释 。

      为避免分裂大脑,应将此设置设置为符合条件的主节点的法定数量:

        (master_eligible_nodes / 2) + 1
      

      换句话说,如果有三个符合主节点的节点,则应将最小主节点设置为(3 / 2) + 1或2:

        discovery.zen.minimum_master_nodes: 2
      
  • Heap size

    默认情况下,Elasticsearch建议JVM应该使用的最小和最大内存大小为1GB。迁移到生产环境时,应该修改heap大小以确保Elasticsearch有足够的heap可用是很重要的。

    Elasticsearch将通过jvm.options中文件中的 Xms (minimum heap size)和Xmx (maximum heap size)设置来指定的整个 heap 。这些设置的值取决于服务器上可用的RAM量。

    建议是:

    • 将最小heap大小(Xms)和最大heap大小(Xmx)设置为彼此相等。 Elasticsearch可用的heap越多,它可用于缓存的内存就越多。但请注意,过多的heap可能会使您陷入长时间的垃圾收集暂停。设置Xmx为不超过物理RAM的50%,以确保有足够的物理RAM留给内核文件系统缓存。

    • 不要设置Xmx为JVM用于压缩对象指针(压缩oops)的截止值以上; 确切的截止值变化但接近32 GB。您可以通过查找日志中的行来验证您是否在限制之下,如下所示:

        heap size [1.9gb], compressed ordinary object pointers [true]
      
    • 更好的是,尽量保持低于zero-based compressed oops的阈值; 确切的截止值有所不同,但大多数系统上26 GB是安全的,但在某些系统上可能高达30 GB。你可以通过使用JVM选项启动-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode并查找如下所示的行来验证您是否在限制之下:

        heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
      

      显示启用zero-based compressed oops, 而不是

        heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
      

      以下是如何通过jvm.options文件设置heap 大小的示例:

        -Xms2g
        -Xmx2g
      

      也可以通过环境变量设置heap大小。这可以通过注释掉来jvm.options文件中的Xms和Xmx设置,并通过设置ES_JAVA_OPTS:

        ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch
        ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch
      
  • heap dump path

  • GC logging

    默认情况下,Elasticsearch启用GC日志。这些配置在 jvm.options默认位置和默认位置与Elasticsearch日志相同。默认配置每64 MB轮换一次日志,最多可占用2 GB的磁盘空间。

Important System Configuration

理想情况下,Elasticsearch应该在服务器上单独运行并使用它可用的所有资源。

默认情况下,Elasticsearch假定你正在开发模式下工作。如果未正确配置下述任何设置,则会向日志文件写入警告,但是你仍然可以启动并运行Elasticsearch节点。

  • Disable swapping

    • Configure swappiness

      Linux系统上可用的确保将sysctl值 vm.swappiness设置为1。这降低了内核交换的倾向,在正常情况下不应导致交换,同时仍允许整个系统在紧急情况下交换。

        $ sysctl -p | grep vm.swappines
        $ sysctl -w  vm.swappiness=1
        $ vim /etc/sysctl.conf
      
    • Enable bootstrap.memory_lock

      另一种选择是在Linux/Unix系统上使用mlockall,或在Windows上 使用 VirtualLock,以尝试将进程地址空间锁定到RAM中,从而防止任何Elasticsearch内存被换出。这可以通过将此行添加到config/elasticsearch.yml文件来完成:

        bootstrap.memory_lock: true
      
  • Increase file descriptors

    Elasticsearch需要使用大量文件描述符或文件句柄。因为用完文件描述符可能会导致灾难性的结果,最有可能的就是导致数据丢失。

    确保将运行Elasticsearch的用户的打开文件描述符数量限制增加到65536或更高。

      $ ulimit -n 65536
    

    并且修改/etc/security/limits.conf。

      $ vim /etc/security/limits.conf
      # allow user 'elasticsearch' mlockall
      elasticsearch soft memlock unlimited
      elasticsearch hard memlock unlimited
    

    注意: 如果是CentoS7等这种使用了systemctl的系统那么应该修改/etc/systemd/system.conf`

      $ vim /etc/systemd/system.conf
      # allow user 'elasticsearch' mlockall
      elasticsearch soft memlock unlimited
      elasticsearch hard memlock unlimited
    

    然后修改下面几项:

      $ vim /etc/systemd/system/elasticsearch.service.d/override.conf
      [Service]
      DefaultLimitNOFILE=65536
      DefaultLimitNPROC=32000
      LimitMEMLOCK=infinity
    

    之后继续操作:

      $ systemctl daemon-reload
      $ systemctl enable elasticsearch.service
      $ systemctl start elasticsearch.service
      $ systemctl status elasticsearch.service
    

    注意:

    limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。登录用户的限制,通过 /etc/security/limits.conf 来配置
    对于systemd service的资源限制,现在被放在 /etc/systemd/system.conf 和 /etc/systemd/user.conf这两个文件里面了。
    其中最主要的就是修改/etc/systemd/system.conf(全局)和/etc/systemd/system/elasticsearch.service.d/override.conf(需要自己创建)这个文件

  • Ensure sufficient virtual memory

    Elasticsearch mmapfs默认使用目录来存储其索引。mmap计数的默认操作系统限制可能太低,这可能导致内存不足异常。

    在Linux上,您可以通过运行以下命令来增加限制:

      $ sysctl -w vm.max_map_count=262144
    

    要永久设置此值,请更新vm.max_map_count设置到 /etc/sysctl.conf。(RPM和Debian软件包将自动配置此设置。无需进一步配置。)

  • Ensure sufficient threads

    Elasticsearch为不同类型的操作使用了许多线程池。重要的是它能够在需要时创建新线程。确保Elasticsearch用户可以创建的线程数至少为4096(Elasticsearch)。

      $ ulimit -u 4096
      $ vim /etc/security/limits.d/90-nproc.conf
      *          soft    nproc     4096
    
  • JVM DNS cache settings

    一旦配置了类似的网络设置network.host,Elasticsearch就会假定您正在转向生产并将上述警告升级为异常。这些异常将阻止您的Elasticsearch节点启动。这是一项重要的安全措施,可确保您不会因服务器配置错误而丢失数据。开发模式与生产模式编辑

参考链接

Configuring Elasticsearch

Important Elasticsearch configuration

Important System Configuration

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/setting-system-settings.html#systemd

https://www.elastic.co/guide/en/elasticsearch/reference/5.6/setting-system-settings.html

https://segmentfault.com/a/1190000014891856

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