ElasticSearch降本增效常见的方法 | 京东云技术团队

Elasticsearch在db_ranking 的排名不断上升,其在存储领域已经蔚然成风且占有非常重要的地位。

随着Elasticsearch越来越受欢迎,企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢?今天我们就特地来聊聊ES降本增效的常见方法:

  • 弹性伸缩

  • 分级存储

  • 其他:(1)数据压缩(2)off heap

1 弹性伸缩

所谓弹性伸缩翻译成大白话就是随时快速瘦身与增肥,并且是头痛医头,按需动态调整资源。当计算能力不足的时候我们可以快速扩充出计算资源;当存储资源不足时,能够快速扩容磁盘,。

1-1 计算存储分离

ES使用计算存储分离架构之后,解决了资源预留而造成资源浪费的问题。在早期大家认为的计算存储分离的实现方式为:使用云盘代替本地盘,这种实现方式可以提高数据的可靠性、可以快速弹扩磁盘资源和计算资源,但是es自身弹性需求是无法解决,即秒级shard搬迁和replica扩容

那么如何解决es自身的弹性呢?本文该部分将给出答案。

共享存储版ES

本文该部分将介绍我们京东云-中间件搜索团队,研发的共享存储版本ES;计算存储分离架构如图1-2所示

图 1-2 计算存储分离架构(共享)

如图1-2所示,我们只存储一份数据,primary shard负责读写,replica只负责读;当我们需要扩容replica的时候无需进行数据搬迁,直接跳过原生es的peer recover两阶段,秒级完成replica的弹扩

当主分片发生relocating时,可以直接跳过原生es的peer recover第一阶段(该阶段最为耗时),同时也不需要原生es的第二阶段发送translog。

共享版本的计算存储分离ES,相对于原生的ES和普通版本的计算存储分离,具有如下突出的优势

  • 数据只保存一份,存储成本倍数级降低

  • 存储容量按需自动拓展,几乎无空间浪费

  • 按实际用量计费,无需容量规划

性能测试

  • 数据集为esrally提供的http_logs

  • 共享版ES7.10.2: 3个data节点(16C64GB)

  • 原生ES7.10.2: 3个data节点(16C64GB)

表 1-1 副本性能测试对比

我们的初步性能测试结果如表1-1所示;副本数越多,共享版本的es越具有优势;

从表1-1所示我们可以看出性能似乎提升的不是特别理想,目前我们正从两个方面进行优化提升:

  • 底层依赖的云海存储,目前正在有计划地进行着性能提升

  • 源码侧,我们也在正在优化ing

在研发es计算存储分离的过程中,我们攻克了很多的问题,后续将输出更加详细的文章进行介绍,比如:主写副只读的具体实现replica的访问近实时问题ES的主分片切换脏写问题等等。

1-2 外部构建Segment

对于有大量写入的场景,通常不会持续的高流量写入,而只有1-2个小时写入流量洪峰;在写入过程中最耗费时间的过程并不是写磁盘而是构建segment,既然构建segment如此耗时,那么我们是否可以将该部分功能单独出来,形成一个可快速扩展的资源(避免去直接改动es源码而引入其他问题)。

目前业界已经有比较好的案例外部构建Segment,相对于共享存储版的es实现起来更简单;它的核心解决方案使用了spark或者map reduce这种批处理引擎进行批量计算处理,然后将构建好的segment搬运到对应的索引shard即可。

外部构建segment的功能也在我们的规划中。

2 分级存储

ES实现降本增效的另外一个方向:分级存储,该解决方案主要是针对数据量大查询少且对查询耗时不太敏感的业务。分级存储,比较成熟的解决方案有es冷热架构和可搜索快照。

2-1 冷热架构

冷热架构适用场景:时序型数据或者同一集群中同时存在这两个索引(一个热数据,另外一个冷数据)

es冷热架构架构,该功能已经在京东云上线有一段时间了,欢迎大家根据自己的业务形态进行试用,冷数据节点开启如图2-1所示

图 2-1 冷数据节点开启

建议如果索引表是按天/小时,这种周期存储的数据,且数据查询具有冷热性,建议开启冷节点;开启冷节点后你可能会获得如下的收益:

  • 开启冷节点后可以降低你的存储成本,因为存放冷节点的索引我们可以选择减少副本数、冷节点的存储介质更便宜

  • 集群可以存放更多的数据

  • 冷数据forcemerge,提升冷数据的查询性能

  • 冷数据从热节点迁移走之后,减少热节点的资源占用,从而使热查询更快

冷热架构的核心技术为
shard-allocation-filtering;

冷热架构实现原理:

es的hot节点增加如下配置

node.attr.box_type: hot

es的warm节点增加如下配置

node.attr.box_type: warm

热数据索引setting增加如下配置,即可限制shard分配在hot节点

“index.routing.allocation.require.box_type”: “hot”

当数据查询减弱,我们通过如下配置,即可使数据由hot节点迁移到warm节点

“index.routing.allocation.require.box_type”: “warm”

2-2 可搜索快照

可搜索快照是在冷热架构的基础上更进一步的分级存储,在之前我们将数据快照之后是无法对快照的数据进行搜索,如果要对快照的数据进行搜索,则需将快照数据先restore(restore的过程可能会比较长)之后才能被搜索。

在引入可搜索快照之后,我们可以直接搜索快照中的数据,大大降低了没必要的资源使用.

3 其他

3-1 数据压缩

除了从资源的角度进行降低存储成本之外,基于数据自身的特性,使用优秀的压缩算法也是一种必不可少的搜索;针对时序数据facebook开源了一个非常优秀的压缩算法zstd,目前已经在业界被大量使用。

表 3-1 三种压缩算法的对比测试结果

目前在lucene的代码库中也有开源爱好者提交了custom codec providing Zstandard compression/decompression (zstd pr)

3-2 off heap

es单个节点存储数据量受到jvm堆内存的限制,为了使单个节点能够存储更多的数据,因此我们需要减少堆内存中的数据。

ES 堆中常驻内存中占据比重最大是 FST,即 tip(terms index) 文件占据的空间,1TB 索引大约占用2GB 或者更多的内存,因此为了节点稳定运行,业界通常认为一个节点 open 的索引不超过5TB。现在,从 ES 7.3版本开始,将 tip 文件修改为通过mmap的方式加载,这使 FST占据的内存从堆内转移到了堆外(即off Heap技术 )由操作系统的 pagecache 管理[6]。

使用esrally官方数据集geonames写入索引1TB,使用 _cat/segments API 查看 segments.memory内存占用量,对比 offheap 后的内存占用效果,如表3-2所示;JVM 内存占用量降低了78%左右

表 3-2 segments.memory内存占用量

4 参考

[1] Indexing Service
[2] ES-Fastloader
[3] 大规模测试新的 Elasticsearch 冷层可搜索快照
[4] Introducing Elasticsearch searchable snapshots
[5] 7.7 版本中的新改进:显著降低 Elasticsearch 堆内存使用量
[6] Elasticsearch 7.3 的 offheap 原理

作者:京东科技 杨松柏

来源:京东云开发者社区 转载请注明来源

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 仿快手视频列表,RecyclerView与Banner联动效果

这是看到群里讨论过快手APP的一个观看他人视频列表的一个联动效果,但是并不是完全按照这个软件的效果来做的,只是参考,并不是完全仿照这个软件来做的,没时间去优化排版问题了,请见谅,如图: 实现…

ADA-YOLO:YOLOv8+注意力+Adaptive Head,mAP提升3%

生物医学图像分析中的目标检测和定位至关重要,尤其是在血液学领域,检测和识别血细胞对于诊断和治疗决策至关重要。虽然基于注意力的方法在各个领域中目标检测方面取得了显著的进展,但由于医学影像数据集的独特挑战,其在医学目标检…

cad的模型怎么打散导入3d---模大狮模型网

将CAD中的模型打散并导入3D建模软件,需要以下步骤: 将CAD中的模型进行分组或分层:在CAD中,将模型按照不同的组或层进行分组或分层。这样可以方便地控制每个部分的显示和隐藏,在导入3D建模软件后,也可以更方…

(超详细)2-YOLOV5改进-添加SimAM注意力机制

1、在yolov5/models下面新建一个SimAM.py文件,在里面放入下面的代码 代码如下: import torch import torch.nn as nnclass SimAM(torch.nn.Module):def __init__(self, e_lambda1e-4):super(SimAM, self).__init__()self.activaton nn.Sigmoid()self…

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量(单例中会使用)3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

使用@Slf4j后引入log,idea标红

引入Slf4j注解 idea标红Cannot resolve symbol ‘log’ 引入Lombok插件 如果在Marketplace查不到时,不妨关闭菜单再打开试下

概率论与数理统计————古典概型、几何概型和条件概率

一、古典概型 特点 (1)有限性:试验S的样本空间的有限集合 (2) 等可能性:每个样本点发生的概率是相等的 公式:P(A) A为随机事件的样本点数;S是样本…

5.3 Verilog 带参数例化

5.3 Verilog 带参数例化 分类 Verilog 教程 关键词: defparam,参数,例化,ram 当一个模块被另一个模块引用例化时,高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块…

STC8H8K蓝牙智能巡线小车——1. 环境搭建(基于RTX51操作系统)

1. 基本介绍 开发环境准备:Keil uVision5 烧录软件:STC-ISP(V6.92A) 芯片: STC8H8K64U-45I-LQFP64 芯片引脚: 2.创建项目 打开Keil,点击【Project】,选择【new uVersion proje…

网页设计(八)HTML5基础与CSS3应用

一、当当网企业用户注册页面设计 当当网企业用户注册页面 改版后当当网企业用户注册页面 <!-- prj_8_1.html --> <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>当当网企业用户注册页面设计</title><s…

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序

一、Chainlit介绍 Chainlit是一个开源Python包&#xff0c;旨在彻底改变构建和共享语言模型&#xff08;LM&#xff09;应用程序的方式。Chainlit可以创建用户界面&#xff08;UI&#xff09;&#xff0c;类似于由OpenAI开发的ChatGPT用户界面&#xff0c;Chainlit可以开发类似…

Kafka消费流程

Kafka消费流程 消息是如何被消费者消费掉的。其中最核心的有以下内容。 1、多线程安全问题 2、群组协调 3、分区再均衡 1.多线程安全问题 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的。 对于线程安全&…

CSS3渐变属性详解

渐变属性 线性渐变 概念&#xff1a;线性渐变&#xff0c;指的是在一条直线上进行的渐变。在线性渐变过程中&#xff0c;起始颜色会沿着一条直线按顺序过渡到结束颜色 语法&#xff1a; background:linear-gradient(渐变角度&#xff0c;开始颜色&#xff0c;结束颜色);渐变…

Vue 如何把computed里的逻辑提取出来

借用一下百度的ai 项目使用&#xff1a; vue 文件引入 <sidebar-itemv-for"route in routes":key"route.menuCode":item"route":base-path"route.path"click"onColor"/>import { handleroutes } from "./handle…

三种引入CSS的方式

文章目录 CSS基础知识概述CSS的注释CSS的格式 三种引入CSS的方式内嵌式外链式行内式优先级 CSS基础知识 概述 Cascading Style Sheet 层叠样式表 前端三大基础之一(Html结构 CSS样式 JS动作) 最早由网景公司&#xff08;Netscape&#xff09;提出&#xff0c;在1996年受到w…

k8s的配置资源管理

1、configmap*&#xff1a;1.2加入新的特征&#xff08;重点&#xff09; 2、secret&#xff1a;保存密码&#xff0c;token&#xff0c;保存敏感的k8s资源&#xff08;保存加密的信息&#xff09; &#xff08;1&#xff09;敏感的k8s资源&#xff0c;这类数据可以直接存放在…

计算机毕业设计 基于Java的手机销售网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)

1.简介 按宏哥计划&#xff0c;本文继续介绍WebDriver关于元素定位大法&#xff0c;这篇介绍By ClassName。看到ID&#xff0c;NAME这些方法的讲解&#xff0c;小伙伴们和童鞋们应该知道&#xff0c;要做好Web自动化测试&#xff0c;最好是需要了解一些前端的基本知识。有了前端…

Android Studio 如何设置中文

Android Studio 是一个为 Adndroid 平台开发程序的集成开发环境&#xff08;IDE&#xff09;。 如何安装中文插件 在 Jetbrains 家族的插件市场上&#xff0c;是能够搜到语言包插件的&#xff0c;正常情况下安装之后只需要重启即可享受中文界面&#xff0c;可AndroidStudio 中…

React Store及store持久化的使用

1.安装 npm insatll react-redux npm install reduxjs/toolkit npm install redux-persist2. 使用React Toolkit创建counterStore并配置持久化 store/modules/counterStore.ts&#xff1a; import { createSlice } from reduxjs/toolkit// 定义状态类型 interface Action {…