Log Service使用Shard控制Logstore或MetricStore的讀寫資料的能力,資料必定儲存在某一個Shard中。
Shard範圍
每個Shard均有範圍,為MD5左閉右開區間[BeginKey,EndKey)。每個Shard範圍不會相互覆蓋,且屬於整個MD5範圍內[00000000000000000000000000000000,ffffffffffffffffffffffffffffffff)。您可以在建立Logstore或MetricStore時指定Shard個數,Log Service將自動平均劃分整個MD5範圍。
BeginKey:指定Shard範圍的起始值,Shard範圍中包含該值。
EndKey:指定Shard範圍的結束值,Shard範圍中不包含該值。
例如Logstore A中包含4個Shard,各個Shard範圍如下:
表 1. Shard範圍
Shard ID | 範圍 |
Shard0 | [00000000000000000000000000000000,40000000000000000000000000000000) |
Shard1 | [40000000000000000000000000000000,80000000000000000000000000000000) |
Shard2 | [80000000000000000000000000000000,c0000000000000000000000000000000) |
Shard3 | [c0000000000000000000000000000000,ffffffffffffffffffffffffffffffff) |
在Shard讀寫資料過程中,讀資料時必須指定Shard ID,寫資料時可通過負載平衡模式或者指定Hash Key的模式。
負載平衡模式:每個資料包隨機寫入當前可用的Shard中。
如果您的寫入流量大於單Shard的服務能力,建議採用負載平衡模式。
指定Hash Key模式:指定MD5的Key值,資料將被寫入包含該Key值的Shard中。
例如Shard範圍如Shard範圍所示,當您寫入資料時指定MD5的Key值為5F時,則資料將被寫入包含5F的Shard1上;當您寫入資料時指定MD5的Key值為8C時,則資料將被寫入包含8C的Shard2上。
Shard的讀寫能力
每個Shard提供一定的服務能力,具體請參見資料讀寫。
建議您根據實際資料流量規劃Shard個數。當資料流量超出讀寫能力時,及時分裂Shard以增加Shard個數,從而達到更大的讀寫能力。當資料流量遠未達到Shard的最大讀寫能力時,及時合并Shard以減少Shard個數,從而降低活躍Shard租用費用。
當寫入資料的API持續報告403或者500錯誤時,您可以通過LogstoreCloudMonitor查看流量和狀態代碼判斷是否需要增加Shard。
超過Shard服務能力的讀寫,Log Service會儘可能服務,但不保證服務品質。
Shard狀態
Shard狀態包括readwrite(讀寫)和readonly(唯讀)。
建立Shard時,所有Shard狀態均為readwrite狀態。執行分裂或合併作業後,Shard狀態變更為readonly,並產生新的readwrite狀態的Shard。Shard狀態不影響其資料讀取的效能。readwrite狀態的Shard可保證資料寫入效能,readonly狀態的Shard不提供資料寫入服務。
分裂與合并
Log Service支援分裂和合并Shard。
分裂操作是指將一個Shard分裂為另外兩個Shard,即分裂後Shard數量增加2。兩個新產生的Shard的狀態為readwrite,排列在原Shard之後且兩個Shard的MD5範圍覆蓋原Shard的MD5範圍。
分裂Shard時,需指定一個處於readwrite狀態的Shard。分裂完成後,原Shard狀態由readwrite變為readonly,該Shard中的資料仍可被消費,但該Shard不支援寫入新資料。
合併作業是指將兩個Shard合并為一個Shard。新產生的Shard的狀態為readwrite,排列在原Shard之後且其MD5範圍覆蓋原來兩個Shard的MD5範圍。
合并Shard時,需指定一個處於readwrite狀態且未排列在最後一個的Shard,Log Service自動找到所指定Shard右側相鄰的Shard,並進行合并。合并完成後,原來兩個Shard的狀態由readwrite變為readonly,這兩個Shard中的資料仍可被消費,但這兩個Shard不支援寫入新資料。