問題現象
在使用Table Store的過程中,部分使用者可能偶爾會接到一些500錯誤。主要錯誤碼資訊請參見下表。
錯誤狀態 | 錯誤碼 | 錯誤資訊 |
503 | OTSPartitionUnavailable | The partition is not available. |
503 | OTSServerUnavailable | Server is not available. |
503 | OTSServerBusy | Server is busy. |
503 | OTSTimeout | Operation timeout. |
原因分析
Table Store是分布式的Serverless表格儲存體服務,服務端會根據資料分區的資料量和訪問情況自動進行負載平衡,從而突破單機服務能力的限制,實現資料規模與訪問並發的無縫擴充。
如下圖所示,Table Store會按照分區鍵(即第一個主鍵)的順序將實際資料劃分到不同的資料分區中,不同的資料分區會調度到不同的服務節點提供讀寫服務。

當某個資料分區的資料量過大或訪問過熱(如下圖的資料分區P1)時,Table Store的動態負載平衡機制能夠檢測到這種情況的發生,並將資料分區分裂成兩個資料分區P1和P5,並將這兩個資料分區調度到負載較低的服務節點上。
當新建立一個資料表時,資料表只有一個資料分區,該表上能夠提供的讀寫並發有限,自動負載平衡機制也有一定的延時性,您可以直接聯絡Table Store支援人員,預先將資料表劃分成多個資料分區。
Table Store使用上述的自動負載平衡機制實現表資料規模和訪問並發的自動擴充,全程無需人工介入。

同時,Table Store使用共用儲存的機制,資料分區為邏輯單位,因此在負載平衡的過程中,不會有實際資料的遷移,只是資料表元資訊的變更。在元資訊變更的過程中,為了保證資料的一致性,涉及到的資料分區會有短暫的不可用時間, 正常情況下影響時間為百毫秒層級,在資料分區的負載較大時,可能會持續到秒層級, 在這段時間內對該分區的讀寫操作可能會收到上述的錯誤。
解決方案
一般重試即可解決。Table StoreSDK預設提供了一些重試策略,在初始化Client時可以指定重試策略。
同時,Table Store提供的是標準Restful API協議,由於網路環境的不可控,所有的讀寫操作也建議均增加重試策略,以便對網路錯誤等有一定的容錯能力。
通過批量讀寫操作BatchWriteRow和BatchGetRow讀寫的資料可能屬於一張表或多張表的多個資料分區。如果某個分區正在分裂,則整個操作是非原子性的,只能夠保證每個單行操作的原子性。即使該操作的返回碼為200,仍需檢查response中的getFailedRows()是否有失敗的單行操作。