当前位置: 首页 > article >正文

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

四、结束语

未完待续。。。


http://www.kler.cn/a/440742.html

相关文章:

  • 奇绩创坛公开课第01课_创业走出第一步_陆奇:学习笔记
  • shell脚本目录下所有文件中关键词替换方法
  • K8s 如何自己实现云上的proxy代理
  • 手眼标定工具操作文档
  • 接口数据做缓存,响应飞快似天神
  • Java项目--仿RabbitMQ的消息队列--消息持久化
  • STM32单片机芯片与内部26 RTC——万年历、时钟 标准库配置 HAL库配置
  • 云计算HCIP-OpenStack02
  • 在OpenCV中轮廓处理
  • 设计模式学习[13]---抽象工厂模式+简单工厂+工厂方法模式回顾
  • 【在 Vue3 的计算属性中传递参数】
  • CompletableFuture异步业务 默认ForkJoinPool 导致类加载器加载类失败
  • 起售停售套餐
  • tij15_泛型
  • Java性能调优 - JVM性能监测及调优
  • React Native学习路线图
  • 计算机组成原理(八):加法器
  • ps案例制作
  • centos使用mkisofs构建无人值守镜像(附官方学习文档)
  • python webdriver-manager 实现selenium 免下载安装webdriver