背景

稿定科技旗下稿定设计产品是一个聚焦商业设计的多场景在线设计平台,打破了软硬件间的技术限制,汇集创意内容与设计工具于一体,为不同场景下的设计需求提供优质的解决方案,满足图片、视频等全类型媒介的设计需求,让设计更简单。

稿定科技使用 Elasticsearch(下文中简称为 ES) 作为日志检索组件,随着业务量的增长,每天有 2T 左右的新增数据,需要保存 15~30 天,给磁盘和系统带来了不小的压力。在 ES 中为了保证日志的写入和查询的性能,大多使用单位存储成本更高的高性能云盘。但是,在实际的业务场景中,超过 7 天的数据仅作低频使用,全部存储在高性能云盘必然会导致过高的成本和空间的浪费。

方案

Elasticsearch 7.10 版本推出了索引生命周期概念,开始支持数据分层存储,可以指定不同节点使用不同的磁盘介质来区分冷热数据,比如使用 HDD 磁盘来存储温冷数据,能获得更大的使用空间和更低的成本。这个特性非常适合日志索引场景。

在温冷数据的存储介质上,使用 JuiceFS 替代 HDD 磁盘,相当于获得了无限容量的存储空间。通过 ES 的索引生命周期管理,可以自动完成索引的创建 - 迁移 - 销毁整个生命周期管理,无需手工干预

在我们的实践中,首先将 ES 集群升级到目前最新的 7.13 版本。然后拆分冷热节点,热节点优先考虑性能,冷节点优先考虑存储的容量和成本。同时,调整索引和模板方式,配置数据生命周期、索引模板和数据流,完成索引数据写入。

调整后整个索引的流转如下图所示:

在索引创建时,配置 index.routing.allocation.require.box_type:hot 进行节点筛选;

等待索引进入 warm 周期时,调整 index.routing.allocation.require.box_type:warm,并迁移到 warm 节点后,数据进入冷节点存储,实际存储于 JuiceFS 中;

等待索引进入 delete 周期时,ES 会自动把索引数据删除。

客户收益

方案中使用的 JuiceFS 是什么呢?

JuiceFS 是一款面向云环境设计的企业级分布式文件系统。提供完备的 POSIX 兼容性,为应用提供一个低成本、空间无限的共享文件系统。使用 JuiceFS 存储数据,数据本身会被持久化在对象存储(例如,Amazon S3、阿里云 OSS 等),结合 JuiceFS 的元数据服务来提供高性能文件存储。JuiceFS 在全球公有云服务中都提供有全托管服务,只需点点鼠标,十分钟配置好。同时 JuiceFS 在 2021年初在 GitHub 开源,受到全球开发者的关注和参与,目前已经获得 3700+ stars。

在本方案中 ES 集群 warm 节点使用 JuiceFS 做存储之后,我们不用再对这些节点做容量规划和扩容工作,也省去了节点故障时的数据迁移,降成本的同时还为运维带来很大的便利。

JuiceFS 的持久层使用对象存储,弹性计费,TCO 比使用普通云盘还要低。在本方案的 ES 集群中,Hot 节点使用的云盘价格为 1000元/TB/月,使用全托管的 JuiceFS 服务加上对象存储的开销,价格约为 250元/TB/月。ES 集群总容量 60TB+,通过冷热分层处理,75% 的数据存在 JuiceFS 中,仅存储成本已经节省近 60%。如果再加上运维团队节省的时间精力,这个方案为客户的数据存储带来的 TCO 下降至少有 70%

实践

集群配置

集群共 9 个节点,⼀个独⽴的 master 节点(elastic_001),另外 8 个数据节点,其中有 5 个热数据节点(elastic_002 ~ elastic_006),3 个冷数据节点(elastic_007 ~ elastic_009)。

目录挂载与配置

JuiceFS 挂载在 ES 冷数据节点,提供 ES 的数据⽬录。

节点配置有⼀块 2T 的数据盘,挂载在 /data ⽬录,ES 进程以容器的⽅式启动,数据盘挂载的是系统的 /data/elastic ⽬录,由于使⽤的容器挂载系统⽬录的⽅式,不能通过 软链 的⽅式将 ES 数据⽬录 ( /data/elastic ) 指向 JuiceFS 挂载的某个⼦⽬录,使⽤了 Linux 系统的 bind mount 将 JuiceFS 的⼦⽬录挂载到 /data/elastic 这个路径上。⽐如在 007 节点上:

# ./juicefs mount gd-elasticsearch-jfs  \
--cache-dir=/data/jfsCache --cache-size=307200 \
--upload-limit=800 /jfs
# mount -o bind /jfs/data-elastic-pro-007 /data/elastic

这样在 /data/elastic ⽬录看到 /jfs/data-elastic-pro-007 的内容。

在 008 和 009 节点上也做类似挂载操作。

如果您还不熟悉 JuiceFS 的初始化、挂载等基本操作,请参考 JuiceFS 官方文档。

ES 索引 Rollover 时有很多随机写操作,为了保证写的性能,挂载 JuiceFS 时加上了 writeback 参数,这样会数据先写本地磁盘,后台异步将数据上传到对象存储。本地磁盘⽬录使⽤的是 /data/jfsCache/gd-elasticsearch-jfs/rawstaging/ ,请注意不要删除这个⽬录中的任何⽂件,否则可能出现数据丢失。

cache-sizeupload-limit 分别⽤来限制本地的读缓存使⽤空间为 300GiB,写对象存储的带宽不超过 800Mbps。attrcachetoentrycacheto 分别表示内核的 attr cache 和 entry cache 的缓存超时时间,单位是秒。

性能优化

降低节点负载

在采用 JuiceFS 之前,ES 集群生命周期中配置了 Force Merge,具体配置项为 warm.actions.forcemerge.max_num_segments: 1,它会导致数据在 Rollover 时重新 Merge,给 CPU 带来极大的压力。而这步动作是完全没必要的,关闭 Force Merge 配置即可避免不必要的性能开销,降低节点负载。

Rollover 参数配置优化

由于 warm 阶段数据写入 JuiceFS,最终会持久化到对象存储上,应用层不用再存储多副本,可以在索引 Rollover 过程中,设置 replicas 为 0,即 warm.actions.number_of_replicas: 0

另外,考虑当索引数据迁移到 warm 阶段后,数据并不再写入,可以设置 warm 阶段索引只读,即 warm.actions.readonly: {},关闭索引的数据写入可以减少内存占用量。

总结

随着时间的推移和业务量的增长,企业势必面临更大规模的数据存储和管理上的双重挑战。在本案中,稿定科技充分发挥 Elasticsearch 的生命周期管理能力,根据业务需要将日志数据进行分层存储。将需要频繁使用的热数据保存在 SSD,而超过 7 天的低频使用数据则存储在性价比更高的 JuiceFS,为客户节省存储成本 60%。同时,JuiceFS 还为应用提供近乎无限的弹性空间,省去了容量规划、扩容、数据迁移等一系列的运维工作,提升了企业 IT 架构的效率。

推荐阅读

Shopee x JuiceFS:ClickHouse 冷热数据分离存储架构与实践

JuiceFS v0.17 发布,通过 1270 项 LTP 测试!

Elasticsearch 存储成本省 60%,稿定科技干货分享的更多相关文章

  1. 将PCM格式存储成WAV格式文件

    将PCM格式存储成WAV格式文件 WAV比PCM多44个字节(在文件头位置多) 摘自:https://blog.csdn.net/u012173922/article/details/78849076 ...

  2. .Net Api 之如何使用Elasticsearch存储文档

    .Net Api 之如何使用Elasticsearch存储文档 什么是Elasticsearch? Elasticsearch 是一个分布式.高扩展.高实时的搜索与数据分析引擎.它能很方便的使大量数据 ...

  3. 用ElasticSearch存储日志

    介绍 如果你使用elasticsearch来存储你的日志,本文给你提供一些做法和建议. 如果你想从多台主机向elasticsearch汇集日志,你有以下多种选择: Graylog2 安装在一台中心机上 ...

  4. 使用ffmpeg获取视频流后如何封装存储成mp4文件

    int main(int argc,char *argv[]) 02 { 03  AVFormatContext *pFormatCtx; 04  int i,videoStream; 05  AVC ...

  5. jmeter使用问题——将接口返回变量存储成csv文件

    在使用jmeter做接口测试时,一整个jmx测试计划中,存在多个线程,多个接口的测试 但是接口可以分类,比如业务接口.查询接口.更新接口等 考虑自动化接口测试一般都是一次性的,有完整的闭环链路,一般步 ...

  6. 用云存储和CDN轻松搞定网站图片

    http://www.kuqin.com/web/20120207/317912.html

  7. Elasticsearch 存储模型

  8. 【腾讯Bugly干货分享】舞动的表情包——浅析GIF格式图片的存储和压缩

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/v0pffOhjFWnVbU2lXjuEmw 导语 G ...

  9. 互动科技 快乐分享 X/Open DTP——分布式事务模型

    这一几天一直在回顾事务相关的知识,也准备把以前了解皮毛的知识进行一些深入总结,虽然这一些知识并没有用到,但是了解其实现原理还是很有必要的,因为知道了原理,你也能把它实现出来. 在上一节事务的编程模型里 ...

随机推荐

  1. ES6扩展——函数扩展之默认参数

    1.函数的默认参数 //函数的默认参数 function add(a, b = 999){ console.log(a,b); //1 999 } add(1); 2. 函数的形参可以设置默认值,默认 ...

  2. Elasticsearch集群搭建教程及生产环境配置

    Elasticsearch 是一个极其强大的搜索和分析引擎,其强大的部分在于能够对其进行扩展以获得更好的性能和稳定性. 本教程将提供有关如何设置 Elasticsearch 集群的一些信息,并将添加一 ...

  3. 移动端 uni-app 滑动事件 精确判断手指滑动方向

    移动端根据手指滑动操作判断滑动方向 设计思路: 1.根据移动端touchstart和touchend方法获取手指触摸屏幕的开始坐标和结束坐标 2.根据两个坐标计算与水平方向的夹角 3.根据夹角判断当前 ...

  4. Jetpack Compose学习(3)——图标(Icon) 按钮(Button) 输入框(TextField) 的使用

    原文地址: Jetpack Compose学习(3)--图标(Icon) 按钮(Button) 输入框(TextField) 的使用 | Stars-One的杂货小窝 本篇分别对常用的组件:图标(Ic ...

  5. 未能找到源类型“DbSet<T>”的查询模式的实现。未找到“Select”

    使用EF6.0的模型优先模式进行开发,遇到了报错,如下图 后来发现是没引用using System.Linq; 引用后就不报错了

  6. Node.js躬行记(9)——微前端实践

    后台管理系统使用的是umi框架,随着公司业务的发展,目前已经变成了一个巨石应用,越来越难维护,有必要对其进行拆分了. 计划是从市面上挑选一个成熟的微前端框架,首先选择的是 icestark,虽然文档中 ...

  7. JS013. 重写toFixed( )方法,toFixed()原理 - 四舍五入?银行家舍入法?No!六舍七允许四舍五入√!

    以下为场景实测与原理分析,需要重写函数请直接滚动至页尾!!! 语法 - Number.prototype.toFixed( ) // toFixed()方法 使用定点表示法来格式化一个数值. numO ...

  8. HTTP快速入门

    一.tomcat端口号设置为80,访问时候可以不加:http协议1.1版本可以复用连接,请求结束后会稍微等会: 二. 表单,get方式提交: 三.user-agent告诉服务器是哪个浏览器,代码中解决 ...

  9. Servlet3.0注解配置访问路径和urlParttern配置

    一.Servlet用注解配置访问路径 二.IDEA的tomcat相关配置 其中,第一点的配置文件,直接在IDEA的可视化操作界面修改就可以改掉配置文件中内容: 三.urlParttern配置 其中,* ...

  10. Jetpack Compose学习(4)——Image(图片)使用及Coil图片异步加载库使用

    原文地址 Jetpack Compose学习(4)--Image(图片)使用及Coil图片异步加载库使用 | Stars-One的杂货小窝 本篇讲解下关于Image的使用及使用Coil开源库异步加载网 ...