一个百亿级日志系统是怎么设计出来的?
ccwgpt 2024-10-01 08:17 26 浏览 0 评论
日志是记录系统中各种问题信息的关键,也是一种常见的海量数据。
日志平台为集团所有业务系统提供日志采集、消费、分析、存储、索引和查询的一站式日志服务。
主要为了解决日志分散不方便查看、日志搜索操作复杂且效率低、业务异常无法及时发现等等问题。
随着有赞业务的发展与增长,每天都会产生百亿级别的日志量(据统计,平均每秒产生 50 万条日志,峰值每秒可达 80 万条)。日志平台也随着业务的不断发展经历了多次改变和升级。
本文跟大家分享有赞在当前日志系统的建设、演进以及优化的经历,这里先抛砖引玉,欢迎大家一起交流讨论。
原有日志系统
有赞从 2016 年就开始构建适用于业务系统的统一日志平台,负责收集所有系统日志和业务日志,转化为流式数据。
通过 Flume 或者 Logstash 上传到日志中心(Kafka 集群),然后供 Track、Storm、Spark 及其他系统实时分析处理日志。
并将日志持久化存储到 HDFS 供离线数据分析处理,或写入 ElasticSearch 提供数据查询。
整体架构如图 2-1 所示:
图 2-1:原有日志系统架构
随着接入的应用越来越多,接入的日志量越来越大,逐渐出现一些问题和新的需求,主要在以下几个方面:
- 业务日志没有统一的规范,业务日志格式各式各样,新应用接入无疑大大的增加了日志的分析、检索成本。
- 多种数据日志数据采集方式,运维成本较高。
- 日志平台收集了大量用户日志信息,当时无法直接的看到某个时间段,哪些错误信息较多,增加定位问题的难度。
- 存储方面。
关于存储方面:
- 采用了 ES 默认的管理策略,所有的 Index 对应 3*2 Shard(3 个 Primary,3 个 Replica)。
有部分 Index 数量较大,对应单个 Shard 对应的数据量就会很大,导致有 Hot Node,出现很多 bulk request rejected,同时磁盘 IO 集中在少数机器上。
- 对于 bulk request rejected 的日志没有处理,导致业务日志丢失。
- 日志默认保留 7 天,对于 SSD 作为存储介质,随着业务增长,存储成本过于高昂。
- 另外 Elasticsearch 集群也没有做物理隔离,ES 集群 OOM 的情况下,使得集群内全部索引都无法正常工作,不能为核心业务运行保驾护航。
现有系统演进
日志从产生到检索,主要经历以下几个阶段:
- 采集
- 传输
- 缓冲
- 处理
- 存储
- 检索
详细架构如图 3-1 所示:
图 3-1:现有系统架构
日志接入
日志接入目前分为两种方式:
- SDK 接入:日志系统提供了不同语言的 SDK,SDK 会自动将日志的内容按照统一的协议格式封装成最终的消息体,并最后最终通过 TCP 的方式发送到日志转发层(Rsyslog-Hub)。
- HTTP Web 服务接入:有些无法使用 SDK 接入日志的业务,可以通过 HTTP 请求直接发送到日志系统部署的 Web 服务,统一由 Web Protal 转发到日志缓冲层的 Kafka 集群。
日志采集
现在有 Rsyslog-Hub 和 Web Portal 做为日志传输系统,Rsyslog 是一个快速处理收集系统日志的程序,提供了高性能、安全功能和模块化设计。
之前系统演进过程中使用过直接在宿主机上部署 Flume 的方式,由于 Flume 本身是 Java 开发的,会比较占用机器资源而统一升级为使用 Rsyslog 服务。
为了防止本地部署与 Kafka 客户端连接数过多,本机上的 Rsyslog 接收到数据后,不做过多的处理就直接将数据转发到 Rsyslog-Hub 集群。
通过 LVS 做负载均衡,后端的 Rsyslog-Hub 会通过解析日志的内容,提取出需要发往后端的 Kafka Topic。
日志缓冲
Kafka 是一个高性能、高可用、易扩展的分布式日志系统,可以将整个数据处理流程解耦。
将 Kafka 集群作为日志平台的缓冲层,可以为后面的分布式日志消费服务提供异步解耦、削峰填谷的能力,也同时具备了海量数据堆积、高吞吐读写的特性。
日志切分
日志分析是重中之重,为了能够更加快速、简单、精确地处理数据。日志平台使用 Spark Streaming 流计算框架消费写入 Kafka 的业务日志。
Yarn 作为计算资源分配管理的容器,会跟不同业务的日志量级,分配不同的资源处理不同日志模型。
整个 Spark 任务正式运行起来后,单个批次的任务会将拉取到的所有的日志分别异步的写入到 ES 集群。
业务接入之前可以在管理台对不同的日志模型设置任意的过滤匹配的告警规则,Spark 任务每个 Excutor 会在本地内存里保存一份这样的规则。
在规则设定的时间内,计数达到告警规则所配置的阈值后,通过指定的渠道给指定用户发送告警,以便及时发现问题。
当流量突然增加,ES 会有 bulk request rejected 的日志重新写入 Kakfa,等待补偿。
日志存储
原先所有的日志都会写到 SSD 盘的 ES 集群,LogIndex 直接对应 ES 里面的索引结构。
随着业务增长,为了解决 ES 磁盘使用率单机最高达到 70%~80% 的问题,现有系统采用 Hbase 存储原始日志数据和 ElasticSearch 索引内容相结合的方式,完成存储和索引。
Index 按天的维度创建,提前创建 Index 会根据历史数据量,决定创建明日 Index 对应的 Shard 数量,也防止集中创建导致数据无法写入。
现在日志系统只存近 7 天的业务日志,如果配置更久的保存时间的,会存到归档日志中。
对于存储来说,Hbase、ES 都是分布式系统,可以做到线性扩展。
多租户
随着日志系统不断发展,全网日志的 QPS 越来越大,并且部分用户对日志的实时性、准确性、分词、查询等需求越来越多样。
为了满足这部分用户的需求,日志系统支持多租户的的功能,根据用户的需求,分配到不同的租户中,以避免相互影响。
针对单个租户的架构如下:
- SDK:可以根据需求定制,或者采用天网的 TrackAppender 或 SkynetClient。
- Kafka 集群:可以共用,也可以使用指定 Kafka 集群。
- Spark 集群:目前的 Spark 集群是在 Yarn 集群上,资源是隔离的,一般情况下不需要特地做隔离。
- 存储:包含 ES 和 Hbase,可以根据需要共用或单独部署 ES 和 Hbase。
现有问题和未来规划
目前,有赞日志系统作为集成在天网里的功能模块,提供简单易用的搜索方式,包括时间范围查询、字段过滤、NOT/AND/OR、模糊匹配等方式。
并能对查询字段高亮显示,定位日志上下文,基本能满足大部分现有日志检索的场景。
但是日志系统还存在很多不足的地方,主要有:
- 缺乏部分链路监控:日志从产生到可以检索,经过多级模块,现在采集,日志缓冲层还未串联,无法对丢失情况进行精准监控,并及时推送告警。
- 现在一个日志模型对应一个 Kafka Topic,Topic 默认分配三个 Partition。
由于日志模型写入日志量上存在差异,导致有的 Topic 负载很高,有的 Topic 造成一定的资源浪费,且不便于资源动态伸缩。
Topic 数量过多,导致 Partition 数量过多,对 Kafka 也造成了一定资源浪费,也会增加延迟和 Broker 宕机恢复时间。
- 目前 Elasticsearch 中文分词我们采用 ikmaxword,分词目标是中文,会将文本做最细粒度的拆分,但是日志大部分都是英文,分词效果并不是很好。
上述的不足之处也是我们以后努力改进的地方,除此之外,对于日志更深层次的价值挖掘也是我们探索的方向,从而为业务的正常运行保驾护航。
相关推荐
- 如何为Hadoop选择最佳弹性MapReduce框架
-
ZDNet至顶网服务器频道07月22日新闻消息:亚马逊Web服务的弹性MapReduce是一项基于Hadoop的实施,它可允许你运行大型的预处理工作,如格式转换和数据聚合等。虽然我们可以选择很多的...
- 《平安小猪》:J.K.罗琳用“魔法”放大的真实
-
对很多孩子来说,某些玩具是抚慰心灵的“忠实伙伴”,几乎无可替代。J.K.罗琳在看到儿子大卫对玩偶小猪的依恋后创作了“平安小猪”的故事,这也是她自《哈利·波特》之后创作的首部儿童长篇小说。男孩杰克在平安...
- 一页纸精华 | HDFS
-
要入门大数据,最好的办法就是理清hadoop的生态系统。本期为你介绍分布式文件系统HDFS。ApacheHadoop2.0生态系统如下图所示:Hadoop2.0生态系统图Hadoop核心项目包括:H...
- 谷歌搁置与法国出版商的协议,将等候反垄断裁定
-
据路透社6月29日消息,两位知情消息人士称,谷歌搁置了与一些法国出版商达成的为新闻内容付费的初步协议,将等待反垄断审议结果。该决定可能为欧洲在线新闻的版权谈判定下基调。文件显示,按照谷歌与法国新闻总联...
- Java 微服务从源码实战开始 | Gitee 项目推荐
-
在软件开发的不同时期、阶段,对技术架构的理解、选择和应用都有着不一样的诉求。微服务架构是当前互联网业界的一个技术热点,它的思想也更符合我们的目标:根据业务模块划分服务种类。每个服务可以独立部署并且互相...
- 快讯|谷歌搁置向法国出版商付费协议:等待反垄断决定
-
财经网科技6月30日讯,据新浪科技消息,两位知情人士透露,谷歌已经搁置此前与一些法国出版商达成的为新闻内容付费的初步协议。因为谷歌正在等待一项反垄断决定,这项决定可能会为该公司的欧洲在线新闻版权谈判定...
- 外媒:谷歌搁置与法国出版商的协议 等候反垄断决定
-
路透中文网30日报道,据两位知情消息人士透露,谷歌GOOGL.O搁置了与一些法国出版商达成的为新闻内容付费的初步协议,等待一项反垄断决定。该决定可能为欧洲在线新闻的版权谈判定下基调。报道显示,根据路透...
- 大数据任务调度框架Oozie
-
Oozie(驯象人)是一个基于工作流引擎的开源框架,由Cloudera公司贡献给Apache,提供对HadoopMapReduce、PigJobs的任务调度与协调。Oozie需要部署到JavaS...
- 惊了!SpringBoot 3.4 触雷,升级后参数绑定竟悄悄破坏你的代码?
-
背景在微服务架构中,我们经常利用HTTP请求头来控制系统行为,比如实现灰度发布和流量控制。在PIG微服务框架中,我们通过重写SpringCloudLoadBalancer,根据请求he...
- 《终结者》:科幻电影巅峰的里程碑
-
在阅读此文之前,麻烦您点击一下“关注”,既方便您进行讨论和分享,又能给您带来不一样的参与感,感谢您的支持。文|庭芥摘要:本文以一位影评家的视角赏析詹姆斯·卡梅隆执导的经典科幻电影《终结者》。通过对该...
- AI已经越过红线?复旦大学:在知道自己将被关闭后,AI复制了自己
-
2024年12月9日,复旦大学的一项研究引发了全球科技界的强烈关注。研究团队对Meta与阿里巴巴旗下的两个大型AI系统展开测试,结果发现,在知晓自身可能被关闭的情况下,它们居然选择自我复制。这不是普通...
- 重磅开源!LocalAI让你在个人电脑上运行AI大模型,无需显卡,已获28K Star!
-
随着AI技术的快速发展,如何在本地设备上高效运行AI模型成为了开发者关注的焦点。LocalAI开源项目提供了一个革命性的解决方案-它让用户能够在个人电脑上轻松部署和运行各种AI模型,并且完全兼容...
- 了解《终结者》的恐怖末日世界观,能让你看懂《终结者6》
-
相信很多人的科幻动作启蒙片,应该就是《终结者》系列,起码对于我来说,童年的暑假里,不止一次反复看着《终结者2》的电影,深深被影片中施瓦辛格的硬核铁汉形象吸引,也为片中的液态机器人着迷。《终结者》系列成...
- Golang底层是用什么语言编写的?
-
Go底层语言Go语言在1.5版本之前主要由汇编和C语言写的,C语言占比85%以上,另外有少量的周边模块如文档等,带了些htmlshellperl代码,可以忽略不计。1.5版本及之后...
- skynet服务的缺陷 lua死循环
-
服务端高级架构—云风的skynet这边有一个关于云风skynet的视频推荐给大家观看点击就可以观看了!skynet是一套多人在线游戏的轻量级服务端框架,使用C+Lua开发。skynet的显著优点是,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)