Bölümlenmemiş kapsayıcıları bölümlenmiş kapsayıcılara geçirme

ŞUNUN IÇIN GEÇERLIDIR: 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 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 20 GB sabit depolama kapasitesine ve 10.000 RU/sn aktarım hızı sınırına sahiptir.

Bölümlenmemiş kapsayıcılar eskidir ve depolama 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, mevcut bölümlenmemiş tüm kapsayıcıların bölümlenmiş kapsayıcılara nasıl otomatik olarak geçirilir olduğu açıklanı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 sistem tanımlı bir 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, özelliğiyle birlikte belgenin _partitionKey diğer özellikleriyle birlikte doldurarak belgeler oluşturabilirsiniz. özelliği, _partitionKey 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 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ı 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 bölüm anahtarı olmayan mevcut belgelere "PartitionKey.None" adlı özel sistem özelliğini kullanarak erişebilir. Bu, geçirilmeyen belgelerin değeridir. Bu özelliği tüm CRUD ve sorgu işlemlerinde kullanabilirsiniz. Aşağıdaki örnekte NonePartitionKey'ten 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 Eski Azure Cosmos DB SDK'ları, 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 kullanarak 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 V3 SDK kullanılarak eklenen öğeler için V3 SDK'sından PartitionKey.None sorgu yaparsanız, parametre FeedOptions içinde sağlanmışsa PartitionKey.None sayı sorgusu daha fazla RU/sn tüketebilir. Bölüm anahtarıyla başka öğe eklenmiyorsa parametresini PartitionKey.None sağlamamanızı öneririz.

Bölüm anahtarı için farklı değerlerle yeni öğeler eklenirse, 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 gerekirse, bu sorgu yine normal bölümlenmiş koleksiyonlara benzer daha yüksek RU/sn'ye neden olabilir.

Sonraki adımlar