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