日志服務定時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任務寫入數據。