日志服务新功能发布(1)--支持保序写入和消费

日志服务在上周新上线的版本,支持数据的保序写入和消费,shard的split和merge, server端consumer group的原生支持(除去对mysql的依赖),数据自动同步至oss等一些列新功能。本文主要介绍数据的保序写入和消费的功能。

LogStore & Shard 关系

  1. 每个LogStore对应一类日志,对于同一个LogStore下的数据,所有处理逻辑相同(索引方式、导入odps、oss等配置)
  2. 每个LogStore由一个或多个shard组成,用于支持数据写入水平扩展
  3. 每个shard提供 5MB/sec的写入和10MB/sec的读取吞吐
  4. 每个Shard的属性:唯一的shard id,当前状态(只读、读写),以及一个左闭右开的区间(取值范围00000000000000000000000000000000~ffffffffffffffffffffffffffffffff,可由md5计算获得)

LogStore数据写入模式

现在日志服务对于每个Logstore,提供两种写入模式:

1. 负载均衡模式 (默认模式)

在这种模式下,数据写入Logstore,由服务后端随机选择一个当前可用的shard写入数据。在这种模式下,数据写入有非常高的可靠性,任意的进程crash,机器宕机,只要还有一个shard正常运行,就不影响数据的写入。

2. 指定HashKey模式(保序特性)

写入的时候,根据需要将部分数据写入同一个shard以实现数据的保序,例如,同一个机器上的日志,写入同一个shard。

        // 以机器的IP的md5值作为hash key
    String  hash_key =  getMd5Value(machine_ip);
        // sever端根据hash key所在的range找到对应的shard
    Logclient.PutLogs(project, logStore, topic, logItems, source,  hash_key);    

在这种模式下,通过传入的hash_key, server端会找到range包含这个key的shard,并将数据写入该shard,数据按照shard接收顺序依次写入,这样,同一个shard内的数据是有序的。使用hashkey的模式,有以下注意事项:

  • 对于hash key的选择尽量做到均衡,避免某个shard写入数据量过大
  • 不可以使用时间(如精确到小时)作为hash_key的计算,以防止任意时刻,只有一个shard提供服务
  • hash_key模式下,系统可用性没有负载均衡模式高,当出现宕机等情况,shard可能会出现短暂不可用的情况,需要在写入端进行重试等处理

数据消费

使用日志服务的批量消费接口,从指定shard中批量拉取数据,数据以FIFO的模式顺序读取,可以保证同一个shard内,日志数据的消费顺序和日志产生顺序相同。

场景实战

单机日志保序消费。一个java应用部署在多个机器上处理用户请求,根据用户ID的不同,每个用户的请求会落到特定的机器上进行处理,而对于用户的每个请求,都有如下记录:

  • 用户ID
  • 操作类型
  • 时间
  • 详细信息

为了安全审计、监控等需求,需要将所有用户的操作日志保存下来,进行实时分析。同时要求分析用户操作行为是安格按照用户操作顺序进行的,即对于每个用户ID产生的日志,读取顺序和日志产生顺序相同,不能发生错乱。 如某个用户依次进行了如下三个操作:

  1. 创建一个资源文件
  2. 更新该资源文件
  3. 删除资源文件

每个操作分别产生了一条日志,为了保障分析程序的正确运行,也必须依次读取创建、更新、删除操作产生的日志。

为了达到这个目的,java应用在产生日志的时候,可以将同一个机器上的日志写入到同一个shard中,这样分析从每个shard中读取的各个用户的操作日志必定和用户操作顺序完全相同。

整个Java App程序日志如理逻辑设计如下:

Java App内主要操作如下:

  1. 每个用户的请求,产生一条操作日志,追加到内存中的"操作日志队列"
  2. Java App后台存在一个日志发送线程,调用日志服务SDK的PutLogs接口,负责将日志批量发送至日志服务,并将Md5(machine_ip)作为 hash_key,确保同一个机器的日志发送至相同的shard
  3. 后台线程处于无限循环状态,空闲的时候,处于sleep状态,只要“操作日志队列" 中日志超过100条,或者已经sleep了1秒,该线程就会被唤醒,检查是否需要将队列中缓存的日志发送出去

适用场景

使用保序的特性主要适用于对日志产生的先后顺序有严格依赖的场景:

  • 用户操作行为记录日志
  • 数据库执行query日志
  • 单机程序打印日志

以上介绍了日志服务提供的shard保序写入和消费的特性,当单个shard写入数据超过其处理能力之后,可以通过shard的split操作来增加shard,关于shard split/merge以及其他新功能介绍,我们后续会更新至论坛。

时间: 2024-08-02 14:26:07

日志服务新功能发布(1)--支持保序写入和消费的相关文章

日志服务新功能发布(2)--弹性伸缩(Merge/Split)

在之前的文章<日志服务(原SLS)新功能发布(1)--支持保序写入和消费>中,我们提到了Shard支持Key映射的特性,通过这个特性能够支持对序有需求的应用场景.今天我们给大家介绍一个在削峰填谷或流量突增情况下的功能:弹性伸缩.在生产中我们往往会面临峰值和低值的情况,也会遇到因业务层映射不均衡,导致某一个分区(shard)有非常大流量的场景,弹性伸缩(Merge/Split)就是为此设计的利器. 使用弹性伸缩的应用场景 场景1(视频类):根据峰值.底值弹性扩容,控制成本 用户A是一个视频类网站

日志服务(原SLS)新功能发布(14)--支持仅对指定键进行索引

背景 日志服务于6月底开始商业化收费(收费细则),如何更加经济使用日志服务请参考文档,其中LogSearch(索引功能)按照需要索引的日志数据量进行收费,并且只支持默认开启全文索引,指定键查询则需要设置键值索引属性(索引功能使用说明),对于某些用户明确只需要指定某个Key进行查询,全文索引属性无法发挥作用,目前关闭全文索引功能已经上线,支持用户仅设置指定Key进行索引查询. 使用说明 设置方法 日志服务控制台点击已有Project进入"LogStore列表"页面,在"日志消费

日志服务(原SLS)新功能发布(13)--Logtail支持自定义标识自动扩容机器组

背景 日志服务提供多种途径帮助用户方便快速写入日志数据到指定日志库,具体包含Logtail客户端.各种语言SDK.TrackingPixel以及REST API等方式,详细描述请参考文档"如何写入日志". 其中Logtail客户端支持快速接入单行.JSON.分隔符等多种日志文件格式以及syslog协议(常见日志收集配置),并且提供80MB/s的大吞吐量,同时性能相比同类工具有10倍提升仅消耗15%的资源(评测文档). Logtail客户端使用的一般流程包括三个步骤:创建机器组管理日志数

简单日志服务SLS产品发布公告

尊敬的阿里云用户: 阿里云简单日志服务SLS于2015年1月29日对外发布新版本,同时北京Region上线公测.详细信息如下:   一.行为变更 1.数据模型变更 数据模型变更:Category变更为Logstore.原API格式依然兼容,推荐用户使用新的API. SLS接口文档 2.离线归档行为变更 离线归档行为变更:由归档到ODPS公共表变更为直接导入用户指定表.在此之前,用户已经设定的归档到公共表配置依然在后台兼容,但不可再增加配置,推荐用户使用新的归档方式. 在ODPS中查看导入日志 3

日志服务(原SLS)新功能发布(10)--Logtail配置支持日志转换、过滤

日志收集流程 对于日志收集的客户端,其work pipeline通常包括三个过程:Input,Process,Output. Input: 适配各类日志接入源,目前Logtail支持文本文件.Syslog(TCP流式)两种形式数据写入. Process:自定义日志处理逻辑,常见的有:日志切分.日志编码转换.日志结构化解析.日志过滤等等. Output:定义日志输出,例如Logtail以HTTP协议写数据到日志服务. 今天要介绍Logtail在日志处理阶段的两个新功能:转码.过滤. 日志转码 日志

日志服务(原SLS)新功能发布(9)--Logtail配置支持主题(Topic)设置功能

日志服务中日志为日志服务中处理的最小数据单元,采用半结构化数据模式定义一条日志,具体数据模型包括主题(Topic).时间(Time).内容(Content)和来源(Source),详细描述请参考核心概念.其中主题(Topic)为用户自定义字段,用以标记一批日志(例如:访问日志根据不同站点进行标记),默认值为空字符串(空字符串也为一个有效的主题).用户可以通过使用REST API/SDK上传数据时设置主题.除此之外,Logtail客户端为日志服务用户常用的数据接入客户端,目前也支持设置使用不同的属

日志服务(原SLS)新功能发布(15)--控制台支持查看协同消费组(ConsumerGroup)消费进度

背景 日志服务中分区(Shard)是每个日志库下基本读写单元,每个分区能承载一定量的服务能力,随着日志数据不断增加,需要通过分裂增加Shard数量,对于多个Shard如果直接通过PullLogs接口拖取数据的话,需要处理负载均衡和故障恢复等各种问题,因此强烈建议使用Consumer Library(storm和spark streaming已支持通过conusmergroup消费数据),用户只需要关心数据处理逻辑,同时在控制台也提供协同消费进度查看功能供用户进行使用. 使用方式 查看Consum

日志服务(原SLS)新功能发布(12)--日志投递ODPS支持自动建表授权

背景 日志服务支持"日志消费","日志索引"和"日志投递"三种消费模式,"日志消费"功能默认支持,支持日志数据上传到服务端3秒内进行实时消费,并且支持保留48小时,"日志索引功能"支持30秒内进行查询,并且在创建时支持保存7天/30天/90天,"日志投递"能够在分钟级别将数据投递至OSS或者MaxCompute(原ODPS). 之前"日志投递"功能创建投递规则至Max

日志服务(原SLS)新功能发布(5)--使用Logstash接入数据

日志服务结合Logstash 目前,阿里云用户可以通过API/SDK或Logtail将数据写入日志服务,参考. 今天要介绍一个新方法:使用著名开源软件Logstash采集机器日志数据,并结合日志服务插件完成数据上传日志服务功能. 用户可以在阿里云ECS,或者是IDC机房机器,又或者是其它云厂商的虚拟机上安装Logstash及插件,进行简单的配置,轻松地将本机日志数据搬到云上来. IIS日志场景 以Windows平台上最常见的IIS(Internet Information Services)日志