美文网首页ElasticSearch实战笔记
17、基于scoll+bulk+索引别名实现零停机重建索引,以及

17、基于scoll+bulk+索引别名实现零停机重建索引,以及

作者: 众神开挂 | 来源:发表于2020-04-01 00:27 被阅读0次

    主要内容:1、基于scoll+bulk+索引别名实现零停机重建索引 2、基于_aliases对client透明切换index

    1、基于scoll+bulk+索引别名实现零停机重建索引

    1.1、重建索引

    一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入index中

    批量查询的时候,建议采用scroll api,并且采用多线程并发的方式来reindex数据,每次scoll就查询指定日期的一段数据,交给一个线程即可

    可以给java应用一个别名,这个别名是指向旧索引的,ava应用先用goods_index alias来操作,此时实际指向的是旧的my_index

    示例过程:

    新建索引并插入数据

    PUT /my_index/_doc/3
    {
      "title": "2017-01-03"
    }
    GET my_index/_mapping
    

    使用mapping命令查看索引的mapping类型,可以看到title被设置成date类型,实际上它应该text ,当后期向索引中加入string类型的title值的时候,就会报错,现在需要重建索引

    设置别名,这个别名可以提供给其他应用程序使用

    PUT /my_index/_alias/goods_index
    

    新建一个index,调整其title的类型为string

    PUT /my_index_new
    {
      "mappings": {
        "properties": {
          "title": {
            "type": "text"
          }
        }
      }
    }
    

    使用scroll api将数据批量查询出来

    GET /my_index/_search?scroll=1m
    {
        "query": {
            "match_all": {}
        },
        "sort": ["_doc"],
        "size":  1
    }
    

    返回的值

    {
      "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAA9oWNV9uQmh1MHpTRHU3MFdoVVd4TlV6UQ==",
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : null,
        "hits" : [
          {
            "_index" : "my_index",
            "_type" : "_doc",
            "_id" : "3",
            "_score" : null,
            "_source" : {
              "title" : "2017-01-03"
            },
            "sort" : [
              0
            ]
          }
        ]
      }
    }
    

    然后采用bulk api将scoll查出来的一批数据,批量写入新索引

    POST /_bulk
    { "index":  { "_index": "my_index_new", "_id": "2" }}
    { "title":    "2017-01-02" }
    

    反复循环scorll API,查询一批又一批的数据出来,采取bulk api将每一批数据批量写入新索引

    GET /_search/scroll
    {
        "scroll": "1m", 
        "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAA9oWNV9uQmh1MHpTRHU3MFdoVVd4TlV6UQ=="
    }
    
    1.2、基于_aliases对client透明切换index

    将goods_index alias切换到my_index_new上去,java应用会直接通过index别名使用新的索引中的数据,java应用程序不需要停机,零提交,高可用

    POST /_aliases
    {
        "actions": [
            { "remove": { "index": "my_index", "alias": "goods_index" }},
            { "add":    { "index": "my_index_new", "alias": "goods_index" }}
        ]
    }
    

    (12)直接通过goods_index别名来查询,是否ok

    GET /goods_index/_search
    

    相关文章

      网友评论

        本文标题:17、基于scoll+bulk+索引别名实现零停机重建索引,以及

        本文链接:https://www.haomeiwen.com/subject/okrnyhtx.html