ELK生态系统——修改es中index的mapping平滑过渡数据

1、需求场景:

Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段。但现实需求往往并非如此,有时需要修改已经定义好的字段名称、字段类型等。

2、实现思路:

这里有一个方法修改mapping,那就是重新建立一个index,然后创建一个新的mapping,再将旧的index中的数据迁移到新的index中去,最后将索引同义词指向新的index即可。你可能会问,这要是在生产环境,可行吗?答案是,如果你一开始就采取了合适的设计——索引同义词,利用索引同义词完全是可以做到不停服务实现修改mapping平滑过渡的。

3、实现步骤:

(1)创建索引:

此索引为旧索引,模拟修改mapping平滑过渡时才需要创建此索引。项目正常使用时,此索引就是项目正在使用并且需要修改mapping的索引。

(2)创建索引同义词(别名):

A、不需要过滤数据同义词(别名):

http://192.168.99.164:9200/_aliases POST

{

  "actions": [

    {

      "add": {

        "index": "my_index",

        "alias": "my_index_alias"

      }

    }

  ]

}

B、需要过滤数据同义词(别名):

对于同一个index,我们给不同人看到不同的数据,如my_index有个字段是team,team字段记录了该数据是那个team的,team之间的数据是不可见的。

http://192.168.99.164:9200/_aliases POST

{

  "actions": [

    {

      "add": {

        "index": "my_index",

        "alias": "my_index__teamA_alias",

        "filter":{

            "term":{

                "team":"teamA"

            }

        }

      }

    },

    {

      "add": {

        "index": "my_index",

        "alias": "my_index__teamB_alias",

        "filter":{

            "term":{

                "team":"teamB"

            }

        }

      }

    },

    {

      "add": {

        "index": "my_index",

        "alias": "my_index__team_alias"

      }

    }

  ]

}

GET /my_index__teamA_alias/_search 只能看到teamA的数据

GET /my_index__teamB_alias/_search 只能看到teamB的数据

GET /my_index__team_alias/_search 既能看到teamA的,也能看到teamB的数据

(3)创建新索引:

获取旧索引的mapping,根据需求对旧mapping进行手动修改得到新mapping,然后通过命令执行新mapping创建新索引。

(4)新旧索引数据迁移:

A、完整迁移数据:

直接将全部数据完整迁移过去。

http://192.168.99.164:9200/_reindex POST

{

  "source": {

    "index": "twitter"

  },

  "dest": {

    "index": "new_twitter"

  }

}

B、字段重命名迁移数据:

把flag重命名为tag,迁移全部数据。

http://192.168.99.164:9200/_reindex POST

{

  "source": {

    "index": "test"

  },

  "dest": {

    "index": "test2"

  },

  "script": {

    "inline": "ctx._source.tag = ctx._source.remove(\"flag\")"

  }

}

C、字段值调换迁移数据:

在数据录入时,字段yxdm和字段jwzydm数据位置错位了,现在需要将数据调换回来,迁移全部数据。

注意需要使用yxdm1作为中间变量存储交换的字段

http://192.168.99.164:9200/_reindex POST

{

  "source": {

    "index": "sugon_course_students_onduty_bak2017_05"

  },

  "dest": {

    "index": "sugon_course_students_onduty_2017_05"

  },

  "script": {

    "inline": "ctx._source.yxdm1 = ctx._source.remove(\"jwzydm\");ctx._source.jwzydm = ctx._source.remove(\"yxdm\");ctx._source.yxdm = ctx._source.remove(\"yxdm1\")"

  }

}

(5)修改索引同义词(别名):

修改索引同义词(别名),就是先删除该索引同义词,然后创建新的索引同义词,两个步骤在一个命令中执行。这样就可以实现平滑过渡。

http://192.168.99.164:9200/_aliases POST

{  

    "actions": [  

        { "remove": {  

            "alias": "my_index",  

            "index": "my_index_v1"  

        }},  

        { "add": {  

            "alias": "my_index",  

            "index": "my_index_v2"  

        }}  

    ]  

}  

(6)删除旧索引:

修改好索引同义词后,程序访问的便是新索引中的数据了,如果程序访问新索引正常,就可以将旧索引删除了,如果为了安全起见,也可以将旧索引备份一下再删除旧索引。

猜你喜欢

转载自blog.csdn.net/LSY_CSDN_/article/details/91401665