Partitionering en horizontaal schalen in Azure Cosmos DBPartitioning and horizontal scaling in Azure Cosmos DB

VAN TOEPASSING OP: SQL-API Cassandra-API Gremlin-API Table-API Azure Cosmos DB-API voor MongoDB

Azure Cosmos DB maakt gebruik van partitionering om afzonderlijke containers in een Data Base te schalen om te voldoen aan de prestatie behoeften van uw toepassing.Azure Cosmos DB uses partitioning to scale individual containers in a database to meet the performance needs of your application. In partitioneren worden de items in een container onderverdeeld in afzonderlijke subsets met de naam logische partities .In partitioning, the items in a container are divided into distinct subsets called logical partitions . Logische partities worden gevormd op basis van de waarde van een partitie sleutel die is gekoppeld aan elk item in een container.Logical partitions are formed based on the value of a partition key that is associated with each item in a container. Alle items in een logische partitie hebben dezelfde partitie sleutel waarde.All the items in a logical partition have the same partition key value.

Een container bevat bijvoorbeeld items.For example, a container holds items. Elk item heeft een unieke waarde voor de UserID eigenschap.Each item has a unique value for the UserID property. Als UserID fungeert als de partitie sleutel voor de items in de container en er 1.000 unieke UserID waarden zijn, worden er voor de container 1.000 logische partities gemaakt.If UserID serves as the partition key for the items in the container and there are 1,000 unique UserID values, 1,000 logical partitions are created for the container.

Naast een partitie sleutel die de logische partitie van het item bepaalt, heeft elk item in een container een item-id (uniek binnen een logische partitie).In addition to a partition key that determines the item's logical partition, each item in a container has an item ID (unique within a logical partition). Als de partitie sleutel en de item-id worden gecombineerd, wordt de index van het item gemaakt, waarmee het item op unieke wijze wordt geïdentificeerd.Combining the partition key and the item ID creates the item's index , which uniquely identifies the item. Het kiezen van een partitie sleutel is een belang rijke beslissing die invloed heeft op de prestaties van uw toepassing.Choosing a partition key is an important decision that will affect your application's performance.

In dit artikel wordt de relatie tussen logische en fysieke partities uitgelegd.This article explains the relationship between logical and physical partitions. Daarnaast worden de aanbevolen procedures voor het partitioneren beschreven en wordt een uitgebreide weer gave geboden op de manier waarop horizontale schaling werkt in Azure Cosmos DB.It also discusses best practices for partitioning and gives an in-depth view at how horizontal scaling works in Azure Cosmos DB. Het is niet nodig om deze interne gegevens te begrijpen om uw partitie sleutel te selecteren, maar we hebben deze gedekt, zodat u over de duidelijkheid beschikt over de werking van Azure Cosmos DB.It's not necessary to understand these internal details to select your partition key but we have covered them so you have clarity on how Azure Cosmos DB works.

Logische partitiesLogical partitions

Een logische partitie bestaat uit een set items die dezelfde partitie sleutel hebben.A logical partition consists of a set of items that have the same partition key. In een container die bijvoorbeeld gegevens bevat over voedsel voeding, bevatten alle items een foodGroup eigenschap.For example, in a container that contains data about food nutrition, all items contain a foodGroup property. U kunt gebruiken foodGroup als de partitie sleutel voor de container.You can use foodGroup as the partition key for the container. Groepen van items waarvoor specifieke waarden zijn opgegeven voor foodGroup , zoals Beef Products , Baked Products en Sausages and Luncheon Meats , vormen afzonderlijke logische partities.Groups of items that have specific values for foodGroup, such as Beef Products, Baked Products, and Sausages and Luncheon Meats, form distinct logical partitions. U hoeft zich geen zorgen te maken over het verwijderen van een logische partitie wanneer de onderliggende gegevens worden verwijderd.You don't have to worry about deleting a logical partition when the underlying data is deleted.

Een logische partitie definieert ook het bereik van database transacties.A logical partition also defines the scope of database transactions. U kunt items binnen een logische partitie bijwerken met behulp van een trans actie met snap shot-isolatie.You can update items within a logical partition by using a transaction with snapshot isolation. Wanneer nieuwe items worden toegevoegd aan een container, worden nieuwe logische partities transparant gemaakt door het systeem.When new items are added to a container, new logical partitions are transparently created by the system.

Er is geen limiet voor het aantal logische partities in de container.There is no limit to the number of logical partitions in your container. Elke logische partitie kan Maxi maal 20 GB aan gegevens bevatten.Each logical partition can store up to 20GB of data. Goede opties voor de partitie sleutel hebben een breed scala aan mogelijke waarden.Good partition key choices have a wide range of possible values. Bijvoorbeeld, in een container waarin alle items een eigenschap bevatten foodGroup , kunnen de gegevens in de Beef Products logische partitie Maxi maal 20 GB groot zijn.For example, in a container where all items contain a foodGroup property, the data within the Beef Products logical partition can grow up to 20 GB. Als u een partitie sleutel selecteert met een breed scala aan mogelijke waarden, zorgt u ervoor dat de container kan worden geschaald.Selecting a partition key with a wide range of possible values ensures that the container is able to scale.

Fysieke partitiesPhysical partitions

Een container wordt geschaald door gegevens en door voer te distribueren over fysieke partities.A container is scaled by distributing data and throughput across physical partitions. Intern worden een of meer logische partities toegewezen aan één fysieke partitie.Internally, one or more logical partitions are mapped to a single physical partition. Doorgaans hebben kleinere containers een groot aantal logische partities, maar er is slechts één fysieke partitie nodig.Typically smaller containers have many logical partitions but they only require a single physical partition. In tegens telling tot logische partities vormen fysieke partities een interne implementatie van het systeem en ze worden volledig beheerd door Azure Cosmos DB.Unlike logical partitions, physical partitions are an internal implementation of the system and they are entirely managed by Azure Cosmos DB.

Het aantal fysieke partities in de container is afhankelijk van de volgende configuratie:The number of physical partitions in your container depends on the following configuration:

  • Het aantal ingerichte door Voer (elke afzonderlijke fysieke partitie kan een doorvoer snelheid hebben van Maxi maal 10.000 aanvraag eenheden per seconde).The number of throughput provisioned (each individual physical partition can provide a throughput of up to 10,000 request units per second).
  • De totale gegevens opslag (elke afzonderlijke fysieke partitie kan Maxi maal 50 GB gegevens bevatten).The total data storage (each individual physical partition can store up to 50GB data).

Er is geen limiet voor het totale aantal fysieke partities in de container.There is no limit to the total number of physical partitions in your container. Als uw ingerichte door Voer of gegevens grootte groeit, Azure Cosmos DB automatisch nieuwe fysieke partities maken door bestaande te splitsen.As your provisioned throughput or data size grows, Azure Cosmos DB will automatically create new physical partitions by splitting existing ones. Fysieke partitie splitsingen hebben geen invloed op de beschik baarheid van uw toepassing.Physical partition splits do not impact your application's availability. Nadat de fysieke partitie is gesplitst, worden alle gegevens in één logische partitie nog steeds opgeslagen op dezelfde fysieke partitie.After the physical partition split, all data within a single logical partition will still be stored on the same physical partition. Een fysieke partitie splitsing maakt simpelweg een nieuwe toewijzing van logische partities aan fysieke partities.A physical partition split simply creates a new mapping of logical partitions to physical partitions.

De door Voer die is ingericht voor een container, wordt gelijkmatig verdeeld over fysieke partities.Throughput provisioned for a container is divided evenly among physical partitions. Een partitie sleutel ontwerp dat geen aanvragen gelijkmatig distribueert, kan leiden tot te veel aanvragen die worden omgeleid naar een kleine subset van partities die ' hot ' worden.A partition key design that doesn't distribute requests evenly might result in too many requests directed to a small subset of partitions that become "hot." Hot partitions leiden tot inefficiënt gebruik van ingerichte door Voer, wat kan leiden tot een snelheids beperking en hogere kosten.Hot partitions lead to inefficient use of provisioned throughput, which might result in rate-limiting and higher costs.

U kunt de fysieke partities van uw container bekijken in de sectie opslag van de Blade metrische gegevens van de Azure portal:You can see your container's physical partitions in the Storage section of the Metrics blade of the Azure portal:

Aantal fysieke partities weer geven

In de bovenstaande scherm afbeelding is een container /foodGroup de partitie sleutel.In the above screenshot, a container has /foodGroup as the partition key. Elk van de drie balken in de grafiek vertegenwoordigt een fysieke partitie.Each of the three bars in the graph represents a physical partition. In de installatie kopie is het partitie sleutel bereik hetzelfde als een fysieke partitie.In the image, partition key range is the same as a physical partition. De geselecteerde fysieke partitie bevat drie logische partities: Beef Products , Vegetable and Vegetable Products en Soups, Sauces, and Gravies .The selected physical partition contains three logical partitions: Beef Products, Vegetable and Vegetable Products, and Soups, Sauces, and Gravies.

Als u een door Voer van 18.000 aanvraag eenheden per seconde (RU/s) inricht, kan elk van de drie fysieke partities 1/3 van de totale ingerichte door Voer gebruiken.If you provision a throughput of 18,000 request units per second (RU/s), then each of the three physical partition can utilize 1/3 of the total provisioned throughput. Binnen de geselecteerde fysieke partitie, de logische partitie sleutels Beef Products , Vegetable and Vegetable Products en Soups, Sauces, and Gravies kan gezamenlijk de 6.000 ingerichte ru/s van de fysieke partitie gebruiken.Within the selected physical partition, the logical partition keys Beef Products, Vegetable and Vegetable Products, and Soups, Sauces, and Gravies can, collectively, utilize the physical partition's 6,000 provisioned RU/s. Omdat de ingerichte door Voer gelijkmatig is verdeeld over de fysieke partities van uw container, is het belang rijk om een partitie sleutel te kiezen waarmee het doorvoer verbruik gelijkmatig kan worden verdeeld door de juiste logische partitie sleutel te kiezen.Because provisioned throughput is evenly divided across your container's physical partitions, it's important to choose a partition key that evenly distributes throughput consumption by choosing the right logical partition key.

Notitie

Als u een partitie sleutel kiest die het doorvoer verbruik gelijkmatig distribueert over logische partities, zorgt u ervoor dat het doorvoer verbruik over fysieke partities evenwichtig is.If you choose a partition key that evenly distributes throughput consumption across logical partitions, you will ensure that throughput consumption across physical partitions is balanced.

Logische partities beherenManaging logical partitions

Azure Cosmos DB transparant en beheert automatisch de plaatsing van logische partities op fysieke partities om efficiënt te voldoen aan de schaal baarheid en prestatie behoeften van de container.Azure Cosmos DB transparently and automatically manages the placement of logical partitions on physical partitions to efficiently satisfy the scalability and performance needs of the container. Naarmate de door Voer en opslag vereisten van een toepassing toenemen, Azure Cosmos DB logische partities verplaatsen om de belasting automatisch over een groter aantal fysieke partities te spreiden.As the throughput and storage requirements of an application increase, Azure Cosmos DB moves logical partitions to automatically spread the load across a greater number of physical partitions. U kunt meer te weten komen over fysieke partities.You can learn more about physical partitions.

Azure Cosmos DB gebruikt op hash gebaseerde partitionering om logische partities over fysieke partities te verdelen.Azure Cosmos DB uses hash-based partitioning to spread logical partitions across physical partitions. Azure Cosmos DB hashes de waarde van de partitie sleutel van een item.Azure Cosmos DB hashes the partition key value of an item. Het gehashte resultaat bepaalt de fysieke partitie.The hashed result determines the physical partition. Azure Cosmos DB wijst vervolgens de sleutel ruimte van partitie sleutel-hashes gelijkmatig over de fysieke partities toe.Then, Azure Cosmos DB allocates the key space of partition key hashes evenly across the physical partitions.

Trans acties (in opgeslagen procedures of triggers) zijn alleen toegestaan voor items in één logische partitie.Transactions (in stored procedures or triggers) are allowed only against items in a single logical partition.

Meer informatie over het beheren van partitiesvindt u in azure Cosmos db.You can learn more about how Azure Cosmos DB manages partitions. (Het is niet nodig om de interne gegevens te begrijpen om uw toepassingen te bouwen of uit te voeren, maar hier toe te voegen voor een nieuws lezer.)(It's not necessary to understand the internal details to build or run your applications, but added here for a curious reader.)

ReplicasetsReplica sets

Elke fysieke partitie bestaat uit een set replica's, ook wel een replicasetgenoemd.Each physical partition consists of a set of replicas, also referred to as a replica set. Elke replicaset host een exemplaar van de data base-engine.Each replica set hosts an instance of the database engine. Een replicaset zorgt ervoor dat de gegevens die zijn opgeslagen in de fysieke partitie, duurzaam, Maxi maal beschikbaar en consistent zijn.A replica set makes the data stored within the physical partition durable, highly available, and consistent. Elke replica die de fysieke partitie vormt, neemt de opslag limiet van de partitie over.Each replica that makes up the physical partition inherits the partition's storage quota. Alle replica's van een fysieke partitie ondersteunen gezamenlijk de door Voer die is toegewezen aan de fysieke partitie.All replicas of a physical partition collectively support the throughput that's allocated to the physical partition. Azure Cosmos DB worden automatisch replica sets beheerd.Azure Cosmos DB automatically manages replica sets.

Normaal gesp roken vereist kleinere containers alleen één fysieke partitie, maar ze hebben nog steeds ten minste vier replica's.Typically smaller containers only require a single physical partition but they will still have at least 4 replicas.

In de volgende afbeelding ziet u hoe logische partities worden toegewezen aan fysieke partities die globaal worden gedistribueerd:The following image shows how logical partitions are mapped to physical partitions that are distributed globally:

Een afbeelding die Azure Cosmos DB partitionering demonstreert

Een partitiesleutel kiezenChoosing a partition key

Een partitie sleutel bestaat uit twee onderdelen: het pad van de partitie sleutel en de waarde van de partitie sleutel .A partition key has two components: partition key path and the partition key value . U kunt bijvoorbeeld een item {"userId": "Andrew", "worksFor": "micro soft"} als u "userId" als de partitie sleutel kiest, de volgende twee partitie sleutel onderdelen zijn:For example, consider an item { "userId" : "Andrew", "worksFor": "Microsoft" } if you choose "userId" as the partition key, the following are the two partition key components:

  • Het pad van de partitie sleutel (bijvoorbeeld: "/userId").The partition key path (For example: "/userId"). Het pad naar de partitie sleutel accepteert alfanumerieke tekens en een onderstrepings teken ().The partition key path accepts alphanumeric and underscore() characters. U kunt geneste objecten ook gebruiken met behulp van de standaard notatie voor paden (/).You can also use nested objects by using the standard path notation(/).

  • De partitie sleutel waarde (bijvoorbeeld: ' Andrew ').The partition key value (For example: "Andrew"). De waarde van de partitie sleutel kan van teken reeks-of numerieke typen zijn.The partition key value can be of string or numeric types.

Zie het artikel Azure Cosmos DB Service quota's voor meer informatie over de limieten voor door Voer, opslag en de lengte van de partitie sleutel.To learn about the limits on throughput, storage, and length of the partition key, see the Azure Cosmos DB service quotas article.

Het selecteren van de partitie sleutel is een eenvoudige maar belang rijke ontwerp keuze in Azure Cosmos DB.Selecting your partition key is a simple but important design choice in Azure Cosmos DB. Wanneer u de partitie sleutel selecteert, is het niet mogelijk om deze in-place te wijzigen.Once you select your partition key, it is not possible to change it in-place. Als u de partitie sleutel moet wijzigen, moet u uw gegevens naar een nieuwe container verplaatsen met de nieuwe gewenste partitie sleutel.If you need to change your partition key, you should move your data to a new container with your new desired partition key.

Voor alle containers moet uw partitie sleutel:For all containers, your partition key should:

  • Een eigenschap zijn die een waarde heeft die niet verandert.Be a property that has a value which does not change. Als een eigenschap uw partitie sleutel is, kunt u de waarde van die eigenschap niet bijwerken.If a property is your partition key, you can't update that property's value.

  • Moet een hoge kardinaliteit hebben.Have a high cardinality. Met andere woorden, de eigenschap moet een breed scala aan mogelijke waarden hebben.In other words, the property should have a wide range of possible values.

  • Sprei ding-verbruik en gegevens opslag gelijkmatig over alle logische partities.Spread request unit (RU) consumption and data storage evenly across all logical partitions. Dit garandeert zelfs RU-verbruik en opslag distributie over uw fysieke partities.This ensures even RU consumption and storage distribution across your physical partitions.

Als u Meervoudige zuren-trans acties in azure Cosmos DB nodig hebt, moet u opgeslagen procedures of triggersgebruiken.If you need multi-item ACID transactions in Azure Cosmos DB, you will need to use stored procedures or triggers. Alle opgeslagen java script-procedures en triggers bevinden zich in een enkele logische partitie.All JavaScript-based stored procedures and triggers are scoped to a single logical partition.

Partitie sleutels voor Read-zware containersPartition keys for read-heavy containers

Voor de meeste containers gelden de bovenstaande criteria alleen wanneer u een partitie sleutel moet kiezen.For most containers, the above criteria is all you need to consider when picking a partition key. Voor grote alleen-lezen containers is het echter mogelijk dat u een partitie sleutel wilt kiezen die regel matig wordt weer gegeven als een filter in uw query's.For large read-heavy containers, however, you might want to choose a partition key that appears frequently as a filter in your queries. Query's kunnen efficiënt worden gerouteerd naar de relevante fysieke partities door de partitie sleutel op te nemen in het filter predicaat.Queries can be efficiently routed to only the relevant physical partitions by including the partition key in the filter predicate.

Als het meren deel van de aanvragen van uw werk belasting query's is en de meeste query's een gelijkheids filter hebben op dezelfde eigenschap, kan deze eigenschap een goede partitie sleutel zijn.If most of your workload's requests are queries and most of your queries have an equality filter on the same property, this property can be a good partition key choice. Als u bijvoorbeeld regel matig een query uitvoert waarmee op wordt gefilterd UserID en vervolgens de partitie sleutel selecteert, wordt UserID het aantal query's voor meerdere partitiesverminderd.For example, if you frequently run a query that filters on UserID, then selecting UserID as the partition key would reduce the number of cross-partition queries.

Als uw container echter klein is, hebt u waarschijnlijk niet genoeg fysieke partities om u zorgen te maken over de invloed van de prestaties van kruis partitie query's.However, if your container is small, you probably don't have enough physical partitions to need to worry about the performance impact of cross-partition queries. Voor de meeste kleine containers in Azure Cosmos DB zijn slechts één of twee fysieke partities vereist.Most small containers in Azure Cosmos DB only require one or two physical partitions.

Als uw container kan worden uitgebreid naar meer dan een paar fysieke partities, moet u ervoor zorgen dat u een partitie sleutel kiest die kruis partitie query's minimaliseert.If your container could grow to more than a few physical partitions, then you should make sure you pick a partition key that minimizes cross-partition queries. De container heeft meer dan een paar fysieke partities nodig wanneer aan een van de volgende voor waarden wordt voldaan:Your container will require more than a few physical partitions when either of the following are true:

  • Uw container heeft meer dan 30.000 RU ingerichtYour container will have over 30,000 RU's provisioned

  • In uw container worden gegevens van 100 GB opgeslagenYour container will store over 100 GB of data

Item-ID als de partitie sleutel gebruikenUsing item ID as the partition key

Als uw container een eigenschap heeft die een breed scala aan mogelijke waarden heeft, is het waarschijnlijk een goede keuze voor de partitie sleutel.If your container has a property that has a wide range of possible values, it is likely a great partition key choice. Een mogelijk voor beeld van een dergelijke eigenschap is de item-id .One possible example of such a property is the item ID . Voor kleine alleen-lezen containers of schrijf bare containers van elke grootte is de item-id natuurlijk een fantastische keuze voor de partitie sleutel.For small read-heavy containers or write-heavy containers of any size, the item ID is naturally a great choice for the partition key.

De item-id van de systeem eigenschap bevindt zich in elk item in de container.The system property item ID exists in every item in your container. Mogelijk hebt u andere eigenschappen die een logische ID van uw item vertegenwoordigen.You may have other properties that represent a logical ID of your item. In veel gevallen zijn dit ook fantastische opties voor partitie sleutels om dezelfde redenen als de item-id .In many cases, these are also great partition key choices for the same reasons as the item ID .

De item-id is een fantastische partitie sleutel keuze om de volgende redenen:The item ID is a great partition key choice for the following reasons:

  • Er zijn een breed scala aan mogelijke waarden (één unieke item-id per item).There are a wide range of possible values (one unique item ID per item).
  • Omdat er een unieke item-id per item is, heeft de item-id een uitstekende taak op gelijkmatige verdeling van het gebruik van ru en gegevens opslag.Because there is a unique item ID per item, the item ID does a great job at evenly balancing RU consumption and data storage.
  • U kunt eenvoudig efficiënte punt Lees bewerkingen uitvoeren omdat u altijd de partitie sleutel van een item weet als u de bijbehorende item-id kent.You can easily do efficient point reads since you'll always know an item's partition key if you know its item ID .

Hieronder vindt u enkele aandachtspunten bij het selecteren van de item-id als de partitie sleutel:Some things to consider when selecting the item ID as the partition key include:

  • Als de item-id de partitie sleutel is, wordt deze in de gehele container een unieke id.If the item ID is the partition key, it will become a unique identifier throughout your entire container. U kunt geen items met een dubbele item-id hebben.You won't be able to have items that have a duplicate item ID .
  • Als u een lees-zware container hebt die een groot aantal fysieke partitiesheeft, zijn query's efficiënter als ze een gelijkheids filter met de item-id hebben.If you have a read-heavy container that has a lot of physical partitions, queries will be more efficient if they have an equality filter with the item ID .
  • Opgeslagen procedures of triggers kunnen niet over meerdere logische partities worden uitgevoerd.You can't run stored procedures or triggers across multiple logical partitions.

Volgende stappenNext steps