暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

两分钟了解ElasticSearch的索引重建

龙虾编程 2024-06-07
14

    在5.x版本之后ElasticSearch新增了索引重建功能,可以直接在ES集群里面对数据进行重建并且支持跨集群间的数据迁移。

1、什么是索引重建

    在保证数据的一致性和可用性情况下,使用一个新的索引替换掉旧的索引。如下是索引重建的常见场景:

(1)索引的分片发生了改变

(2)文档结构的变更

    ES中一个字段的mapping在定义并且导入数据之后就不能在修改,此时可以使用索引重建。

(3)ES版本升级


2、索引重建的实现过程

源端索引的结构:

    PUT longxia_item
    {
    "mappings": {
    "_doc": {
    "properties": {
    "item_id": {
    "type": "integer"
    },
                    "item_name": {
    "type": "text",
    "fields": {
    "raw": {
    "ignore_above": 256,
    "type": "keyword"
    }
    }
    }
    }
    }
    }
    }

    (1)同步数据到longxia_item2索引中

      POST _reindex                   
      {
      "source": {
      "index": "longxia_item"
      },
      "dest": {
      "index": "longxia_item2"
      }
      }

      (2)删除源索引的数据

        delete longxia_item

        (3)将目标索引更名为源索引的名称

          POST _aliases
          {
          "actions": [
          {"add": {"index": "longxia_item2", "alias": "longxia_item"}}
          ]
          }

          使用Reindex的注意点:

          (1)要求源端索引的元字段_source是打开的,默认是打开的

          (2)Reindex过程并不会自动将源端索引的设置拷贝到目标索引,所以需要事先在目标集群中按照源端索引的表结构建立好目标索引。


          3、索引重建过程很慢的解决方案

          (1)修改批次数据的大小

          (2)借助Scroll并行优化方式

            POST _reindex?slices=5&refresh
            {
            "source":{
            "index": "longxia_item"
            },
            "dest":{
            "index": "longxia_item2"
            }
            }

                Reindex的底层是是Scroll实现,对每个Scroll请求分成多个Slice请求,让各Slice独立并行,以此来提升效率。

                slices大小设置注意事项: 

                (a)slices大小的设置可以手动指定,或者设置slices设置为auto。auto针对单索引,slices大小=分片数;针对多索引,slices等于分片的最小值。 

                (b)当slices的数量等于索引中的分片数量时,查询性能最高效。slices大小大于分片数,非但不会提升效率,反而会增加开销、影响性能。 

            (3)es副本设置成0

              PUT /longxia_item2/_settings
              {
              "number_of_replicas": 0
              }

                  这样设置之后暂时不会同步es副本数据,等到数据同步完成后启用副本,再去同步副本数据,从而提高同步索引重建的速度。

              (4)禁用或者增加refresh间隔

                PUT /longxia_item2/_settings
                {
                  "refresh_interval"-1    #禁用
                }

                    针对不需要实时获取结果的业务场景,可以先不要索引刷新refresh(默认值是1s)。在做Reindex时可以将每个索引的refresh_interval到60s或禁用,等到数据同步完成之后恢复refresh

                文章转载自龙虾编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论