盒子
盒子

Elasticsearch生产环境部署_配置

本文主要介绍Elasticsearch生产环境部署需要考虑的一些配置,自学&分享

ES的默认的很多参数都是不需要改的,当遇到性能问题时首先应该考虑的是增加节点,和优化数据结构。
下面列举一些需要注意的配置项,首先是一般大家都知道的配置项:

  • cluster.name: elasticsearch_production 集群名称还是要改一下,不要使用默认的,万一你在哪个内网,然后一台测试的笔记本开启了ES不是自动就加入了集群。
  • node.name: elasticsearch_005_data 节点名称,这个也改下把,自己也清楚。看日志也明白些
  • path.data: /path/to/data1 数据存储路径
  • path.logs: /path/to/logs 日志路径
  • path.plugins: /path/to/plugins 插件路径
    上面三个初始目录都在安装目录下,主要考虑重装不会因为覆盖丢失数据
  • discovery.zen.minimum_master_nodes 这个配置项主要是用于防止“脑裂”问题,具体设施可以看这篇文章:如何防止ElasticSearch集群出现脑裂现象

  • gateway.recover_after_nodes: n
    这个设置主要防止不必要的数据处理,比如一个集群全部重启,然后有一个机器起的比较慢,然后机器就会组成集群,选出master,然后从备份中恢复出故障集群的数据。集群此时恢复正常。然后起的慢的机器又重启成功了,又会把数据同步到这台机器上并删除冗余数据。这项配置决定直到第n个节点可用才可以进行恢复操作

  • gateway.expected_nodes: 10
  • gateway.recover_after_time: 5m 这个配置一个是恢复的时间,上面配置的是5分钟
    这三项要求首先等待n个节点恢复,然后等待5分钟或者10个节点已经加入了集群就开始数据恢复

  • discovery.zen.ping.multicast.enabled: false

  • discovery.zen.ping.unicast.hosts: [“host1”, “host2:port”]
    ES通过UDP协议去发现节点,建议关闭multicast的自动发现节点机制,上面的配置主要一个是禁用multicast,一个是写出需要尝试连接的节点,如果有专门的master节点可以配置成master节点。

  • 不要修改java的GC机制
    线程池设置成内核数,比如八核机器就设置成8,很多阻塞的操作都是Lucene来操作的,比如硬盘读写。搜索的线程设置可以设置成内核数的三倍

  • Heap size设置
    可以通过命令export ES_HEAP_SIZE=10g,或者启动时配置./bin/elasticsearch -Xmx10g -Xms10g,要让Xmx和Xms相等。也可以修改文件./bin/elasticsearch.in.sh,修改sh代码,修改相关配置
    然后这个内存一般设置为内存的一半,因为还有内存要分配给Lucene使用。然后不管你有多大的内存,该项设置不要超过32GB,这个与JVM的一些特性有关
    如果你是使用了服务的方式去启动ES,需要修改服务的配置文件./bin/service/elasticsearch.conf来实现相关配置。

  • 内存交换
    这个对于性能影响是致命的,可以使用命令sudo swapoff -a来暂时关闭,永久关闭需要编辑文件/etc/fstab
    也可以在配置文件中添加配置bootstrap.mlockall: true,这样jvm可以锁定这些内存,避免被交换到物理存储介质。

  • 文件描述符
    这个说法我也不知道对不对,或者叫文件句柄?反正就是file descriptor,这个主要是因为Lucene要打开很多文件,Elasticsearch要开启很多socket,在linux系统下这些都是通过文件来处理的,linux会限制每个进程开启的文件数,可以通过sysctl -w vm.max_map_count=262144来临时修改,或者修改配置文件/etc/sysctl.confvm.max_map_count设置,最后都要执行sysctl -p使设置生效。
    然后我是通过elasticsearchservicewrapper来启动ES的这里还需要修改配置文件./bin/service/elasticsearch,将配置项ULIMIT_N前面的注释去掉,并配置相应的值,建议值是32000,然而我配置了64000。
    查看是否设置成功http://localhost:9200/_nodes/process?pretty,里面的max_file_descriptors就是对应的值。