你可能还想看
1. 阿里10年技术人:Leader的7种思考方式
2. SLS 智能告警平台最新技术总结
3. 6年团队Leader: 程序员的8种软技能
4. 代码覆盖率在性能优化上的一种可行应用
5. 阿里10年技术人:实战中的架构设计方法
关注我们欢迎关注加星标✨ 每日推送不错过
凌云时刻
一方面 ,SLS 本身是一个开放的日志数据平台。用户可以通过开放 API,把其存储在 SLS 的数据与已有的大数据平台连接起来,这一点与阿里云上很多大数据产品也有紧密合作。今年 iLogtail 开源(GitHub库)、阿里云 Terrform 集成、阿里云统一 CLI 等等都在推动 SLS 越来越开放化。
另一方面, SLS 为客户提供一站式数据处理链路服务,支持客户快速完成非结构化数据实时加工处理。如上图所示,整个数据处理链路包含四个功能点:
数据导入:打通阿里云上客户自建服务、外部开放服务与 SLS 的无缝对接
数据加工:对数据进行实时行处理以及链路编排
Scheduled SQL:对数据进行定时分析、聚合加工
数据导出:围绕“数据入湖”等场景给出相应的技术实现与解决方案
本文重点将放在数据加工上。
规整:这是使用频率最高的场景,比如从文本日志数据中提取出关键信息,将其转为规范化的数据
富化:比如用户的点击数据中只包含商品 ID,分析时需要从数据库关联详细信息
脱敏:随着我国信息安全相关法律的完善,对于敏感数据(比如个人信息)的处理要求越来越高
分裂:在数据写出时,出于性能、便捷性考虑会将多条数据合并输出,在分析前则需要拆分出独立数据条目
分发:将不同类型的数据分别写到不同的特定目标中,以供下游定制化使用
SLS 数据加工语法 DSL (Domain Specific Language)是一个基于 Python 语法的子集,提供了完善的内置函数,详情请参考(附1)。
SLS 数据加工正在逐步进行架构升级,发挥 SLS 一站式数据平台的优势,数据加工功能从同地域内 Logstore 读取及写入数据将不再需要在不同服务模块间数据流转。
本次架构升级正在内测中,即将发布。发布完成后,SLS 团队将通过官网等渠道向用户公告。
随着客户日趋增长的数据量、复杂多变的数据加工计算,数据加工服务引擎在一些场景下需要更加灵活和弹性,例如:
复杂的需求场景导致计算复杂度不可控,要求更强的单点计算能力
原始数据流的模式不可预知,要求作业的算力伸缩过程极其灵敏
SLS 数据加工作业执行性能依赖多方面因素,详情请参考 SLS 数据加工性能指南。例如在游戏业务场景中,面对开新服活动时的流量高峰,数据加工作业运行需要更高敏感度的自动弹性扩容,保持高效实时性的处理高峰流量的游戏日志。
以下总结过去一年对数据加工性能相关的几个核心迭代。
数据协议层的优化分为两个部分:
序列化、反序列化算法实现优化
数据协议层,也就是从 SLS 消费的原始数据是 Protobuf 协议的 LogGroup,需要反序列化为单条原始事件;加工后的数据需要根据 Protobuf 协议进行序列化才能写入 SLS。数据协议层作为基础公共代码模块,对所有作业的执行效率有关键作用。通过对一些核心模块用 C++重写,在特定场景下性能提升了 5 倍。
新增小包合并发送协议
在数据发送阶段,序列化操作是基于数据的元信息(比如 time、source、topic、tags)组装数据包独立发送,当遇到原始数据的元信息无规则的场景时(比如 WebTracking 采集数据),就会出现大量小包发送数据,导致网络传输效率不足。数据加工合并处理因元信息不同而无法合并的大量小数据包,这种场景下单次上传提升网络传输效率 10+倍。
DSL 执行层是数据加工作业运行的计算核心,过去一年我们通过多个方面对 DSL 执行层进行了优化,以下列出一些重点的优化项:
DSL 解析器,”预编译”加工脚本
编译优化
逻辑短路
数据模式 Lazy-Parse
多级缓存
公共子表达式提取等
针对客户场景中高频使用的内置函数进行深入优化,这里不做赘述,部分优化请参考技术博文(附2、附3)。
SLS 数据加工是构建在阿里云容器服务 ACK 之上,得益于其部署简单高效、安全可靠的优势,数据加工的技术架构非常直接。由于集群中运行大量线上作业,集群升级过程对于作业有潜在影响,所以集群升级需要一个确保线上作业稳定性的方案。这一点也导致了集群的升级无法频繁操作。
为了能够应用到集群最新版本的新功能,集群的升级就势在必行。集群升级有以下两个方案。
一个方案是使用 ACK 的集群热升级功能,提供升级、暂停、取消等能力。不过对于数据加工的业务场景,此方案存在几个缺点:
升级时集群中所有作业都可能受到影响,所以总体来说达不到“可灰度”的稳定性要求;
升级过程中一旦出现问题就需要回滚,作业在整个回滚过程中可能都无法正常运行,客户的数据链路将会被阻塞;
每次升级只能升级到相邻版本,所以需要多次升级操作,这不仅增加了工作量,而且几何级地提高了升级风险。
另一个方案是在调度层实现多集群负载均衡的能力,需要升级集群时,将新建作业创建至新集群,逐步将旧版本集群汰换掉。此方案规避了集群热升级潜在的风险,但是新旧版本集群会同时存在很长一段时间,使得运维工作也不小,这也驱动我们进一步完善运维自动化。综前所述,最终选择的是此方案进行升级。
2、近百个集群统一化监控运维、告警
3、自定义伸缩计算指标,满足不同场景的计算需求
原生的 K8S HPA 内置支持 CPU 和内存两个指标,这对于绝大多数数据密集型作业来说已经足够了。但是在数据加工中,某些客户会对数据编排,进行跨地域数据流转,面对这类网络/IO 敏感场景,内置的 HPA 指标就无法满足。所以我们需要引入更全面的 HPA 指标,以支撑多种多样业务场景下的作业需求。
除此之外,我们还将使用智能算法对 HPA 指标进行续升级优化, 比如基于作业的历史运行特性,提前做资源分配,更进一步提升作业运行的稳定性。
4、内置告警规则,客户一键开启作业监控
数据加工与 SLS 监控告警能力整合,用户可一键开启加工作业异常告警,接收到告警后可通过手册排错处理。具体使用请参考(附4)。
在控制台上配置加工作业后,默认引导用户开启告警通知,模板化、一键开启
支持加工流量同环比、错误日志信息、数据处理延迟等多个维度通知,覆盖全部异常场景
1、DSL 语法简化,开放 Python 字典、列表和元组常量
SLS 数据加工在保证安全性的同时,也在持续增强 DSL 的语法能力,使其更加 Pythonic、更加简洁易用。最新的语法可参考(附5),以下就以 Python 字典常量使用作为例子。
模拟 HTTP 访问日志:
method: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
我们需要 HTTP 状态码的具体描述信息,详情如下:
method: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
http_description: OK
可以直接在代码中嵌入完整的 HTTP 状态码表,用于字段映射:
e_dict_map(
{
"100": "Continue",
"200": "OK",
"300": "Multiple Choices",
"400": "Bad Request",
"500": "Internal Server Error",
},
"http_status",
"http_description",
)
2、IP 地理解析库精准度进一步提升,更大程度挖掘数据价值
IP 是日志数据中重要的信息,比如访问客户端的 IP 就可以用于完成用户画像的分析。SLS 数据加工支持开放式的对 IP 地址数据的地理位置(GeoIP)进行解析,并内置了 GeoIP 库方便客户使用。通过调用数据加工预定义函数 geo_parse 即可实现,参考以下例子——某系统的模拟访问日志样例:
client_ip: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
通过以下数据加工代码获取 client_ip 字段的 IP 地理位置信息:
e_set("_geo_", geo_parse(v("client_ip")))
加工后的结果:
client_ip: 101.37.0.0
request: GET /product/8396812?from=source-2 HTTP/1.1
http_status: 200
_geo_: {
"country_en": "CN",
"province_en": "330000",
"city_en": "330100",
"country": "中国",
"province": "浙江省",
"city": "杭州市",
"isp": "阿里云",
"lat": 30.294,
"lon": 120.162
}
客户通过 geo_parse 函数也可以使用自定义的 GeoIP 库,参考文档(附6)。
3、Terraform集成,作业编排自动化
使用 Terraform 可以对云上资源进行编码,利用代码来进行增删查改。阿里云已经集成 Terraform,便于客户安全高效地预览、配置和管理云基础架构和资源。通过 Terraform,客户可以方便地管理 SLS 数据加工任务配置。详情请参考(附7、附8)。
应用场景 | 实践总结 | 简要说明 |
信息脱敏 | 使用 SLS 数据加工进行敏感信息处理 | 随着数字化的推进,个人敏感信息保护显得越来越重要,通过数据加工可实现敏感信息的脱敏处理 |
数据流编排 | 游戏场景全球日志规划 多模式日志数据流的实时加工与集散 | 数据加工支持跨区域数据复制,客户可选择通过公网传输,也可以针对 SLS Project开启全球加速服务,确保更稳定的传输效率 |
数据编码、解码 | SLS 数据加工“数据编码、解码”实践 阿里云 SLS 数据加工中使用 Python 数据编码 | 数据加工提供完善的内置函数,支持各类数据转化场景:编码与解码、压缩与解压缩、加密与解密、哈希摘要 |
阿里云威胁情报服务集成 | 【新发布】SLS 数据加工增值内容服务 使用 SLS 一键分析 VPC 流日志 | 数据加工提供内置函数扫描数据内容是否存在威胁情报,比如检查访问 IP 是否存在攻击行为 |
Log 转 Metric | 使用数据加工将 Log 转成 Metric | 某种程度上来说,Metric 是一种特殊的 Log,数据加工提供内置函数将 Log 中的指标信息转化为 Metric |
过去一年里,SLS 也多次参与开放社区、大会的专题分享,阐述 SLS 加工服务的技术原理与实践。以下是最近几次与数据加工相关的专题分享。
2021 QCon(北京站)
阿里云数据加工设计及实践(附9)
2021 K+峰会(上海站)
PB级日志数据实时加工原理与实践(附10)
K8S下海量数据治理的任务调度框设计及与实现:K+分享(附11)
2021 Python Meetup(杭州站)
Pythonic语法的PB级数据实时加工服务原理与实践(附12)
附1:SLS 数据加工语法简介
https://help.aliyun.com/document_detail/125430.html
附2:数据加工 DSL 编译优化:搜索算子语义等价转换
https://developer.aliyun.com/article/792165
附3:数据加工 DSL 编译优化:公共子表达式删除
https://developer.aliyun.com/article/790914
附4:为数据加工任务开启监控告警
https://help.aliyun.com/document_detail/135602.html
附5:SLS 数据加工语法简介
https://help.aliyun.com/document_detail/125430.html
附6:IP 解析函数
https://help.aliyun.com/document_detail/354825.html
附7:阿里云 Provider 官方文档 - SLS 数据加工
https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/log_etl
https://developer.aliyun.com/article/894761
附9:阿里云实时数据加工服务的设计及实践
https://blog.csdn.net/bjchenxu/article/details/118383957
附10:PB 级日志数据实时加工原理与实践
https://developer.aliyun.com/article/814237
附11:K8S 下海量数据治理的大规模任务调度框架设计与实践
http://www.keylinkcon.com/h-col-171.html
附12:Pythonic 语法的 PB 级数据实时加工服务原理与实践
https://www.huodongxing.com/event/9638891718600
欢迎关注加星标✨ 每日推送不错过