3. Azure SQL托管实例架构与部署实战
Azure SQL 托管实例(Azure SQL Managed Instance,简称 MI)是 Azure 上最接近本地 SQL Server 的 PaaS 形态。它把数据库引擎、SQL Agent、CLR、Service Broker、跨库查询、链接服务器等能力保留下来,同时把操作系统补丁、高可用副本、备份和底层存储交给平台管理。理解它的架构,关键要抓住三件事:计算与存储分离、部署必须落在委派子网中、连接入口由网关统一转发。这三件事决定了后续网络集成、存储配置和连接验证的全部做法。
架构原理:计算、存储与网关三层
托管实例运行在一个由 Azure 管理的虚拟集群(virtual cluster)中。用户创建的第一个实例会在指定子网内“占位”形成一个虚拟集群,后续同子网的实例共享这个集群资源。计算层是 SQL Server 引擎进程,运行在专用节点上;存储层由 Azure 高级存储或高级 SSD 提供,数据、日志、tempdb 都落在托管磁盘上,并通过 Always On 可用性组实现本地高可用——主副本与至少一个辅助副本同步提交,故障时自动切换。备份写入 Azure 存储账户,支持时间点还原。
连接入口是很多人第一次部署时踩坑的地方。客户端并不直接连到引擎节点,而是先连到网关,由网关根据实例的可用性组监听器把流量转发到当前主副本。因此连接字符串里的主机名是 <实例名>.<dns前缀>.database.windows.net,端口固定为 1433。网关有两种连接类型:代理(Proxy)默认模式,流量经网关中转,适合从本地或对等网络接入;重定向(Redirect)模式,客户端先问网关拿到节点地址,再直连 11000–11999 端口,延迟更低,但要求客户端能访问这些端口。下面的图展示了这三层关系与两种连接路径。
网络集成:委派子网是硬性前提
托管实例不能部署在普通子网里,必须使用委派给 Microsoft.Sql/managedInstances 的子网。这个子网只能放托管实例,不能混放虚拟机、应用网关等其它资源。创建时通常需要至少 /27 的地址空间(约 32 个可用 IP),因为虚拟集群会预留一批地址用于节点、网关和内部通信。子网还需要关联一个网络安全组(NSG)和路由表(UDR),用于放行管理流量并禁止出网滥用。
网络连通性有两条典型路线。第一条是专用终结点:在应用所在虚拟网络的另一个子网中创建专用终结点,指向托管实例,流量走 Azure 骨干网,不经过公网,适合生产环境。第二条是公共终结点:为实例启用公共端点,客户端通过公网连接,必须配合 NSG 限制来源 IP,仅建议测试或临时使用。如果本地数据中心要接入,则通过 VPN 网关或 ExpressRoute 把本地网络与托管实例所在虚拟网络打通,并在 DNS 上把实例主机名解析到网关地址。
存储配置:按工作负载选层与容量
托管实例的存储与计算规格绑定。选择“常规用途”或“业务关键”服务层级后,再选 vCore 数量,存储容量和 IOPS 随之确定。业务关键层使用本地 SSD 和多个副本,延迟更低,适合高事务量场景;常规用途层使用远程高级存储,成本更优。存储容量一旦设定只能增大不能缩小,因此规划时要留出增长余量。tempdb 由平台管理,但业务关键层的 tempdb 会占用实例存储配额,需要一并考虑。
下面给出一个示例参数表,用于说明选型时各字段之间的关系(数值为教学示例,实际以 Azure 门户和定价页为准):
| 参数 | 示例值 | 说明 |
|---|---|---|
| 服务层级 | 业务关键 | 本地 SSD,多副本,低延迟 |
| vCore | 8 | 决定计算能力与最大存储 |
| 存储容量 | 256 GB | 只能增大,规划留余量 |
| 子网地址范围 | 10.10.1.0/27 | 委派给托管实例 |
| 连接类型 | 重定向 | 低延迟,需放行 11000–11999 |
| 时区 | China Standard Time | 创建后不可更改 |
部署流程与连接验证
部署通常按以下顺序推进:先创建资源组和虚拟网络,划出委派子网并配置 NSG 与路由表;再创建托管实例,指定名称、登录账号、服务层级、vCore、存储和排序规则;等待部署完成(通常需要数十分钟到数小时);最后配置连接方式并验证。用 Azure CLI 创建的核心命令如下:
az sql mi create \
--resource-group rg-mi-demo \
--name mi-demo-01 \
--location eastasia \
--subnet /subscriptions/<sub-id>/resourceGroups/rg-mi-demo/providers/Microsoft.Network/virtualNetworks/vnet-mi/subnets/snet-mi \
--admin-user sqladmin \
--admin-password '<强密码>' \
--license-type BasePrice \
--capacity 8 \
--storage 256 \
--tier BusinessCritical \
--collation SQL_Latin1_General_CP1_CI_AS \
--timezone-id 'China Standard Time'
部署完成后,先确认实例状态为 Ready,再获取主机名:
az sql mi show -g rg-mi-demo -n mi-demo-01 --query "{fqdn:fullyQualifiedDomainName,state:state}" -o table
连接验证建议分三步。第一步,用 Test-NetConnection 或 nc 测试 1433 端口是否可达;第二步,用 sqlcmd 登录并查询版本与当前节点:
sqlcmd -S mi-demo-01.<dns前缀>.database.windows.net,1433 -U sqladmin -P '<密码>' -Q "SELECT @@VERSION; SELECT SERVERPROPERTY('ServerName');"
第三步,验证业务能力:创建数据库、执行跨库查询、检查 SQL Agent 作业是否可创建。若使用重定向模式,还要确认客户端能访问 11000–11999 端口,否则会退化为代理模式或连接失败。判断部署是否成功的依据是:实例状态 Ready、1433 可达、能成功登录并返回版本信息、目标功能(如跨库查询、Agent)可用。
把架构、网络、存储和验证串起来看,托管实例的部署本质上是“先规划网络与子网,再定计算与存储规格,最后打通连接并逐层验证”。只要委派子网、NSG/UDR、DNS 和端口这几项对齐,后续迁移本地 SQL Server 数据库、配置故障转移组和只读副本都会顺畅很多。