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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 日志服务新功能上线介绍,本文介绍日志服务如何支持日志严格保序的写入和消费。

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

LogStore & Shard 关系

screenshot

  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);    

screenshot

在这种模式下,通过传入的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程序日志如理逻辑设计如下:
screenshot

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以及其他新功能介绍,我们后续会更新至论坛。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
SQL 机器学习/深度学习 监控
阿里云日志服务(SLS)SQL案例中心发布
阿里云日志服务(SLS)提供大规模日志实时查询与分析能力(LogSearch/Analytics),支持完整SQL92标准(提供restful 和 jdbc两种协议),除基本聚合功能外,支持完整的SQL计算,并支持外部数据源联合查询(Join)、机器学习、模式分析等函数。
2870 0
|
监控
日志服务(SLS)数据加工功能发布
日志服务用户,您好! 针对日志生命周期内存在的各种数据规整、分发、富化、清洗场景需求,阿里云日志服务(SLS)新推出了“数据加工”功能。 推荐在日志服务上进行数据规整、加工或联合其它数据源做分析的数据工程师使用。
7171 0
|
分布式计算 监控 Shell
新功能:日志服务IPython/Jupyter Notebook扩展发布
日志服务发布IPython/Jupyter Notebook扩展,可以轻松地使用Python对海量数据进行深度加工(ETL)、交互式分析(通过SQL、DataFrame)、机器学习与可视化等。
4004 0
|
SQL JSON 监控
新功能:日志服务命令行工具ETL发布!
日志服务命令行工具ETL发布,解决数据采集、分析查询、投递归档、外部整合过程中的数据规整痛点,提供实时、可靠、可扩展、可管理的运行模式支持,以及全面简单的ETL规则,并支持丰富的扩展支持。
3655 0
|
存储 监控 安全
【功能发布】日志服务(SLS)11-12月功能合集
日志服务(SLS)11-12月功能发布合集
5170 0
|
运维 监控 大数据
阿里云CDN实时日志服务正式发布 数据驱动 实时决策
12月26日,阿里云CDN实时日志服务举办线上直播发布会,全网首次深度解读阿里云CDN大数据系统技术演进,产品应用场景与业务实操。阿里云CDN实时日志服务可以将CDN采集的实时日志,在小于60秒的时间进行实时、交互式分析和报表呈现,为监控、报警、渠道分析、运营分析提供实时、可靠的数据参考。
3014 0
|
数据采集 监控 容器
【功能发布】日志服务Logtail 2018-08
【功能发布】日志服务Logtail 2018-08
2311 0
|
存储 监控 安全
|
JSON 监控 关系型数据库
日志服务(2018-08)6月新功能发布
阿里云日志服务6月新功能发布
2413 0
|
JSON 监控 数据格式
日志服务(原SLS)2018-2 月功能发布
发布Json类型、中文分词、新增窗口/逻辑运算/二进制处理/Lamdba等分析函数,支持Kubernetes数据采集
4124 0

相关产品

  • 日志服务