Azure Cosmos DB cost optimization: 8 pák, jak snížit RU/s účet
Azure Cosmos DB cost optimization: 8 pák, jak snížit RU/s účet
Cosmos DB má zaslouženou pověst „skvělá technologie, drahá faktura". Po dvou letech provozu CostSentry.AI na Cosmos jsem se naučil osmi konkrétních pák, které když všechny zatáhnete, snížíte celkový účet o 40–60 % bez dopadu na výkon nebo dostupnost.
Tenhle článek je destilát toho, co opakovaně dělám na FinOps audit Cosmos workloadů.
Krok 0: pochopit, za co vlastně platíte
Cosmos DB účtuje za dvě věci:
- Provisioned/Consumed RU/s (request units per second) – throughput pro database operace
- Storage (GB-month) – fixní cena, marginal na celkové faktuře
Storage je v 90 % případů zanedbatelný. RU/s je páka, na které se hraje. Než začnete optimalizovat, spusťte cost breakdown:
az consumption usage list \
--start-date 2026-05-01 \
--end-date 2026-06-01 \
--query "[?contains(consumedService, 'Microsoft.DocumentDB')].{Resource:instanceName, RU:meterDetails.meterName, Cost:pretaxCost}" \
--output tableMěli byste vidět, kolik RU/s jednotlivé kontejnery konzumují. To je waypoint pro optimalizaci.
Páka 1: Provisioned vs Serverless rozhodnutí
| Scenario | Doporučení | Důvod |
|---|---|---|
| Dev/test, <5 000 RU/s burst | Serverless | Pay per RU consumed, žádné min |
| Production, >5 000 RU/s sustained | Provisioned (autoscale) | Levnější per-RU na vyšším throughputu |
| Spike-heavy (5× nominal) | Provisioned autoscale | Bez throttling, accommodates spikes |
| Constant predictable load | Provisioned manual | Nejnižší per-RU cena |
Pro CostSentry.AI dev/test environment jsme přepnutím z Provisioned (4 000 RU/s) na Serverless snížili účet z 180 USD na 40 USD měsíčně. Pro produkci jsme zůstali na Provisioned autoscale.
Páka 2: Autoscale tuning
Defaultní autoscale nastavení je max 4 000 RU/s. Většina dev kontejnerů to nepotřebuje. Vždy:
- Zkontrolujte aktuální peak v posledních 30 dnech přes Metrics → Total Request Units
- Nastavte max na 1.3× peak (ne 4 000, ne 10 000 – konkrétní číslo podle vašich dat)
resource container 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2024-08-15' = {
name: 'users'
parent: database
properties: {
resource: {
id: 'users'
partitionKey: { paths: ['/tenantId'], kind: 'Hash' }
}
options: {
autoscaleSettings: {
maxThroughput: 2000 // ne 4000 default!
}
}
}
}Per-RU cena autoscale: ~$0.00012 / RU / hodina (vs $0.00008 manual). Když si zvolíte max 2 000 místo 4 000, ušetříte 50 % i v idle – autoscale neúčtuje za nepoužitou kapacitu, ale baseline je 10 % maxima.
Páka 3: Indexing policy optimization
Default indexing policy v Cosmos je /* – indexuje všechno. To zvyšuje write cost o 20–40 % vs explicit policy. Pokud děláte query jen na konkrétní property:
{
"indexingMode": "consistent",
"includedPaths": [
{ "path": "/tenantId/?" },
{ "path": "/createdAt/?" },
{ "path": "/email/?" },
{ "path": "/status/?" }
],
"excludedPaths": [
{ "path": "/*" },
{ "path": "/_etag/?" }
]
}To indexuje pouze 4 fields. Write RU cost klesne z ~10 RU per document na ~6 RU per document = 40 % úspora na writes.
V CostSentry.AI jsme touto změnou na jednom kontejneru (events, 500k zápisů/den) snížili cost z 80 USD/měsíc na 52 USD.
Pozor: změnu indexing policy Cosmos provádí jako background reindex, který může trvat hodiny až dny u velkých kontejnerů. Monitor přes:
// Cosmos SDK – check reindex progress
const { resource: container } = await client
.database('mydb')
.container('users')
.read();
console.log(`Indexing transformation: ${container.indexTransformationProgress}%`);Páka 4: TTL pro ephemeral data
Pokud máte data, která mají časovanou platnost (sessions, audit logs, cached query results, expired notifications), nastavte container-level TTL místo ruční deletion:
resource sessionContainer 'Microsoft.DocumentDB/.../containers@2024-08-15' = {
name: 'sessions'
parent: database
properties: {
resource: {
id: 'sessions'
partitionKey: { paths: ['/userId'], kind: 'Hash' }
defaultTtl: 86400 // 24 hodin v sekundách
}
}
}TTL deletion stojí 0 RU – Cosmos to dělá v rámci background maintenance. Oproti tomu manual DELETE volání stojí ~5 RU per dokument plus aplikační overhead.
Pro variabilní TTL per document použijte ttl property na dokumentu:
await container.items.create({
id: 'session-123',
userId: 'user-456',
ttl: 3600, // tento dokument expiruje za hodinu, ne za 24
data: { ... }
});Páka 5: Partition key design (cost driver number 1)
Špatný partition key není jen výkonový problém – je to největší cost driver. Hot partition znamená:
- Cosmos musí rozdělovat partition (overhead RU/s)
- Throttling i přes vysoký provisioned throughput
- Cross-partition queries (5–10× dražší než single-partition)
Pravidla:
- Cardinality: minimálně tisíce unikátních hodnot
- Uniform distribution: žádná hodnota by neměla mít >5 % všech dokumentů
- Query-aligned: query často filtruje podle této hodnoty
V CostSentry.AI jsme původně měli /customerId jako PK pro events. Pro velké zákazníky to znamenalo hot partition. Refactor na /customerId-${YYYYMM} (sloučenina customer + měsíc) rozloženo zatížení rovnoměrně a snížilo cross-partition query cost o 60 %.
Páka 6: Bulk operations pro write-heavy workloady
Pokud zapisujete 100+ dokumentů najednou, single-document inserts spalují RU. Použijte bulk:
// Místo loop přes insert
const operations = items.map(item => ({
operationType: 'Create',
resourceBody: item
}));
const response = await container.items.bulk(operations);Bulk operations sdílejí networking overhead a Cosmos je dávkuje – výsledek je 30–40 % nižší RU cost per dokument oproti loop variantě.
Páka 7: Reserved Capacity pro Provisioned
Stejně jako VM Reserved Instances, Cosmos DB má Reserved Capacity – platíte za 1Y nebo 3Y commitment a získáváte 20–65 % slevu:
| Term | Sleva |
|---|---|
| 1-year | 20 % |
| 3-year | 65 % |
Pro produkční workload s stabilním 10 000 RU/s baseline to znamená:
Pay-as-you-go: ~580 USD/měsíc
1-year Reserved: ~465 USD/měsíc (-20%)
3-year Reserved: ~205 USD/měsíc (-65%)Pozor: od léta 2024 Microsoft zrušil exchange pro Cosmos DB Reserved Capacity (pouze refund). Pokud plánujete re-platforming v horizontu 2 let, kupte 1-year místo 3-year.
Páka 8: Multi-region replikace audit
Defaultní mindset architektů je „pro produkci zapneme multi-region kvůli HA". Cosmos DB účtuje každý region jako samostatnou provisioned kapacitu:
| Setup | RU/s cost multiplier |
|---|---|
| Single region (zone-redundant) | 1.25× |
| 2 regions (read replica) | 2× |
| 3 regions | 3× |
| 5 regions | 5× |
Pro most workloads je zone-redundant single region (99.995% SLA) dostatečný. Multi-region zapínejte jen když:
- Máte explicit business requirement na geographic redundancy
- Máte read traffic z více kontinentů a latency requirement <100 ms p99
- Compliance vyžaduje data residency v multiple regions
V Christie's jsme našli 4 produkční Cosmos účty s multi-region setup z roku 2022, kdy se ještě nikdo neptal proč. Přepnutí na zone-redundant single region snížilo Cosmos faktury o ~1 800 EUR/měsíc dohromady.
FinOps audit checklist pro Cosmos DB
| Krok | Očekávaná úspora | Náročnost |
|---|---|---|
| Přepnout dev/test na Serverless | 50–80 % na non-prod | Nízká |
| Tunit autoscale max na 1.3× peak | 20–40 % na overprovisioned | Nízká |
| Optimalizovat indexing policy | 20–40 % na writes | Střední |
| Nastavit container TTL pro ephemeral data | 100 % na manual deletes | Nízká |
| Audit partition key cardinality/distribution | 30–60 % na cross-partition queries | Vysoká |
| Bulk operations pro write-heavy | 30–40 % na bulk write paths | Střední |
| Reserved Capacity 1Y na stable workload | 20 % na baseline | Nízká |
| Audit multi-region nutnost | až 50 % na zbytečné repliky | Nízká |
Závěr
Cosmos DB cost optimization je řemeslo – žádný silver bullet, ale osm konkrétních pák s kumulativním efektem 40–60 % redukce. V CostSentry.AI jsme po implementaci všech bodů snížili Cosmos účet z 380 USD/měsíc na 145 USD bez ztráty funkcionality nebo SLA.
Klíčový princip: Cosmos není drahý, je špatně nakonfigurovaný. Defaulty Microsoft optimalizoval pro „funguje hned", ne pro „je nejlevnější". Tři hodiny FinOps auditu vám vrátí tisíce EUR ročně.
Potřebujete pomoc s Cosmos DB FinOps auditem? Podívejte se na naše služby cloudové architektury nebo se ozvěte pro NoSQL cost review.
O autorovi

Martin Rylko
Senior Cloud Architect & DevOps Engineer
Více než 14 let v IT – od on-premises datacenter a Hyper-V clusteringu po cloudovou infrastrukturu v Microsoft Azure. Specializuji se na Landing Zones, IaC automatizaci, Kubernetes a bezpečnostní compliance.
Nejcastejsi dotazy
Kdy přepnout Cosmos DB z Provisioned na Serverless?▾
Co je autoscale a kdy nahradí manual scaling?▾
Jak indexing policy ovlivňuje cost?▾
Vyplatí se multi-region replikace pro non-critical workloady?▾
Mohlo by vás zajímat
Azure FinOps: 7 kroků ke snížení cloud nákladů o 30 %
Praktický průvodce Azure FinOps – od Cost Management přes right-sizing VM až po Reserved Instances a automatické škálování. Reálné úspory z enterprise projektů.
ČístAzure Reserved Instances a Savings Plans: Strategie pro konec fiskálního roku
Kompletní průvodce nákupem Azure Reserved Instances a Savings Plans před koncem fiskálního roku. Coverage analýza, exchange pravidla a reálné výpočty z enterprise projektů.
ČístAzure Functions Flex Consumption: Kdy nahradit Premium plan v 2026
Flex Consumption je třetí cesta mezi Consumption a Premium plánem pro Azure Functions. Praktický rozbor cenového modelu, VNet integration a kdy přepnout z Premium plánu.
Číst