日志服务定时SQL保证每次任务的计算结果都以Exactly-Once方式写入到目标存储库(Logstore和MetricStore),确保数据不会重复写入,也不会丢失。日志服务基于Logstore的幂等写入来实现定时SQL结果数据的Exactly-Once。
本文内容适用于Logstore和MetricStore,仅以Logstore为例进行说明。
背景信息
日志服务Logstore中包含多个Shard,每个Shard对应一个Hash Key区间(左闭右开)。您可通过负载均衡模式或者指定Hash Key的模式写数据到Logstore,数据最终落到某个Hash Key中。更多信息,请参见分区(Shard)。
负载均衡模式:每个数据包随机写入当前可用的Shard中。
指定Hash Key模式(幂等写入):指定Hash Key的范围,数据将被写入包含该Hash Key范围的Shard中。
幂等写入
日志服务通过指定hash key和sequence id,实现数据的幂等写入。
hash key用于指定数据写入的Hash Key范围。
sequence id用于指定待写入数据在该Hash Key中的ID。
您需保证Sequence ID单调增长,进而保证数据的幂等写入,避免写入任务多次重试时导致数据重复。
当您将数据写入到相同的Hash Key中时,如果待写入数据的Sequence ID小于等于Hash Key中记录的最近一次写入的数据的Sequence ID,则日志服务将拒绝数据写入并返回错误。
当您将数据写入到相同的Hash Key中时,如果待写入数据的Sequence ID大于Hash Key中记录的最近一次写入的数据的Sequence ID,则日志服务将允许数据写入,并更新Hash Key中的Sequence ID。
基于幂等写入的定时SQL Exactly-Once
定时SQL采用幂等写入方式向目标Logstore写数据。在幂等写入方式的基础上,定时SQL会为每次任务的计算结果生成具有以下特性的Hash Key以及Sequence ID,从而实现Exactly-Once写入。
为两个不同的定时SQL任务实例生成不同的Hash Key。
当多个定时SQL任务向同一个Logstore写入数据时,定时SQL会为各个任务生成不同的Hash Key,避免Sequence ID冲突。
为同一个定时SQL任务中的不同实例生成递增的Sequence ID。
当您通过以下方式向同一个Logstore中的同一个Hash Key写入数据时,可能出现Sequence ID冲突,导致其中一方写入数据失败,引起数据缺失问题。
通过API或SDK写入数据,并指定hash key参数和sequence id参数。
通过Logtail写入数据,并开启ExactlyOnce功能。具体操作,请参见Logtail配置。
通过定时SQL任务写入数据。