一、前言
ElasticSearch版本:8.11.1
操作环境:机器数5,规格为16核32 GB
索引名称:test
索引大小:1.5G
索引分片:1主1副
测试环境将test索引调整为2主2副。计划采用如下两种方案:
方式 | 耗时 | 资源占用 |
---|---|---|
reindex | 1小时 | 集群中有大量的写QPS,索引所占节点资源高。 |
_split API |
1分钟 | 集群数据节点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方案
四、结束语
未完待续。。。