Elasticsearch不停机重建索引笔记

本文介绍如何在Elasticsearch不停机的情况下进行索引重建,包括创建别名、同步数据等步骤,适用于需要修改索引结构但又不能中断服务的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
  • 记录当生产机器上的es索引需要增加字段,修改索引类型,并且要求不重启es集群时,可以使用别名进行索引重建。

过程
  • 首先假设我们已经有一个索引名为student_v1,我们得先给他创建一个别名,操作如下:

curl -XPUT "http://localhost:9200/student_v1 " -d'
{
      "mappings": {
         "man": {
            "properties": {
               "age": {
                  "type": "long"
               },
               "name": {
                  "type": "text",
                  "fields": {
                     "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                     }
                  }
               }
            }
         }
      }
   }'
  • 设置别名,对外提供操作都需要通过别名对索引进行增删改查。

  • 如下:设置student_v1的别名为student

curl -XPUT "http://localhost:9200/student_v1/_aliases/student"
  • 模拟写入一些数据

curl -XPUT "http://localhost:9200/student/man/1" -d'
{
    "age":1
    ,"name":"1"
}'
  • 创建最新版本的索引,增加需要的字段,模拟增加了一个class字段

curl -XPUT "http://152.136.87.179:9200/student_v2 " -d'
{
      "mappings": {
         "man": {
            "properties": {
                "class":{
                    "type":"text",
                    "fields":{
                        "keyword":{
                            "type":"keyword",
                            "ignore_above":256
                        }
                    }
                },
               "age": {
                  "type": "long"
               },
               "name": {
                  "type": "text",
                  "fields": {
                     "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                     }
                  }
               }
            }
         }
      }
   }'
  • 同步一次v1,v2两个索引的数据

curl -XPOST "http://localhost:9200/_reindex" -d'
{
     "conflicts": "proceed",
     "source":{
         "index":"student_v1"
     },"dest":{
         "index":"student_v2"
     }
}'
  • 修改索引v2的别名为student,同时移除v1的别名

curl -XPOST "http://localhost:9200/_aliases" -d'
{
    "actions": [
        {"remove": {"index": "student_v1", "alias": "student"}},
        { "add": {"index": "student_v2",  "alias": "student"}}
    ]
}'
  • 再同步一次数据,至此,就完成了es不停机索引重建。

总结
  • reindex 操作可以复制文档,其versiontype属性有

    • internal: 盲目的复制文档,重复则覆盖。

    • external: 继承已有的版本,对于不存在的数据则创建,更新新索引中旧版本的数据。

  • op_type 属性:

  • create,如果目标索引不存在则创建,否则会冲突报异常。

    conflicts:冲突时,忽略,继续操作。

Elasticsearch是一个强大的全文搜索引擎,用于实时数据分析和存储。如果你需要重建索引,通常是由于以下原因: **如何重建索引:** 1. **登录Elasticsearch集群:** 使用Kibana、Logstash或直接通过命令行工具(如curl)连接到你的Elasticsearch节点。 2. **确定要重建索引:** 在`/_cat/indices` API中查找你要重置或重建索引名称。 3. **暂停索引:** 在索引命名空间运行`PUT /your_index_name/_settings`并设置`index.blocks.write = true`,以防新数据写入影响重建过程。 4. **删除旧索引:** 使用`DELETE /your_index_name`删除现有的索引,但要注意这将丢失所有未备份的数据。 5. **创建新的索引:** 发起一个新的索引请求,例如`PUT /your_new_index_name`。你可以指定新索引的配置选项,比如分片数、副本数等。 6. **重新映射数据:** 如果需要,可以在新的索引上运行`POST /_reindex`操作,将老索引中的文档迁移到新索引。如果不需要迁移,可以跳过此步骤。 7. **恢复索引状态:** 当数据迁移完成后,取消对旧索引的封锁,即执行`PUT /your_index_name/_settings`并设置`index.blocks.write = false`。 8. **验证重建:** 最后,检查新索引的状态是否正常,可以通过`GET /_cat/health`查看集群健康状况。 **相关问题--:** 1. 如何防止数据丢失在重建过程中? 2. 是否可以直接在现有索引重建而无需先删除? 3. 新建索引时如何处理字段类型变化导致的问题?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值