8 — Data Platforms (AZ-305)
A. Vocabulaire DB cloud
A.1 SQL relationnel vs NoSQL ⭐⭐
| SQL relationnel | NoSQL | |
|---|---|---|
| Structure | Tables schéma fixe, colonnes typées | Schema-less (chaque doc peut différer) |
| Relations | Joins, foreign keys | Pas de joins natifs, dénormalisation |
| Garanties | ACID | BASE (eventually consistent) |
| Scale | Vertical + read replicas | Horizontal natif (partitioning) |
| Services Azure | Azure SQL DB / MI / on VM, MySQL/PG Flex | Cosmos DB, Table Storage |
| Quand | Données structurées + intégrité critique (banque, ERP) | Catalogue, sessions, IoT, social, multi-region low-latency |
A.2 ACID vs BASE
- ACID (Azure SQL) : transfert 100€ A→B = les 2 ops réussissent OU aucune. Jamais d'état intermédiaire incohérent.
- BASE (Cosmos) : post publié, followers Paris voient instantanément, Tokyo 200ms après. Cohérence finale.
A.3 Request Units (RU/s) — l'unité de coût Cosmos
- RU/s = la "monnaie" de Cosmos : chaque op coûte des RU (read ≈ 1 RU, write ≈ 5 RU).
- Tu paies les RU/s réservées (provisioned) ou consommées (serverless).
A.4 Partition Key (Cosmos) ⭐
Attribut qui détermine sur quelle partition physique un document est stocké. Choix critique et figé à la création.
Bonne PK = haute cardinalité (millions valeurs distinctes) + distribution équitable + souvent dans WHERE.
Mauvaise PK = peu de valeurs (/status avec 5 valeurs) → hot partition.
B. Azure SQL — Famille (vue d'ensemble) ⭐⭐
| Service | Type | Compat SQL Server | Use case |
|---|---|---|---|
| Azure SQL Database ⭐ | PaaS, single DB ou elastic pool | ~99% | Apps modernes cloud-first, scaling fin, HA managé |
| Azure SQL Managed Instance (MI) | PaaS, instance complète | ~100% | Migrer SQL Server on-prem (Agent, CLR, cross-DB, linked servers) |
| SQL Server on Azure VM | IaaS | 100% | Compat totale + control OS, BYOL |
Décision rapide
- Cloud-first / nouvelles apps → SQL DB
- Migration SQL Server on-prem rapide + compat features instance-level → SQL MI
- Compat 100% + control OS / agents tiers / version SQL spécifique → SQL VM
C. Azure SQL Database (PaaS)
C.1 C'est quoi
PaaS relationnel managé (single DB ou elastic pool), ~99% compat SQL Server, HA managé, scaling fin → cible apps modernes cloud-first.
C.2 Compute models
- Provisioned : capacité fixe, payé 24/7 — prod prévisible
- Serverless ⭐ : auto-pause après inactivité, billing par seconde — dev/test sporadique
C.3 Tiers vCore (3 modèles archi)
| Tier | Storage | HA | Cas |
|---|---|---|---|
| General Purpose | Premium remote disk | Storage HA, RTO ~30s | App standard <4 TB |
| Business Critical ⭐ | Local SSD ultra-rapide | Always On AG 4 replicas, RTO <10s | Mission-critical, latence <2ms + read replicas inclus |
| Hyperscale ⭐ | Storage tiering jusqu'à 100 TB | Page servers + log service | DW OLTP, SaaS gros volume, >4 TB, jusqu'à 30 read replicas |
🎯 Mémo 305 :
- "Production HA" (sans précision) → BC (l'exam considère GP comme "HA avec disruption")
- "DB > 4 TB" ou "read scale-out massif" → Hyperscale
- "Budget restreint, RTO 30s OK" → GP
C.4 DTU vs vCore
| DTU | vCore ⭐ | |
|---|---|---|
| Concept | Bundles CPU+mem+IO | CPU/RAM/storage indépendants |
| Tiers | Basic / Standard / Premium | GP / BC / Hyperscale |
| Azure Hybrid Benefit | ❌ | ✅ |
| Recommandation MS | Legacy | ⭐ Moderne |
C.5 Features scalabilité (awareness)
- Elastic Pools : partage capacité entre N DBs (SaaS multi-tenant, ~10× moins cher que N DBs peak séparées).
- Read Scale-out : BC + Hyperscale exposent un replica readable via
ApplicationIntent=ReadOnlydans conn string. Offload reads. - Sharding : N DBs + shard map (
customerId % 10) pour scale horizontal. (utile pour donné qui doit être dans la géographie des utilisateurs)
C.6 Pièges 305
- 🚨 Hyperscale = SQL DB only (pas MI).
- 🚨 DTU model = pas d'Azure Hybrid Benefit (vCore only).
- 🚨 Elastic Pool oversize : tous tenants peak simultanément → throttling pool.
- 🚨 Read Scale-out sans
ApplicationIntent=ReadOnly→ reads tapent sur primary.
🚨 SQL DB — in-memory OLTP support par tier :
- Premium (DTU) et Business Critical (vCore) : FULL support in-memory OLTP + memory-optimized tables persistantes + clustered columnstore indexes.
- General Purpose : ❌ pas d'in-memory OLTP.
- Hyperscale : SUBSET only d'in-memory OLTP objects (memory-optimized table types non-persistés, table variables, native compiled modules) — PAS de memory-optimized tables persistantes complètes.
Mnémo : Premium DTU = BC vCore = full in-memory. GP = none. Hyperscale = partiel.
D. Azure SQL Managed Instance (MI)
D.1 C'est quoi
PaaS instance complète SQL Server (quasi 100% compat) — cible migrations SQL Server on-prem rapides sans refactor.
D.2 Features uniques vs SQL DB
- SQL Agent intégré (jobs)
- CLR (.NET assemblies)
- Cross-database queries
- Linked servers
- DTC (transactions distribuées)
- Service Broker
D.3 Networking
- Toujours dans un VNet (subnet dédié, délégué
Microsoft.Sql/managedInstances). - Public endpoint optionnel, recommandé privé only.
D.4 Tiers
| Tier | Storage cap | Cas |
|---|---|---|
| General Purpose | ~16 TB | Standard prod, lift-and-shift |
| Next-gen GP ⭐ | ~16 TB | Meilleur perf/coût vs GP classique |
| Business Critical | ~16 TB | Mission-critical, Always On AG, latence basse |
D.5 Pièges 305
- 🚨 SQL MI = pas de Hyperscale (GP/BC only, cap ~16 TB). Scenario >16 TB → forcément SQL DB Hyperscale.
- 🚨 Subnet dédié non partageable + délégation obligatoire.
- 🚨 Déploiement long (4-6h création, 1-6h scale).
E. SQL Server on Azure VM (IaaS)
E.1 Quand l'utiliser
- Compat 100% SQL Server (toutes features incl. agents tiers).
- Control complet OS, version SQL spécifique.
- Workloads >100 TB ou non-supportés en PaaS (legacy ETL, drivers exotiques).
- Azure Hybrid Benefit (BYOL) pour réutiliser licences on-prem (-55% Standard, -85% Enterprise).
E.2 HA / DR (à ta charge)
- HA via Always On AG manuel (multi-VMs + WSFC + AD + Internal LB pour le listener) — voir fiche 11.
- DR via ASR ou Always On AG cross-region.
E.3 Pièges 305
- 🚨 SQL VM = IaaS : patch OS, HA, backups → à toi. PaaS (DB/MI) gère tout.
- 🚨 Azure Hybrid Benefit = essentiel pour rentabilité SQL VM.
- 🚨 SQL IaaS Agent Extension = à installer/enregistrer pour features Azure (backup, monitoring, AHB tracking).
🚨 SQL Server on Azure VM — tempdb placement :
- Mettre tempdb sur le disque éphémère D:\ (ephemeral local SSD) → perf I/O optimal (latence µs), data perdue au reboot (OK car tempdb se recrée auto au démarrage SQL).
- Storage Account / Premium SSD persistents pour tempdb = surcoût + latence inutile. ⚠️ Distractor exam : "tempdb sur Premium SSD persistant" = mauvaise pratique, choisir ephemeral D:\. (localstorage)
F. Azure DB for MySQL / PostgreSQL — Flexible Server
F.1 C'est quoi
PaaS managé MySQL / PostgreSQL avec Flexible Server ⭐ (successeur Single Server legacy) — zone-redundant HA + maintenance window custom + VNet injection.
F.2 Flexible Server vs Single Server (legacy)
| Critère | Single Server (legacy) | Flexible Server ⭐ |
|---|---|---|
| Zone-redundant HA | ❌ | ✅ |
| Maintenance window custom | ❌ (auto-patch only) | ✅ |
| Stop/Start | ❌ | ✅ |
| VNet injection privée | Limited | ✅ |
F.3 Tiers Flexible Server
| Compute tier | HA | Cas |
|---|---|---|
| Burstable (B-series) | ❌ pas de HA | Dev/test, charge sporadique |
| General Purpose ⭐ | HA zone-redundant | Prod standard |
| Memory Optimized | HA zone-redundant | Analytics / cache heavy |
F.4 Pièges 305
- 🚨 Burstable = pas de HA. Question prod HA → GP ou Memory Optimized.
- 🚨 Single Server legacy → migrer vers Flexible Server.
- 🚨 Distractors exam : "Burstable HA" = faux | "Single Server custom maintenance" = faux.
G. Cosmos DB (NoSQL) ⭐⭐
G.1 C'est quoi
NoSQL multi-modèle, multi-region, low-latency (<10ms P99). Cœur "Design data storage" AZ-305 — schema-less + scale horizontal natif + SLA 99.999%. Gross feature: multi-region write.
G.2 Hiérarchie
Account (région primaire + N régions) → Database → Container (collection/table/graph) → Item (document/row/vertex)
G.3 APIs (façades) ⭐
| API | Pour quoi | Quand |
|---|---|---|
| NoSQL (SQL) ⭐ | Documents JSON, queries SQL-like | Default nouvelles apps, max features |
| MongoDB | Documents BSON (wire protocol Mongo) | Migrer app MongoDB existante |
| Cassandra | Wide-column (CQL) | Migrer Cassandra |
| Gremlin (Graph) | Vertices + edges | Réseaux sociaux, reco, fraud detection |
| Table | Key-value | Migrer Azure Table Storage |
| PostgreSQL | Relational distributed (Citus) | App PG avec scale horizontal massif |
🎯 Question type 305 : "Migrer app MongoDB existante avec wire protocol Mongo intact" → Cosmos DB for MongoDB API.
G.4 Throughput modes (RU/s)
| Mode | Use case | Coût |
|---|---|---|
| Provisioned Manual | Charge prévisible 24/7 | RU/s fixes payées 24/7 |
| Provisioned Autoscale ⭐ | Charge variable mais prévisible | Max RU/s, scale 10-100% |
| Serverless | Dev/test, sporadique (<5000 RU/s, max 1 TB) | Pay-per-RU consommée |
Throughput scope : Database-level (RU partagées, max 25 containers) vs Container-level ⭐ (RU dédiées, recommandé prod).
G.5 Partitioning
- PK = haute cardinalité + distribution équitable + souvent dans
WHERE. - Limite 20 GB / partition logique.
| App | ✅ Bonne PK | ❌ Mauvaise PK |
|---|---|---|
| E-commerce orders | /customerId |
/status |
| Multi-tenant SaaS | /tenantId |
/region |
| IoT telemetry | /deviceId |
/sensorType |
| Chat | /conversationId |
/userId |
G.6 Consistency Levels (5) ⭐⭐
| Niveau | Garantie | Scenario |
|---|---|---|
| Strong | Read voit toujours dernière write globale | Compteur stock e-commerce |
| Bounded Staleness | Retard borné par K versions ou T temps | Score live sport |
| Session ⭐ default | Read-your-own-writes par client | E-commerce panier |
| Consistent Prefix | Reads voient writes dans l'ordre | Chat (A, B, C ordre conservé) |
| Eventual | Aucune garantie | Likes counter |
🎯 Mémo : Strong = cher + lent multi-region. Session suffit 99% des cas prod.
G.7 Multi-Region & Replication
| Config | Reads | Writes | Scenario |
|---|---|---|---|
| Single region | 1 | 1 | App interne colocalisée |
| Multi-region reads | N | 1 | App globale read-heavy |
| Multi-region writes ⭐ | N | N | App globale write-heavy, latence min globale |
G.8 Backup
- Periodic (default) : 2/jour, restore via ticket
- Continuous PITR ⭐ : 7j gratuit / 30j payant, self-service portail
G.9 Quand l'utiliser
- NoSQL global low-latency schema-less (<10ms P99).
- Multi-region writes nécessaires (apps mondiales, edge).
- Charges write-heavy / IoT / catalogue / sessions / social.
- PAS : relationnel + ACID + joins → SQL DB | cache key-value → Redis | big data analytical → Synapse/Databricks.
G.10 Pièges 305
- 🚨 Mauvaise PK (
/status,/region) → hot partition : 1 partition à 100% RU/s, 429 errors malgré faible utilisation totale. - 🚨 SAS = storage only, PAS Cosmos (auth = keys / tokens / Entra RBAC).
- 🚨 Strong consistency en multi-region = très coûteux + latence writes (sync cross-region). Session suffit.
- 🚨 PK figée à la création : pas de migration sans recréer container.
- 🚨 Synapse Link : 2026 sunset → préférer Fabric Mirroring pour HTAP nouveaux projets.
H. Caching — Redis
📚 Azure Cache for Redis & Azure Managed Redis = traités dans la fiche 5 - App Integration Services (section M).
Rappel court : caching key-value in-memory pour sessions, offload DB, rate limiting, distributed lock. Azure Cache for Redis en sunset 2026-2028 → nouveaux projets = Azure Managed Redis ⭐ (Redis Enterprise multi-threaded, modules natifs, active geo-rep, zone-redundant par défaut).
I. Rappel HA/DR & Backup (détail → fiche 11)
Vite fait, le détail est dans la fiche 11 :
- HA SQL DB intra-region : GP (~30s reattach storage) / BC Always On AG 4 replicas (<10s) / Hyperscale (page servers). Option Zone-Redundant (+30% coût, SLA 99.995%).
- DR cross-region SQL DB / MI : Auto-Failover Group ⭐ (listener DNS stable + failover auto + multi-DB atomique) ou Active Geo-Replication (manuel, SQL DB only).
- Backup SQL : PITR 1-35j + LTR W/M/Y jusqu'à 10 ans + Geo-redundant default (GRS).
- MySQL/PG Flex backup : LRS / ZRS / GRS ⭐ pour DR régional + Read Replica cross-region pour DR manuel.
- Cosmos DB : Continuous Backup PITR 7d/30d + Multi-region writes pour HA globale.
- Redis : Zone-redundant intra-region (Standard+) + Active geo-rep (Enterprise / Managed Redis) pour DR.
🎯 Réflexes : "DNS stable + auto-failover" → Auto-FG · "rétention longue compliance" → LTR · "DR régional MySQL/PG" → GRS + Read Replica cross-region.
J. Decision Trees AZ-305
Par type de data
Tu as quel type de data ?
├─ Relationnel + ACID + joins → Azure SQL
│ ├─ Cloud-first, nouvelles apps → SQL Database
│ │ ├─ Mission-critical low-latency → Business Critical
│ │ ├─ Volume >4 TB ou scale reads massif → Hyperscale
│ │ └─ Standard prod → General Purpose
│ ├─ Migration SQL Server avec Agent/CLR/cross-DB → SQL Managed Instance
│ └─ Compat 100% + control OS / agents tiers → SQL on Azure VM (+ AHB)
│
├─ MySQL / PostgreSQL → MySQL/PG Flexible Server
│ ├─ Prod HA → GP ou Memory Optimized
│ └─ Dev/test → Burstable
│
├─ NoSQL global, schema-less, low-latency → Cosmos DB
│ ├─ Documents JSON natifs → NoSQL API
│ ├─ Migrer MongoDB → MongoDB API
│ ├─ Migrer Cassandra → Cassandra API
│ ├─ Graphes (social, fraud) → Gremlin API
│ └─ App PG distribuée massive → PostgreSQL API (Citus)
│
├─ Cache key-value RAM (sessions, offload DB) → Azure Managed Redis ⭐
│ (ou Cache for Redis legacy si déjà déployé)
│
├─ Fichiers / blobs → Storage Account (fiche 7)
└─ Big data analytical → Synapse / Databricks (fiche 10)
Par tier SQL DB
Quel tier Azure SQL DB ?
├─ Production "HA" sans précision → Business Critical (réponse 305 par défaut)
├─ Mission-critical + read replicas inclus → Business Critical
├─ Volume >4 TB ou jusqu'à 100 TB → Hyperscale
├─ Scale reads massif (30 read replicas) → Hyperscale
├─ Budget restreint + RTO 30s OK → General Purpose
└─ Dev/test sporadique avec auto-pause → Serverless
Par consistency Cosmos
Use case ?
├─ Compteurs critiques, finance → Strong
├─ Tolère retard borné → Bounded Staleness
├─ Read-your-own-writes (default, le + courant) → Session ⭐
├─ Order matter, pas de gaps → Consistent Prefix
└─ Likes counter, no fresh required → Eventual
M. Pièges récurrents 305
- 🚨 OLTP vs OLAP : SQL DB / Cosmos = OLTP. Synapse Dedicated / Fabric Warehouse = OLAP (fiche 10).
- 🚨 SQL DB BC = "HA seamless" (Always On AG <10s). GP = "HA avec disruption" (~30s reattach).
- 🚨 Hyperscale = SQL DB only (pas MI).
- 🚨 SQL MI cap ~16 TB. Au-delà → SQL DB Hyperscale forcément.
- 🚨 Premium DTU = BC vCore (même archi, 2 nommages).
- 🚨 DTU = pas d'Azure Hybrid Benefit. vCore only.
- 🚨 MySQL/PG Burstable = pas de HA. Prod HA → GP ou Memory Optimized.
- 🚨 Single Server MySQL/PG = legacy → Flexible Server.
- 🚨 DR cross-region MySQL/PG : pas d'Auto-FG natif → GRS backup + Read Replica cross-region (promotion manuelle).
- 🚨 Cosmos PK figée à la création (pas modifiable).
- 🚨 Cosmos Strong consistency multi-region = très cher + lent. Session suffit 99% cas.
- 🚨 Synapse Link Cosmos = sunset 2026 → Fabric Mirroring pour nouveaux projets.).
- 🚨 SQL VM = IaaS : tout est à ta charge (patch, HA, backup). PaaS gère tout.
DEMO
Demo Portail — Create Cosmos DB account + container
💡 Serverless vs Provisioned : Provisioned = réserves RU/s (manual / autoscale), payé 24/7, charge prévisible. Serverless = pay-per-RU, max ~5k RU/s + 1 TB, pas multi-region writes, idéal dev/test.
Azure Cosmos DB > Create > Azure Cosmos DB for NoSQL(ou MongoDB / Cassandra / Gremlin / Table)- Basics tab :
- Resource Group + Account Name :
mycosmos(FQDN globalement unique) - Location : East US
- Capacity mode : Provisioned throughput ou Serverless
- Apply Free Tier Discount : Apply (1000 RU/s gratuites si dispo)
- Resource Group + Account Name :
- Global Distribution tab :
- Geo-Redundancy : Enable (read replica paired region)
- Multi-region Writes : Enable
- Availability Zones : Enable
- Networking tab : All networks / Selected networks / Private endpoint
- Backup Policy tab : Continuous (7 days) ⭐ gratuit (PITR self-service) ou Continuous 30j / Periodic
- Encryption tab : Service-managed key ou Customer-managed key (KV)
- Review + create (5-10 min)
- Après création — créer DB + container :
mycosmos > Data Explorer > New Container- Database id :
mydb - Container id :
orders - Partition key :
/customerId(haute cardinalité, figé) - Throughput : Manual / Autoscale (max RU/s) / Serverless
mycosmos > Replicate data globally: cliquer regions sur la carte + drag Failover priorities → Save- Data Explorer : New Item (JSON) + New SQL Query (
SELECT * FROM c WHERE c.customerId="C-001")
Demo — Cosmos Continuous Backup (PITR)
- À la création :
Backup policy: Continuous (7 days or 30 days) - Restore :
Cosmos DB > Point in time restore→ timestamp + nouveau account destination
Demo Portail — Cosmos Entra ID auth
Cosmos DB > Access Control (IAM) > + Add role assignment- Rôle : Cosmos DB Built-in Data Contributor → assigner à user / Managed Identity
- (Optionnel)
Cosmos DB > Settings > Features: activer Disable local auth (Entra-only) - Côté app : utiliser
DefaultAzureCredential(MSAL) au lieu des keys
Demo Portail — Create Azure SQL DB + Entra ID auth (avec VM/SSMS)
Étape 1 — Créer VM jump avec SSMS
Virtual machines > + Create > Azure virtual machine- Basics :
- Resource Group :
rg-sqldemo - Virtual machine name :
vm-ssms - Image : Windows Server 2022 Datacenter (ou marketplace avec SSMS)
- Public inbound : Allow RDP (3389)
- Resource Group :
- Networking : créer
vnet-sqldemo+ subnetsnet-vm - Review + create → RDP, installer SSMS (
aka.ms/ssmsfullsetup)
Étape 2 — Créer SQL Server + SQL Database
SQL databases > + Create- Basics tab :
- Resource Group :
rg-sqldemo - Database name :
mydb - Server → Create new :
- Server name :
mysrv-demo - Authentication method : Use both SQL and Microsoft Entra authentication (ou Entra-only)
- Set Microsoft Entra admin : sélectionner user/group Entra
- Server name :
- Want to use SQL elastic pool? : No
- Compute + storage > Configure database :
- Service tier : General Purpose / Business Critical / Hyperscale
- Compute tier : Provisioned ou Serverless (auto-pause)
- Hardware : Standard-series Gen5 + vCores + Storage
- Resource Group :
- Networking tab :
- Connectivity method : Public endpoint (selected networks) ou Private endpoint
- Allow Azure services and resources to access this server : No
- Add current client IP address : Yes (optionnel)
- Security tab : Microsoft Defender for SQL (recommandé) + Transparent data encryption ON (default)
- Additional settings : Use existing data = None / Backup / Sample (AdventureWorksLT)
- Review + create
Étape 3 — Autoriser le VNet de la VM
mysrv-demo > Security > Networking- Public network access : Selected networks
- Virtual networks > + Add existing virtual network :
- VNet
vnet-sqldemo, Subnetsnet-vm→ Enable (Service EndpointMicrosoft.Sql)
- VNet
- Save
Étape 4 — Activer Entra ID auth (si pas fait à la création)
mysrv-demo > Settings > Microsoft Entra ID- Set admin → user/group
DB Admins→ Save - (Optionnel) Microsoft Entra authentication only : On → Save
Étape 5 — Se connecter via SSMS depuis la VM
- RDP
vm-ssms→ ouvrir SSMS - Connect > Database Engine :
- Server name :
mysrv-demo.database.windows.net - Authentication : Microsoft Entra MFA
- Database (Options) :
mydb
- Server name :
Étape 6 — Créer un contained user (SQL DDL)
💡 Explication :
EXTERNAL PROVIDER= principal Entra. Le user dans la DB est mappé par nom (pas de password).db_datareader/writer= rôles SQL built-in pour CRUD sans droits admin/DDL.
CREATE USER [my-app] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [my-app];
ALTER ROLE db_datawriter ADD MEMBER [my-app];
Étape 7 — Côté app .NET (Managed Identity, zéro password)
var credential = new DefaultAzureCredential();
var sqlConn = new SqlConnection("Server=mysrv-demo.database.windows.net;Database=mydb;");
sqlConn.AccessToken = (await credential.GetTokenAsync(
new TokenRequestContext(new[] { "https://database.windows.net/.default" }))).Token;
📚 DEMO Azure Managed Redis = traitée dans la fiche 5 - App Integration Services.