背景

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

稿定科技使用 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. 用ElasticSearch存储日志

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

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

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

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

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

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

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

  6. Elasticsearch 存储模型

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

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

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

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

  9. 批量将网页转换成图片或PDF文档技巧分享

    工作中我们有时要将一些批量的网页转换成图片或者PDF文档格式,尽管多数浏览器具有滚动截屏或者打印输出PDF文档功能.可是假设有几十上百张网页须要处理,那也是要人命的.所以我一直想找一款可以批量处理该工 ...

  10. 干货分享:如何搞定Essay Paragraph部分?

    想要写出一篇高质量的留学生作业,首先要从写好段落(paragraph)开始.那么今天就随小编一起来看看,如何写好Paragraph部分? 段落:在英文中我们俗称为paragraph,而一篇英文文章通常 ...

随机推荐

  1. 关于SQLSERVER2012版本远程登录问题

    最近公司新配置了一台服务器,安装的数据库版本为sqlserver2012企业版本,一切安装正常,本地登录也正常 需要远程客户端登录,防火墙也开放的端口,路由器也做了端口映射,因为我们有两台服务器,14 ...

  2. Java EE 学习总结

    1.Java EE WEB 工程项目文件结构 组成:静态HTML页.Servlet.JSP和其他相关的class: 每个组件在WEB应用中都有固定的存放目录. WEB应用的配置信息存放在web.xml ...

  3. JSP页面编码问题

    <%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding ...

  4. VBS练习题

    练习题: 1.输入3个数,输出其中最大的那个值. Option Explicit Dim intA,intB,intC intA=CInt(InputBox("请输入a:")) i ...

  5. php curl多线程抓取网页

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...

  6. mockjax MOCK.js的拦截ajax请求

    今天看了下 mock.js的拦截请求 .https://github.com/nuysoft/Mock/blob/master/src/mockjax.js //覆盖(拦截) Ajax 请求,目前内置 ...

  7. jqm的多列布局demo,html5的多列布局demo,多列布局的具体解说,html5开发实例具体解释

    因为移动设备屏幕宽度较小,所以一般不建议使用多列布局.但有时你可能须要并排放置一些元素(如button之类的). jQuery Mobile通过约定的类名ui-grid来提供了一种基于css的多列布局 ...

  8. nginx+gunicorn项目部署

    1.1安装虚拟环境 创建文件夹 mkdir data 目录文件夹 cd data 进入data文件夹 mkdir nginx 创建安装nginx的文件夹 mkdir server 存放代码的文件夹 m ...

  9. Code forces363D Renting Bikes

    Renting Bikes Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Subm ...

  10. Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

    转载自:http://www.open-open.com/lib/view/open1436360508098.html