Dělení a horizontální škálování ve službě Azure Cosmos DBPartitioning and horizontal scaling in Azure Cosmos DB

PLATÍ pro: rozhraní SQL api rozhraní API CASSANDRA Gremlin API rozhraní API pro tabulky Azure Cosmos DB API pro MongoDB

Azure Cosmos DB používá dělení ke škálování jednotlivých kontejnerů v databázi tak, aby splňovaly požadavky vaší aplikace na výkon.Azure Cosmos DB uses partitioning to scale individual containers in a database to meet the performance needs of your application. Při dělení jsou položky v kontejneru rozděleny do samostatných dílčích množin nazývaných logické oddíly.In partitioning, the items in a container are divided into distinct subsets called logical partitions. Logické oddíly se vytvoří na základě hodnoty klíče oddílu , který je spojený s každou položkou v kontejneru.Logical partitions are formed based on the value of a partition key that is associated with each item in a container. Všechny položky v logickém oddílu mají stejnou hodnotu klíče oddílu.All the items in a logical partition have the same partition key value.

Například kontejner obsahuje položky.For example, a container holds items. Každá položka má jedinečnou hodnotu pro UserID vlastnost.Each item has a unique value for the UserID property. Pokud UserID slouží jako klíč oddílu pro položky v kontejneru a jsou-li k dispozici jedinečné UserID hodnoty 1 000, jsou pro kontejner vytvořeny logické oddíly 1 000.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.

Kromě klíče oddílu, který určuje logický oddíl položky, každá položka v kontejneru má ID položky (jedinečné v rámci logického oddílu).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). Kombinování klíče oddílu a ID položky vytvoří index položky, který položku jednoznačně identifikuje.Combining the partition key and the item ID creates the item's index, which uniquely identifies the item. Výběr klíče oddílu je důležité rozhodnutí, které bude mít vliv na výkon vaší aplikace.Choosing a partition key is an important decision that will affect your application's performance.

Tento článek vysvětluje vztah mezi logickými a fyzickými oddíly.This article explains the relationship between logical and physical partitions. Popisuje také osvědčené postupy pro dělení a poskytuje podrobné zobrazení, jak horizontální škálování funguje v 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. Není nutné porozumět těmto interním podrobnostem, abyste mohli vybrat klíč oddílu, ale my jsme je pokryli, abyste měli jasnou představu o tom, jak Azure Cosmos DB funguje.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.

Logické oddílyLogical partitions

Logický oddíl obsahuje sadu položek, které mají stejný klíč oddílu.A logical partition consists of a set of items that have the same partition key. Například v kontejneru, který obsahuje data o výživě potravin, všechny položky obsahují foodGroup vlastnost.For example, in a container that contains data about food nutrition, all items contain a foodGroup property. Můžete použít foodGroup jako klíč oddílu pro kontejner.You can use foodGroup as the partition key for the container. Skupiny položek, které mají specifické hodnoty pro foodGroup , například, Beef Products Baked Products a Sausages and Luncheon Meats , tvoří rozdílné logické oddíly.Groups of items that have specific values for foodGroup, such as Beef Products, Baked Products, and Sausages and Luncheon Meats, form distinct logical partitions.

Logický oddíl také definuje rozsah databázových transakcí.A logical partition also defines the scope of database transactions. Položky v rámci logického oddílu lze aktualizovat pomocí transakce s izolací snímku.You can update items within a logical partition by using a transaction with snapshot isolation. Při přidání nových položek do kontejneru jsou nové logické oddíly transparentně vytvořeny systémem.When new items are added to a container, new logical partitions are transparently created by the system. Nemusíte si dělat starosti s odstraněním logického oddílu, pokud jsou podkladová data odstraněna.You don't have to worry about deleting a logical partition when the underlying data is deleted.

Počet logických oddílů ve vašem kontejneru není nijak omezený.There is no limit to the number of logical partitions in your container. Každý logický oddíl může ukládat až 20 GB dat.Each logical partition can store up to 20GB of data. Dobrá volba klíče oddílu má široké spektrum možných hodnot.Good partition key choices have a wide range of possible values. Například v kontejneru, kde všechny položky obsahují foodGroup vlastnost, může data v rámci Beef Products logického oddílu růst až 20 GB.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. Výběr klíče oddílu s široké škálou možných hodnot zajistí, že kontejner bude schopný škálovat.Selecting a partition key with a wide range of possible values ensures that the container is able to scale.

Fyzické oddílyPhysical partitions

Kontejner se škáluje distribucí dat a propustnosti mezi fyzickými oddíly.A container is scaled by distributing data and throughput across physical partitions. Interně je jeden nebo více logických oddílů namapovaných na jeden fyzický oddíl.Internally, one or more logical partitions are mapped to a single physical partition. Obvykle menší kontejnery mají mnoho logických oddílů, ale vyžadují jenom jeden fyzický oddíl.Typically smaller containers have many logical partitions but they only require a single physical partition. Na rozdíl od logických oddílů jsou fyzické oddíly interní implementací systému a jsou výhradně spravovány Azure Cosmos DB.Unlike logical partitions, physical partitions are an internal implementation of the system and they are entirely managed by Azure Cosmos DB.

Počet fyzických oddílů ve vašem kontejneru závisí na následujících:The number of physical partitions in your container depends on the following:

  • Stanovený počet propustnosti (každý jednotlivý fyzický oddíl může poskytovat propustnost až 10 000 jednotek žádostí za sekundu).The number of throughput provisioned (each individual physical partition can provide a throughput of up to 10,000 request units per second). Omezení 10 000 RU/s pro fyzické oddíly znamená, že logické oddíly mají taky limit 10 000 RU/s, protože každý logický oddíl je namapovaný jenom na jeden fyzický oddíl.The 10,000 RU/s limit for physical partitions implies that logical partitions also have a 10,000 RU/s limit, as each logical partition is only mapped to one physical partition.

  • Celkové úložiště dat (každý jednotlivý fyzický oddíl může ukládat až 50 GB data).The total data storage (each individual physical partition can store up to 50GB data).

Poznámka

Fyzické oddíly jsou interní implementace systému a jsou výhradně spravované pomocí Azure Cosmos DB.Physical partitions are an internal implementation of the system and they are entirely managed by Azure Cosmos DB. Při vývoji řešení se nemusíte soustředit na fyzické oddíly, protože je nemůžete ovládat.When developing your solutions, don't focus on physical partitions because you can't control them. Místo toho se zaměřte na klíče oddílů.Instead, focus on your partition keys. Pokud zvolíte klíč oddílu, který rovnoměrně distribuuje spotřebu propustnosti napříč logickými oddíly, zajistíte rovnováhu propustnosti mezi fyzickými oddíly.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.

Celkový počet fyzických oddílů ve vašem kontejneru není nijak omezený.There is no limit to the total number of physical partitions in your container. Jak vaše zřízená propustnost nebo velikost dat roste, Azure Cosmos DB automaticky vytvoří nové fyzické oddíly tím, že se rozdělí stávající.As your provisioned throughput or data size grows, Azure Cosmos DB will automatically create new physical partitions by splitting existing ones. Rozdělení fyzického oddílu nemá vliv na dostupnost vaší aplikace.Physical partition splits do not impact your application's availability. Po rozdělení fyzického oddílu budou všechna data v jednom logickém oddílu stále uložena ve stejném fyzickém oddílu.After the physical partition split, all data within a single logical partition will still be stored on the same physical partition. Rozdělení fyzického oddílu jednoduše vytvoří nové mapování logických oddílů na fyzické oddíly.A physical partition split simply creates a new mapping of logical partitions to physical partitions.

Propustnost zřízená pro kontejner je rozdělená rovnoměrně mezi fyzické oddíly.Throughput provisioned for a container is divided evenly among physical partitions. Návrh klíče oddílu, který nedistribuuje požadavky rovnoměrně, může mít za následek příliš mnoho požadavků směrovaných na malou podmnožinu oddílů, které se stanou "horkou".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 vede k neefektivnímu využití zřízené propustnosti, což může vést k omezení rychlosti a vyššímu počtu nákladů.Hot partitions lead to inefficient use of provisioned throughput, which might result in rate-limiting and higher costs.

Fyzické oddíly kontejneru můžete zobrazit v části úložiště v okně metriky Azure Portal:You can see your container's physical partitions in the Storage section of the Metrics blade of the Azure portal:

Zobrazení počtu fyzických oddílů

Na výše uvedeném snímku obrazovky má kontejner /foodGroup jako klíč oddílu.In the above screenshot, a container has /foodGroup as the partition key. Každý ze tří pruhů v grafu představuje fyzický oddíl.Each of the three bars in the graph represents a physical partition. V imagi je Rozsah klíčů oddílu stejný jako fyzický oddíl.In the image, partition key range is the same as a physical partition. Vybraný fyzický oddíl obsahuje horní 3 nejvýznamnější velikosti logických oddílů:, a Beef Products Vegetable and Vegetable Products Soups, Sauces, and Gravies .The selected physical partition contains the top 3 most significant size logical partitions: Beef Products, Vegetable and Vegetable Products, and Soups, Sauces, and Gravies.

Pokud zřizujete propustnost 18 000 jednotek žádostí za sekundu (RU/s), pak každý ze tří fyzických oddílů může využít 1/3 celkové zřízené propustnosti.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. V rámci vybraného fyzického oddílu klíče logických oddílů Beef Products , Vegetable and Vegetable Products a Soups, Sauces, and Gravies mohou společně shromažďovat, využijte ru/s fyzického oddílu 6 000.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. Vzhledem k tomu, že zajištěná propustnost je rovnoměrně rozdělená napříč fyzickými oddíly kontejneru, je důležité zvolit klíč oddílu, který rovnoměrně distribuuje spotřebu propustnosti, a to výběrem správného logického klíče oddílu.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.

Správa logických oddílůManaging logical partitions

Azure Cosmos DB transparentně a automaticky spravuje umístění logických oddílů na fyzických oddílech, aby bylo možné efektivně splnit požadavky na škálovatelnost a výkon kontejneru.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. V rámci zvýšení propustnosti a požadavků na úložiště se Azure Cosmos DB přesune logické oddíly, aby se zatížení automaticky rozšířilo do většího počtu fyzických oddílů.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. Můžete se dozvědět víc o fyzických oddílech.You can learn more about physical partitions.

Azure Cosmos DB pro rozprostření logických oddílů mezi fyzickými oddíly používá dělení na základě hodnoty hash.Azure Cosmos DB uses hash-based partitioning to spread logical partitions across physical partitions. Azure Cosmos DB hodnota hash hodnot klíče oddílu položky.Azure Cosmos DB hashes the partition key value of an item. Výsledek s hodnotou hash Určuje fyzický oddíl.The hashed result determines the physical partition. Pak Azure Cosmos DB přiděluje klíčové místo hodnot hash klíče oddílu rovnoměrně napříč fyzickými oddíly.Then, Azure Cosmos DB allocates the key space of partition key hashes evenly across the physical partitions.

Transakce (v uložených procedurách nebo triggerech) jsou povoleny pouze proti položkám v jednom logickém oddílu.Transactions (in stored procedures or triggers) are allowed only against items in a single logical partition.

Sady replikReplica sets

Každý fyzický oddíl se skládá ze sady replik, které se také označují jako sada replik.Each physical partition consists of a set of replicas, also referred to as a replica set. Každá sada replik je hostitelem instance databázového stroje.Each replica set hosts an instance of the database engine. Sada replik vytvoří data uložená v rámci fyzického oddílu odolného, vysoce dostupného a konzistentního.A replica set makes the data stored within the physical partition durable, highly available, and consistent. Každá replika, která tvoří fyzický oddíl, zdědí kvótu úložiště oddílu.Each replica that makes up the physical partition inherits the partition's storage quota. Všechny repliky fyzického oddílu společně podporují propustnost, která je přidělena fyzickému oddílu.All replicas of a physical partition collectively support the throughput that's allocated to the physical partition. Azure Cosmos DB automaticky spravuje sady replik.Azure Cosmos DB automatically manages replica sets.

Menší kontejnery obvykle vyžadují jenom jeden fyzický oddíl, ale budou mít pořád aspoň 4 repliky.Typically, smaller containers only require a single physical partition, but they will still have at least 4 replicas.

Následující obrázek ukazuje, jak jsou logické oddíly namapovány na fyzické oddíly distribuované globálně:The following image shows how logical partitions are mapped to physical partitions that are distributed globally:

Obrázek, který ukazuje Azure Cosmos DB dělení

Výběr klíče oddíluChoosing a partition key

Klíč oddílu má dvě komponenty: cestu ke klíči oddílu a hodnotu klíče oddílu.A partition key has two components: partition key path and the partition key value. Představte si třeba položku {"userId": "Andrew", "worksFor": "Microsoft"} Pokud jako klíč oddílu zvolíte "userId", budou to tyto dvě komponenty klíče oddílu: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:

  • Cesta ke klíči oddílu (například: "/userId").The partition key path (For example: "/userId"). Cesta ke klíči oddílu přijímá alfanumerické znaky a znaky podtržítka ().The partition key path accepts alphanumeric and underscore() characters. Můžete také použít vnořené objekty pomocí standardního zápisu cesty (/).You can also use nested objects by using the standard path notation(/).

  • Hodnota klíče oddílu (například "Andrew").The partition key value (For example: "Andrew"). Hodnota klíče oddílu může být typu String nebo numeric.The partition key value can be of string or numeric types.

Další informace o limitech propustnosti, úložiště a délky klíče oddílu najdete v článku o kvótách služby Azure Cosmos DB .To learn about the limits on throughput, storage, and length of the partition key, see the Azure Cosmos DB service quotas article.

Výběr klíče oddílu je jednoduchá, ale důležitá volba návrhu v Azure Cosmos DB.Selecting your partition key is a simple but important design choice in Azure Cosmos DB. Jakmile vyberete klíč oddílu, není možné ho změnit na místě.Once you select your partition key, it is not possible to change it in-place. Pokud potřebujete změnit klíč oddílu, měli byste přesunout data do nového kontejneru s novým požadovaným klíčem oddílu.If you need to change your partition key, you should move your data to a new container with your new desired partition key.

Pro všechny kontejnery by měl klíč oddílu:For all containers, your partition key should:

  • Vlastnost, která má hodnotu, která se nemění.Be a property that has a value which does not change. Pokud je vlastnost klíčem oddílu, nemůžete tuto hodnotu vlastnosti aktualizovat.If a property is your partition key, you can't update that property's value.

  • Má vysokou kardinalitu.Have a high cardinality. Jinými slovy, vlastnost by měla mít široké spektrum možných hodnot.In other words, the property should have a wide range of possible values.

  • Využití jednotky (RU) požadavků na rozprostření (RU) a úložiště dat rovnoměrně napříč všemi logickými oddíly.Spread request unit (RU) consumption and data storage evenly across all logical partitions. Tím se zajistí i využití a distribuce úložiště mezi fyzickými oddíly.This ensures even RU consumption and storage distribution across your physical partitions.

Pokud budete potřebovat transakce s kyselými položkami v Azure Cosmos DB, bude nutné použít uložené procedury nebo triggery.If you need multi-item ACID transactions in Azure Cosmos DB, you will need to use stored procedures or triggers. Všechny uložené procedury a triggery založené na JavaScriptu jsou vymezeny na jeden logický oddíl.All JavaScript-based stored procedures and triggers are scoped to a single logical partition.

Klíče oddílů pro kontejnery pro čtení a těžký přístupPartition keys for read-heavy containers

U většiny kontejnerů je výše uvedená kritéria při vybírání klíče oddílu všechno potřeba zvážit.For most containers, the above criteria is all you need to consider when picking a partition key. U velkých kontejnerů pro čtení ale můžete chtít zvolit klíč oddílu, který se často objevuje jako filtr v dotazech.For large read-heavy containers, however, you might want to choose a partition key that appears frequently as a filter in your queries. Dotazy mohou být efektivně směrovány pouze na příslušné fyzické oddíly zahrnutím klíče oddílu do predikátu filtru.Queries can be efficiently routed to only the relevant physical partitions by including the partition key in the filter predicate.

Pokud jsou většina požadavků na vaše úlohy dotazy a většina vašich dotazů má pro stejnou vlastnost filtr rovnosti, může být tato vlastnost vhodnou volbou klíče oddílu.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. Pokud třeba často spustíte dotaz, který filtrujete UserID , pak výběrem možnosti UserID klíč oddílu snížíte počet dotazů mezi oddíly.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.

Pokud je ale váš kontejner malý, pravděpodobně nemáte dostatek fyzických oddílů, abyste se museli starat o dopad na výkon dotazů mezi oddíly.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. Většina malých kontejnerů v Azure Cosmos DB vyžaduje pouze jeden nebo dva fyzické oddíly.Most small containers in Azure Cosmos DB only require one or two physical partitions.

Pokud by váš kontejner mohl růst na více než několik fyzických oddílů, měli byste si vybrat klíč oddílu, který minimalizuje dotazy mezi oddíly.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. Váš kontejner bude vyžadovat více než několik fyzických oddílů, pokud je splněna jedna z následujících podmínek:Your container will require more than a few physical partitions when either of the following are true:

  • Váš kontejner bude mít zajištěné více než 30 000 RU.Your container will have over 30,000 RU's provisioned

  • Váš kontejner bude uchovávat více než 100 GB dat.Your container will store over 100 GB of data

Použití ID položky jako klíče oddíluUsing item ID as the partition key

Pokud má váš kontejner vlastnost, která má široké spektrum možných hodnot, je pravděpodobné, že je vhodný klíč oddílu.If your container has a property that has a wide range of possible values, it is likely a great partition key choice. Jedním z možných příkladů takové vlastnosti je ID položky.One possible example of such a property is the item ID. Pro malé kontejnery pro čtení nebo zapisovatelné kontejnery libovolné velikosti je ID položky přirozeně skvělým výběrem pro klíč oddílu.For small read-heavy containers or write-heavy containers of any size, the item ID is naturally a great choice for the partition key.

ID položky systémové vlastnosti existuje v každé položce v kontejneru.The system property item ID exists in every item in your container. Můžete mít další vlastnosti, které reprezentují logické ID vaší položky.You may have other properties that represent a logical ID of your item. V mnoha případech jsou to také skvělé volby klíče oddílu ze stejných důvodů jako ID položky.In many cases, these are also great partition key choices for the same reasons as the item ID.

ID položky je skvělý výběr klíče oddílu z následujících důvodů:The item ID is a great partition key choice for the following reasons:

  • Existuje celá řada možných hodnot (jedno jedinečné ID položky na jednu položku).There are a wide range of possible values (one unique item ID per item).
  • Vzhledem k tomu, že existuje jedinečné ID položky na jednu položku, má ID položky skvělou úlohu s rovnoměrně vyvážením využití ru a úložiště dat.Because there is a unique item ID per item, the item ID does a great job at evenly balancing RU consumption and data storage.
  • Můžete snadno provádět efektivní čtení bodů, protože poznáte jeho ID, vždy znát klíč oddílu položky.You can easily do efficient point reads since you'll always know an item's partition key if you know its item ID.

Je potřeba vzít v úvahu několik věcí, které byste měli zvážit při výběru ID položky jako klíč oddílu:Some things to consider when selecting the item ID as the partition key include:

  • Pokud je ID položky klíč oddílu, stane se jedinečným identifikátorem v celém rámci celého kontejneru.If the item ID is the partition key, it will become a unique identifier throughout your entire container. Nebudete moct mít položky, které mají duplicitní ID položky.You won't be able to have items that have a duplicate item ID.
  • Pokud máte kontejner pro čtení s velkým množstvím fyzických oddílů, dotazy budou efektivnější, pokud mají filtr rovnosti s ID položky.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.
  • Uložené procedury nebo triggery nemůžete spouštět v několika logických oddílech.You can't run stored procedures or triggers across multiple logical partitions.

Další krokyNext steps