ElasticSearch系列:索引分片调整

一、前言

ElasticSearch版本:8.11.1

操作环境:机器数5,规格为16核32 GB

索引名称:test

索引大小:1.5G

索引分片:1主1副

测试环境将test索引调整为2主2副。计划采用如下两种方案:

方式耗时资源占用
reindex1小时集群中有大量的写QPS,索引所占节点资源高。
_split API1分钟集群数据节点CPU使用率为78%左右,load_1m为10左右。

二、正文

1、reindex方案

1c查看原索引映射以及重建的索引是否存在

GET test/_mapping
GET test_new/_search

2)禁用原索引写入数据,验证禁用功能是否正常,如果无法写入数据,则正常。

PUT test/_settings
{
  "settings": {
    "index.blocks.write": true
  }
}

PUT 原索引 新增数据

3)创建索引、映射、分片数量、自定义分词器

put test_new
{
  "settings": {
    "analysis": {
  		"filter": {
  			"search_pinyin": {
  				"keep_joined_full_pinyin": false,
  				"ignore_pinyin_offset": true,
  				"none_chinese_pinyin_tokenize": true,
  				"lowercase": true,
  				"keep_original": true,
  				"remove_duplicated_term": false,
  				"keep_separate_first_letter": false,
  				"trim_whitespace": true,
  				"type": "pinyin",
  				"limit_first_letter_length": 16,
  				"keep_none_chinese_in_first_letter": true,
  				"keep_separate_chinese": true,
  				"keep_none_chinese_in_joined_full_pinyin": false,
  				"keep_none_chinese_together": true,
  				"keep_first_letter": false,
  				"keep_none_chinese": true,
  				"keep_full_pinyin": false
  			},
  			"my_pinyin": {
  				"keep_joined_full_pinyin": true,
  				"keep_separate_chinese": true,
  				"keep_none_chinese_in_first_letter": true,
  				"lowercase": true,
  				"none_chinese_pinyin_tokenize": true,
  				"keep_original": true,
  				"remove_duplicated_term": false,
  				"keep_separate_first_letter": false,
  				"keep_first_letter": true,
  				"type": "pinyin",
  				"limit_first_letter_length": 16,
  				"keep_full_pinyin": true
  			}
  		},
  		"analyzer": {
  			"pinyin_chinese_tokenizer": {
  				"filter": ["search_pinyin"],
  				"type": "custom",
  				"tokenizer": "ik_max_word"
  			},
  			"ik_pinyin_analyzer": {
  				"filter": ["my_pinyin"],
  				"type": "custom",
  				"tokenizer": "ik_max_word"
  			}
  		}
  	},
    "index": {
      "number_of_shards": "2",
      "number_of_replicas": "2"
    }
  },
  "mappings": {
      ...
  }
  
}

4)数据迁移(覆盖更新),可以考虑异步

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test_new"
  }
}
  • source: 源索引
  • dest: 目标索引

4)查看当前任务

//查看任务列表
GET _tasks?actions=*reindex*&detailed
//根据任务ID查询任务状态
GET /_tasks/任务ID
GET /_tasks/TDipbgZDRWisJfNLder62g:243544
//取消任务
POST /_tasks/任务ID/_cancel
POST /_tasks/TDipbgZDRWisJfNLder62g:243544/_cancel

查看任务列表

根据任务ID查询任务状态

5)验证新索引名称是否生效,确认新索引生效且无误后,可删除旧索引,定义新索引别名为旧索引。

DELETE /test
定义别名 语法:PUT 新索引/_alias/旧索引
PUT /test_new/_alias/test

6)取消原索引禁止写入限制

PUT /test/_settings
{
  "settings": {
    "index.blocks.write": false
  }
}

2、_split API方案(参考:通过_split API快速拆分主分片

1)在创建索引时指定index.number_of_routing_shards,设置索引可拆分的分片数。如果默认存在,可忽略。

PUT /test
{
  "settings": {
    "index": {
      "number_of_routing_shards": 1024,
      "number_of_shards":2
    }
  }
}

number_of_routing_shards:路由分片数,定义索引可拆分的次数或原始分片可拆分的分片数。创建索引指定该参数,要求索引主分片数必须是路由分片数的一个因数。
number_of_shards:默认因数2

2)插入数据,并且可以查询,确保正常
3)禁用原索引写入数据,验证禁用功能是否正常,如果无法写入数据,则正常。

PUT test/_settings
{
  "settings": {
    "index.blocks.write": true
  }
}

PUT 原索引 新增数据

4)拆分原索引并配置新索引,取消新索引的禁止写入限制

POST test/_split/test_new
{
  "settings": {
    "index.number_of_shards": 2,
    "index.number_of_replicas": 2,
    "index.blocks.write": null
  }
}

5)通过_cat recovery API查看分片拆分进度,当无拆分分片相关的recovey,且集群状态健康,则分片拆分完成。当返回结果的index列没有待拆分的索引时,说明无拆分分片相关的recovey。

GET _cat/recovery?v&active_only

拆分完成后

6)取消原索引禁止写入限制

PUT /test/_settings
{
  "settings": {
    "index.blocks.write": false
  }
}


7)验证新索引名称是否生效,确认新索引生效且无误后,可删除旧索引,定义新索引别名为旧索引。

DELETE /test
定义别名 语法:PUT 新索引/_alias/旧索引
PUT /test_new/_alias/test

三、问题

1、拆分后分配在同一个数据节点内。

可能由于数据节点不够导致的

2、调整副本数不生效

在排除索引无问题之后,可以尝试以下三种方案解决:

1)尝试重新分配失败的分片

POST /_cluster/reroute?retry_failed=true


2)重启索引

--刷新索引
POST indexname/_flush
--关闭索引
POST indexname/_close
---打开索引
POST indexname/_open


3)重建索引
参考reindex方案

四、结束语

未完待续。。。

### Elasticsearch 索引分片的概念 在Elasticsearch中,索引可以被分割成多个部分称为分片(shards),这些分片可以在集群中的不同节点间分布。这种设计不仅有助于水平扩展存储能力,还提高了查询性能因为请求会被并行处理[^1]。 当文档被存入某个特定的索引时,它实际上会被写入该索引的一个或几个主分片之中;而为了提高可用性和容错性,每一个主分片还可以拥有零个或多个副本(replicas)[^2]。这意味着即使某些硬件发生故障,只要还有其他健康的副本来保存相同的据集,则整个系统的正常运作不会受到影响。 对于大规模应用而言,考虑到单一分片所能承载的据量有限以及潜在的增长需求,在规划之初就应当谨慎考虑如何设置合适的初始分片目及其大小上限。通常情况下,官方建议将每个分片的最大容量控制在大约30GB左右,并据此推算出合理的总分片以适应预期的据规模[^3]。 另外值得注意的是,虽然理论上增加更多的分片似乎总是有利无弊——毕竟这能带来更好的并发度和支持更大的总体据体量——但实际上过多的小型分片反而会对系统造成额外负担,因此还需要综合考量实际场景下的资源状况与访问模式等因素来做出最佳决策[^4]。 ### 创建及管理方式 #### 创建索引 创建一个新的带有指定配置参(比如分片量)的索引可以通过RESTful API轻松实现: ```json PUT /my_index?pretty { "settings": { "number_of_shards": 5, "number_of_replicas": 1 } } ``` 上述命令定义了一个名为`my_index`的新索引,其中包含了五个主分片和一个完整的复制链路用于冗余保护。 #### 动态调整分片量 一旦索引建立完成之后,默认情况下其内部结构如分片量便不可更改。然而,针对已存在的索引仍可通过重新索引来间接达到改变目的的效果,即先构建另一个具有新设定值的目标索引并将源据迁移过去再删除旧版本。 此外,尽管无法直接修改现有索引内的分片,但允许随时增减副本的量从而灵活应对不同的负载情况或是维护期间的需求变化: ```json POST /my_index/_settings { "index" : { "number_of_replicas" : 2 } } ``` 此段脚本展示了怎样把先前例子中提到的那个索引对象(`my_index`)所拥有的备份份提升至两份[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值