Elasticsearch调优

系统参数

  • 修改系统最大打开文件描述符数
    • vi /etc/security/limits.conf,增加配置,用户退出后重新登录生效
*               soft    nofile          65535
*               hard    nofile          65535
  • ​ 修改用户可以打开的最大线程数
    • vi /etc/security/limits.conf, 增加配置,用户退出后重新登录生效
  *               soft    nproc           4096
  *               hard    nproc           4096
  • 单个jvm能开启的最大线程数
    • vi /etc/sysctl.conf
    • 添加如下配置
    • sysctl -p
vm.max_map_count=262144
  • 锁定物理内存
    • vi /etc/security/limits.conf
es soft memlock unlimited
es hard memlock unlimited
es soft memlock unlimited
es hard memlock unlimited
  • 关闭swap,锁定进程地址空间,防止内存swap
    • vi /etc/sysctl.conf
vm.swappiness=0
  • 重启机器,使配置生效
    • reboot

elasticsearch.yml

# 集群的名称,同一个集群该值必须设置成相同的
cluster.name: demo-application
# 该节点的名字
node.name: node-1
# 内存锁定
bootstrap.memory_lock: true
#该节点有机会成为master节点
node.master: true
# 该节点可以存储数据
node.data: true
# 设置绑定的IP地址,可以是IPV4或者IPV6
network.bind_host: 0.0.0.0
# 设置其他节点与该节点交互的IP地址
network.publish_host: 191.168.1.100
# 该参数用于同时设置bind_host和publish_host
network.host: 191.168.1.100
# 设置节点之间交互的端口号
transport.tcp.port: 9300
# 设置是否压缩tcp上交互传输的数据
transport.tcp.compress: true
# 设置对外服务的http端口号
http.port: 9200
# 设置http内容的最大大小
http.max_content_length: 100mb
# 是否开启http服务对外提供服务
http.enabled: true 
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点,建议设置(n/2)+1, 防止脑裂问题
discovery.zen.minimum_master_nodes: 2
# 设置集群中自动发现其他节点时ping连接的超时时间
discovery.zen.ping_timeout: 30s
# 设置是否打开多播发现节点
#discovery.zen.ping.multicast.enabled: false
# 置集群中的Master节点的初始列表,可以通过这些节点来自动发现其他新加入集群的节点
discovery.zen.ping.unicast.hosts: ["191.168.1.100:9300","191.168.1.101:9300","191.168.1.102:9300"]

# 是否支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

jvm.options

  • Heap Size不超过物理内存的一半,且小于32G
  • 如果Heap Size大于6g,建议使用G1垃圾回收
# 初始的Heap的大小,与Xmx的值保持一致
-Xms8g
# 最大Heap的大小,与Xms的值保持一致
-Xmx8g 

# 修改默认的垃圾回收机制CMS为G1
#-XX:+UseConcMarkSweepGC
#-XX:CMSInitiatingOccupancyFraction=75
#-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200

全量导入数据准备操作

  • 开始导入前将副本分片数量设置为0
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/cmas/_settings' -d '{"index": {"number_of_replicas":0}}'
  • 导入完成后设置副本分片数量为1
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/cmas/_settings' -d '{"index": {"number_of_replicas":1}}'

索引优化

合理设置分片

  • 适当增大分片,可以提升建立索引的能力,5~20个比较合适
  • 如果分片数过多或过少,都会导致检索比较慢
    • 分片数过多,会导致检索时打开文件较多,另外也会导致多台服务器之间通讯,影响效率
    • 分片数过少会导致至单个分片索引过大,所以检索速度慢
    • 建议单个分片最多存储20G左右的索引数据,通用计算公司:分片数量=数据总量/20G

合理设置副本数

  • 增加副本,可以提升搜索的能力
  • 如果副本设置过多,会对服务器造成额外的压力,因为主分片需要给所有的副本分片同步数据。另外,副本过多也会占用磁盘空间
  • 一般建议最多设置2~3个即可

合并索引

  • 定时对索引进行合并优化,segment越多,占用的segment memory越多,查询的性能也越差

    • 索引量不大的情况下,可以将segment设置为1
    • 在es1.2.0以前调用_optimize接口,后期改为_forcemerge接口
    curl -u elastic:123456 -XPOST 'http://master:9200/test/_forcemerge?max_num_segments=1'
    

关闭索引

  • 针对不使用的index,建议close,减少内存占用
  • 只要索引处于open状态,索引库中的segment就会占用内存,close之后就只会占用磁盘空间,不会占用内存空间
curl -u elastic:123456 -XPOST 'master:9200/test/_close'

清除删除文档

  • 在Lucene中删除文档,数据不会马上在磁盘上清除,而是在Lucene索引中产生一个.del文件。然而在检索过程中,这部分数据也会参与检索,Lucene在检索过程中会判断是否删除,如果已经删除,再过滤掉,这样也会降低检索效率
  • 可以执行清除删除文档命令
curl -u elastic:123456 -XPOST 'http://master:9200/test/_optimize?only_expunge_deletes=true

合理数据导入

  • 如果在项目开始阶段,需要批量入库大量的数据,建议将副本数量设置为0.因为es在索引数据的时候,如果副本已经存在,数据会立即同步到副本中,这样会对es增加压力
  • 等到索引完成之后,再恢复副本数即可,可以提高索引效率
curl -XGET http://master:9200/test/_settings?pretty
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/test/_settings' -d '{"index": {"number_of_replicas":0}}'
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/test/_settings' -d '{"index": {"number_of_replicas":1}}'

设置索引_all

  • 去掉mapping中_all域,index中默认会有__all域,虽然会给查询带来方便,但是会增加索引时间和索引尺寸
PUT /my_index
{
    "mapping": {
        "user": {
            "_all": {
                "enable": false
            }
        }   
    }
}

设置索引_source

  • _source字段在我们检索时相当重要
  • ES默认检索只会返回ID,如果在{"enable":false}情况下,你需要通过根据这个ID去倒排索引中去取每个Field数据,效率不高。反之,在{"enable":true}情况下可以根据ID直接检索对应source JSON的字段,不用去倒排索引去按FIeld取数据

版本一致

  • 使用Java代码操作ES集群,要保证本地es的版本和集群上es的版本保持一致
  • 保证集群中的每个节点的JDK版本和es配置一致

问题处理

集群脑裂问题

  • 原因

    • 网络原因
    • 节点负载
    • 回收内存
  • 解决方案

    • 将master节点与data节点分离
    node.master:true
    node.data:false
    
    • 为了使新加入的节点快速确定master位置,可以将data节点的默认master发现方式由multicast修改为unicast
    discovery.zen.ping.multicast.enable:false
    discovery.zen.ping.unicast.hosts:["master1","master2","master3"]
    
    • discovery.zen.ping.timeout: 默认三秒,如果master节点在3秒内没有应答,那么这个节点就是挂掉了。增加这个值,会增加节点等待响应的时间,从一定程度上会减少误判
    • discovery.zen.minimum_master_node:默认是1,这个参数控制的是一个节点需要看到的具有master节点资质的最小数量,然后才能在集群中做操作。官方推荐的是(n/2)+1,其中n是具有master资格的节点的数量

翻页问题

  • 尽量不要使用浅分页
  • 如果业务需要必须使用浅分页,需要考虑最大翻页数
PUT /my_index/_settings
{
  "index": {
    "max_result_window": 50000
  }
}

你可能感兴趣的:(Elasticsearch调优)