Elasticsearch:如何减少 Elasticsearch 集群中的分片数量

news2024/11/18 7:51:14

在我之前的文章 “Elasticsearch:我的 Elasticsearch 集群中应该有多少个分片?” , 它描述了在我们实际操作中的分片数量的准则。在文章 “Elasticsearch:如何部署 Elasticsearch 来满足自己的要求” 讲述了如何部署 Elasticsearch 来满足我们的搜索数据的需求。在实际的操作中,我们可能由于版本的变迁,会涉及到分片数据的变更。在今天的文章中,我们来描述一下具体的操作。

Elasticsearch 减少分片数量

当你的集群中有太多分片时并且有些分片的大小过小的时候,你可以采取一些步骤来减少分片的数量。 本文指南涵盖了删除或关闭索引以及重新索引到更大的索引中。 下面,我们将回顾如何减少新建索引的分片数量,如何减少现有索引的分片数量,如何减少主分片数量以及如何减少基于时间的索引的分片数量。

如何减少新建索引的分片数

创建新索引时,你应该确保将新创建的分片数量配置为尽可能低的数量。

为了演示此选项,我们假设你正在运行旧版本的 Elasticsearch(v6.0 之前)并且你正在使用它来存储你的日志。 默认情况下,每个索引创建 5 个主分片。 这 5 个分片可以轻松容纳 100-250GB 的数据。 如果你知道你生成的数据量要少得多,你应该将集群的默认值调整为每个索引每 50GB 数据 1 个分片。

实现这一点的最简单方法是创建一个索引模板并将其存储在你的集群状态中。

此请求将创建一个名为 “template_1” 的索引模板。 它将应用于所有以 “log” 开头的新创建的索引名称,并将每个索引的分片数设置为 1。

PUT _index_template/template_1
{
  "index_patterns": ["log*"],
  "template": {
	"settings": {
  	 "index.number_of_shards": 1
       }
  }
}

确切的语法可能因你使用的 Elasticsearch 版本而异。 请检查这个文档。上面的 template 能够使得我们新创建的以 log 为开头的索引都具有一个分片,当然这个依赖于你具体的需求。

如何减少现有索引的分片数量

减少副本分片的数量

减少分片数量的一种简单方法是减少副本数量。 可以通过请求动态更改副本数量,只需几秒钟。

通常建议每个索引有 1 个副本分片,这样每个分片的一个副本将分配到另一个节点上(除非你有许多并行运行的搜索请求)。 副本用于故障安全,因此如果一个节点出现故障,你的数据仍然可用于搜索和存储。 它们增强集群弹性并更均匀地分配负载。

但是,如果你的集群完全过载,一个快速简单的解决方法是将副本设置为零。 如果这样做,请注意这并不理想,不应长时间保持这种状态。

此请求会将所有以 “log” 开头的索引名称的副本分片数设置为 0:

PUT log*/_settings
{
  "index" : {
	"number_of_replicas" : 0
  }
}

减少主分片的数量

每个索引的主分片数量不能动态更改 — 它是不可变的。 用于在多个分片之间分发新文档的路由算法依赖于主分片的总数。 这就是为什么减少现有索引的主分片数量有点困难的原因。

你基本上需要创建一个新索引并将所有数据复制过来。 你可以使用 2 个 API:Shrink API 和 Reindex API。 当然,每个 API 都有自己的优点和缺点,但根据你的设置和要求,通常会有一个更理想。 Shrink API 更快,但它只能用于只读索引(不更新或插入任何文档的索引)。 Reindex API 可用于活动(active)索引。

使用 Shrink API 减少分片数量

你可以根据索引的大小将过度分片的索引缩小到 1 个或更多分片。 对于可以将索引缩小到的分片数量有非常严格的要求。 请阅读文档 “Elasticsearch:如何部署 Elasticsearch 来满足自己的要求” 以确保此选项适合您。

请记住,收缩索引时预计会有一些维护时间。 首先,一个索引的所有主分片需要分配到同一个节点。 请确保该节点上有足够的存储空间(如果没有,你可以考虑使用 Reindex API,如下所示)。 然后,需要将索引标记为只读。

此请求会将所有以 “log” 开头的索引名称的索引设置为只读,并将所有分片移动到同一节点。

PUT log*/_settings
{
  "settings": {
	"index.blocks.write": true,
	"index.routing.allocation.require._name": "shrink_node_name"                               	 
  }
}

你将需要使用此命令一个一个地缩小索引。 分片的分配将恢复为默认值,索引将再次可写。

POST log-1/_shrink/log-shrink-1
{
  "settings": {
	"index.routing.allocation.require._name": null,
	"index.blocks.write": null
  }
}

确切的语法可能因你使用的 Elasticsearch 版本而异。 请检查文档。

使用 Reindex API 减少分片数量

如果你尝试收缩的索引仍在积极写入,你可以改用 Reindex API。

Reindex API 可用于将文档从一个索引批量复制到另一个索引。 在这种情况下,所有需要在索引时间执行的工作都需要重复。 这使得使用 Reindex API 比复制整个分片要慢,但它仍然是一个相当快的过程。

Reindex API 创建索引当前状态的快照,然后复制所有这些文档。 在重建索引过程中新创建的文档将被忽略。 为了将这些新创建的文档复制到新索引,你需要使用一些确保你只创建新文档的设置来重复重建索引过程。

如果您的索引正在被积极写入并且您不能允许新索引中丢失任何文档,建议同时写入两个索引一段时间以确保没有增量。

此请求会将所有文档从名为 “log-1” 的索引复制到名为 “log-shrink-1” 的新索引。

确保应用第一部分中的索引模板。

POST _reindex
{
  "source": {
	"index": "log-1"
  },
  "dest": {
	"index": "log-shrink-1",
	"op_type" : "index"
  }
}

第二次迭代仅添加在重建索引操作期间创建的文档:

POST _reindex
{
  "source": {
	"index": "log-1"
  },
  "dest": {
	"index": "log-shrink-1",
	"op_type" : "create"
  }
}

减少基于时间的索引的分片数量

如果你使用基于时间的索引名称,例如用于日志记录的每日索引,并且你没有足够的数据,减少分片数量的一个好方法是切换到每周或每月模式。

你还可以按月、季度或年对旧的只读索引进行分组。 最简单的方法是使用 Reindex API。

减少多租户索引的分片数量

当你有一个多租户用例,每个客户都有一个索引时,减少分片似乎要困难得多。

在多租户情况下,你可能有几个大客户,每个索引有一个或多个分片,而且大小似乎合适。 同时,你还会有许多指数较小的客户。

如果你需要在此类设置中减少分片,同时仍需要为每个客户创建一个索引,则可以使用 Filtered Aliases。

使用 Filtered Aliases 减少分片数量

Filtered Aliases 不像普通索引别名那样广为人知,但它们允许你为一个索引创建多个视图。

你不是为每个租户或客户创建一个索引,而是为所有规模太小以至于不值得拥有自己的索引的较小租户创建一个索引。 然后添加关键字或数字字段来区分这些租户(客户名称或客户 ID)。

创建索引后,你现在可以简单地在该索引上存储过滤器并提供租户名称作为索引名称。

应用程序不会注意到你正在后台使用过滤器。 他们可以简单地使用索引名称。 但是你可以在一个索引中存储许多不同的租户并避免过度分片。

这一切都假设你正在为所有客户使用兼容的数据模型。

如何在索引上创建 Filtered Alias:

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "small-customers",
        "alias": "customer-1",
        "filter": {
          "term": {
            "customer-id": "1"
          }
        }
      }
    }
  ]
}

为了减少多租户环境中的分片数量,你可以为所有小租户创建一个新索引,并使用 Reindex API 简单地复制数据。 如果你需要添加一个新字段来区分租户,例如“customer-id”,你可以使用 ingest pipeline 来添加一个新字段,比如:

POST _reindex
{
  "source": {
    "index": "source"
  },
  "dest": {
    "index": "dest",
    "pipeline": "some_ingest_pipeline"
  }
}

我们可以使用 set processor 来添加一个新的字段。

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

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

相关文章

Prometheus系列之Grafana 版本9.0.0 设置Email邮件报警实战

目录1. 配置文件conf/defaults.ini修改2. Grafana Web页面配置报警邮箱接收者3. 创建Dashboard4. 创建Alert的文件夹5. 设置Notification policies6. 添加Alert7. Alert Rule测试1. 配置文件conf/defaults.ini修改 将conf/defaults.ini的如下内容 ##########################…

变量提升,函数提升,暂时性死区,详细解析

变量的提升 JavaScript 在执行之前 会进行预解析 函数声明 函数体会被提升到当前作用域顶部 var的声明会提升 并赋值undefined 因为var会有一个变量提升,他的声明初始化会被提升,但是值不会被提升,所以控制台返回undefined 函数提升 这是…

CSS -- CSS3基础动画讲解

文章目录CSS 3动画1 动画的基本使用2 动画序列3 动画常用属性4 动画简写属性5 速度曲线细节CSS 3动画 动画(animation) 是CSS3中具有颠覆性的特征之一,可通过设置多个节点来精确控制一个或一组动画常用来实现复杂的动画效果。 相比较过渡,动画可以实现…

白银票据的原理和使用

白银票据的原理和使用白银票据(Silver Ticket)原理白银票据的使用服务账号是计算机名字$用来管理服务的账号 白银票据(Silver Ticket)原理 白银票据是伪造本该由TGS返回的ST(服务票据),从而访问对应的服务 有server用户的hash就可以伪造出ST,且不经过K…

自重启伪遗传改良算法解决TSP问题(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题&…

Spark 3.0 - 14.ML 高斯混合聚类理论与实战

目录 一.引言 二.高斯混合模型理论 1.高斯模型 GM 2.高斯混合模型 GMM 三.高斯混合模型实践 1.数据准备 2.模型训练 3.获取多个 GM 四.总结 一.引言 前面提到的 K-means 是发现数据对应簇的硬聚类方法,即分配一个点其固定分配到某个簇,而高斯混…

三方系统集成SF(SuccessFactors),实现单点登录要点

在笔者先前的文章——《基于saml2.0的平台(适用多种平台)单点登录配置,以okta为例》中,详细介绍了如何把一个自开发的三方系统,集成到okta或者IAS平台。 经过笔者的实际工作经验,发现SF自己本身其实也可以…

MCU-51:初识单片机,从点亮一个灯开始

题目一、什么是单片机二、点亮一个LED灯2.1 LED原理和知识2.2 方法一2.3 方法二一、什么是单片机 单片机又称单片微控制器,把一整个计算机系统集成到一个芯片上,当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。一块芯…

文字语义纠错技术探索与实践-张健

背景 文本语义纠错的使用场景非常广泛,基本上只要涉及到写作就有文本纠错的需求。书籍面市前就有独立的校对的环节来保障出版之后不出现明显的问题。在新闻中我们也时不时看到因为文字审核没到位造成大乌龙的情况,包括上市公司在公开文书上把“临时…

并行计算(MPI + OpenMP)

文章目录并行计算MPI(进程级并行)基本结构数据类型点对点通信阻塞非阻塞非连续数据打包聚合通信Communicator & Cartisen GridOpenMP(线程级并行)简介基本制导语句worksharing constructSectionsSingleFor临界区 & 原子操…

React 学习笔记总结(三)

文章目录1. React( v16.8 版本) 生命周期2. React( v16.8 版本) 生命周期 更新流程2.1 三个更新流程2.2 setState()的生命周期流程(对应上图2号线)2.3 forceUpdate()的生命周期流程(对应上图3号线)2.4 父组件render()渲染的生命周期流程(对应上图1号线)2.5 React( v16.8 版本)生…

“学了一个我不感兴趣的专业,要不要转行IT?”

“这个专业太无聊了,我想转行……” “你想转去干什么?” “我对金融感兴趣,听说金融很赚钱,我想学金融……” “你感兴趣为什么课后不去钻研,而要选择打游戏?” “以后再慢慢来嘛……” “可是你已经…

报表工具-FineReport JS实现参数面板显示对应数据

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 预期效果 1.3 实现思路 对照填报界面的章节,在参数界面也用 SQL 语句实现对应数据的展示 ,当第一次打开模板时,标签不显示可以通过JS 控制实现。 2. 示例 2.1 新建模板 新建普通…

设计模式-牛刀小试01

前言 本文为datawhale2022年12月组队学习《大话设计模式》task4打卡学习,本次完成homework1。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern 一、任务描述 1.1 背景 小李已经是一个工作一年的初级工程师了,他所在的公司是…

靶机练习——vulnstack1

下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 注意事项 密码一定要设置为不同的 部署环境 根据红日安全出具的wp,我们只需要设置两个C段即可,分别是外网的72和内网的52,这里直接添加新的网络以及子网地址即可&…

十三、DockerFile构建增强版本centos7

1、概述 在Docker 常用命令篇中,我们已经知道了2中构建镜像的方式 export\import 和 commit方式。这两种方式都需要先运行并创建容器,然后在容器中安装vim、ifconfig等命令,然后再重新构建加强版的镜像,比较麻烦。Dockerfile通过…

2022CTF培训(九)MIPS PWN环境搭建MIPS PWN入门

附件下载链接 环境搭建 在 ARM PWN 环境搭建 的基础上,首先安装具备MIPS交叉编译gcc与MIPS程序动态链接库: sudo apt-get install gcc-mips-linux-gnu sudo apt-get install gcc-mipsel-linux-gnu sudo apt-get install gcc-mips64-linux-gnuabi64 su…

【CANN训练营第三季】Ascend平台体验Pytorch笔记

模型迁移 手册地址:https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/600alpha002/ptmoddevg/ptmigr/ptmigr_000009.html 主要修改: 导入相关库 import torch import torch_npu #1.8.1及以上需要指定NPU设备 通过device()指定 …

JDBC编程步骤、JDBC API详解和数据库连接池

前言: JDBC 就是使用Java语言操作关系型数据库的一套API ,全称:( Java DataBase Connectivity ) Java 数据库连接。官方(sun公司)定义的一套操作所有关系型数据库的规则,即 接口各个数据库厂商去实现这套…

工具及方法 - Process Explorer以及类似工具,用来获取系统运行的进程信息

下载Process explorer: Process Explorer - Sysinternals | Microsoft Learn Process explorer简介 有没有想过哪个程序打开了一个特定的文件或目录?现在你可以找到了。Process Explorer向你显示关于进程打开或加载的句柄和DLL的信息。 Process Explore…