Log Service定時SQL保證每次任務的計算結果都以Exactly-Once方式寫入到目標存放庫(LogStore和MetricStore),確保資料不會重複寫入,也不會丟失。Log Service基於LogStore的等冪寫入來實現定時SQL結果資料的Exactly-Once。
本文內容適用於LogStore和MetricStore,僅以LogStore為例進行說明。
背景資訊
Log ServiceLogStore中包含多個Shard,每個Shard對應一個Hash Key區間(左閉右開)。您可通過負載平衡模式或者指定Hash Key的模式寫資料到LogStore,資料最終落到某個Hash Key中。更多資訊,請參見分區(Shard)。
-
負載平衡模式:每個資料包隨機寫入當前可用的Shard中。
-
指定Hash Key模式(等冪寫入):指定Hash Key的範圍,資料將被寫入包含該Hash Key範圍的Shard中。

等冪寫入
Log Service通過指定hash key和sequence id,實現資料的等冪寫入。
-
hash key用於指定資料寫入的Hash Key範圍。
-
sequence id用於指定待寫入資料在該Hash Key中的ID。
您需保證Sequence ID單調增長,進而保證資料的等冪寫入,避免寫入任務多次重試時導致資料重複。
-
當您將資料寫入到相同的Hash Key中時,如果待寫入資料的Sequence ID小於等於Hash Key中記錄的最近一次寫入的資料的Sequence ID,則Log Service將拒絕資料寫入並返回錯誤。
-
當您將資料寫入到相同的Hash Key中時,如果待寫入資料的Sequence ID大於Hash Key中記錄的最近一次寫入的資料的Sequence ID,則Log Service將允許資料寫入,並更新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任務寫入資料。