利用elasticsearch alias和reindex操作实
2021-04-06 本文已影响0人
艺超51iwowo
利用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提供数据读取操作,会存在数据不一致情况。这一块需要特定业务特定评估。