Microsoft Azure Services and Architecture Questions
Microsoft Azure's core service catalog and architectural patterns: Virtual Machines, managed Kubernetes (AKS), App Service and Azure Functions, Storage accounts and managed disks, Azure SQL and Cosmos DB, VNets with hybrid connectivity and global load balancing, Microsoft Entra ID and RBAC, and Key Vault secrets and encryption. Covers Azure service selection, infrastructure as code (ARM, Bicep, Terraform), observability with Azure Monitor and Kusto queries, cost governance and Azure Policy, the Azure Well-Architected design principles, and hybrid management via Azure Arc, common in enterprise Azure estates. For provider-agnostic trade-offs, see the cross-cloud entries.
You must design backup and restore for a three-tier application running in Azure: web VMs, app VMs, and Azure SQL Managed Instance. Define backup cadence, retention, offsite replication, and a test plan to achieve an RPO of 15 minutes and an RTO of 1 hour. Mention Azure Backup, point-in-time restore, transaction log backups, and any service limitations.
Sample Answer
Direct answer
Meeting a 15-minute Recovery Point Objective (RPO, how much recent data you can afford to lose) and a 1-hour Recovery Time Objective (RTO, how long the system can stay down before it must be back up) across a mixed estate means treating the virtual machine (VM) tiers and the Managed Instance (MI) tier as separate problems: MI's own transaction-log backups, taken roughly every 5 to 10 minutes, satisfy the 15-minute RPO for data on their own, but a default nightly VM backup does not, so any VM tier holding real, non-reconstructible state needs continuous or near-continuous replication, not just a backup schedule.
Backup cadence and retention
- Web and app VMs (stateless): if these tiers truly hold no unique state (configuration and code come from Infrastructure as Code and a deployment pipeline, not from anything written on the VM's disk), their "RPO" is really about redeploying known-good artifacts, satisfied by daily Azure Backup snapshots plus the deployment pipeline itself, not by tight backup cadence.
- Any VM tier holding real, hard-to-reconstruct data (uploaded files not yet copied to Blob storage, local write-ahead logs): a nightly Azure Backup snapshot cannot hit a 15-minute RPO by construction. Use Azure Site Recovery (ASR) instead, which replicates changes continuously and supports RPOs in the range of 30 seconds to a few minutes, well inside the target.
- Azure SQL Managed Instance: automated backups already include a weekly full, differential backups roughly every 12 hours, and transaction-log backups roughly every 5 to 10 minutes, giving point-in-time restore at that granularity. Default retention is 7 days, configurable up to 35; set retention to whatever the actual test-and-recovery window requires, not the default by habit.
Recovery Time Objective (RTO) and the restore-time caveat
Restoring VMs from Azure Backup, or failing over Azure Site Recovery-replicated VMs, should sit comfortably inside a 1-hour RTO once pre-tested, since ASR failover is measured in minutes. The Managed Instance side deserves an explicit caveat rather than an assumed pass: a point-in-time restore replays backups, so its duration scales with database size and log volume, a small, low-churn MI database restores quickly, but a very large or high-churn one can take considerably longer than an hour. Don't state "1-hour RTO" as met without drilling the actual database at production scale; if that drill shows the restore exceeding the target, the fix is to rely on a warm secondary (an auto-failover group) for the primary RTO path, and reserve point-in-time restore for logical or data-corruption recovery, a different scenario with a different acceptable RTO, rather than for infrastructure disaster recovery.
Design and validation
flowchart TB
subgraph P[Primary Region]
W1[Web VMs] --> A1[App VMs] --> M1[(SQL Managed Instance)]
end
subgraph S[Secondary Region]
W2[Web VMs, ASR replica]
A2[App VMs, ASR replica]
M2[(MI secondary, Failover Group)]
end
W1 -. ASR continuous replication .-> W2
A1 -. ASR continuous replication .-> A2
M1 -. transaction-log shipping, roughly 5-10 min .-> M2
A test plan for a 15-minute RPO and 1-hour RTO must exercise the whole chain, not just the database: (1) trigger an ASR failover for the VM tiers and confirm the failed-over VMs come up healthy inside the time budget, (2) trigger an MI point-in-time restore or failover-group failover and time it at realistic data volume, not a small test database, (3) repoint Domain Name System (DNS) or Traffic Manager (Azure's DNS-based service that can detect an unhealthy endpoint and redirect clients elsewhere) to the recovered region and run an application-level integrity check (not just "the VM is up") before cutting user traffic over, and (4) confirm data consistency across the tiers, since the app and database tiers may have recovered to slightly different points in time if their replication mechanisms have different lag characteristics.
Mentions and limitations
Azure Backup supports soft-delete on recovery points (protecting against accidental or malicious deletion) and vault immutability for compliance regimes that require backups be tamper-proof, distinct from, and in addition to, the RTO/RPO requirement itself. If any tier here were instead a legacy Windows file server VM rather than a stateless app tier, Azure Site Recovery (managed, low RTO/RPO, application-agnostic) is generally preferable to storage-account-level geo-replication (coarser, asynchronous, no application awareness) or application-level replication like Distributed File System (DFS) Replication (finer conflict handling, but unmanaged by Azure); pick ASR unless an existing, well-tested application-level replication feature is already in place and trusted.
Trade-offs and pitfalls
- Assuming a daily VM backup satisfies a 15-minute RPO for a tier that actually holds unique state is the most common gap in a design like this; check what each tier actually persists before picking its recovery mechanism.
- Quoting a 1-hour RTO for Managed Instance restore without having drilled it at production data volume is exactly the kind of gap this design should not excuse away; state the dependency (restore time scales with database size) instead.
- Recovering the VM tiers and the database tier to slightly different points in time is possible if their replication mechanisms aren't synchronized; the test plan must check cross-tier consistency, not just that each tier independently recovered.
Design an architecture and migration plan to move on-prem Oracle databases to Azure with minimal downtime. Compare using Azure Database Migration Service, Oracle Data Guard replication, or running Oracle on Azure VMs with Oracle RAC. Discuss licensing considerations, HA and DR strategies, backup and restore plans, and a cutover approach with rollback options.
Sample Answer
Direct answer
For keeping the database engine as Oracle (not converting to a different engine), the three realistic paths are Oracle Data Guard replication into Oracle running on Azure VMs, Oracle RAC (Real Application Clusters) on Azure VMs for the highest-availability tier, or, for large or latency-sensitive estates, Oracle AI Database@Azure (Oracle's Exadata and Autonomous Database services running physically inside Microsoft's datacenters, jointly operated by Oracle and Microsoft). One correction to the premise worth stating directly: Azure Database Migration Service (DMS) is not actually a fit for this scenario. As of current Microsoft documentation, DMS's supported scope is SQL Server and Azure SQL targets only, it does not migrate Oracle sources; DMS's older Oracle support was for converting an Oracle schema into SQL Server/Azure SQL (a re-platform, changing engines), which is a fundamentally different project from "move this Oracle database to Azure and keep it Oracle." Data Guard and RAC are the right comparators for a same-engine move; DMS isn't a third option alongside them for this specific ask.
Comparison
| Data Guard to Oracle on Azure VMs | Oracle RAC on Azure VMs | Oracle AI Database@Azure | |
|---|---|---|---|
| What it is | Physical or logical standby, continuous redo apply from primary to standby | Multiple Oracle instances sharing one database on clustered storage, active-active at the instance level | Oracle's own Exadata/Autonomous infrastructure, colocated in Azure datacenters, managed by Oracle |
| HA/DR model | DR-oriented: standby takes over on failure (manual or fast-start failover with Data Guard Broker) | HA-oriented: surviving instances keep serving without a failover event, since all instances already have the database open | Whichever Oracle-native pattern fits (Data Guard, RAC, or Autonomous's own managed HA) inside Oracle's infrastructure |
| Azure VM fit | Straightforward: two (or more) VMs, no shared-storage requirement | Needs shared storage across VMs, which Azure VMs don't provide natively the way an on-prem SAN does; requires a supported clustered-storage solution (e.g., Oracle ACFS (Automatic Storage Management Cluster File System, Oracle's clustered file system) over a clustered file layer, or a third-party clustered storage product), adding real design and support complexity | No VM sizing/storage design needed; it's a managed service consumption model |
| Licensing | Oracle Processor or NUP (Named User Plus, Oracle's per-user licensing metric) licensing on Azure VM vCPUs, counted per Oracle's Authorized Cloud Environments policy: 2 vCPUs = 1 Oracle Processor license when hyperthreading is enabled, 1 vCPU = 1 license if disabled | Same licensing basis as above, but RAC itself is a separately licensed Oracle option on top of the base database license, which materially changes the cost | Billed through Azure Marketplace against your Microsoft Azure Consumption Commitment; existing Oracle licenses can be applied via Bring Your Own License or an Unlimited License Agreement |
| Typical use case | Standard-tier DR requirement, most workloads | Workloads that genuinely cannot tolerate any failover event, not just fast recovery | Large, latency-sensitive, or Exadata-dependent estates where lift-and-shift to generic VMs isn't realistic |
Worked example: cutover approach with rollback
For a Data Guard-based migration (the common case for most workloads that don't need RAC's zero-failover guarantee):
- Stand up the standby first. Provision the target Azure VM(s) with the same Oracle version and patch level as the source, configure Data Guard as a physical standby, and let redo apply catch up fully before touching production traffic. This can run for days with zero production risk since the primary is untouched.
- Validate independently. Run read-only queries against the standby (in Active Data Guard mode if licensed for it) to confirm data correctness and confirm redo apply lag stays within your RPO (Recovery Point Objective: how much data you can afford to lose) tolerance under real production load, not just idle replication.
- Cutover window: stop application writes briefly (or use Data Guard's switchover, which is a clean, no-data-loss role swap when both sides are healthy, versus a failover which implies the old primary is gone), confirm the standby (now primary) is fully caught up, repoint the application's connection string (ideally via a DNS alias or a connection manager that doesn't require redeploying the app), and resume writes against the new Azure-hosted primary.
- Rollback plan: because a switchover (not a failover) leaves the original on-prem primary intact and just demoted to standby, rolling back is the same switchover procedure run in reverse, provided you do it before the on-prem environment is decommissioned. Keep the on-prem primary in standby role, still receiving redo, for an agreed burn-in period (commonly 1 to 2 weeks) before decommissioning it, specifically so rollback stays a switchover rather than "restore from backup and lose data."
Trade-offs and pitfalls
The most consequential mistake is treating RAC as a default "more available, so better" choice without weighing its cost: RAC's licensing and its shared-storage requirement on Azure VMs add real design complexity and cost for workloads whose actual requirement is "recover quickly," not "never have a failover event at all," which Data Guard already satisfies more cheaply. The second is licensing: Oracle's Authorized Cloud Environments policy has specific, auditable vCPU-counting rules, and guessing at compliance rather than confirming licensing with Oracle (or a licensing specialist) before migrating is a common source of expensive after-the-fact true-ups. Finally, treating "the standby is caught up" as sufficient validation without testing it under real production load is how teams discover redo-apply lag was fine in testing but not under peak traffic, right when they need the standby to actually be current.
Summarize the differences between Azure SQL Database (Single Database), Elastic Pool, and Azure SQL Managed Instance. For a SaaS product with hundreds of small tenant databases and variable per-tenant load, which option would you choose and why? Discuss trade-offs in cost, isolation, migration complexity, and network topology.
Sample Answer
Direct answer
For a SaaS product with hundreds of small tenant databases and variable, largely uncorrelated per-tenant load, an Elastic Pool is the right default, because it is built specifically for this shape of problem: many databases that individually have unpredictable, bursty utilization but rarely all peak at the same moment. Pooling lets them share a budget of compute and storage resources instead of each database paying for its own worst-case peak capacity around the clock.
Structured elaboration
| Option | Fit for this scenario | Isolation | Migration complexity | Network topology |
|---|---|---|---|---|
| Single Database | Best per-tenant isolation and independent scaling, but paying for hundreds of individually provisioned databases sized for peak is the most expensive option when load is bursty and uncorrelated | Full: separate compute allocation per database | Simplest to reason about individually, but managing hundreds of independent scaling, backup, and monitoring configurations at fleet scale is itself an operational cost | Straightforward, one logical server can front many single databases |
| Elastic Pool (recommended default) | Purpose-built for many small databases with variable, uncorrelated load: a pool sized for the aggregate, not the sum of every tenant's individual peak | Statistical, not absolute: a shared resource ceiling means sustained high load from a few tenants can pressure others, mitigated with per-database min/max resource limits | Straightforward from Single Database, same connection model and T-SQL (Transact-SQL, the SQL dialect Azure SQL uses) surface; the new work is pool sizing and per-database limits | Same as Single Database, one or more logical servers, pools sit under a server |
| Managed Instance | Fits near-total SQL Server surface-area compatibility needs (cross-database queries, SQL Agent, linked servers) or a smaller number of larger, predictable tenants, not hundreds of small variable ones | Instance-level isolation via a dedicated, virtual-network-injected instance, stronger network isolation, but per-instance, not per-tenant-database within it | Highest compatibility with on-premises SQL Server, easiest lift-and-shift, but solves a different problem than many small SaaS tenants | Virtual-network-injected by design, right when tenants contractually require that isolation, unnecessary cost and complexity otherwise |
Cost trade-off, concretely. Pooled compute is priced for the pool as a whole, so the economics depend on how correlated tenant load actually is. If tenants genuinely spike independently and rarely simultaneously, a pool sized well below the sum of every tenant's individual peak still comfortably serves the real aggregate demand at any given moment, which is the entire cost argument for pooling. If tenant load were instead highly correlated, for example every tenant is a retailer spiking together during the same shopping event, pooling provides much less benefit, since the pool would need to be sized near the sum of peaks anyway, at which point Single Database with per-tenant autoscale might be comparably priced with better isolation.
Isolation trade-off. A noisy-neighbor tenant in a shared pool can degrade others sharing that pool's resource budget. The mitigation is a per-database maximum resource limit, so no single tenant can consume the whole pool, and, for a small number of especially large or sensitive tenants, moving just those specific ones out to their own Single Database, a hybrid model many real multi-tenant SaaS platforms land on: most tenants pooled, a handful of large or premium-tier tenants isolated, rather than treating "pool everyone" or "isolate everyone" as the only two choices.
Migration complexity. Moving from Single Database to an Elastic Pool is low-friction and largely operational, since the connection string and T-SQL surface do not change. Managed Instance requires accounting for its virtual-network-injected model, and is specifically valuable for compatibility features pools and single databases lack, cross-database queries between tenant databases being a genuine reason to consider it if the SaaS design actually needs that.
Network topology. Pools and single databases share a logical-server model reachable via public endpoint with firewall rules or a private endpoint. Managed Instance's network injection is heavier infrastructure, subnet delegation, network security group rules, potentially a VPN or ExpressRoute (a private, dedicated network connection between an on-premises network and Azure that bypasses the public internet) for hybrid connectivity, that buys real isolation and on-premises compatibility but is unwarranted complexity for a scenario with no stated on-premises or cross-database-query requirement.
Worked example
300 tenant databases, each averaging 20 DTU-equivalent load (DTU, or Database Transaction Unit, is Azure SQL's blended measure of provisioned CPU, memory, and I/O capacity; higher numbers mean more provisioned throughput) with occasional individual spikes to 100 DTU-equivalent lasting a few minutes, and spikes empirically uncorrelated across tenants, verified from the platform's own monitoring, not assumed, with typically no more than about 15 tenants spiking simultaneously at any given moment. Provisioning 300 Single Databases each sized for its own 100-DTU peak requires 300 x 100 = 30,000 DTU-equivalent of standing capacity. A pool sized for roughly 15 simultaneous 100-DTU spikes plus the remaining 285 tenants' 20-DTU baseline: 15 x 100 + 285 x 20 = 1,500 + 5,700 = 7,200 DTU-equivalent, with some headroom, comfortably covers the actual observed aggregate demand at 7,200 / 30,000 = 24 percent, just under a quarter, of the Single-Database sum-of-peaks cost. That arithmetic, not a general assumption that pooling is cheaper, is the actual basis for recommending it here.
Trade-offs and pitfalls
Assuming pooling is always cheaper without checking whether tenant load is actually uncorrelated is the main risk, since a SaaS product whose tenants spike together, a shared business calendar event or a shared upstream dependency outage causing a shared retry storm, gets little of the statistical-multiplexing benefit the cost argument depends on. Putting every tenant, including a few unusually large or contractually isolated ones, into the same shared pool without per-database resource limits lets one tenant's incident become every tenant's incident. And reaching for Managed Instance's heavier network and compatibility model for a scenario that never actually needed cross-database queries or on-premises SQL Server compatibility means paying for isolation and features the design does not use.
Given a global application with regulatory constraints and the need for durable data, explain how you would choose among Azure storage replication options (LRS, ZRS, GRS, RA-GRS, GZRS). Discuss cost trade-offs, RTO/RPO implications, regional availability constraints, and data-access semantics.
Sample Answer
Direct answer
Choose replication by the failure you must survive and by what data-residency rules permit, not by defaulting to the most redundant option available. Locally Redundant Storage (LRS) only survives a hardware failure inside one datacenter; step up to Zone-Redundant Storage (ZRS) when residency rules permit multiple zones but not another region and you need to survive a datacenter-level failure; step up to Geo-Redundant Storage (GRS) or Geo-Zone-Redundant Storage (GZRS), and their read-access (RA-) variants, only when residency rules allow an asynchronous copy to leave the region and the workload needs to survive a full regional disaster.
Replication options
| Option | Copies | Durability (per year, approximate) | Survives | Secondary readable? |
|---|---|---|---|---|
| LRS | 3, one datacenter | 99.999999999% (11 nines) | Nothing above hardware failure | No secondary |
| ZRS | 3, three zones in one region | 99.9999999999% (12 nines) | Datacenter/zone failure | No secondary (single region) |
| GRS | LRS primary + async LRS copy in a paired region | 99.99999999999999% (16 nines) combined | Regional failure | Not directly (until failover) |
| RA-GRS | Same as GRS | Same as GRS | Regional failure | Yes, via a separate read-only endpoint |
| GZRS | ZRS primary + async LRS copy in a paired region | 99.99999999999999% (16 nines) combined | Zone failure and regional failure | Not directly (until failover) |
| RA-GZRS | Same as GZRS | Same as GZRS | Zone failure and regional failure | Yes, via a separate read-only endpoint |
Recovery Time Objective (RTO) and Recovery Point Objective (RPO) implications
Microsoft targets a Recovery Point Objective (RPO, in plain terms: how much data you could lose, measured as time since the last successful copy) of under 15 minutes for asynchronous geo-replication (the GRS and GZRS family), but this is a target, not a Service Level Agreement (SLA): there is no contractual guarantee on how current the secondary copy is at any given moment. There is also no automatic failover: a regional outage requires a customer-initiated account failover, so Recovery Time Objective (RTO, in plain terms: how long the service stays down before it is back up and serving traffic again) is bounded mainly by how fast your operations team detects the outage and triggers the failover (the failover operation itself typically completes within roughly an hour), plus any downstream Domain Name System (DNS) propagation for clients pointed at the storage endpoint. Building automated health-check-driven failover triggers matters as much as picking GRS over LRS in the first place.
Cost and access-semantics trade-offs
Each step up the table costs more per gigabyte stored. RA-GRS and RA-GZRS cost slightly more than their non-RA counterparts for the always-on readable secondary, and reads from the secondary can return slightly stale data relative to the primary because replication is asynchronous, an eventual-consistency trade a read-heavy reporting workload can usually absorb but a "read your own write" workload cannot.
Worked example
A global application under a data-residency rule that forbids any copy of the data leaving its home region, but with a compliance requirement to survive a datacenter outage without data loss, should land on ZRS: it satisfies "stay in the region" while giving 12-nines durability against a zone failure, something LRS cannot do. A separate workload without a residency constraint that must survive a full regional disaster with minimal data loss, and needs to keep serving reads during the outage from a secondary, should land on RA-GZRS: it combines in-region zone resilience with a readable cross-region copy, at the highest cost tier in the table but the only one that meets both requirements simultaneously.
Trade-offs and pitfalls
- Picking GRS/GZRS by habit when a residency rule actually forbids a cross-region copy is a compliance defect, not just an overspend; check the residency constraint before the durability target.
- RA- variants add a readable secondary endpoint, but application code must be written to use it deliberately (a separate connection string), it isn't transparent read-scaling.
- No option here has an SLA-backed RPO of exactly zero; if the workload truly cannot tolerate any data loss on a regional failure, that requirement needs synchronous replication at the application or database layer, not storage-account replication alone.
Explain Azure Storage account types and when to use each: General-purpose v2 (GPv2), Blob storage, File storage, Queue, Table, and premium Blob/File tiers. Cover performance tiers, access tiers (hot/cool/archive), durability/replication options (LRS/ZRS/GRS/GZRS), and practical examples such as logs, media assets, and long-term compliance archives.
Sample Answer
Direct answer
General-purpose v2 (GPv2) is the default account type and the one to reach for unless a specific requirement rules it out: one account serves Blob, File, Queue, and Table, supports both standard and premium performance, and lets Blob data move between hot, cool, and archive access tiers as its access pattern changes. Dedicated premium Blob (BlockBlobStorage) and premium File (FileStorage) accounts trade that tiering flexibility for consistently low, SSD-backed latency on a single service.
Account types and performance tiers
| Account type | Services | Performance tier | Best for |
|---|---|---|---|
| General-purpose v2 (GPv2) | Blob, File, Queue, Table | Standard (hard-disk-drive-class) or Premium | The default choice for mixed workloads; the only type with hot/cool/archive access tiers |
| Premium block blob (BlockBlobStorage) | Blob only | Premium (solid-state-drive-backed) only | High-transaction-rate, low-latency blob workloads (for example, large-scale data ingestion); no access tiers |
| Premium file shares (FileStorage) | Azure Files only | Premium (solid-state-drive-backed) only | Enterprise file shares needing consistent low latency over the Server Message Block (SMB) or Network File System (NFS) protocol |
| Legacy Blob storage / General-purpose v1 | Blob (v1: also others) | Standard or Premium | Mostly retired for new deployments in favor of GPv2 |
Access tiers (Blob data, standard performance, GPv2 or a dedicated Blob account)
- Hot: highest storage cost, lowest per-access cost. For data read or written frequently.
- Cool: lower storage cost, higher per-gigabyte access cost, and a minimum retention period (moving or deleting data early triggers an early-deletion charge). For infrequently accessed data expected to sit for at least 30 days.
- Archive: lowest storage cost by far, highest access cost, and objects must be rehydrated (which can take hours) before they can be read. For compliance or long-term retention data that's rarely, if ever, read.
Durability and replication (Locally Redundant Storage/LRS, Zone-Redundant Storage/ZRS, Geo-Redundant Storage/GRS, Geo-Zone-Redundant Storage/GZRS) are chosen independently of access tier: tier controls cost by access frequency, replication controls durability and disaster-recovery posture.
Worked example
An application produces three distinct data shapes. Rotating application logs are read heavily for about a week, then almost never: put them on GPv2 with a lifecycle-management policy that automatically moves blobs from Hot to Cool after 7 days and to Archive after 90 days. Media assets (images, video) served directly to users stay on GPv2 Hot (or a dedicated premium BlockBlobStorage account if request-rate latency becomes the bottleneck), since they're read continuously and tiering would only add cost via early-access charges. A 7-year compliance archive of signed contracts goes straight to Archive from day one, with an immutability (write once, read many) policy so it can't be altered, accepting hours-long rehydration in the rare event it's ever needed, because for a true compliance archive it almost never is.
The same estate also needs a Server Message Block (SMB) file share to lift-and-shift an on-premises file server. That requirement is Azure Files, not Blob storage: an application expecting a real file-system protocol can't be pointed at Blob's REST/HyperText Transfer Protocol (HTTP) interface. Use standard-tier Azure Files in a GPv2 account for a cost-sensitive share, or a dedicated premium FileStorage account if the share backs a line-of-business application that needs consistently low latency.
Trade-offs and pitfalls
- Moving a blob to Cool or Archive too early trips the early-deletion charge for that tier's minimum retention period; moving it too late wastes money on Hot-tier storage costs. Size the tier boundary from realistic access patterns, not aspirational ones.
- Archive-tier retrieval latency (hours to rehydrate) makes it unsuitable for anything with even a rare need for fast access.
- Premium Blob and premium File accounts don't support tiering at all; that's a deliberate trade of tiering flexibility for consistently low latency, not a strict upgrade over GPv2.
Unlock Full Question Bank
Get access to all 19 Microsoft Azure Services and Architecture interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.