jlog/README.md
2024-02-04 15:34:58 +08:00

83 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 简介
该项目架构设计文章https://my.oschina.net/1Gk2fdm43/blog/5312538
该项目主要为海量日志秒级GB级的搜集、传输、存储而设计的全套方案。区别于传统的如ELK系列套件该项目主要是为了解决超大量级的日志出入参、链路跟踪日志从搜集到最后检索查询的中途产生的高昂硬件成本、性能低下等问题。
核心点在于 **性能、成本**
主要应用方向为: **用户跟踪** ,即根据特定条件,查询用户请求出入参、中途打印的所有日志,即这个链路的日志。
较ELK系列方案filebeat、mq传输、es存储等常见方案该框架拥有10倍以上的性能提升和70%以上的磁盘节省。这意味着在日志这个功能块上使用相同的硬件配置原本只能传输、存储一秒100M的日志采用该方案一秒可以处理1GB的日志且将全链路因日志占用的磁盘空间下降70%。
由于该方案着重于极致的吞吐性能和极低的磁盘占用而对数据全程进行了压缩。故并不适合于需要es关键字模糊查询的场景使用而仅支持提前设定好的索引字段查询。数据库使用的是clickhouse集群配置中心采用的etcd如果之前没有相关经验的还涉及了新技术的学习成本以及需要对部分源码进行改造故未必适合大部分项目使用。建议关注实现方案和处理超大量级的数据、缓冲、入库等代码逻辑即可整套思路可适用于多种场景。
该项目适用于日志量极大且用于节省中转环节如使用kafka等mq进行日志中转的场景。在京东、方舟健客等公司线上使用由于各公司日志查询时索引字段不同固必然有一定的开发工作需要注意。这不是一个开箱即用的项目。
关于性能及机器配置简述目前线上的worker配置主要为8核32g的docker32g内存是专门定制的参数因为worker需要靠纯内存来承接和缓冲大量接收的日志这样的单机每秒可以承接的日志量为160M-200M因为是压缩后的对应原始日志约1个G约1千万行。
clickhouse机器配置为16核64G内存单机每秒可以稳定写入180M再高会丢可用率。对应原始日志约1个G。
查询界面由于目前前端做的不太好,大概放个图大家了解意思就行,就是查用户跟踪的。
可以查询出入参,及请求整个链路的日志情况。
![输入图片说明](images/tracer.png)
![输入图片说明](images/image12.png)
![输入图片说明](images/image4.png)
# 使用说明
[使用说明](https://gitee.com/jd-platform-opensource/jlog/blob/master/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
群已满200人可加我微信备注JLog邀请入群
![输入图片说明](images/imagewechat.png)
# 背景
京东App作为一个巨大量级的请求入口涉及了诸多系统为了保证系统的健壮性、和请求溯源以及出现问题后的问题排查通常我们保存了用户请求从出入参、系统中途关键节点日志info、error、链路日志等并且会将日志保存一段时间。
日志系统基本划分为几个模块收集filebeat、logstash等传输kafka、tcp直传等存储esmysql、hive等查询kibana、自建
以传统日志解决方案为例当有一个G的日志产生后日志写本地磁盘占用磁盘1G读取后写入mqmq占用2G单备份消费mq写入eses占用1G共需占用磁盘4GB附带着网络带宽占用和同体量的服务器资源占用单服务器秒级处理100M
则以京东App的体量当秒级百G日志产生时所耗费的硬件资源相当庞大成本已到了难以承受的地步。
该日志框架即为在有所取舍的情况下支撑海量日志的场景所研发如前文所讲该方案在同等硬件配置下较filebeat+mq+es的模式秒级 **日志吞吐量提升10倍且全链路磁盘占用下降了70%以上**
# 方案简介
详细的可以看开头那篇文章。
这里只放两张图基本能说明原理。
![输入图片说明](images/image1.png)
![输入图片说明](images/image65.png)
![输入图片说明](images/image2.png)
基本流程为通过filter获取web请求出入参、自定义log4j、logback的appender搜集中途打印的日志通过请求入口时生成的tracerId进行关联写入本地内存取代写磁盘进行压缩字符串空间占用减少80%以上通过Udp发往worker端取代mqworker接收数据抽取索引字段并入库clickhouse除未来查询要用的索引字段外其他内容全程压缩直至入库。
### 答疑
一 为什么是UDP而不是TCP
主要区别udp是知道对方的ip和端口把消息发出去后直接清空本地缓存。而tcp是发出去后等待对方回复确认收到信息后才会删除这条消息的缓存。一旦接收端卡顿则客户端可能堆外内存溢出。并且通信时间翻倍吞吐量下降。
二 UDP丢消息怎么办
1 网络拥堵交换机被打满。则无论udp tcp都发不出去了
2 重启机器在空档期udp发出去的不会重发
3 worker消费入库不及主动抛弃
总结:日志允许以上情况下的丢失,无需保证强可靠性
三 1台clickhouse极限一秒写入180M对应用户QPS约1万。
那么30台服务器如何支撑大促60万QPS或更高
前提clickhouse性能是明确的譬如一秒最多写1万用户QPS则30台最高写30万。那么60万QPS时
我们只能用别的地方去缓冲。
方案: 定制8核32G机器单机开一个10万的队列存放用户请求数据。批量入库靠内存来吃下
大促陡增的几秒流量。则50台worker机器即可拥有500万的内存队列即便高峰是80万、100万随后
逐步下降至30万、20万并维持。则一个能吃下30万的clickhouse集群足以支撑。
且worker机器可以随时扩容平时4台支撑日常的1-5万的QPS大促当天扩容即可成本极低。