在之前的两篇博文中 (微软云服务介绍 – SQL Server虚拟机(1), 微软云服务介绍 – SQL Server虚拟机(2) ),我们介绍了微软云服务中SQL Server虚拟机的搭建和管理。本文会给大家介绍如何在SQL Server虚拟机中搭建SQL Server AlwaysOn来实现高可用性。
SQL Server 2012 中引入了 AlwaysOn 可用性组功能,此功能可最大程度地提高一组用户数据库对企业的可用性。 “可用性组”针对一组离散的用户数据库(称为“可用性数据库”,它们共同实现故障转移)支持故障转移环境。 一个可用性组支持一组读写主数据库以及一至四组对应的辅助数据库。并且可设置使辅助数据库能进行只读访问和某些备份操作。
AlwaysOn 可用性组提供了一组丰富的选项来提高数据库的可用性并改进资源使用情况。 主要组件如下:
- 支持最多五个可用性副本。 “可用性副本”是可用性组的实例化,此可用性组由特定的 SQL Server 实例承载,该实例维护属于此可用性组的每个可用性数据库的本地副本。 每个可用性组支持一个主副本和最多四个辅助副本。
- 支持替代可用性模式,如下所示:
- 异步提交模式。 此可用性模式是一种灾难恢复解决方案,适合于可用性副本的分布距离较远的情况。
- 同步提交模式。 此可用性模式相对于性能而言更强调高可用性和数据保护,为此付出的代价是事务延迟时间增加。 一个给定的可用性组可支持最多三个同步提交可用性副本(包括当前主副本)
通过使用活动辅助功能,可更好地利用辅助硬件资源,从而提高 IT 效率并降低成本。 此外,通过将读意向应用程序和备份作业转移到辅助副本,有助于提高针对主副本的性能。
- 支持每个可用性组的可用性组侦听器。 “可用性组侦听器”是一个服务器名称,客户端可连接到此服务器以访问 AlwaysOn可用性组的主副本或辅助副本中的数据库。 可用性组侦听器将传入连接定向到主副本或只读辅助副本。侦听器在可用性组故障转移后保证应用程序的连接。
Microsoft Azure 虚拟机 (VM) 服务可帮助数据库管理员降低高可用性 SQL Server 系统的成本。并且Azure 虚拟机 (VM) 服务针对SQL Server AlwaysON进行了特殊的设计以支持AlwaysOn的可用性组侦听器。本文将结合现有的部署Azure 环境中SQL Server AlwaysOn可用性组的官方文档以及一些已知问题以实现一套完整的SQL Server AlwaysOn的测试解决方案。
本文中的SQL Server AlwaysOn 解决方案将由以下要素组成:
- 三个虚拟机部署在相同的地缘组、虚拟网络、子网和云服务中并使用相同的存储帐户。此外,使用保留 IP 可以在Azure 中保留一个公共虚拟 IP 地址,然后将它分配给云服务。保留IP 地址是粘性的,也就是说,一旦它关联到云服务,就不会发生更改,除非你决定取消关联它。在虚拟机方案中,保留 IP 地址将与云服务保持关联,即使云服务中的所有 VM 都已停止/释放,以保证在VM在重启后云服务关联IP不会放生变化,影响可用性组侦听器配置。
- 一个虚拟机是域控制器 (DC) 服务器,部署在一个独立的子网,并为此VM分配静态内部 IP 地址。可以防止新的 PaaS 实例从处于停止/取消设置(不只是重新启动)过程中的VM 获取此静态 DIP影响,保证在域环境中DC和DNS正常工作。
- 其余两个虚拟机构成一个两节点 Windows Server 故障转移群集 (WSFC),并部署在相同的子网和可用性集中
- 其中两个 WSFC 节点包含 SQL Server 实例,并承载具有可用性数据库的可用性组。
下图是该解决方案的拓扑结构。之所以选择此方案是因为其简易性,而非其成本效益或 Azure 上的其他功能。通过将域控制器作为2 节点 WSFC 群集中的仲裁文件共享见证服务器来最大程度减少虚拟机数目。
下面我们简要的说明创建的步骤:
A. 创建地缘组
进入 Azure 门户的主屏幕。依次点击设置,地缘组,添加,指定名称,说明和区域。
- 名称 = AlwaysOnAG
- 说明 = AlwaysOn Affinity Group
- 区域 = 东南亚
B. 创建虚拟网络和域控制器服务器
- 单击该页左下角的“新建”按钮,如下所示。
- 依次单击“网络”、“虚拟网络”、“自定义创建”,如下所示。
- 在“创建虚拟网络”对话框中,通过逐页完成以下设置创建新的虚拟网络。
接下来,你应新建一个用来存储虚拟机 VHD 文件的存储帐户。再次单击“新建”,然后依次单击“数据服务”、“存储”、“快速创建”。
指定“URL”和“位置/地缘组”,然后单击“创建存储帐户”。创建存储帐户可能要用一些时间。
- URL = AlwaysOnStorage
- 位置/地缘组 = AlwaysOnAG
C. 创建用作域控制器 (DC) 的虚拟机
由于云服务保留 IP,VM静态内部 IP 地址目前只能通过Powershell脚本创建,下面我们用PowerShell 脚本完成后续步骤。
1. # 设置订阅中的当前存储帐户为刚刚创建的地缘组关联的存储帐户
Set-AzureSubscription -SubscriptionName "Your Subscription Name " -CurrentStorageAccountName "AlwaysOnStorage"
2. # 创建云服务保留 IP
New-AzureReservedIP -ReservedIPName "AlwasyOnIP" -Label "AlwasyOnIP" -Location "SouthEast Asia"
3. # 配置新的云服务和可用性集中创建 DC 服务器
# Cloud Service Parameters
$AlwaysOnServiceName ="AlwaysOnTest"
$AlwaysOnServiceLabel ="AlwaysOnTest"
$AlwaysOnServiceDesc = "Cloud Service for AlwaysOnTest"
$ReservedIP = 'YiAlwaysOnIP'
# VM Parameters
$VMName = "AlwaysOnDC"
$VMLabel = "AlwaysOnDC"
$size = "Basic_A1"
# Gallery Images
# Get the Platform Image Name
# Get-AzureVMImage | Select-Object -Property ImageName | Out-GridView
$AlwaysOnImage=‘a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201409.01-en.us-127GB.vhd’
# Network Settings
# verify that the IP address
# Test-AzureStaticVNetIP –VNetName TestVNet–IPAddress 10.10.10.4
$vnetname = 'AlwaysOnNet'
$SubnetName = 'DC-Subnet'
$ag = "AlwaysOnAG"
$primaryDNS = '10.10.10.4'
$primaryDNSName = 'AlwaysOnDNS'
# MediaLocation
$mediaLocation ="http://AlwaysOnStorage.blob.core.windows.net/vhds/"
$vmStorageLocation = $mediaLocation +"AlwaysOnDC.vhd"
# account setting
$vmuser = 'AzureAdmin'
$vmpwd = 'Contoso!000'
# Create Exchange Server
$VM = New-AzureVMConfig -Name $VMName -Label$VMLabel -InstanceSize $size -ImageName $AlwaysOnImage `
-MediaLocation$vmStorageLocation |
Add-AzureProvisioningConfig-Windows -AdminUsername $vmuser -Password $vmpwd |
Add-AzureEndpoint-Name 'MSTSC' -LocalPort 3389 -PublicPort 3389 -Protocol tcp |
Set-AzureSubnet $SubnetName |
Set-AzureStaticVNetIP -IPAddress $primaryDNS
$dns1 = New-AzureDns -Name $primaryDNSName -IPAddress $primaryDNS
New-AzureVM -ServiceName $AlwaysOnServiceName -ServiceLabel $AlwaysOnServiceLabel `
-ServiceDescription $AlwaysOnServiceDesc `
-AffinityGroup $ag -VNetName $vnetname -DnsSettings $dns1 `
-VMs $VM `
–ReservedIPName $ReservedIP
4. 配置域控制器
- 通过启动远程桌面文件连接到 DC 服务器。之前脚本使用了用户名 AzureAdmin 和密码 Contoso!000
- 在管理员模式下打开 PowerShell 窗口。
- 运行以下DCPROMO.EXE 命令来设置域(例:corp.contoso.com),这里不加以详述。
5. 参照并修改下面的就脚本来创建 AlwaysOnVM1和AlwaysOnVM2
# Cloud Service Parameters
$AlwaysOnServiceName = "YiAlwaysOn"
# VM Parameters
$VMName = "AlwaysOnVM1"
$VMLabel = "AlwaysOnVM1"
$size = "Large"
# Availability Sets
$SQLAS = 'SQLHA'
# Gallery Images
# Get the Platform Image Name
# Get-AzureVMImage | Select-Object -Property ImageName | Out-GridView
$AlwaysOnImage=‘fb83b3509582419d99629ce476bcb5c8__SQL-Server-2014-RTM-12.0.2361.0-Enterprise-ENU-Win2012R2-cy14su05’
# Network Settings
$vnetname = 'AlwaysOnNet'
$SubnetName = 'SQL-Subnet'
$EndpointName = "SQLAG" # name of the endpoint
$EndpointPort = "18110" # public port to use for the endpoint
# MediaLocation
$mediaLocation ="http://AlwaysOnStorage.blob.core.windows.net/vhds/"
$vmStorageLocation = $mediaLocation +"AlwaysOnVM1.vhd"
# account setting
$vmuser = 'AzureAdmin'
$vmpwd = 'Contoso!000'
$domainName= "corp"
$FQDN = "corp.contoso.com"
# Create Exchange Server
$VM = New-AzureVMConfig -Name $VMName -Label$VMLabel -InstanceSize $size -AvailabilitySetName $SQLAS -DiskName $diskName |
Add-AzureProvisioningConfig `
-WindowsDomain `
-AdminUserName $vmuser `
-Password $vmpwd `
-Domain $domainName `
-JoinDomain $FQDN `
-DomainUserName $vmuser `
-DomainPassword $vmpwd |
Add-AzureEndpoint -Name "Remote Desktop" -LocalPort 3389 -PublicPort 18001 -Protocol tcp |
Add-AzureEndpoint -Name 'MSSQL' -LocalPort 1433 -PublicPort 1433 -Protocol tcp |a
Add-AzureEndpoint -Name $EndpointName -Protocol "TCP" -PublicPort $EndpointPort -LocalPort $EndpointPort -LBSetName "$EndpointName-LB" -ProbePort59999 -ProbeProtocol "TCP" -DirectServerReturn $true |
Set-AzureSubnet $SubnetName
New-AzureVM -ServiceName $AlwaysOnServiceName`
-VNetName $vnetname `
-VMs $VM