Elasticsearch问题以及调优

Elasticsearch问题以及调优

Elasticsearch脑裂问题分析

  • 脑裂问题的图解
    • [外链图片转存失败(img-09EzQT3W-1566829347750)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1566822492817.png)]
    • 脑裂问题就是在集群环境之中,由于节点之间的通信问题导致节点对集群的状态理解不同,导致es有些查询非常缓慢甚至查询失败
    • 最好的解决办法就是重启集群,详细的问题分析可以查看我的博客《Elasticsearch脑裂问题详细分析及解决方案》

Elasticsearch索引模板以及索引名

索引模板index template
  • 在我们的工作中,针对一个大批量的数据存储时需要使用多个索引库,如果我们手工去为每个索引库配置信息就很麻烦,所以就有了索引模板,创建一个模板,制定好配置信息,如果我们闯进的索引库匹配到了模板就会使用模板中的配置信息

  • 创建模板

    • curl -H "Content-Type: application/json" -XPUT localhost:9200/_template/template_1 -d '
      {
          "template" : "*",
          "order" : 0,
          "settings" : {
              "number_of_shards" : 1
          },
          "mappings" : {
              "type1" : {
                  "_source" : { "enabled" : false }
              }
          }
      }
      其中的order值是用来进行模板之间的优先级排序的,如果一个索引匹配到多个模板则比较模板的order值,选取最大order值的模板进行配置信息匹配
      
  • 查看模板信息 curl -XGET localhost:9200/_template/temp*?pretty

  • 删除模板 curl -XDELETE localhost:9200/_template/temp_1

索引别名index alias
  • 索引别名就是为索引起一个或者多个别名方便引用

  • 公司使用es收集应用的日志,每个星期创建一个索引库,这样时间长了就会创建很多个索引库,操作和管理非常不方便

  • 由于新增的索引只会操作最新的这一周的索引库,所以我们就可以创建两个别名

  • curr_week :此别名执行这个星期的索引库,新增的数据操作这个索引库

  • last_3_month:这个别名指向的是近三个月的索引库,因为我们需要查询近三个月的数据

  • 后期只需要修改两个别名与索引库的指向关系即可,应用层的代码不许要更新、

  • 还需要将三个月之前的索引库close掉,将一年前的索引库删除

  • es默认对查询分片的数量是有限制的,默认是1000个,使用通配符查询多个索引库的时候会出问题,正好可以使用别名解决

  • 增加索引别名 可同时增减多个

    • curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/_aliases' -d '
      {
          "actions" : [
              { "add" : { "index" : "test1", "alias" : "alias1" } },
              { "add" : { "index" : "test2", "alias" : "alias1" } }
      
          ]
      }'
      
  • 删除索引别名

    • curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/_aliases' -d '
      {
          "actions" : [
              { "remove" : { "index" : "test1", "alias" : "alias1" } }
          ]
      }'
      

Elasticsearch参数调优

  • 解决es启动警告信息

    • vi /etc/security/limits.conf
      增加以下内容
      * soft nofile 65536
      * hard nofile 131072
      * soft nproc 2048
      * hard nproc 4096
      vi /etc/security/limits.d/90-nproc.conf 
      把1024修改为4096
      *          soft    nproc     4096
      
  • 修改配置文件调整es的jvm内存大小

    • 修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置一样大,避免频繁的分配内存,根据服务器内存大小,一般分配60%左右(默认256M)
    • 注意内存最大不要超过32G 一旦你越过这个神奇的32GB边界,指针会切换回普通对象指针.。每个指针的大小增加,使用更多的CPU内存带宽。事实上,你使用40~50G的内存和使用32G的内存效果是一样的。
  • 设置memory_lock来锁定进程的物理内存地址

    • 避免交换(swapped)来提高性能

      修改文件conf/elasticsearch.yml

      bootstrap.memory_lock: true

      需要根据es启动日志修改/etc/security/limits.conf文件(重启系统)

  • 改变分片的数量

    • 分片多的话,可以提升建立索引的能力,5-20个比较合适。
    • 如果分片的数量过多或者过少都会导致检索比较慢
    • 分片过多会导致查询的额时候打开较多的文件,而分片数过少会导至单个分片索引过大,所以检索速度也会慢。
    • 建议单个分片存储20G左右的索引数据【最高也不要超过50G,否则性能会很差】,所以,分片数量=数据总量/20G
    • 副本多的话,可以提升搜索的能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为主分片需要给所有副本同步数据。所以建议最多设置1-2个即可。
  • 针对不使用的index,建议close,减少内存占用。因为只要索引处于open状态,索引库中的segement就会占用内存,close之后就只会占用磁盘空间了。

    • curl -XPOST ‘localhost:9200/test/_close’
  • 要定时对索引进行合并优化,不然segment越多,占用的segment memory越多,查询的性能也越差

    • 索引量不是很大的话可以将segment设为1

    • 在es2.1.0以前调用_optimize接口,后期改为_forcemerge接口

      • curl -XPOST 'http://localhost:9200/test/_forcemerge?max_num_segments=1'
        client.admin().indices().prepareForceMerge("test").setMaxNumSegments(1).get();
        注意:索引合并是针对分片的。segment设置为1,则每个分片都有一个索引片段。
        
  • 删除文档:在es中删除文档,数据不会马上在硬盘上除去,而是在es索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,es在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档

    • shell:
      curl -XPOST 'http://localhost:9200/test/_forcemerge?only_expunge_deletes=true'
      java:
      client.admin().indices().prepareForceMerge("test").setOnlyExpungeDeletes(true).get();
      
  • 如果在项目开始的时候需要批量入库大量数据的话,建议将副本数设置为0

    • 因为es在索引数据的时候,如果有副本存在,数据也会马上同步到副本中,这样会对es增加压力。可以等索引完成后将副本按需要改回来。这样可以提高索引效率
  • Elasticsearch在建立索引时,根据id或(id,类型)进行hash,得到hash值之后再与该索引的分片数量取模,取模的值即为存入的分片编号

    • 可以指定把数据存储到某一个分片中,通过routing参数 可以显著提高性能

      • curl -XPOST 'localhost:9200/yehua/emp?routing=rout_param' -d '{"name":"zs","age":20}'
        routing(路由参数)
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值