在Azure Cosmos DB中選擇分區(qū)鍵的策略是什么?
管理邏輯分區(qū)
Azure CosmosDB以透明的方式自動管理邏輯分區(qū)在物理分區(qū)(物理服務器)上的位置,以滿足業(yè)務數(shù)據(jù)的橫向擴展和可伸縮性,同時支持性能需求。
隨著應用程序的吞吐量和存儲要求的提高,Azure Cosmos DB可移動邏輯分區(qū),以自動在更多的服務器之間分散負載。
Azure Cosmos DB使用基于哈希的分區(qū)在物理分區(qū)之間分散邏輯分區(qū)。Azure Cosmos DB對項的分區(qū)鍵值進行哈希處理。哈希處理結(jié)果確定了物理分區(qū)。然后,Azure Cosmos DB在物理分區(qū)之間均勻分配分區(qū)鍵哈希的鍵空間。
與訪問多個分區(qū)的查詢相比,訪問單個分區(qū)中的數(shù)據(jù)的查詢更具成本效益。只允許針對單個邏輯分區(qū)中的項執(zhí)行事務(在存儲過程或觸發(fā)器中)
選擇分區(qū)
我們在使用Partition Key分區(qū)鍵時候,需要注意以下幾點:
1.單個邏輯分區(qū)的存儲空間上限為10GB
2.對每個CosmosDB分區(qū)的最小吞吐量為每秒400個Request Unit(RU)。
假設我們對CosmosDB分區(qū)的RU設置為500,但是真實的Request吞吐量超過500,則請求將因為RU不足而有限制。請務必選擇不會導致應用程序中產(chǎn)生“熱點”的分區(qū)鍵
3.請合理選擇Azure CosmosDB的分區(qū)鍵,以保證數(shù)據(jù)平均的分布。平衡數(shù)據(jù)查詢和事務查詢,以實現(xiàn)橫向擴展
4.我們在選擇分區(qū)鍵的時候,盡量保證該分區(qū)鍵可以被作為過濾條件,以提高查詢的效率。
避免在所有分區(qū)下查詢某一條數(shù)據(jù),因為沒有定義分區(qū)鍵查詢效率會非常低下。
我向你介紹下如何選擇適合你方案的分區(qū)鍵,以及怎么充分利用 Azure Cosmos DB 自動擴展。
分區(qū)鍵是Azure將數(shù)據(jù)整理到邏輯分區(qū)所依據(jù)的值。分區(qū)鍵應用于在整個數(shù)據(jù)庫中分發(fā)操作以避免熱分區(qū)。熱分區(qū)是比其他分區(qū)接收更多請求的單個分區(qū),可能會產(chǎn)生吞吐量瓶頸。
在我們的在線零售方案中,使用userID或productId值作為分區(qū)鍵是一個不錯的選擇,因為它具有唯一性且有可能用于查找記錄。userID是不錯的選擇,因為應用程序經(jīng)常需要為用戶檢索個性化設置、購物車、訂單歷史記錄和個人資料信息(僅舉幾例)。productId也是不錯的選擇,因為應用程序需要查詢庫存水平、運輸費用、顏色選擇、倉庫位置等信息。
使用當前時間不是一個好的分區(qū)鍵選擇,因為所有傳入數(shù)據(jù)都將歸入一個分區(qū)鍵。userID或productId會更好,因為站點上的所有用戶都可能以幾乎相同的頻率添加和更新購物車或個人資料信息,這會在所有用戶和產(chǎn)品分區(qū)上分發(fā)讀取和寫入操作。
容器的物理分區(qū)完全由Azure Cosmos DB管理,所需的物理分區(qū)數(shù)取決于所需的RU和存儲量。如果需要額外的物理分區(qū),Cosmos DB將通過拆分現(xiàn)有分區(qū)自動進行創(chuàng)建。應用程序沒有故障時間或性能影響。
與每個分區(qū)鍵關聯(lián)的數(shù)據(jù)的存儲空間不得超過20 GB,這是Azure Cosmos DB中一個物理分區(qū)的大小。因此,如果一個userID或productId記錄即將超過20 GB,請考慮改用組合鍵,以縮小每條記錄。組合鍵的一個示例是userID-date,如下所示:CustomerName-08072018。通過此組合鍵方法,可以為有用戶訪問該站點的每一天創(chuàng)建新分區(qū)。
最佳實踐
在嘗試確定合適的分區(qū)鍵時,如果解決方案不明顯,請注意以下幾點提示。
不要害怕選擇有大量值的分區(qū)鍵。分區(qū)鍵的值越多,可伸縮性就越大。
若要確定讀取密集型工作負荷的最佳分區(qū)鍵,請檢查打算使用的前三到五個查詢。WHERE子句中最常包含的值是分區(qū)鍵很好的候選項。
對于寫入密集型工作負載,需要了解工作負載的事務需求,因為分區(qū)鍵是多文檔事務的作用域。
檢查:選擇分區(qū)鍵
對于每個Azure Cosmos DB容器,應指定滿足以下核心屬性的分區(qū)鍵:
具有高基數(shù)。此選項允許在所有物理分區(qū)之間均勻分發(fā)數(shù)據(jù)。
均勻分發(fā)請求。請記住,RU/s的總數(shù)在所有物理分區(qū)之間平均分配。
均勻分發(fā)存儲。每個分區(qū)的大小可以增加到20 GB。