Dělení a horizontální škálování ve službě Azure Cosmos DB
PLATÍ PRO: NoSQL
MongoDB
Cassandra
Gremlin
Tabulka
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. Položky v kontejneru jsou rozdělené do samostatných podmnožina, které se nazývají logické oddíly. Logické oddíly se vytvářejí na základě hodnoty klíče oddílu , který je přidružený ke každé položce v kontejneru. Všechny položky v logickém oddílu mají stejnou hodnotu klíče oddílu.
Například kontejner obsahuje položky. Každá položka má jedinečnou hodnotu vlastnosti UserID
. Pokud UserID
slouží jako klíč oddílu pro položky v kontejneru a existuje 1 000 jedinečných UserID
hodnot, vytvoří se pro kontejner 1 000 logických oddílů.
Kromě klíče oddílu, který určuje logický oddíl položky, má každá položka v kontejneru ID položky (jedinečné v rámci logického oddílu). Kombinace klíče oddílu a ID položky vytvoří index položky, který položku jedinečně identifikuje. Výběr klíče oddílu je důležité rozhodnutí, které ovlivňuje výkon vaší aplikace.
Tento článek vysvětluje vztah mezi logickými a fyzickými oddíly. Popisuje také osvědčené postupy pro dělení a poskytuje podrobný přehled o tom, jak funguje horizontální škálování ve službě Azure Cosmos DB. Při výběru klíče oddílu není nutné rozumět těmto interním podrobnostem, ale probrali jsme je, abyste měli přehled o fungování služby Azure Cosmos DB.
Logické oddíly
Logický oddíl se skládá ze sady položek, které mají stejný klíč oddílu. Například v kontejneru, který obsahuje data o výživě potravin, obsahují foodGroup
všechny položky vlastnost . Jako klíč oddílu pro kontejner můžete použít foodGroup
. Skupiny položek, které mají specifické hodnoty pro foodGroup
, jako Beef Products
jsou , Baked Products
a Sausages and Luncheon Meats
, tvoří jedinečné logické oddíly.
Logický oddíl také definuje obor databázových transakcí. Položky v rámci logického oddílu můžete aktualizovat pomocí transakce s izolací snímku. Při přidání nových položek do kontejneru systém transparentně vytvoří nové logické oddíly. Při odstranění podkladových dat se nemusíte starat o odstranění logického oddílu.
Počet logických oddílů v kontejneru není nijak omezený. Každý logický oddíl může ukládat až 20 GB dat. Vhodné volby klíče oddílu mají širokou škálu možných hodnot. Například v kontejneru, kde všechny položky obsahují foodGroup
vlastnost, můžou data v logickém oddílu Beef Products
růst až na 20 GB. Výběrem klíče oddílu s širokou škálou možných hodnot zajistíte, že kontejner bude možné škálovat.
Pomocí upozornění služby Azure Monitor můžete monitorovat, jestli se velikost logického oddílu blíží 20 GB.
Fyzické oddíly
Kontejner se škáluje distribucí dat a propustnosti napříč fyzickými oddíly. Interně se jeden nebo více logických oddílů mapuje na jeden fyzický oddíl. Menší kontejnery mají obvykle mnoho logických oddílů, ale vyžadují pouze jeden fyzický oddíl. Na rozdíl od logických oddílů jsou fyzické oddíly interní implementací systému a Azure Cosmos DB zcela spravuje fyzické oddíly.
Počet fyzických oddílů v kontejneru závisí na následujících charakteristikách:
Velikost zřízené propustnosti (každý jednotlivý fyzický oddíl může poskytovat propustnost až 10 000 jednotek žádostí za sekundu). Limit 10 000 RU/s pro fyzické oddíly znamená, že logické oddíly mají také limit 10 000 RU/s, protože každý logický oddíl je mapovaný pouze na jeden fyzický oddíl.
Celkové úložiště dat (každý fyzický oddíl může ukládat až 50 GB dat).
Poznámka
Fyzické oddíly jsou interní implementací systému a jsou zcela spravované službou Azure Cosmos DB. Při vývoji řešení se nezaměřujte na fyzické oddíly, protože je nemůžete ovládat. Místo toho se zaměřte na klíče oddílů. Pokud zvolíte klíč oddílu, který rovnoměrně rozděluje spotřebu propustnosti mezi logické oddíly, zajistíte, aby byla spotřeba propustnosti napříč fyzickými oddíly vyvážená.
Celkový počet fyzických oddílů v kontejneru není nijak omezený. S rostoucí zřízenou propustností nebo velikostí dat služba Azure Cosmos DB automaticky vytvoří nové fyzické oddíly rozdělením existujících oddílů. Rozdělení fyzických oddílů nemá vliv na dostupnost vaší aplikace. Po rozdělení fyzického oddílu budou všechna data v rámci jednoho logického oddílu stále uložena ve stejném fyzickém oddílu. Rozdělení fyzických oddílů jednoduše vytvoří nové mapování logických oddílů na fyzické oddíly.
Propustnost zřízená pro kontejner je rovnoměrně rozdělená mezi fyzické oddíly. 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 "horkými". Horké oddíly vedou k neefektivnímu využití zřízené propustnosti, což může vést k omezování rychlosti a vyšším nákladům.
Fyzické oddíly kontejneru můžete zobrazit v části Úložištěv okně Metriky Azure Portal:
Představte si například kontejner s cestou /foodGroup
zadanou jako klíč oddílu. Kontejner může mít libovolný počet fyzických oddílů, ale v tomto příkladu předpokládáme, že má tři oddíly. Jeden fyzický oddíl může obsahovat více klíčů oddílu. Největší fyzický oddíl může například obsahovat tři logické oddíly s nejvyšší velikostí: Beef Products
, Vegetable and Vegetable Products
a Soups, Sauces, and Gravies
.
Pokud přiřadíte propustnost 18 000 jednotek žádostí za sekundu (RU/s), může každý ze tří fyzických oddílů využívat 1/3 celkové zřízené propustnosti. V rámci vybraného fyzického oddílu můžou klíče Beef Products
Vegetable and Vegetable Products
logického oddílu , a Soups, Sauces, and Gravies
společně využívat 6 000 zřízených RU/s fyzického oddílu. Vzhledem k tomu, že zřízená propustnost je rovnoměrně rozdělená mezi fyzické oddíly kontejneru, je důležité zvolit klíč oddílu, který rovnoměrně rozdělí spotřebu propustnosti. Další informace najdete v tématu o výběru správného klíče logického oddílu.
Správa logických oddílů
Azure Cosmos DB transparentně a automaticky spravuje umístění logických oddílů na fyzických oddílech, aby efektivně uspokojila požadavky na škálovatelnost a výkon kontejneru. Se zvyšujícími se požadavky aplikace na propustnost a úložiště přesune Azure Cosmos DB logické oddíly, aby se zatížení automaticky rozložilo mezi větší počet fyzických oddílů. Můžete si přečíst další informace o fyzických oddílech.
Azure Cosmos DB používá dělení na základě hodnoty hash k rozložení logických oddílů mezi fyzické oddíly. Azure Cosmos DB hashuje hodnotu klíče oddílu položky. Výsledek hash určuje fyzický oddíl. Azure Cosmos DB pak přidělí prostor klíčů v klíčích hash oddílů rovnoměrně napříč fyzickými oddíly.
Transakce (v uložených procedurách nebo triggerech) jsou povoleny pouze pro položky v jednom logickém oddílu.
Sady replik
Každý fyzický oddíl se skládá ze sady replik, které se také označují jako sada replik. Každá replika je hostitelem instance databázového stroje. Díky sadě replik je úložiště dat v rámci fyzického oddílu odolné, vysoce dostupné a konzistentní. Každá replika, která tvoří fyzický oddíl, dědí kvótu úložiště oddílu. Všechny repliky fyzického oddílu společně podporují propustnost přidělenou fyzickému oddílu. Azure Cosmos DB automaticky spravuje sady replik.
Menší kontejnery obvykle vyžadují pouze jeden fyzický oddíl, ale stále mají alespoň čtyři repliky.
Následující obrázek ukazuje, jak se logické oddíly mapují na fyzické oddíly, které se distribuují globálně. Sada oddílů v imagi odkazuje na skupinu fyzických oddílů, které spravují stejné klíče logických oddílů ve více oblastech:
Výběr klíče oddílu
Klíč oddílu má dvě komponenty: cestu ke klíči oddílu a hodnotu klíče oddílu. Pokud například jako klíč oddílu zvolíte userId, zvažte položku { "userId" : "Andrew", "worksFor": "Microsoft" }
. Následující dvě komponenty klíče oddílu jsou následující:
Cesta ke klíči oddílu (například /userId). Cesta ke klíči oddílu přijímá alfanumerické znaky a podtržítka (_). Můžete také použít vnořené objekty pomocí standardního zápisu cesty(/).
Hodnota klíče oddílu (například Andrew). Hodnota klíče oddílu může být řetězcového nebo číselného typu.
Informace o omezeních propustnosti, úložiště a délky klíče oddílu najdete v článku Kvóty služby Azure Cosmos DB .
Výběr klíče oddílu je jednoduchá, ale důležitá volba návrhu ve službě Azure Cosmos DB. Jakmile klíč oddílu vyberete, není možné ho místně změnit. 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. (S tímto procesem vám pomůžou úlohy kopírování kontejnerů .)
Pro všechny kontejnery by měl klíč oddílu:
Být vlastností, která má hodnotu, která se nemění. Pokud je vlastnost klíčem oddílu, nemůžete hodnotu této vlastnosti aktualizovat.
Měla by obsahovat
String
pouze hodnoty – nebo čísla by měla být v ideálním případě převedena naString
, pokud je možné, že jsou mimo hranice čísel s dvojitou přesností podle IEEE 754 binary64. Specifikace JSON zdůvodní, proč je obecně používání čísel mimo tuto hranici špatným postupem kvůli pravděpodobným problémům s interoperabilitou. Tyto obavy jsou relevantní zejména pro sloupec klíče oddílu, protože je neměnný a vyžaduje migraci dat, aby se později změnil.Má vysokou kardinalitu. Jinými slovy, vlastnost by měla mít širokou škálu možných hodnot.
Rovnoměrně rozprostřete spotřebu jednotek žádostí (RU) a úložiště dat napříč všemi logickými oddíly. Toto rozložení zajišťuje rovnoměrnou spotřebu RU a distribuci úložiště napříč vašimi fyzickými oddíly.
Mají hodnoty, které nejsou obvykle větší než 2048 bajtů, nebo 101 bajtů, pokud nejsou povolené velké klíče oddílů. Další informace najdete v tématu Klíče velkých oddílů.
Pokud potřebujete transakce ACID s více položkami ve službě Azure Cosmos DB, musíte použít uložené procedury nebo triggery. Všechny uložené procedury a triggery založené na Jazyce JavaScript jsou vymezeny na jeden logický oddíl.
Poznámka
Pokud máte jenom jeden fyzický oddíl, nemusí být hodnota klíče oddílu relevantní, protože všechny dotazy budou cílit na stejný fyzický oddíl.
Klíče oddílů pro kontejnery náročné na čtení
U většiny kontejnerů je potřeba při výběru klíče oddílu vzít v úvahu všechna výše uvedená kritéria. U velkých kontejnerů s velkými nároky na čtení ale můžete zvolit klíč oddílu, který se ve vašich dotazech často zobrazuje jako filtr. Dotazy je možné efektivně směrovat pouze na relevantní fyzické oddíly zahrnutím klíče oddílu do predikátu filtru.
Tato vlastnost může být dobrou volbou klíče oddílu, pokud většina požadavků vaší úlohy jsou dotazy a většina dotazů má filtr rovnosti pro stejnou vlastnost. Pokud například často spouštíte dotaz, který filtruje UserID
, pak výběrem UserID
klíče oddílu snížíte počet dotazů mezi oddíly.
Pokud je ale váš kontejner malý, pravděpodobně nemáte dostatek fyzických oddílů, abyste se museli starat o výkon dotazů mezi oddíly. Většina malých kontejnerů ve službě Azure Cosmos DB vyžaduje pouze jeden nebo dva fyzické oddíly.
Pokud se váš kontejner může zvětšit na více než několik fyzických oddílů, měli byste se ujistit, že jste vybrali klíč oddílu, který minimalizuje dotazy mezi oddíly. Váš kontejner vyžaduje více než několik fyzických oddílů, pokud platí některý z následujících:
Váš kontejner má zřízených více než 30 000 RU.
V kontejneru je uloženo více než 100 GB dat.
Použití ID položky jako klíče oddílu
Pokud má váš kontejner vlastnost, která má širokou škálu možných hodnot, je to pravděpodobně skvělá volba klíče oddílu. Jedním z možných příkladů takové vlastnosti je ID položky. Pro malé kontejnery s velkými nároky na čtení nebo kontejnery náročné na zápis je ID položky přirozeně skvělou volbou pro klíč oddílu.
ID položky systémové vlastnosti existuje v každé položce v kontejneru. Můžete mít další vlastnosti, které představují logické ID položky. V mnoha případech jsou tato ID také skvělou volbou klíče oddílu ze stejných důvodů jako ID položky.
ID položky je skvělou volbou klíče oddílu z následujících důvodů:
- Existuje široká škála možných hodnot (jedno jedinečné ID položky na položku).
- Vzhledem k tomu, že pro každou položku existuje jedinečné ID položky , dělá ID položky skvělou práci při rovnoměrné vyvážení spotřeby RU a úložiště dat.
- Můžete snadno provádět efektivní čtení bodů, protože vždy znáte klíč oddílu položky, pokud znáte JEJÍ ID položky.
Mezi věci, které je potřeba zvážit při výběru ID položky jako klíče oddílu, patří:
- Pokud je ID položky klíč oddílu, stane se jedinečným identifikátorem v celém kontejneru. Nemůžete vytvářet položky, které mají duplicitní ID položek.
- Pokud máte kontejner náročný na čtení s mnoha fyzickými oddíly, jsou dotazy efektivnější, pokud mají filtr rovnosti s ID položky.
- Nemůžete spouštět uložené procedury nebo triggery, které cílí na více logických oddílů.
Další kroky
- Přečtěte si o zřízené propustnosti ve službě Azure Cosmos DB.
- Přečtěte si o globální distribuci ve službě Azure Cosmos DB.
- Projděte si školicí modul o modelování a dělení dat ve službě Azure Cosmos DB.