Elasticsearch迁移数据方案(不停服重建索引)

2018-12-11  本文已影响14人  非凡公社

背景

方案

流程图

image

打开临时索引

拷贝数据

 ReindexAction.INSTANCE
 .newRequestBuilder(elasticsearchTemplate.getClient())
                    .source("index_old")
                    .destination("index_new")
                    .get();

删除老索引&建立别名

  if (elasticsearchTemplate.indexExists("index_old")) {
            elasticsearchTemplate.deleteIndex("index_old");
        }

        AliasQuery aliasQuery = new AliasQuery();
        aliasQuery.setIndexName("index_new");
        aliasQuery.setAliasName("index_old");
        elasticsearchTemplate.addAlias(aliasQuery);

关闭临时索引

迁移临时索引数据到新索引

int curPage = 0;
    while (true) {
        SearchQuery query = new NativeSearchQuery(QueryBuilders.matchAllQuery()).setPageable(PageRequest.of(curPage, 1000));
        Page<IndexTemp> indexTemp = elasticsearchTemplate.queryForPage(query, IndexTemp.class);
            if (!indexTemp.hasContent()) {
                logger.info("index_temp 没有跟多数据");
                logger.info("index_temp 迁移完成");
                 return;
              }
             List<IndexNew> infoList = new ArrayList<>();
            for (IndexTemp temp : indexTemp) {
                   IndexNew indexNew = new IndexNew();
                BeanUtils.copyProperties(temp, indexNew);
                   infoList.add(indexNew);
             }
             List<IndexQuery> indexQueries = infoList.stream().map(e -> {
                  IndexQuery indexQuery = new IndexQuery();
                 indexQuery.setObject(e);
                 return indexQuery;
              }).collect(Collectors.toList());

            elasticsearchTemplate.bulkIndex(indexQueries);
              logger.info("迁移一页, page:{}, infoListSize:{}", curPage, infoList.size());
             curPage++;
         }

删除临时索引

if (elasticsearchTemplate.indexExists("index_temp")) {
            elasticsearchTemplate.deleteIndex("index_temp");
            logger.info("index_temp 删除完成");
        }

总结

最后还是建议大家使用别名来指向真正的索引,使用别名对于索引结构的变更非常方便,只要将更改别名指向就 OK 了,简单快捷

上一篇下一篇

猜你喜欢

热点阅读