Bölümlenmemiş kapsayıcıları bölümlenmiş kapsayıcılara geçirme
UYGULANANLAR: NoSQL
Azure Cosmos DB, bölüm anahtarı olmadan kapsayıcı oluşturmayı destekler. Şu anda 2.x'ten küçük veya buna eşit bir sürüme sahip Azure CLI ve Azure Cosmos DB SDK'larını (.NET, Java, NodeJs) kullanarak bölümlenmemiş kapsayıcılar oluşturabilirsiniz. Azure portalını kullanarak bölümlenmemiş kapsayıcılar oluşturamazsınız. Ancak bu tür bölümlenmemiş kapsayıcılar esnek değildir ve sabit depolama kapasitesi 20 GB ve aktarım hızı sınırı 10.000 RU/sn'dir.
Bölümlenmemiş kapsayıcılar eskidir ve depolamayı ve aktarım hızını ölçeklendirmek için mevcut bölümlenmemiş kapsayıcılarınızı bölümlenmiş kapsayıcılara geçirmeniz gerekir. Azure Cosmos DB, bölümlenmemiş kapsayıcılarınızı bölümlenmiş kapsayıcılara geçirmek için sistem tanımlı bir mekanizma sağlar. Bu belgede, var olan tüm bölümlenmemiş kapsayıcıların bölümlenmiş kapsayıcılara nasıl otomatik olarak geçirilir açıklanmaktadır. Otomatik geçiş özelliğinden yalnızca tüm dillerde SDK'ların V3 sürümünü kullanıyorsanız yararlanabilirsiniz.
Not
Şu anda, bu belgede açıklanan adımları kullanarak Gremlin hesapları için Azure Cosmos DB MongoDB ve API'yi geçiremezsiniz.
Sistem tanımlı bölüm anahtarını kullanarak kapsayıcıyı geçirme
Geçişi desteklemek için Azure Cosmos DB, bölüm anahtarı olmayan tüm kapsayıcılarda adlı /_partitionkey
bir sistem tanımlı bölüm anahtarı sağlar. Kapsayıcılar geçirildikten sonra bölüm anahtarı tanımını değiştiremezsiniz. Örneğin, bölümlenmiş bir kapsayıcıya geçirilen bir kapsayıcının tanımı aşağıdaki gibi olacaktır:
{
"Id": "CollId"
"partitionKey": {
"paths": [
"/_partitionKey"
],
"kind": "Hash"
},
}
Kapsayıcı geçirildikten sonra, belgenin _partitionKey
diğer özellikleriyle birlikte özelliğini doldurarak belgeler oluşturabilirsiniz. _partitionKey
özelliği, belgelerinizin bölüm anahtarını temsil eder.
Sağlanan aktarım hızını en iyi şekilde kullanmak için doğru bölüm anahtarını seçmek önemlidir. Daha fazla bilgi için bölüm anahtarı seçme makalesine bakın.
Not
Sistem tanımlı bölüm anahtarından yalnızca tüm dillerde SDK'ların en son/V3 sürümünü kullanıyorsanız yararlanabilirsiniz.
Aşağıdaki örnekte, sistem tanımlı bölüm anahtarıyla belge oluşturmak ve bu belgeyi okumak için örnek bir kod gösterilmektedir:
Belgenin JSON gösterimi
DeviceInformationItem = new DeviceInformationItem
{
"id": "elevator/PugetSound/Building44/Floor1/1",
"deviceId": "3cf4c52d-cc67-4bb8-b02f-f6185007a808",
"_partitionKey": "3cf4c52d-cc67-4bb8-b02f-f6185007a808"
}
public class DeviceInformationItem
{
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "deviceId")]
public string DeviceId { get; set; }
[JsonProperty(PropertyName = "_partitionKey", NullValueHandling = NullValueHandling.Ignore)]
public string PartitionKey { get {return this.DeviceId; set; }
}
CosmosContainer migratedContainer = database.Containers["testContainer"];
DeviceInformationItem deviceItem = new DeviceInformationItem() {
Id = "1234",
DeviceId = "3cf4c52d-cc67-4bb8-b02f-f6185007a808"
}
ItemResponse<DeviceInformationItem > response =
await migratedContainer.CreateItemAsync<DeviceInformationItem>(
deviceItem.PartitionKey,
deviceItem
);
// Read back the document providing the same partition key
ItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.ReadItemAsync<DeviceInformationItem>(
partitionKey: deviceItem.PartitionKey,
id: device.Id
);
Tam örnek için bkz . .NET örnekleri GitHub deposu.
Belgeleri geçirme
Kapsayıcı tanımı bir bölüm anahtarı özelliğiyle geliştirilmiş olsa da, kapsayıcı içindeki belgeler otomatik olarak geçirilmez. Bu, sistem bölüm anahtarı özellik /_partitionKey
yolunun var olan belgelere otomatik olarak eklenmediği anlamına gelir. Bölüm anahtarı olmadan oluşturulan belgeleri okuyarak mevcut belgeleri yeniden bölümlemeniz ve bunları belgelerdeki özellik ile _partitionKey
yeniden yazmanız gerekir.
Bölüm anahtarı olmayan belgelere erişme
Uygulamalar, "PartitionKey.None" adlı özel sistem özelliğini kullanarak bölüm anahtarı olmayan mevcut belgelere erişebilir. Bu, geçirilmeyen belgelerin değeridir. Bu özelliği tüm CRUD ve sorgu işlemlerinde kullanabilirsiniz. Aşağıdaki örnekte NonePartitionKey'den tek bir Belgeyi okumak için bir örnek gösterilmektedir.
CosmosItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.Items.ReadItemAsync<DeviceInformationItem>(
partitionKey: PartitionKey.None,
id: device.Id
);
SDK'larla uyumluluk
V2.x.x ve V1.x.x gibi Azure Cosmos DB SDK'larının eski sürümü, sistem tanımlı bölüm anahtarı özelliğini desteklemez. Bu nedenle, kapsayıcı tanımını eski bir SDK'dan okuduğunuzda, herhangi bir bölüm anahtarı tanımı içermez ve bu kapsayıcılar tam olarak önceki gibi davranır. SDK'ların eski sürümüyle oluşturulan uygulamalar, herhangi bir değişiklik yapılmadan olduğu gibi bölümlenmemiş olarak çalışmaya devam eder.
Geçirilen kapsayıcı SDK'nın en son/V3 sürümü tarafından kullanılıyorsa ve sistem tanımlı bölüm anahtarını yeni belgeler içinde doldurmaya başlarsanız, bu tür belgelere artık eski SDK'lardan erişemezsiniz (okuma, güncelleştirme, silme, sorgulama).
Bilinen sorunlar
V3 SDK kullanılarak bölüm anahtarı olmadan eklenen öğelerin sayısını sorgulamak daha yüksek aktarım hızı tüketimi gerektirebilir
V2 SDK kullanılarak eklenen öğeler veya parametresiyle PartitionKey.None
V3 SDK kullanılarak eklenen öğeler için V3 SDK'sından sorgu yaparsanız, parametre FeedOptions'da sağlanırsa PartitionKey.None
sayı sorgusu daha fazla RU/sn tüketebilir. Bölüm anahtarıyla başka bir öğe eklenmediyse parametresini PartitionKey.None
sağlamamanızı öneririz.
Bölüm anahtarı için farklı değerlerle yeni öğeler eklenirse, içinde uygun anahtarı FeedOptions
geçirerek bu tür öğe sayılarını sorgulamada herhangi bir sorun olmaz. Bölüm anahtarıyla yeni belgeler ekledikten sonra, bölüm anahtarı değeri olmadan yalnızca belge sayısını sorgulamanız gerekiyorsa, bu sorgu yine normal bölümlenmiş koleksiyonlara benzer şekilde daha yüksek RU/sn'ye neden olabilir.
Sonraki adımlar
- Azure Cosmos DB'de bölümleme
- Azure Cosmos DB'de İstek birimleri
- Kapsayıcı ve veritabanlarına aktarım hızı sağlama
- Azure Cosmos DB hesabıyla çalışma
- Azure Cosmos DB'ye geçiş için kapasite planlaması yapmaya mı çalışıyorsunuz?
- Tek bildiğiniz mevcut veritabanı kümenizdeki sanal çekirdek ve sunucu sayısıysa, sanal çekirdek veya vCPU kullanarak istek birimlerini tahmin etme hakkında bilgi edinin
- Geçerli veritabanı iş yükünüz için tipik istek oranlarını biliyorsanız Azure Cosmos DB kapasite planlayıcısı kullanarak istek birimlerini tahmin etme hakkında bilgi edinin