日志服务Scheduled SQL保证每次作业的计算结果都以Exactly-Once方式写入到目标存储库(Logstore和MetricStore),确保数据不会重复写入,也不会丢失。日志服务基于Logstore的幂等写入来实现Scheduled 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。
基于幂等写入的Scheduled SQL Exactly-Once
Scheduled SQL采用幂等写入方式向目标Logstore写数据。在幂等写入方式的基础上,Scheduled SQL会为每次作业的计算结果生成具有以下特性的Hash
Key以及Sequence ID,从而实现Exactly-Once写入。
- 为两个不同的Scheduled SQL作业实例生成不同的Hash Key。
当多个Scheduled SQL作业向同一个Logstore写入数据时,Scheduled SQL会为各个作业生成不同的Hash Key,避免Sequence ID冲突。
- 为同一个Scheduled SQL作业中的不同实例生成递增的Sequence ID。

注意 当您通过以下方式向同一个Logstore中的同一个Hash Key写入数据时,可能出现Sequence ID冲突,导致其中一方写入数据失败,引起数据缺失问题。
- 通过API或SDK写入数据,并指定hash key参数和sequence id参数。
- 通过Logtail写入数据,并开启ExactlyOnce功能。具体操作,请参见Logtail配置。
- 通过Scheduled SQL作业写入数据。