业务日志服务架构简介

背景介绍

随着业务服务(Server App)逐渐增加,使得问题排查非常困难,很多时候需要关联查询多个服务的日志,而且统计分析十分不便。因此,急需设计一个集中式海量日志实时处理系统。需要满足功能需求(实时看日志、统计历史日志、实时行为分析、用户轨迹跟踪等)、性能需求(具有高吞吐能力、高扩展性、高容错性)等。

组件介绍

Kafka 是一种高吞吐量的分布式发布订阅消息系统,它适合处理海量日志发布订阅,提供消息磁盘持久化、支持物理分片存储、多组消费等特性。

Elasticsearch 是一个开源实时分布式搜索引擎,具备如下特征:零配置,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Flume 是Apache基金会的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,它支持在日志系统中定制各类数据发送方,用于收集数据;同时提供对数据进行简单处理,并写到各种数据接受方(可定制)。


实现思路
  1. 开发业务日志SDK(下文为描述方便,称之为 BizLogSDK),嵌于各业务App;
  2. 从业务服务端收集日志并集中输出到Kafka;
  3. 根据不同需求(查询、统计),由Flume对数据预处理并分发;
  4. Flume 的下游组件对日志内容进行消费;
架构设计
业务日志服务架构.png

目前日志消费方式有两种:

  • Elasticsearch 做索引,用于查询、统计;
  • 基于Storm流式计算实现(待完成)。

引入Kafka的目的:

  • 线上业务集群规模较大,日志产生量巨大,如果直接同步日志对下游服务负荷较重,容易因为故障导致日志阻塞延迟和丢失,所以引入了kafka ;
  • 消息可以持久化,并且可以进行日志回溯。有了消息队列,上游服务和下游服务完全解藕,网络传输会更稳定、更高效、更均衡,避免级联效应。
架构说明
  1. 由于业务日志量极大,为减轻业务服务的压力,故将业务日志首先输出到 Kafka 集群;
  2. Flume 做分发和预处理。从Kafka中拉取待处理的业务日志,先在本地保留一份,然后做预处理和分发;
  3. Elasticsearch 做日志索引。对业务日志按 Prefix-bizType-YYYY.MM.dd 的格式创建索引;
  4. Kibana 做查询界面与简单的统计报表。供开发、运维、运营人员使用;
  5. Zookeeper 用于维护Kafka集群配置。Flume作为Kafka的消费者,需要配置Zookeeper的相关信息;
  6. Kibana 的报表展示能力有限,可以在Elasticsearch 下游对接 Grafana或其他工具(架构图中未做描述),实现更炫酷的报表;
  7. 可以根据业务扩展需求,增加对应的 Flume 及处理服务,以实现业务横向扩展;
  8. 目前还没有对业务日志做大数据分析,因此架构中只做了节点描述。
技术方案
  1. Flume 1.6增加了 KafkaSource,之前版本需要自己实现(自定义 Source 实现示例);
  2. Flume 做预处理和分发,需要自定义Sink(自定义Sink实现示例);
  3. BizLogSDK 的配置中可以添加对Kafka Producer 的配置(Producer Configs),以优化性能;
  4. Elasticsearch 官网的 Java Client 比较重,连接数太多,建议按照Elasticsearch Reference 自己开发一个基于HTTP 协议 的 Client(实现CRUD),方便业务日志按照 biztype-date 格式进行索引。注意:HTTP 连接应该复用,(可以采用HttpClient 的连接池管理方式),避免连接数过多;
  5. Flume Sink 中拿到业务日志后,应该放到线程池里处理,避免 Flume卡死;
  6. Elasticsearch 默认会将 string 类型字段设为 _ analyzed _,会造成CPU过高。可以通过 Elasticsearch 提供的 Index Templates 方式,在index 创建后,应用 template 到匹配的index,将相关 _ string _ 型字段设为 _ not_analyzed _。
BizLogSDK :

业务App通过调用 BizLogSDK,将业务日志输出到Kafka集群。BizLogSDK 需要实现设置公用属性、扩展属性,日志发送等功能。可参考 Log4j 的源码来实现。

  1. 业务日志公用属性:
  • _ bizType _ :业务类型
  • _ bizAction _:业务操作
  • _ serverIp _ :服务器IP
  • _ requestTime _ :请求时间
  1. 基本配置:
# 队列名称
topicName = bizlog-server
# 是否同步发送消息(异步速度更快)
send.sync = false
# kafka 消息队列服务器
bootstrap.servers = 127.0.0.1:9091
实时查询
查询界面
实时统计
统计界面 1
统计界面 2
相关监控
  • KafkaOffsetMonitor
Kafka队列监控
  • Elasticsearch Monitor


    Elasticsearch 监控
后续改进
  • BizLogSDK 中需要加入 Log Level;
  • 业务日志需要一个统一的界面来管理(设置level、关闭、删除、定期清理等);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,401评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,011评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,263评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,543评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,323评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,874评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,968评论 3 439
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,095评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,605评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,551评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,720评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,242评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,961评论 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,358评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,612评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,330评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,690评论 2 370

推荐阅读更多精彩内容