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
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容