Elasticsearch Split和shrink API

news2024/11/20 21:42:55

背景:

尝试解决如下问题:单分片存在过多文档,超过lucene限制

 

分析

1.一般为日志数据或者OLAP数据,直接删除索引重建

2.尝试保留索引,生成新索引

  - 数据写入新索引,查询时候包含 old_index,new_index

3.尝试split

split index API

如果需要将当前index的primary shard数量增加时,可以使用split index api。

会生成一个新index,但会保留原来的index。

步骤:

确保source index只读

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

spilt API修改primary shard数量

POST source_index/_split/new_index
{
  "settings": {
    "index.number_of_shards": 10
  }
}

监控执行进度

GET _cat/recovery/new_index

测试

版本 7.17.5

# 新建测试索引
PUT test_split
{
  
}

# 关闭source索引的写入
PUT /test_split/_settings
{
  "settings": {
    "index.blocks.write": true 
  }
}

# 执行split API
POST /test_split/_split/test_split_new
{
  "settings": {
    "index.number_of_shards": 12
  }
}

遇到报错并解决,在split API执行阶段:

1. source 索引必须是 read-only 的

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_state_exception",
        "reason": "index test_split must be read-only to resize index. use \"index.blocks.write=true\""
      }
    ],
    "type": "illegal_state_exception",
    "reason": "index test_split must be read-only to resize index. use \"index.blocks.write=true\""
  },
  "status": 500
}



2. source分片数(3)必须是target分片数的因子(所以target不能为11,可以为12)

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "the number of source shards [3] must be a factor of [11]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "the number of source shards [3] must be a factor of [11]"
  },
  "status": 400
}




应用

集群版本 6.8.5

设置source索引 "index.blocks.write": true 之后,执行split API异常:

{
  "error": {
    "root_cause": [
      {
        "type": "remote_transport_exception",
        "reason": "[es-log-all-2][10.xx.x.xx:9300][indices:admin/resize]"
      }
    ],
    "type": "illegal_state_exception",
    "reason": "the number of routing shards [5] must be a multiple of the target shards [20]"
  },
  "status": 500
}

即:目标索引的主分片个数必须是index.number_of_routing_shards的因数;

注意:number_of_routing_shards 不可以动态修改

结论:ES6.8无法通过split API解决索引分片过少的问题

官方doc:Split index API | Elasticsearch Guide [8.9] | Elastic

Shrink index API

如果需要将当前index的primary shard数量减少时,可以使用shrink index api。

会生成一个新index,但会保留原来的index。

(Shrinks an existing index into a new index with fewer primary shards.)

POST /my-index-000001/_shrink/shrunk-my-index-000001

步骤

# 新建index
PUT test_shrink
{
  
}

# 查看索引的shard在哪些node
GET _cat/shards/test_shrink?v

# 将所有主分片分配到node1,副本设置为0,设置readOnly
PUT test_shrink/_settings
{
  "settings": {
    "index.number_of_replicas": 0,
    "index.routing.allocation.require._name": "node-es-0",
    "index.blocks.write": true
  }
}

# 执行shrink API
POST /test_shrink/_shrink/new_test_shrink
{
  "settings": {
    "index.number_of_replicas": 1,
    "index.number_of_shards": 1, 
    "index.codec": "best_compression" 
  },
  "aliases": {
    "my_search_indices": {}
  }
}

如果上述命令修改成:

POST /test_shrink/_shrink/new_test_shrink
{
  "settings": {
    "index.number_of_replicas": 1,
    "index.number_of_shards": 2, 
    "index.codec": "best_compression" 
  },
  "aliases": {
    "my_search_indices": {}
  }
}

新的number_of_shards不是source index的number_of_shards的因子,那么出现如下错误:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "the number of source shards [3] must be a multiple of [2]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "the number of source shards [3] must be a multiple of [2]"
  },
  "status": 400
}

官方doc:Shrink index API | Elasticsearch Guide [8.9] | Elastic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/918823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一、数据库基础

数据库 一、数据库基础 1、一些概念 数据库:数据库(DataBase ,简称DB),就是信息的集合。数据库是由数据库管理系统管理的数据的集合;数据库管理系统:简称DBMS 。是一种操纵和管理数据库的大型…

听GPT 讲Prometheus源代码--tsdb

题图来自 Prometheus TSDB (Part 1): The Head Block[1] tsdb 目录在 Prometheus 项目中承担了实现时间序列数据库(Time Series Database)的功能。Prometheus 使用这个自定义的时间序列数据库来高效地存储和查询监控数据。 在 tsdb 目录下,有…

这所C9无歧视!专业课简单,平均130分!

一、学校及专业介绍 哈尔滨工业大学(Harbin Institute of Technology,简称哈工大),是隶属于工业和信息化部的全国重点大学,位于哈尔滨市,九校联盟“C9”之一,位列国家“双一流”、“985工程”、…

连接未来 驱动创新|腾讯云 CODING DevOps 主题沙龙诚邀您的参与

点击链接了解详情 随着企业数字化转型步入深水区,DevOps 作为数字化转型关键的内建阶段,其应用和实施已经成为企业提升研发效率,实现快速迭代和持续交付的重要手段。然而如何有效地实施 DevOps,如何利用 DevOps 推动业务发展和创新…

Wireshark数据抓包分析之UDP协议

一、实验目的: 通过使用wireshark对UDP数据包的抓取分析UDP协议的内容 二、预备知识: UDP协议的概念:UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接传输服务。它也不提供报文到达确认、排序及流量控制等功能。 …

kafka复习:(4)为什么默认情况下相同的key不为空的消息会被存储到相同的分区

默认分区器DefaultPartitioner的分区代码: 可以看到,消息最终落在哪个分区就是由总计有几个分区以及key的值来决定的。

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks [2022 CVPR]

长期以来,仅使用单视角二维照片集无监督生成高质量多视角一致图像和三维形状一直是一项挑战。现有的三维 GAN 要么计算密集,要么做出的近似值与三维不一致;前者限制了生成图像的质量和分辨率,后者则对多视角一致性和形状质量产生不…

推荐这11个平面设计软件,平面设计师必备好物

今天本文整理了大厂设计师都在用的平面设计软件,为设计师的平面设计工作高效赋能,一起来看看吧! 1、即时设计 即时设计是国内很多设计师或者设计团队都在用的平面设计软件,它能为个人设计师带来丰富的创作力和多样的平面设计功能…

UE学习记录03----UE5.2 使用拖拽生成模型

0.创建蓝图控件,自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor,创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…

ssm网上医院预约挂号系统源码和论文

ssm网上医院预约挂号系统源码和论文051 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式…

SpringCloud教程 | 第五篇: 路由网关(zuul)

在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简单的微服务系统如下图: 注意&…

interview1-DB篇

需要项目经验可自行上Gitee寻找项目资源 一、Redis篇 1、缓存 缓存的要点可分为穿透、击穿、雪崩,双写一致、持久化,数据过期、淘汰策略。 (1)穿透、击穿、雪崩 1.缓存穿透 查询一个不存在的数据,mysql查询不到数据…

Ansible学习笔记(一)

1.什么是Ansible 官方网站:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html Ansible是一个配置管理和配置工具,类似于Chef,Puppet或Salt。这是一款很简单也很容易入门的部署工具,它使用SS…

Linux学习记录——이십오 多线程(2)

文章目录 1、理解原生线程库线程局部存储 2、互斥1、并发代码(抢票)2、锁3、互斥锁的实现原理 3、线程封装1、线程本体2、封装锁 4、线程安全5、死锁6、线程同步1、条件变量1、接口2、demo代码 1、理解原生线程库 线程库在物理内存中存在,也…

常用性能测试工具及其功能

在软件开发周期的不同阶段,性能测试工具被广泛用于评估系统的性能和发现潜在的性能瓶颈。本文介绍了几种常用的性能测试工具,包括负载测试工具、压力测试工具和基准测试工具,并详细描述了它们的功能和用法。 性能测试在软件开发的各个阶段都至…

SpringBoot 调用外部接口

SpringBoot 调用外部接口 一、第一种方式(HttpClient等) 使用插件方式,比如自带的HttpClient,或者OkHttp,甚至是原生的HttpURLConnection 等等,这里以HttpClient为例。 1、封装工具类 简单封装的get请求 /*** 发送get请求:带请求…

数字时代的先驱者,「Adobe之父」离世,享年82岁!

原创 | 文 BFT机器人 John Warnock于当地时间8月19日辞世,享年82岁。 他作为图形和出版软件公司Adobe的共同创始人,被誉为“Adobe之父”,在计算机图形学和电子出版等领域都做出了重大的贡献,为后人留下一笔丰厚的“遗产”&#x…

校园二手物品交易平台/二手交易系统/基于java的校园跳蚤市场系统

​ 摘 要 本文论述了校园二手物品交易平台的设计和实现,该网站从实际运用的角度出发,运用了计算机网站设计、数据库等相关知识,网络和Mysql数据库设计来实现的,网站主要包括用户注册、用户登录、浏览商品、搜索商品、查看商品并进…

8.23 类 构造函数 析构函数 拷贝构造函数

#include <iostream>using namespace std;class Per{string name;int age;float *high;float *weight; public:Per(string name,int age,float high,float weight):name(name),age(age),high(new float(high)),weight(new float(weight)){cout << "Per的构造函…

docker: /lib64/libc.so.6: version `GLIBC_2.32‘ not found (required by docker)

Linux环境 Ubuntu 22.04 docker 最新版 jenkins docker 版本(以下版本都会报错 jenkins/jenkins:centos7 jenkins/jenkins:lts-centos7 jenkins/jenkins:ltsdocker-compose.yml配置 version: 3.6 services:gitlab:image: twang2218/gitlab-ce-zhrestart: alwayscontainer_nam…