Partizionamento e ridimensionamento in Azure Cosmos DBPartition and scale in Azure Cosmos DB

Azure Cosmos DB è un servizio di database multimodello distribuito a livello globale che consente di ottenere prestazioni rapide e prevedibile.Azure Cosmos DB is a globally distributed, multimodel database service designed to help you achieve fast, predictable performance. È ridimensionabile contestualmente all'espansione dell'applicazione.It scales seamlessly along with your application as it grows. Questo articolo offre una panoramica del funzionamento del partizionamento per tutti i modelli di dati in Azure Cosmos DB.This article provides an overview of how partitioning works for all the data models in Azure Cosmos DB. Descrive anche come configurare contenitori Azure Cosmos DB per ridimensionare in modo efficace le applicazioni.It also describes how you can configure Azure Cosmos DB containers to effectively scale your applications.

Il partizionamento e le chiavi di partizione sono illustrati in questo video di Azure Friday con Scott Hanselman e Shireesh Thota, responsabile principale della progettazione di Azure Cosmos DB:Partitioning and partition keys are discussed in this Azure Friday video with Scott Hanselman and Azure Cosmos DB Principal Engineering Manager, Shireesh Thota:

Partizionamento in Azure Cosmos DBPartitioning in Azure Cosmos DB

In Azure Cosmos DB è possibile archiviare dati ed eseguire query senza schema con tempi di risposta nell'ordine di millisecondi su qualsiasi scala.In Azure Cosmos DB, you can store and query schema-less data with order-of-millisecond response times at any scale. Azure Cosmos DB offre contenitori per l'archiviazione di dati denominati raccolte (per i documenti), grafici o tabelle.Azure Cosmos DB provides containers for storing data called collections (for documents), graphs, or tables.

I contenitori sono risorse logiche e possono comprendere una o più partizioni fisiche o server.Containers are logical resources and can span one or more physical partitions or servers. Il numero di partizioni è determinato da Azure Cosmos DB in base allo spazio di archiviazione e alla velocità effettiva con provisioning del contenitore.The number of partitions is determined by Azure Cosmos DB based on the storage size and the provisioned throughput of the container.

Una partizione fisica è una quantità fissa di spazio di archiviazione riservato basato su SSD.A physical partition is a fixed amount of reserved SSD-backed storage. Ogni partizione fisica viene replicata per assicurare disponibilità elevata.Each physical partition is replicated for high availability. Una o più partizioni fisiche costituiscono un contenitore.One or more physical partitions make up a container. Le partizioni fisiche vengono completamente gestite da Azure Cosmos DB, quindi non è necessario scrivere codice complesso o occuparsi personalmente della gestione.Physical partition management is fully managed by Azure Cosmos DB, and you don't have to write complex code or manage your partitions. I contenitori di Azure Cosmos DB sono illimitati in termini di risorse di archiviazione e di velocità effettiva.Azure Cosmos DB containers are unlimited in terms of storage and throughput.

Una partizione logica è una partizione all'interno di una partizione fisica che archivia tutti i dati associati a un valore di una singola chiave di partizione.A logical partition is a partition within a physical partition that stores all the data associated with a single partition key value. Una partizione logica ha una capacità massima di 10 GB. Nel diagramma seguente è raffigurato un singolo contenitore con tre partizioni logiche.A logical partition has a 10 GB max. In the following diagram, a single container has three logical partitions. Ogni partizione logica archivia i dati di una chiave di partizione, rispettivamente LAX, AMS e MEL.Each logical partition stores the data for one partition key, LAX, AMS, and MEL respectively. Ognuna delle partizioni logiche LAX, AMS e MEL non può superare il limite massimo di 10 GB per le partizioni logiche.Each of the LAX, AMS, and MEL logical partitions cannot grow beyond the maximum logical partition limit of 10 GB.

Partizionamento delle risorse

Quando una raccolta soddisfa i prerequisiti di partizionamento, il partizionamento stesso è un'operazione trasparente all'applicazione.When a collection meets the partitioning prerequisites, the act of partitioning is transparent to your application. Azure Cosmos DB supporta letture e scritture veloci, query, logica transazionale, livelli di coerenza e controllo di accesso con granularità fine tramite metodi/API per una singola risorsa di contenitore.Azure Cosmos DB supports fast reads and writes, queries, transactional logic, consistency levels, and fine-grained access control via methods/APIs to a single container resource. Il servizio gestisce la distribuzione dei dati tra le partizioni fisiche e logiche e il routing delle richieste di query alla partizione corretta.The service handles distributing data across physical and logical partitions and routing query requests to the right partition.

Funzionamento del partizionamentoHow does partitioning work

Per il partizionamento,How does partitioning work? ogni elemento deve avere una chiave di partizione e una chiave di riga che lo identificano in modo univoco.Each item must have a partition key and a row key, which uniquely identify it. La chiave di partizione funge da partizione logica per i dati e fornisce ad Azure Cosmos DB un limite naturale per la distribuzione dei dati tra le partizioni fisiche.Your partition key acts as a logical partition for your data and provides Azure Cosmos DB with a natural boundary for distributing data across physical partitions. Tenere presente che i dati di una singola partizione logica devono essere contenuti in un'unica partizione fisica, ma la gestione delle partizioni fisiche viene eseguita da Azure Cosmos DB.Remember that the data for a single logical partition must reside inside a single physical partition, but physical partition management is managed by Azure Cosmos DB.

In sintesi, il partizionamento in Azure Cosmos DB funziona nel modo seguente:In brief, here's how partitioning works in Azure Cosmos DB:

  • Si esegue il provisioning di un contenitore Azure Cosmos DB con velocità effettiva di T richieste al secondo.You provision a Azure Cosmos DB container with T requests per second throughput.
  • In background Azure Cosmos DB effettua il provisioning delle partizioni necessarie per gestire T richieste al secondo.Behind the scenes, Azure Cosmos DB provisions partitions needed to serve T requests per second. Se T è maggiore della velocità effettiva massima per partizione t, Azure Cosmos DB effettua il provisioning di N = T/t partizioni.If T is higher than the maximum throughput per partition t, then Azure Cosmos DB provisions N = T/t partitions.
  • Azure Cosmos DB alloca lo spazio degli hash delle chiavi di partizione in modo uniforme tra le N partizioni.Azure Cosmos DB allocates the key space of partition key hashes evenly across the N partitions. Ogni partizione fisica ospita quindi 1/N valori di chiave di partizione (partizioni logiche).So, each partition (physical partition) hosts 1/N partition key values (logical partitions).
  • Quando una partizione fisica p raggiunge il limite di archiviazione, Azure Cosmos DB suddivide p in due nuove partizioni, p1 e p2.When a physical partition p reaches its storage limit, Azure Cosmos DB seamlessly splits p into two new partitions, p1 and p2. Distribuisce i valori corrispondenti a circa la metà delle chiavi a ogni partizione.It distributes values corresponding to roughly half the keys to each of the partitions. Questa operazione di suddivisione è invisibile all'applicazione.This split operation is invisible to your application. Se una partizione fisica raggiunge il limite di archiviazione e tutti i dati della partizione fisica appartengono alla stessa chiave di partizione logica, l'operazione di suddivisione non viene eseguita.If a physical partition reaches its storage limit and all of the data in the physical partition belongs to the same logical partition key, the split operation does not occur. Tutti i dati di una singola chiave di partizione logica, infatti, devono trovarsi nella stessa partizione fisica, pertanto la partizione fisica non può essere suddivisa in p1 e p2.This is because all the data for a single logical partition key must reside in the same physical partition and thus the physical partition cannot be split into p1 and p2. In questo caso dovrebbe essere adottata una strategia diversa per la chiave di partizione.In this case a different partition key strategy should be employed.
  • Quando si esegue il provisioning di una velocità effettiva superiore a t*N, Azure Cosmos DB suddivide una o più partizioni per supportare la velocità effettiva maggiore.When you provision throughput higher than t*N, Azure Cosmos DB splits one or more of your partitions to support the higher throughput.

La semantica delle chiavi di partizione è leggermente diversa in modo da corrispondere alla semantica di ogni API, come illustrato nella tabella seguente:The semantics for partition keys are slightly different to match the semantics of each API, as shown in the following table:

APIAPI Chiave di partizionePartition key Chiave di rigaRow key
Azure Cosmos DBAzure Cosmos DB Percorso personalizzato della chiave di partizioneCustom partition key path id fissoFixed id
MongoDBMongoDB Chiave personalizzata condivisaCustom shared key _id fissoFixed _id
GraficoGraph Proprietà chiave di partizione personalizzataCustom partition key property id fissoFixed id
TabellaTable PartitionKey fissoFixed PartitionKey RowKey fissoFixed RowKey

Azure Cosmos DB usa il partizionamento basato su hash.Azure Cosmos DB uses hash-based partitioning. Quando si scrive un elemento, Azure Cosmos DB esegue l'hashing del valore della chiave di partizione e usa il risultato con hash per determinare la partizione in cui archiviare l'elemento.When you write an item, Azure Cosmos DB hashes the partition key value and uses the hashed result to determine which partition to store the item in. Azure Cosmos DB archivia tutti gli elementi con la stessa chiave di partizione nella stessa partizione fisica.Azure Cosmos DB stores all items with the same partition key in the same physical partition. La scelta della chiave di partizione è una decisione importante da prendere in fase di progettazione.The choice of the partition key is an important decision that you have to make at design time. È necessario scegliere un nome proprietà che contenga un'ampia gamma di valori e abbia anche modelli di accesso.You must pick a property name that has a wide range of values and has even access patterns. Se una partizione fisica raggiunge il limite di archiviazione e tutti i dati della partizione appartengono alla stessa chiave di partizione, Azure Cosmos DB restituisce un errore che informa che la chiave di partizione ha raggiunto le dimensioni massime di 10 GB e la partizione non viene divisa, pertanto la scelta della chiave di partizione è una decisione molto importante.If a physical partition reaches it's storage limit and the same partition key is on all the data in the partition, Azure Cosmos DB returns the "Partition key reached maximum size of 10 GB" error, and the partition is not split, thus choosing a partition key is a very important decision.

Nota

È consigliabile avere una chiave di partizione con molti valori distinti (centinaia di migliaia come minimo).It's a best practice to have a partition key with many distinct values (hundreds to thousands at a minimum).

I contenitori di Azure Cosmos DB possono essere creati come fissi o senza limitazioni nel portale di Azure.Azure Cosmos DB containers can be created as fixed or unlimited in the Azure portal. I contenitori a dimensione fissa hanno un limite massimo di 10 GB e velocità effettiva di 10.000 UR/s.Fixed-size containers have a maximum limit of 10 GB and 10,000 RU/s throughput. Per creare un contenitore senza limitazioni, è necessario specificare una velocità effettiva minima di 1.000 UR/s e una chiave di partizione.To create a container as unlimited, you must specify a minimum throughput of 1,000 RU/s and you must specify a partition key.

È consigliabile controllare la modalità di distribuzione dei dati nelle partizioni.It is a good idea to check how your data is distributed in partitions. Per eseguire il controllo nel portale, accedere al proprio account Azure Cosmos DB e fare clic su Metrics (Metriche) nella sezione Monitoring (Monitoraggio) e quindi nel riquadro destro fare clic sulla scheda storage (Archiviazione) per visualizzare come sono partizionati i dati nelle diverse partizioni fisiche.To check this in portal, go to your Azure Cosmos DB account and click on Metrics in Monitoring section and then on right pane click on storage tab to see how your data is partitioned in different physical partition.

Partizionamento delle risorse

L'immagine a sinistra mostra il risultato di una chiave di partizione non valida l'immagine a destra mostra il risultato di una chiave di partizione valida.The left image shows the result of a bad partition key and the right image shows the result of a good partition key. Nell'immagine a sinistra è possibile vedere che i dati non sono distribuiti uniformemente tra le partizioni.In left image, you can see the data is not evenly distributed among partitions. È consigliabile distribuire i dati in modo che il grafico sia simile all'immagine di destra.You should strive to distribute your data so your graph looks similar to right image.

Prerequisiti per il partizionamentoPrerequisites for partitioning

Per consentire la suddivisione automatica delle partizioni fisiche in p1 e p2, come descritto nella sezione Funzionamento del partizionamento, è necessario creare il contenitore con una velocità effettiva di almeno 1.000 UR/s e specificare una chiave di partizione.For physical partitions to auto-split into p1 and p2 as described in How does partitioning work, the container must be created with a throughput of 1,000 RU/s or more, and a partition key must be provided. Durante la creazione di un contenitore nel portale di Azure selezionare l'opzione di capacità di archiviazione Senza limitazioni per sfruttare i vantaggi del partizionamento e del ridimensionamento automatico.When creating a container in the Azure portal, select the Unlimited storage capacity option to take advantage of partitioning and auto-scaling.

Se si è creato un contenitore nel portale di Azure o a livello di programmazione con una velocità effettiva iniziale di almeno 1.000 UR/s e se i dati includono una chiave di partizione, è possibile sfruttare i vantaggi del partizionamento senza modificare il contenitore, inclusi i contenitori con dimensioni fisse, purché il contenitore iniziale sia stato creato con una velocità effettiva di almeno 1.000 UR/s e una chiave di partizione sia presente nei dati.If you created a container in the Azure portal or programmatically and the initial throughput was 1,000 RU/s or more, and your data includes a partition key, you can take advantage of partitioning with no changes to your container - this includes Fixed size containers, so long as the initial container was created with at least 1,000 RU/s in througput, and a partition key is present in the data.

Se si è creato un contenitore di dimensioni fisse senza chiave di partizione o un contenitore di dimensioni fisse con una velocità effettiva inferiore a 1.000 UR/s, il contenitore non può essere suddiviso automaticamente come descritto in questo articolo.If you created a Fixed size container with no partition key, or created a Fixed size container with throughput less than 1,000 RU/s, the container cannot auto-split as described in this article. Per eseguire la migrazione dei dati da un contenitore di questo tipo a un contenitore senza limitazioni, ossia con una velocità effettiva di almeno 1.000 UR/s e una chiave di partizione, è necessario usare l'Utilità di migrazione dati o la libreria di feed di modifiche per eseguire la migrazione delle modifiche.To migrate data from container like this to an unlimited container (one with at least 1,000 RU/s in throughput, and a partition key), you need to use the Data Migration tool or the Change Feed library to migrate the changes.

Partizionamento e velocità effettiva con provisioningPartitioning and provisioned throughput

Azure Cosmos DB è progettato per prestazioni prevedibili.Azure Cosmos DB is designed for predictable performance. Quando si crea un contenitore, la velocità effettiva viene riservata in termini di unità richiesta (UR) al secondo.When you create a container, you reserve throughput in terms of request units (RU) per second. A ogni richiesta viene assegnato un addebito delle UR proporzionato alla quantità di risorse di sistema, come CPU, memoria e I/O usati dall'operazione.Each request is assigned a RU charge that is proportionate to the amount of system resources like CPU, memory, and IO consumed by the operation. La lettura di un documento di 1 KB con coerenza di sessione usa 1 UR.A read of a 1-KB document with session consistency consumes 1 RU. Un'operazione di lettura corrisponde a 1 RU indipendentemente dal numero di elementi archiviati o dal numero di richieste simultanee in esecuzione contemporaneamente.A read is 1 RU regardless of the number of items stored or the number of concurrent requests running at the same time. Elementi di dimensioni maggiori richiedono più UR a seconda delle dimensioni.Larger items require higher RUs depending on the size. Se si conoscono le dimensioni delle entità e il numero di letture che è necessario supportare per l'applicazione, è possibile eseguire il provisioning della quantità esatta di velocità effettiva necessaria per le esigenze di lettura dell'applicazione.If you know the size of your entities and the number of reads you need to support for your application, you can provision the exact amount of throughput required for your application's read needs.

Nota

Per ottenere la velocità effettiva totale del contenitore è necessario scegliere una chiave di partizione che consenta di distribuire in modo uniforme le richieste tra alcuni valori distinti della chiave di partizione.To achieve the full throughput of the container, you must choose a partition key that allows you to evenly distribute requests among some distinct partition key values.

Uso delle API di Azure Cosmos DBWork with the Azure Cosmos DB APIs

È possibile usare il portale di Azure o l'interfaccia della riga di comando di Azure per creare contenitori e ridimensionarli in qualsiasi momento.You can use the Azure portal or Azure CLI to create containers and scale them at any time. Questa sezione illustra come creare contenitori e specificare la definizione di velocità effettiva e chiave di partizione in ognuna delle API supportate.This section shows how to create containers and specify the throughput and partition key definition in each of the supported APIs.

API di Azure Cosmos DBAzure Cosmos DB API

L'esempio seguente illustra come creare un contenitore (raccolta) usando l'API di Azure Cosmos DB.The following sample shows how to create a container (collection) by using the Azure Cosmos DB API.

DocumentClient client = new DocumentClient(new Uri(endpoint), authKey);
await client.CreateDatabaseAsync(new Database { Id = "db" });

DocumentCollection myCollection = new DocumentCollection();
myCollection.Id = "coll";
myCollection.PartitionKey.Paths.Add("/deviceId");

await client.CreateDocumentCollectionAsync(
    UriFactory.CreateDatabaseUri("db"),
    myCollection,
    new RequestOptions { OfferThroughput = 20000 });

È possibile leggere un elemento (documento) tramite il metodo GET nell'API REST oppure usando ReadDocumentAsync in un SDK.You can read an item (document) by using the GET method in the REST API or by using ReadDocumentAsync in one of the SDKs.

// Read document. Needs the partition key and the ID to be specified
DeviceReading document = await client.ReadDocumentAsync<DeviceReading>(
  UriFactory.CreateDocumentUri("db", "coll", "XMS-001-FE24C"), 
  new RequestOptions { PartitionKey = new PartitionKey("XMS-0001") });

API di MongoDBMongoDB API

Con l'API MongoDB è possibile creare una raccolta partizionata usando il proprio strumento, driver o SDK preferito.With the MongoDB API, you can create a sharded collection through your favorite tool, driver, or SDK. In questo esempio verrà usato Mongo Shell per la creazione della raccolta.In this example, we use the Mongo Shell for the collection creation.

In Mongo Shell:In the Mongo Shell:

db.runCommand( { shardCollection: "admin.people", key: { region: "hashed" } } )

Risultati:Results:

{
    "_t" : "ShardCollectionResponse",
    "ok" : 1,
    "collectionsharded" : "admin.people"
}

API di tabellaTable API

Per creare una tabella mediante l'API Tabelle di Azure Cosmos DB, usare il metodo CreateIfNotExists.To create a table using the Azure Cosmos DB Table API, use the CreateIfNotExists method.

CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

CloudTable table = tableClient.GetTableReference("people");
table.CreateIfNotExists(throughput: 800);

La velocità effettiva viene impostata come argomento di CreateIfNotExists.Throughput is set as an argument of CreateIfNotExists.

La chiave di partizione viene creata implicitamente come valore PartitionKey.The partition key is implicitly created as the PartitionKey value.

È possibile recuperare una singola entità tramite il frammento seguente:You can retrieve a single entity by using the following snippet:

// Create a retrieve operation that takes a customer entity.
TableOperation retrieveOperation = TableOperation.Retrieve<CustomerEntity>("Smith", "Ben");

// Execute the retrieve operation.
TableResult retrievedResult = table.Execute(retrieveOperation);

Per altre informazioni, vedere Sviluppare con l'API Table.For more information, see Develop with the Table API.

API GraphGraph API

Con l'API Graph è necessario usare il portale o l'interfaccia della riga di comando di Azure per creare contenitori.With the Graph API, you must use the Azure portal or Azure CLI to create containers. Essendo Azure Cosmos DB multimodello, in alternativa è possibile usare un altro modello per creare e ridimensionare il contenitore di grafici.Alternatively, because Azure Cosmos DB is multimodel, you can use one of the other models to create and scale your graph container.

È possibile leggere qualsiasi vertice o arco usando la chiave di partizione e l'ID in Gremlin.You can read any vertex or edge by using the partition key and ID in Gremlin. Per un grafico con area ("USA") come chiave di partizione e "Seattle" come chiave di riga, ad esempio, è possibile trovare un vertice usando la sintassi seguente:For example, for a graph with region ("USA") as the partition key and "Seattle" as the row key, you can find a vertex by using the following syntax:

g.V(['USA', 'Seattle'])

È possibile fare riferimento a un arco usando la chiave di partizione e la chiave di riga.You can reference an edge by using the partition key and the row key.

g.E(['USA', 'I5'])

Per altre informazioni, vedere Gremlin support for Azure Cosmos DB (Supporto Gremlin per Azure Cosmos DB).For more information, see Gremlin support for Azure Cosmos DB.

Progettazione del partizionamentoDesign for partitioning

Per ridimensionare in modo efficace con Azure Cosmos DB è necessario selezionare una chiave di partizione valida quando si crea il contenitore.To scale effectively with Azure Cosmos DB, you need to pick a good partition key when you create your container. È necessario considerare due aspetti principali nella scelta di una chiave di partizione:There are two main considerations for choosing a partition key:

  • Limite per query e transazioni.Boundary for query and transactions. La scelta della chiave di partizione deve bilanciare la necessità di consentire l'uso di transazioni rispetto al requisito di distribuire le entità tra più chiavi di partizione per garantire una soluzione scalabile.Your choice of partition key should balance the need to enable the use of transactions against the requirement to distribute your entities across multiple partition keys to ensure a scalable solution. Da una parte è possibile impostare la stessa chiave di partizione per tutti gli elementi. Questa opzione potrebbe comunque limitare la scalabilità della soluzione.At one extreme, you can set the same partition key for all your items, but this option might limit the scalability of your solution. Dall'altra è possibile assegnare una chiave di partizione univoca per ogni elemento.At the other extreme, you can assign a unique partition key for each item. Questa scelta è altamente scalabile, ma impedisce di usare transazioni tra documenti tramite stored procedure e trigger.This choice is highly scalable, but it prevents you from using cross-document transactions via stored procedures and triggers. Una chiave di partizione ideale consente di usare query efficienti e dispone di una quantità di cardinalità idonea a garantire la scalabilità della soluzione.An ideal partition key enables you to use efficient queries and has sufficient cardinality to ensure your solution is scalable.
  • Evitare i colli di bottiglia in termini di archiviazione e prestazioni.No storage and performance bottlenecks. È importante scegliere una proprietà che consenta di distribuire le scritture su una serie di valori distinti.It's important to pick a property that allows writes to be distributed across various distinct values. Le richieste per la stessa chiave di partizione non possono superare la velocità effettiva di una partizione singola e vengono limitate.Requests to the same partition key can't exceed the throughput of a single partition and are throttled. È quindi importante scegliere una chiave di partizione che non generi "aree sensibili" all'interno dell'applicazione.So it's important to pick a partition key that doesn't result in "hot spots" within your application. Poiché tutti i dati per una singola chiave di partizione devono essere archiviati in una partizione, è consigliabile evitare le chiavi di partizione con volumi elevati di dati per lo stesso valore.Because all the data for a single partition key must be stored within a partition, you should avoid partition keys that have high volumes of data for the same value.

Verranno ora esaminati alcuni scenari reali con le chiavi di partizione corrette per ognuno:Let's look at a few real-world scenarios and good partition keys for each:

  • Se si implementa un back-end del profilo utente, l'ID utente rappresenta la scelta ideale per la chiave di partizione.If you're implementing a user profile back end, the user ID is a good choice for partition key.
  • Se si archiviano dati IoT, ad esempio lo stato del dispositivo, l'ID dispositivo rappresenta la scelta ideale per la chiave di partizione.If you're storing IoT data, for example, device state, a device ID is a good choice for partition key.
  • Se si usa Azure Cosmos DB per la registrazione di dati di serie temporali, il nome host o l'ID processo rappresenta la scelta ottimale per la chiave di partizione.If you're using Azure Cosmos DB for logging time-series data, the hostname or process ID is a good choice for partition key.
  • Se si dispone di un'architettura multi-tenant, l'ID tenant rappresenta la scelta ideale per la chiave di partizione.If you have a multitenant architecture, the tenant ID is a good choice for partition key.

In alcuni casi d'uso, come l'IoT e i profili utente, la chiave di partizione può corrispondere all'ID (chiave del documento).In some use cases, like IoT and user profiles, the partition key might be the same as your ID (document key). In altri casi, come ad esempio i dati di serie temporali, la chiave di partizione potrebbe essere diversa rispetto all'ID.In others, like the time-series data, you might have a partition key that's different from the ID.

Partizionamento e registrazione di dati di serie temporaliPartitioning and logging/time-series data

Uno dei casi d'uso più comuni di Azure Cosmos DB è rappresentato da registrazione e telemetria.One of the common use cases of Azure Cosmos DB is for logging and telemetry. È importante scegliere una chiave di partizione efficace perché potrebbe essere necessario scrivere/leggere grandi volumi di dati.It's important to pick a good partition key, because you might need to read/write vast volumes of data. La scelta dipende dalla frequenza di lettura e scrittura e dai tipi di query che si prevede di eseguire.The choice depends on your read-and-write rates and the kinds of queries you expect to run. Di seguito sono riportati alcuni suggerimenti su come scegliere una chiave di partizione efficace:Here are some tips on how to choose a good partition key:

  • Se il caso d'uso prevede frequenze di scrittura ridotte che si accumulano nel tempo ed è necessario eseguire una query per intervalli di timestamp e altri filtri, usare un'implementazione del timestamp.If your use case involves a small rate of writes that accumulate over a long time and you need to query by ranges of time stamps and other filters, use a rollup of the time stamp. Ad esempio, un approccio valido consiste nell'usare la data come chiave di partizione.For example, a good approach is to use date as a partition key. Con questo approccio è possibile eseguire query su tutti i dati per una data da una singola partizione.With this approach, you can query over all the data for a date from a single partition.
  • Se il carico di lavoro prevede molte scritture, scenario più comune, usare una chiave di partizione non basata su timestamp.If your workload is written heavy, which is more common, use a partition key that's not based on time stamp. Con questo approccio Azure Cosmos DB può distribuire in modo uniforme le scritture in più partizioni.With this approach, Azure Cosmos DB can distribute writes evenly across various partitions. In questo caso, un nome host, un ID processo, un ID attività o un'altra proprietà con una cardinalità elevata è una scelta efficace.Here a hostname, process ID, activity ID, or another property with high cardinality is a good choice.
  • Un altro approccio è quello ibrido, in cui si hanno più contenitori, uno per ogni giorno/mese, e la chiave di partizione è una proprietà granulare, ad esempio un nome host.Another approach is a hybrid one where you have multiple containers, one for each day/month, and the partition key is a granular property like hostname. Questo approccio offre il vantaggio di impostare una velocità effettiva diversa in base all'intervallo di tempo.This approach has the benefit that you can set different throughput based on the time window. Ad esempio, il contenitore per il mese in corso viene sottoposto a provisioning con una velocità effettiva superiore, poiché gestisce letture e scritture.For example, the container for the current month is provisioned with higher throughput because it serves reads and writes. I mesi precedenti vengono sottoposti a provisioning con velocità effettiva inferiore poiché gestisce solo letture.Previous months are provisioned with lower throughput because they only serve reads.

Partizionamento e multi-tenancyPartitioning and multitenancy

Se si implementa un'applicazione multi-tenant usando Azure Cosmos DB, sono disponibili due criteri comuni: una chiave di partizione per ogni tenant e un contenitore per ogni tenant.If you're implementing a multitenant application by using Azure Cosmos DB, there are two popular patterns: one partition key per tenant and one container per tenant. Di seguito sono riportati vantaggi e svantaggi di ogni modello:Here are the pros and cons for each:

  • Una chiave di partizione per ogni tenant.One partition key per tenant. In questo modello i tenant vengono collocati all'interno di un singolo contenitore.In this model, tenants are collocated within a single container. Le query e gli inserimenti di elementi all'interno di un tenant possono essere tuttavia eseguiti a fronte di una partizione singola.But queries and inserts for items within a single tenant can be performed against a single partition. È anche possibile implementare la logica transazionale su tutti gli elementi all'interno di un tenant.You can also implement transactional logic across all items within a tenant. Poiché più tenant condividono un contenitore, è possibile risparmiare i costi di archiviazione e velocità effettiva raggruppando le risorse per i tenant all'interno di un singolo contenitore invece di eseguire il provisioning di capacità aggiuntiva per ogni tenant.Because multiple tenants share a container, you can save storage and throughput costs by pooling resources for tenants within a single container rather than provisioning extra headroom for each tenant. Lo svantaggio è che non si ottiene l'isolamento delle prestazioni per ogni tenant.The drawback is that you don't have performance isolation per tenant. Gli aumenti di prestazioni/velocità effettiva si applicano all'intero contenitore rispetto agli aumenti previsti per i tenant.Performance/throughput increases apply to the entire container versus targeted increases for tenants.
  • Un contenitore per ogni tenant.One container per tenant. In questo modello ogni tenant dispone di un proprio contenitore ed è possibile riservare prestazioni per ogni tenant.In this model, each tenant has its own container, and you can reserve performance per tenant. Con il nuovo tariffario per il provisioning di Azure Cosmos DB, questo modello è più conveniente per applicazioni multi-tenant con un numero ridotto di tenant.With the Azure Cosmos DB new provisioning pricing, this model is more cost-effective for multitenant applications with a few tenants.

È anche possibile usare un approccio combinato/a livelli che colloca tenant di dimensioni ridotte ed esegue la migrazione di tenant di dimensioni maggiori al relativo contenitore.You can also use a combination/tiered approach that collocates small tenants and migrates larger tenants to their own container.

Passaggi successiviNext steps

In questo articolo è stata illustrata una panoramica di concetti e procedure consigliate per il partizionamento con qualsiasi API di Azure Cosmos DB.In this article, we provided an overview of concepts and best practices for partitioning with any Azure Cosmos DB API.