ElasticSearch 不停机重新索引(reindex)

假设需要reindex的索引为 book

  • 1.新建一个临时索引 book_v1 (我们通常都使用template,所以不需要指定mapping)
PUT /book_v1
  • 2.将旧索引数据reindex到临时索引中
POST /_reindex
{
  "source": {
    "index": "book"
    // 这里可以写query,指定reindex哪些数据
    // "query": {}
  },
  "dest": {
    "index": "book_v1"
  }
}
  • 3.将别名指向指到临时索引上 这里是不停机重新索引的关键,所以我们在操作es时,建议都使用别名
{
  "actions": [
    {
      "remove": {
        "index": "book",
        "alias": "book_alias"
      }
    },
    {
      "add": {
        "index": "book_v1",
        "alias": "book_alias"
      }
    }
  ]
}
  • 4.删除旧索引
DELETE /book
  • 5.创建一个新的book索引 (我们通常都使用template,所以不需要指定mapping)
PUT /book
  • 6.将临时索引中的数据reindex到新book中(由于ES准实时的原因,所以两次reindex之间的时间间隔一定要大于1s,否则可能丢失数据)
POST /_reindex
{
  "source": {
    "index": "book_v1"
  },
  "dest": {
    "index": "book"
  }
}
  • 7.将别名指向指回新book索引
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "book_v1",
        "alias": "book_alias"
      }
    },
    {
      "add": {
        "index": "book",
        "alias": "book_alias"
      }
    }
  ]
}
  • 8.删除临时索引v1
DELETE /book_v1

上面是直接在kibana上操作的,下面附上一个shell脚本,直接在ES服务器上运行即可

#!/bin/bash

index=$1
index_v1=$2

echo -e '\n1.开始新建索引['$index_v1']'
curl -XPUT "http://localhost:9200/$index_v1"

sleep 3s

echo -e '\n2.开始reindex['$index'->'$index_v1']'
curl -XPOST "http://localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{
	"source": {
		"index": "'$index'"
	},
	"dest": {
		"index": "'$index_v1'"
	}
}'

sleep 3s

echo -e '\n3.开始修改别名指向['$index'_alias->'$index_v1']'
curl -XPOST "http://localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
	"actions": [
	{
		"remove": {
			"index": "'$index'",
			"alias": "'$index'_alias"
		}
	},
	{
		"add": {
			"index": "'$index_v1'",
			"alias": "'$index'_alias"
		}
	}
	]
}'

sleep 3s

echo -e '\n4.开始删除索引['$index']'
curl -XDELETE "http://localhost:9200/$index"

sleep 3s

echo -e '\n5.开始创建引['$index'']
curl -XPUT "http://localhost:9200/$index"

sleep 3s

echo -e '\n6.开始reindex索引['$index_v1'->'$index']'
curl -XPOST "http://localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{
	"source": {
		"index": "'$index_v1'"
	},
	"dest": {
		"index": "'$index'"
	}
}'

sleep 3s

echo -e '\n7.开始修改别名指向['$index'_alias->'$index']'
curl -XPOST "http://localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
	"actions": [
	{
		"remove": {
			"index": "'$index_v1'",
			"alias": "'$index'_alias"
		}
	},
	{
		"add": {
			"index": "'$index'",
			"alias": "'$index'_alias"
		}
	}
	]
}'

sleep 3s

echo -e '\n8.开始删除索引['$index_v1']'
curl -XDELETE "http://localhost:9200/$index_v1"

echo -e '\n重新索引完成'

执行方法

#如果执行时候有问题 $'\r': 未找到命令 提示这个错误的话
#是因为在dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,而Linux/unix下按一次回车键只输入“换行(LF)”,所以文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令,所以,解决问题之道,就是把dos文件格式转换为unix格式。
#我使用的是notepad++,编辑打开右键,然后双击右下角的 Windows(CR LF) 点击转为Unix即可

/bin/bash ./reindex.sh book book_v1

执行结果

在这里插入图片描述

如果不放心话直接删除索引的话,我们可以对比一下文档数,确认相同后再删除索引

GET /_cat/indices/book,book_v1?v
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值