使用 Google Cloud NetApp Volumes 块存储配置 SQL Server Always On 可用性组

本教程介绍了如何使用 Google Cloud NetApp Volumes 块存储和 Internet 小型计算机系统接口 (iSCSI) 协议,在 Compute Engine 虚拟机 (VM) 实例上部署 Microsoft SQL Server Always On 可用性组。将 NetApp Volumes 用于 SQL Server 存储可让您访问高性能、全代管式存储服务,该服务具有快照和克隆等高级数据管理功能。

目标

本教程将指导您完成以下任务:

费用

本教程使用 Google Cloud的以下收费组件:

如需根据您的预计使用量来估算费用,请使用价格计算器

准备工作

在开始之前,请确保您��有以下各项:

  1. 在 Google Cloud 控制台的项目选择器页面上, 选择或创建 Google Cloud 项目。

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择您被授予角色的任何项目。
    • 创建项目:如需创建项目,您需要 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予 角色

    转到“项目选择器”

  2. 验证是否已为您的 Google Cloud 项目启用结算功能。

  3. 一个 Google Cloud 项目,其中包含 Compute Engine、网络、Identity and Access Management 和 Cloud Storage 的管理员权限。
  4. 一个 VPC 网络,其中包含目标区域中的子网。
  5. 在该区域内建立的 Active Directory 和 DNS 服务。
  6. 一个 Active Directory 用户,该用户有权将计算机加入网域并使用 RDP 访问虚拟机。
  7. 确保 VPC 防火墙规则允许节点之间进行 iSCSI (TCP 3260)、WSFC (UDP/TCP 3343)、SQL Server (TCP 1433)、SQL Server AG 端点 (TCP 5022)、SMB (TCP 445) 和 RPC (TCP 135、TCP 49152-65535) 流量。
  8. 启用 NetApp Volumes API
  9. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

配置网域账号

为 SQL Server 配置两个 Active Directory 账号:

  • 安装账号:具有网域管理员权限(例如 DOMAIN\DomainAdmin)的账号,用于登录虚拟机并配置集群和可用性组。
  • 服务账号:SQL Server 虚拟机上的 SQL Server 服务和 SQL 代理服务的账号(例如 DOMAIN\sqlsvc)。

为 SQL Server 创建 Compute Engine 虚拟机

创建两个 Compute Engine 实例(sqlnode1sqlnode2),这两个实例在 Windows Server 2025 上运行 SQL Server 2022 Enterprise:

  1. 在 Google Cloud 控制台中,前往创建实例 页面。

    转到“创建实例”

  2. 对于名称,输入sqlnode1

  3. 机器配置 部分中,选择通用,然后执行以下操作:

    1. 系列 列表中,选择 N4
    2. 机器类型 列表中,选择 n4-highmem-8(8 个 vCPU、64 GB 内存)
  4. 选择您配置 VPC 的区域可用区

  5. 启动磁盘 部分,点击更改 ,然后执行以下操作:

    1. 公共映像 标签页上,从操作系统 列表中选择 Windows Server 上的 SQL Server
    2. 版本 列表中,选择 Windows Server 2025 Datacenter 上的 SQL Server 2022 Enterprise
    3. 启动磁盘类型 列表中,选择 Hyperdisk Balanced
    4. 大小 (GB) 设置为 50
    5. 要保存启动磁盘配置,请点击选择
  6. 展开高级选项 部分,然后展开网络

  7. 对于网络接口 ,选择项目的 VPC 和子网

  8. 网络接口卡类型 列表中,选择 gVNIC

  9. 网络服务层级 部分,选择高级

  10. 点击创建

  11. 重复这些步骤以创建第二个名为 sqlnode2 的实例。

将服务器加入网域并为集群做准备

sqlnode1sqlnode2 上执行以下步骤:

  1. 使用本地管理员账号连接到虚拟机。
  2. 服务器管理器 中,选择本地服务器
  3. 选择 WORKGROUP 链接。
  4. 计算机名称 部分,选择更改
  5. 选中网域 复选框,输入您的网域名称(例如 cvsdemo.internal),然后点击确定
  6. Windows 安全性 对话框中,输入网域管理员账号的凭据,然后点击确定
  7. 当系统显示网域的欢迎辞时,请完成以下步骤:a. 点击确定 。b. 点击关闭 ,然后选择立即重启
  8. 虚拟机重启后,使用网域管理员账号连接到虚拟机。
  9. DOMAIN\sqlsvc 账号添加到虚拟机上的本地 管理员 群组。您可以使用以下 PowerShell 命令:
    Add-LocalGroupMember -Group "Administrators" -Member "DOMAIN\sqlsvc"
    
  10. 以管理员身份打开 PowerShell,然后运行以下命令以安装所需的 Windows 功能:

    # Install Failover Clustering and tools
    Install-WindowsFeature Failover-Clustering, RSAT-Clustering-PowerShell, RSAT-Clustering-CmdInterface -IncludeAllSubFeature -IncludeManagementTools
    # Install and enable MPIO for iSCSI
    Install-WindowsFeature -Name Multipath-IO
    Enable-MSDSMAutomaticClaim -BusType "iSCSI"
    # Install .NET and other SQL prereqs
    Install-WindowsFeature NET-Framework-45-Core, NET-Framework-45-Features
    Install-WindowsFeature RSAT-AD-PowerShell
    
  11. 如需获取虚拟机的 iSCSI 限定名称 (IQN),请运行 iscsicpl.exe,前往配置 标签页,然后复制发起程序名称 。或者,运行以下 PowerShell 命令:

    Get-InitiatorPort | Select-Object NodeAddress
    

    记录 sqlnode1sqlnode2 的 IQN。下一部分将会用到它们。示例:iqn.1991-05.com.microsoft:sqlnode1.cvsdemo.internal

创建 NetApp Volumes 块存储卷

按照以下步骤创建主机组、存储池和 iSCSI 卷。

创建主机组

主机组可确保只有指定的主机(您的 SQL Server 虚拟机)才能访问您创建的卷。

  • 在 Cloud Shell 中,创建一个包含 sqlnode1sqlnode2 的 IQN 的主机组:

    gcloud netapp host-groups create HOST_GROUP_NAME 
    --location=LOCATION
    --type=ISCSI_INITIATOR
    --hosts=SQLNODE1_IQN,SQLNODE2_IQN
    --os-type=WINDOWS
    --description="SQL Server AG nodes"

    替换以下信息:

    • HOST_GROUP_NAME:主机组的名称,例如 sql-ag-hosts
    • LOCATION:主机组的区域,例如 us-west1
    • SQLNODE1_IQNsqlnode1 的 IQN。
    • SQLNODE2_IQNsqlnode2 的 IQN。

预配存储池

  • 在 Cloud Shell 中,为卷创建存储池:

    gcloud netapp storage-pools create POOL_NAME 
    --project=PROJECT_ID
    --location=ZONE
    --service-level=Flex
    --type=Unified
    --capacity=1024
    --total-throughput=64
    --total-iops=1024
    --network=name=VPC_NAME,psa-range=PSA_RANGE_NAME

    替换以下信息:

    • POOL_NAME:存储池的名称,例如 sql-pool
    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • ZONE:存储池的可用区,该可用区必须与虚拟机的可用区一致,例如 us-west1-b
    • VPC_NAME:您的 VPC 网络的名称。
    • PSA_RANGE_NAME:分配的专用服务访问通道连接范围的名称。

创建卷

为每个节点的 SQL Server 数据、日志、tempdb 和备份创建单独的卷。

  • 在 Cloud Shell 中,为您需要创建的每个卷运行以下命令:

    gcloud netapp volumes create VOLUME_NAME 
    --project=PROJECT_ID
    --location=ZONE
    --storage-pool=POOL_NAME
    --capacity=200
    --protocols=ISCSI
    --block-devices="name=VOLUME_NAME,host-groups=projects/PROJECT_ID/locations/LOCATION/hostGroups/HOST_GROUP_NAME,os-type=WINDOWS"
    --snapshot-directory=false

    VOLUME_NAME 替换为每个卷的唯一名称。在本双节点教程中,您需要运行该命令八次,以便为每个节点创建数据、日志、tempdb 和备份卷(例如 sqlnode1-datasqlnode1-logsqlnode1-tempsqlnode1-backupsqlnode2-datasqlnode2-logsqlnode2-tempsqlnode2-backup)。

在每个 SQL 虚拟机上装载 iSCSI 卷

对于每个虚拟机(sqlnode1sqlnode2),装载您为该特定节点创建的卷。

  1. 在 Google Cloud 控制台中,前往 NetApp Volumes 页面。

    前往卷

    选择分配给您要配置的节点的卷。记下 iSCSI 目标详细信息 部分中列出的目标门户 IP 地址。您需要使用这些地址连接到卷。

  2. 在虚拟机上,以管理员身份打开 PowerShell,然后运行以下命令,将示例 IP 替换为卷的目标门户 IP:

    "10.165.128.216","10.165.128.217" | ForEach-Object { New-IscsiTargetPortal -TargetPortalAddress $_ }
    

  3. 运行 iscsicpl.exe 以打开 iSCSI 发起程序属性

  4. 前往目标 标签页,从列表中选择一个卷目标,然后点击连接

  5. 连接到目标 对话框中,选择启用多路径 ,然后点击高级

  6. 高级设置 对话框中:

    1. 本地适配器:选择Microsoft iSCSI 发起程序
    2. 发起程序 IP:选择虚拟机上的 IP 地址。
    3. 目标门户 IP:选择您发现的门户 IP 之一。
    4. 点击确定
  7. 连接到目标 对话框中,点击确定

  8. 对与虚拟机关联的所有目标重复连接步骤。

  9. 如需为 iSCSI 设备配置 MPIO,请从控制面板服务器管理器 中打开 MPIO 属性

  10. 点击发现多路径 标签页。

  11. 选择添加对 iSCSI 设备的支持 ,然后点击添加 。如果系统提示您重启虚拟机,请重启虚拟机。

  12. 重启后,打开设备管理器 并展开磁盘驱动器 。您的 iSCSI 磁盘将显示为多路径设备。

  13. 打开磁盘管理 (compmgmt.msc)。对于每个新磁盘:

    1. 将磁盘联机。
    2. 初始化磁盘 (GPT)。
    3. 创建一个新卷,分配盘符(例如,D 代表数据,E 代表日志,F 代表备份,G 代表 tempdb),然后使用 NTFS 格式化该卷,并将分配单元大小 设置为 64K
  14. 在刚格式化的驱动器上为 SQL Server 创建目录结构。例如:

    $paths = "D:\MSSQL\DATA","E:\MSSQL\Log","F:\MSSQL\Backup","G:\MSSQL\Temp"
    $paths | ForEach-Object { New-Item -ItemType Directory -Path $_ -Force }
    

配置 SQL Server

在装载各自的卷后,在 sqlnode1sqlnode2 上执行以下步骤。

  1. 打开 SQL Server 配置管理器
  2. 在左侧窗格中,选择 SQL Server 服务
  3. 在右侧窗格中,右键点击 SQL Server (MSSQLSERVER),选择属性,前往登录标签页,然后将账号名称更改为您的服务帐号 (DOMAIN\sqlsvc)。输入密码,然后点击确定
  4. SQL Server 代理 (MSSQLSERVER) 重复上一步。
  5. 使用 SQL Server Management Studio (SSMS) 和您的网域管理员账号连接到 SQL Server 实例。
  6. 为服务帐号创建登录名,并向其授予必要的权限:
    USE [master];
    GO
    CREATE LOGIN [DOMAIN\sqlsvc] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english];
    GO
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [DOMAIN\sqlsvc];
    GO
    
  7. 在 SSMS 中运行以下脚本,将默认数据库、日志、备份和 tempdb 路径重定向到您装载的 iSCSI 卷:
    USE [master];
    GO
    EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', REG_SZ, N'F:\MSSQL\Backup';
    GO
    EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', REG_SZ, N'D:\MSSQL\DATA';
    GO
    EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'E:\MSSQL\Log';
    GO
    -- Modify model and msdb paths
    ALTER DATABASE model MODIFY FILE (NAME = modeldev, FILENAME = 'D:\MSSQL\DATA\model.mdf');
    ALTER DATABASE model MODIFY FILE (NAME = modellog, FILENAME = 'E:\MSSQL\Log\modellog.ldf');
    ALTER DATABASE msdb  MODIFY FILE (NAME = MSDBData, FILENAME = 'D:\MSSQL\DATA\MSDBData.mdf');
    ALTER DATABASE msdb  MODIFY FILE (NAME = MSDBLog,  FILENAME = 'E:\MSSQL\Log\MSDBLog.ldf');
    GO
    -- Modify tempdb paths
    ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'G:\MSSQL\Temp\tempdb.mdf');
    ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'G:\MSSQL\Temp\templog.ldf');
    GO
    
  8. 停止 SQL Server (MSSQLSERVER) 服务。
  9. 将现有的 modelmsdbtempdb 文件从其旧位置(例如 C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA)移动到驱动器 D:、E: 和 G: 上的新位置。
  10. 如需移动 master 数据库和 ERRORLOG
    1. 打开 SQL Server 配置管理器
    2. 右键点击 SQL Server (MSSQLSERVER),选择属性,然后前往启动参数标签页。
    3. 对于指向 C: 驱动器的每个现有参数 -d-e-l,选择该参数,然后点击移除
    4. 添加以下参数,并为每个参数点击添加
      • -dD:\MSSQL\DATA\master.mdf
      • -lE:\MSSQL\Log\mastlog.ldf
      • -eE:\MSSQL\Log\ERRORLOG
    5. 点击确定
    6. 手动将 master.mdfmastlog.ldf 分别从 C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA 移动到 D:\MSSQL\DATA\` andE:\MSSQL\Log`。
    7. ERRORLOG 文件从其旧位置移动到 `E:\MSSQL\Log`。
  11. 启动 SQL Server (MSSQLSERVER) 服务。

设置 Windows Server 故障切换集群

按照以下步骤创建集群并配置仲裁见证。

配置 Windows 防火墙

在创建集群之前,请确保每个节点上的 Windows 防火墙允许 WSFC、SQL Server 和 iSCSI 的流量。

sqlnode1sqlnode2 上,以管理员身份打开 PowerShell,然后运行以下命令:

New-NetFirewallRule -DisplayName 'Failover Clusters (UDP-In)' -Direction Inbound -Protocol UDP -LocalPort 3343 -Action Allow
New-NetFirewallRule -DisplayName 'Failover Clusters (TCP-In)' -Direction Inbound -Protocol TCP -LocalPort 3343 -Action Allow
New-NetFirewallRule -DisplayName 'RPC Endpoint Mapper' -Direction Inbound -Protocol TCP -LocalPort 135 -Action Allow
New-NetFirewallRule -DisplayName 'File and Printer Sharing (SMB-In)' -Direction Inbound -Protocol TCP -LocalPort 445 -Action Allow
New-NetFirewallRule -DisplayName 'Failover Cluster Manager RPC' -Direction Inbound -Protocol TCP -LocalPort 49152-65535 -Action Allow
New-NetFirewallRule -DisplayName 'iSCSI' -Direction Inbound -Protocol TCP -LocalPort 3260 -Action Allow
New-NetFirewallRule -DisplayName 'SQL Server' -Direction Inbound -Protocol TCP -LocalPort 1433 -Action Allow
New-NetFirewallRule -DisplayName 'SQL Server AG Endpoint' -Direction Inbound -Protocol TCP -LocalPort 5022 -Action Allow

创建集群

  1. sqlnode1 上,打开故障切换集群管理器 (cluadmin.msc)。
  2. 管理 部分中,选择验证配置 。按照向��验证 sqlnode1sqlnode2。确保所有测试均已通过,然后再继续。
  3. 验证后,选择创建集群
  4. 创建集群向导 中,将 sqlnode1sqlnode2 添加为集群节点。
  5. 对于用于管理集群的访问点,输入集群名称(例如sqlcluster),并为集群提供静态 IP 地址。
  6. 按照提示创建集群。

为集群仲裁创建文件共享

我们建议您在第三个虚拟机上(最好是在不同的可用区中)创建一个文件共享,以用作集群仲裁见证。

  1. 连接到您打算用作文件共享见证的虚拟机。
  2. 服务器管理器 窗口中,依次选择工具 > 计算机管理
  3. 展开系统工具 > 共享文件夹,右键点击共享,然后选择新建共享
  4. 按照创建共享文件夹向导 的步骤操作。在文件夹路径 页面上,浏览或创建共享文件夹。
  5. 权限 页面上,选择自定义权限
  6. 点击添加 ,然后向集群名称对象 (CNO) 账号(例如 sqlcluster$)授予完全控制 权限。
  7. 完成向导以创建共享。

配置集群仲裁

  1. sqlnode1 上,打开故障切换集群管理器
  2. 右键点击集群名称,然后依次选择更多操作 > 配置集群仲裁设置
  3. 配置集群仲裁向导 中,选择下一步
  4. 选择仲裁配置选项 页面上,选择选择仲裁见证 ,然后点击下一步
  5. 选择仲裁见证 页面上,选择配置文件共享见证 ,然后点击下一步
  6. 对于文件共享路径,输入您创建的共享的路径(例如\\witness-server\quorum),然后点击下一步
  7. 确认您的设置,然后依次点击下一步完成

配置 Always On 可用性组

将本部分中的步骤应用于两个 SQL Server 虚拟机,以启用和配置可用性组。

在 SQL Server 中启用可用性组

  1. 打开 SQL Server 配置管理器
  2. 在浏览器树中,选择 SQL Server 服务
  3. 右键点击 SQL Server (MSSQLSERVER),然后选择属性
  4. 选择 Always On 高可用性 标签页,然后选择启用 Always On 可用性组
  5. 依次点击应用确定。重启 SQL Server 服务。

为可用性组创建数据库

  1. 使用 SSMS 连接到 sqlnode1
  2. 对象资源管理器 窗格中,右键点击数据库 ,然后选择新建数据库
  3. 对于数据库名称,输入MyDB1,然后点击确定
  4. 右键点击 MyDB1,然后依次选择任务 > 备份 。执行完整 备份。确保数据库恢复模式为完整
  5. 右键点击 MyDB1,然后依次选择任务 > 备份 。执行事务日志 备份。
  6. 将完整备份文件和事务日志备份文件复制到 sqlnode2
  7. 使用 SSMS 连接到 sqlnode2。右键点击数据库 ,然后选择还原数据库
  8. sqlnode1 还原 MyDB1 的完整备份,并在选项 页面中指定 RESTORE WITH NORECOVERY
  9. 右键点击 sqlnode2 上的 MyDB1,然后依次选择任务 > 还原 > 事务日志 。还原事务日志备份,同时指定 RESTORE WITH NORECOVERY

创建可用性组

  1. 使用 SSMS 连接到 sqlnode1
  2. 对象资源管理器中,右键点击Always On 高可用性,然后选择新建可用性组向导
  3. 指定可用性组名称,例如 sql-ag
  4. 选择 MyDB1 作为要包含的数据库。
  5. 指定副本 页面上,点击添加副本 ,然后连接到 sqlnode2
  6. 为两个副本启用自动故障切换,将可用性模式设置为同步提交,并将可读辅助副本设置为
  7. 前往端点 标签页,确保使用端口 5022
  8. 选择初始数据同步 页面上,选择仅加入
  9. 完成向导以创建可用性组。

为可用性组创建 DNN 资源

使用分布式网络名称 (DNN) 而不是负载均衡器,将客户端流量路由到可用性组监听器。

  1. 打开故障切换集群管理器,展开角色,然后选择您的可用性组角色。
  2. 资源 中,右键点击可用性组资源,然后依次选择添加资源 > 客户端访问点
  3. 为 DNN 监听器提供名称 ,然后完成向导。
  4. 将新的 DNN 资源联机。
  5. 默认情况下,集群会将 DNN DNS 名称绑定到集群中的所有节点。如果集群中有不托管 SQL Server 副本的节点,您必须将这些节点从 DNN 的可能所有者中排除:
    1. 右键点击您创建的 DNN 资源,然后选择属性
    2. 取消选中不是可用性组副本的任何节点的复选框。
    3. 点击确定
  6. 更新应用连接字符串以连接到 DNN 监听器名称,并添加 MultiSubnetFailover=True

测试故障切换

  1. 使用 SSMS 连接到 sqlnode1sqlnode2,然后运行以下查询以检查哪个副本是主副本,并检查两个副本是否都配置为同步提交和自动故障切换:

    -- Check primary replica
    SELECT ag.name AS AG_Name, ar.replica_server_name as PrimaryReplica
    FROM sys.dm_hadr_availability_replica_states AS ars
    JOIN sys.availability_groups AS ag ON ag.group_id = ars.group_id
    JOIN sys.availability_replicas ar ON ar.replica_id = ars.replica_id
    WHERE ars.role_desc = 'PRIMARY';

    -- Check replica configuration SELECT replica_server_name, availability_mode_desc, failover_mode_desc FROM sys.availability_replicas WHERE group_id = (SELECT group_id FROM sys.availability_groups WHERE name = N'sql-ag');

  2. 如需启动手动故障切换,请在 SSMS 中连接到辅助副本,然后运行以下命令:

    ALTER AVAILABILITY GROUP [sql-ag] FAILOVER;
    

  3. 故障切换后,运行 SELECT @@SERVERNAME; 或重新连接到 DNN 监听器并检查服务器名称,以验证新的主副本。

  4. 您还可以在 SSMS 中查看可用性组状态,方法是右键点击 Always On 高可用性 下的可用性组,然后选择显示信息中心

清理

删除项目

为避免系统因本教程中使用的资源向您的 Google Cloud 项目收取费用,请删除您的项目。如需了解详情,请参阅关停项目