Memigrasikan kontainer nonpartisi ke kontainer yang dipartisi

BERLAKU UNTUK: NoSQL

Microsoft Azure Cosmos DB mendukung pembuatan kontainer tanpa kunci partisi. Saat ini Anda dapat membuat kontainer nonpartisi dengan menggunakan Azure CLI dan Azure Cosmos DB SDK (.NET, Java, NodeJs) yang memiliki versi kurang dari atau sama dengan 2.x. Anda tidak dapat membuat kontainer nonpartisi menggunakan portal Azure. Namun, kontainer nonpartisi tersebut tidak elastis dan memiliki kapasitas penyimpanan tetap 20 GB dan batas throughput 10K RU/dtk.

Kontainer nonpartisi adalah warisan dan Anda harus memigrasikan kontainer nonpartisi yang ada ke kontainer yang dipartisi untuk menskalakan penyimpanan dan throughput. Azure Cosmos DB menyediakan mekanisme yang ditentukan sistem untuk memigrasikan kontainer nonpartisi Anda ke kontainer yang dipartisi. Dokumen ini menjelaskan bagaimana semua kontainer nonpartisi yang ada dimigrasikan secara otomatis ke dalam kontainer yang dipartisi. Anda dapat memanfaatkan fitur migrasi otomatis hanya jika Anda menggunakan SDK versi V3 dalam semua bahasa.

Catatan

Saat ini, Anda tidak dapat memigrasikan Azure Cosmos DB MongoDB dan API untuk akun Gremlin dengan menggunakan langkah-langkah yang dijelaskan dalam dokumen ini.

Migrasikan kontainer menggunakan kunci partisi yang ditentukan sistem

Untuk mendukung migrasi,MIcrosoft Azure Cosmos DB menyediakan kunci partisi yang ditentukan sistem bernama /_partitionkey pada semua kontainer yang tidak memiliki kunci partisi. Anda tidak dapat mengubah definisi kunci partisi setelah kontainer dimigrasikan. Misalnya, definisi kontainer yang dimigrasikan ke kontainer berpartisi adalah sebagai berikut:

{
    "Id": "CollId"
  "partitionKey": {
    "paths": [
      "/_partitionKey"
    ],
    "kind": "Hash"
  },
}

Setelah kontainer dimigrasikan, Anda dapat membuat dokumen dengan mengisi _partitionKey properti bersama dengan properti dokumen lainnya. Properti _partitionKey mewakili kunci partisi dokumen Anda.

Memilih kunci partisi yang tepat itu penting untuk memanfaatkan throughput yang disediakan secara optimal. Untuk informasi selengkapnya, lihat artikel cara memilih kunci partisi.

Catatan

Anda dapat memanfaatkan kunci partisi yang ditentukan sistem hanya jika Anda menggunakan SDK versi terbaru/V3 dalam semua bahasa.

Contoh berikut menunjukkan sampel kode untuk membuat dokumen dengan kunci partisi yang ditentukan sistem dan membaca dokumen itu:

Representasi JSON dari dokumen

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
  );

Untuk sampel lengkapnya, lihat repositori GitHub sampel .NET .

Migrasikan dokumen

Meski definisi kontainer ditingkatkan dengan properti kunci partisi, dokumen dalam kontainer tidak dimigrasikan secara otomatis. Yang berarti jalur properti /_partitionKey kunci partisi sistem tidak secara otomatis ditambahkan ke dokumen yang ada. Anda perlu mempartisi ulang dokumen yang ada dengan membaca dokumen yang dibuat tanpa kunci partisi dan menulis ulang dokumen kembali dengan _partitionKey properti di dokumen.

Mengakses dokumen yang tidak memiliki kunci partisi

Aplikasi dapat mengakses dokumen yang tidak memiliki kunci partisi dengan menggunakan properti sistem khusus yang disebut "PartitionKey.None", ini adalah nilai dari dokumen non-migrasi. Anda dapat menggunakan properti ini di semua operasi CRUD dan kueri. Contoh berikut menunjukkan sampel untuk membaca satu Dokumen dari NonePartitionKey.

CosmosItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.Items.ReadItemAsync<DeviceInformationItem>(
  partitionKey: PartitionKey.None,
  id: device.Id
);

Kompatibilitas dengan SDK

Versi lama Microsoft Azure Cosmos DB SDK seperti V2.x.x dan V1.x.x tidak mendukung properti kunci partisi yang ditentukan sistem. Jadi, ketika Anda membaca definisi kontainer dari SDK yang lebih lama, itu tidak berisi definisi kunci partisi dan kontainer ini akan berperilaku persis seperti sebelumnya. Aplikasi yang dibangun dengan versi SDK yang lebih lama terus bekerja dengan nonpartisi apa adanya tanpa perubahan apa pun.

Jika kontainer yang dimigrasikan digunakan oleh SDK versi terbaru/V3 dan Anda mulai mengisi kunci partisi yang ditentukan sistem dalam dokumen baru, Anda tidak dapat mengakses (baca, perbarui, hapus, kueri) dokumen tersebut dari SDK yang lebih lama lagi.

Masalah yang diketahui

Kueri untuk menghitung item yang disisipkan tanpa kunci partisi dengan menggunakan V3 SDK mungkin melibatkan konsumsi throughput yang lebih tinggi

Jika Anda mengueri dari V3 SDK untuk item yang disisipkan dengan menggunakan V2 SDK, atau item yang disisipkan dengan menggunakan V3 SDK dengan PartitionKey.None parameter, kueri hitungan dapat mengonsumsi lebih banyak RU/s jika PartitionKey.None parameter disediakan di FeedOptions. Kami menyarankan agar Anda tidak menyediakan PartitionKey.None parameter jika tidak ada item lain yang dimasukkan dengan kunci partisi.

Jika item baru disisipkan dengan nilai yang berbeda untuk kunci partisi, mengkueri jumlah item tersebut dengan meneruskan kunci yang sesuai di FeedOptions tidak akan memiliki masalah. Setelah menyisipkan dokumen baru dengan kunci partisi, jika Anda perlu mengueri hanya jumlah dokumen tanpa nilai kunci partisi, kueri itu mungkin menimbulkan RU/s yang lebih tinggi mirip dengan koleksi partisi reguler.

Langkah berikutnya