ElasticSearch系列:索引分片调整

发布于:2024-12-21 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、前言

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方案

四、结束语

未完待续。。。