Eseguire la migrazione di contenitori non partizionati a contenitori partizionati
SI APPLICA A: NoSQL
Azure Cosmos DB supporta la creazione di contenitori senza una chiave di partizione. Attualmente è possibile creare contenitori non partizionati usando l'interfaccia della riga di comando di Azure e gli SDK di Azure Cosmos DB (.NET, Java, NodeJs) con una versione inferiore o uguale a 2.x. Non è possibile creare contenitori non partizionati usando il portale di Azure. Tuttavia, tali contenitori non partizionati non sono elastici e hanno una capacità di archiviazione fissa di 20 GB e un limite di velocità effettiva di 10.000 UR/s.
I contenitori non partizionati sono legacy ed è necessario eseguire la migrazione dei contenitori non partizionati esistenti ai contenitori partizionati per dimensionare l'archiviazione e la velocità effettiva. Azure Cosmos DB offre un meccanismo definito dal sistema per la migrazione dei contenitori non partizionati ai contenitori partizionati. Questo documento illustra come viene eseguita la migrazione automatica di tutti i contenitori non partizionati esistenti in contenitori partizionati. È possibile sfruttare la funzionalità di migrazione automatica solo se si usa la versione 3 degli SDK in tutte le lingue.
Nota
Attualmente non è possibile eseguire la migrazione di Azure Cosmos DB MongoDB e API per gli account Gremlin seguendo la procedura descritta in questo documento.
Eseguire la migrazione del contenitore usando la chiave di partizione definita dal sistema
Per supportare la migrazione, Azure Cosmos DB fornisce una chiave di partizione definita dal sistema denominata /_partitionkey
in tutti i contenitori che non dispongono di una chiave di partizione. Non è possibile modificare la definizione della chiave di partizione dopo la migrazione dei contenitori. Ad esempio, la definizione di un contenitore di cui viene eseguita la migrazione a un contenitore partizionato sarà la seguente:
{
"Id": "CollId"
"partitionKey": {
"paths": [
"/_partitionKey"
],
"kind": "Hash"
},
}
Dopo la migrazione del contenitore, è possibile creare documenti popolando la proprietà _partitionKey
insieme alle altre proprietà del documento. La proprietà _partitionKey
rappresenta la chiave di partizione dei documenti.
La scelta della chiave di partizione corretta è importante per usare la velocità effettiva con provisioning in modo ottimale. Per altre informazioni, vedere l'articolo su come scegliere una chiave di partizione.
Nota
È possibile sfruttare la chiave di partizione definita dal sistema solo se si usa la versione più recente/V3 degli SDK in tutti i linguaggi.
L'esempio seguente illustra un codice di esempio per creare un documento con la chiave di partizione definita dal sistema e leggere il documento:
Rappresentazione JSON del documento
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
);
Per l'esempio completo, vedere il repository GitHub degli esempi .NET.
Eseguire la migrazione dei documenti
Sebbene la definizione del contenitore sia migliorata con una proprietà della chiave di partizione, i documenti all'interno del contenitore non vengono migrati automaticamente. Ciò significa che il percorso della proprietà /_partitionKey
della chiave di partizione di sistema non viene aggiunto automaticamente ai documenti esistenti. È necessario ripartizionare i documenti esistenti leggendo i documenti creati senza una chiave di partizione e riscrivendoli con la proprietà _partitionKey
nei documenti.
Accedere ai documenti che non dispongono di una chiave di partizione
Le applicazioni possono accedere ai documenti esistenti che non dispongono di una chiave di partizione usando la proprietà di sistema speciale denominata "PartitionKey.None", ovvero il valore dei documenti non migrati. È possibile usare questa proprietà in tutte le operazioni CRUD e di query. L'esempio seguente mostra un esempio per leggere un singolo documento da NonePartitionKey.
CosmosItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.Items.ReadItemAsync<DeviceInformationItem>(
partitionKey: PartitionKey.None,
id: device.Id
);
Compatibilità con gli SDK
La versione precedente degli SDK di Azure Cosmos DB, ad esempio V2.x.x e V1.x.x, non supporta la proprietà della chiave di partizione definita dal sistema. Pertanto, quando si legge la definizione del contenitore da un SDK precedente, non contiene alcuna definizione della chiave di partizione e questi contenitori si comportano esattamente come in precedenza. Le applicazioni compilate con la versione precedente degli SDK continuano a funzionare con le versioni non partizionate così come sono senza modifiche.
Se un contenitore migrato viene utilizzato dalla versione più recente/V3 dell'SDK e si inizia a popolare la chiave di partizione definita dal sistema all'interno dei nuovi documenti, non è più possibile accedere (lettura, aggiornamento, eliminazione, query) a tali documenti dagli SDK precedenti.
Problemi noti
L'esecuzione di query per il conteggio degli elementi inseriti senza una chiave di partizione tramite SDK V3 può comportare un consumo di velocità effettiva superiore
Se si esegue una query dall'SDK V3 per gli elementi inseriti usando l'SDK V2 o gli elementi inseriti usando l'SDK V3 con il parametro PartitionKey.None
, la query di conteggio può usare più UR/s se il parametro PartitionKey.None
viene fornito in FeedOptions. È consigliabile non specificare il parametro PartitionKey.None
se non vengono inseriti altri elementi con una chiave di partizione.
Se vengono inseriti nuovi elementi con valori diversi per la chiave di partizione, l'esecuzione di query per tali conteggi di elementi passando la chiave appropriata in FeedOptions
non avrà problemi. Dopo aver inserito nuovi documenti con chiave di partizione, se è necessario eseguire una query solo sul numero di documenti senza il valore della chiave di partizione, tale query potrebbe comportare di nuovo un numero di UR/s superiore simile alle normali raccolte partizionate.
Passaggi successivi
- Partizionamento in Azure Cosmos DB
- Unità richiesta in Azure Cosmos DB
- Effettuare il provisioning della velocità effettiva per contenitori e database
- Usare l'account Azure Cosmos DB
- Si sta tentando di pianificare la capacità per una migrazione ad Azure Cosmos DB?
- Se si conosce solo il numero di vcore e server nel cluster di database esistente, leggere le informazioni sulla stima delle unità richieste usando vCore o vCPU
- Se si conosce la frequenza delle richieste tipiche per il carico di lavoro corrente del database, leggere le informazioni sulla stima delle unità richieste con lo strumento di pianificazione della capacità di Azure Cosmos DB