利用elasticsearch alias和reindex操作实现服务零停机迁移

  • Post author:
  • Post category:其他


利用ES的alias和reindex操作,可以实现某些业务场景下的服务零停机的数据迁移。

前提是,数据的读写操作均依赖索引的alias,而非具体的索引。

如下图所示:

写入操作依赖write_alias别名,读取操作依赖read_alias别名。

image-20210405143855719

当需要进行数据迁移时,

步骤1:按照需求建立好新的索引,Index_version_v2。

步骤2:删除write_alias与index_version_v1的关联,同时建立write_alias与index_version_v2的关联。

以下操作为原子操作。

POST /_aliases
{
    "actions" : [
        { "remove" : { "index" : "Index_version_v1", "alias" : "write_alias" } },
        { "add" : { "index" : "Index_version_v2", "alias" : "write_alias" } }
    ]
}

image-20210405144303395

步骤3:使用es reindex操作,将数据从index_version_v1重新建立到index_version_v2。

  POST _reindex
    {
      "source": {
        "index": "Index_version_v1"
      },
      "dest": {
        "index": "Index_version_v2"
      }
    }

image-20210405144327964

步骤4:删除read_alias与index_version_v2的关联,同时建立read_alias与index_version_v2的关联。

POST /_aliases
{
    "actions" : [
        { "remove" : { "index" : "Index_version_v1", "alias" : "read_alias" } },
        { "add" : { "index" : "Index_version_v2", "alias" : "read_alias" } }
    ]
}

image-20210405144346013

可能存在的问题:

在索引Index_version_v2的数据还未reindex完成时,需要依赖Index_version_v1提供数据读取操作,会存在数据不一致情况。这一块需要特定业务特定评估。



版权声明:本文为yi_chao_jiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。