Date: 3月 9, 2018
分步说明:如何配置SQL Server故障转移群集实例(FCI)在Microsoft Azure IaaS中
7/19/2016更新 – 以下步骤描述了Azure“Classic”中的部署。 如果您要在Azure资源管理器(ARM)中部署SQL群集,那么您应该在这里看到我的文章。 https://clusteringformeremortals.com/2016/04/23/deploying-microsoft-sql-server-2014-failover-clusters-in-azure-resource-manager-arm/
在开始之前,我们将假设您至少对故障转移群集和Microsoft Azure略为熟悉,并且已经注册了Azure帐户。在整个分步指南中,我们将参考其他资源以进行额外阅读。本指南包含屏幕截图和代码示例。Azure是一种快速发展的产品,因此您的体验可能与所描述的不同。但是你应该能够根据需要进行调整和调整。随着时间的推移,我会尽力让本文保持最新状态。在撰写本文时,新的Azure门户仍处于预览阶段。因此,我们将在所有示例中使用当前支持的门户以及PowerShell。
在高层次上,为了在Azure IaaS上创建高度可用的SQL Server部署,需要采取以下步骤。如果您已经在Azure IaaS中拥有一个正在运行的域,则可以跳过项目1-3。
我们将仔细研究下面的每个步骤。
- 创建您的虚拟网络
- 创建一个云服务
- 创建存储帐户
- 创建您的Azure虚拟机和存储
- 配置Active Directory
- 创建一个群集
- 创建复制群集卷资源
- 将SQL安装到群集中
- 创建一个内部负载平衡器
- 更新客户端侦听器
概观
这些说明假定您希望完全在一个Azure区域内创建高度可用的SQL Server部署。完全可以在Azure中配置跨越不同地理区域的SQL Server群集,甚至可以配置从内部部署到Azure Cloud的混合云配置,反之亦然。我不打算在本文档中涵盖这些类型的配置。相反,我将关注配置的配置如图1所示。
本文将介绍如何创建跨越Azure区域中两个不同的故障域和更新域的群集。跨越不同的故障域消除了与计划外停机相关的停机时间。跨越不同的更新域可以消除与计划停机时间相关的故障。
有关其他概述信息,您可能想要观看我在SQLTIPS上做的网络研讨会,详细讨论了这个主题。可以在http://www.mssqltips.com/sql-server-video/360/highly-available-sql-server-cluster-deployments-in-azure-iaas/上查看它。
创建您的虚拟网络
为了实现这个目标,您需要在虚拟网络中拥有所有虚拟机。创建虚拟网络非常简单。下面的屏幕截图应该有助于指导您完成整个过程。
此时我想添加8.8.8.8的Google DNS服务器地址。尝试使用默认DNS服务器从Microsoft下载更新时,我遇到了奇怪的连接问题。在我们下载完所有这些服务器所需的更新后,我们将返回并用AD控制器的IP地址替换DNS服务器的IP地址。但现在,添加8.8.8.8,并且在此虚拟网络中供应的所有虚拟机都将通过DHCP服务将其作为DNS服务器接收。此论坛帖子描述了我没有添加此DNS服务器条目时遇到的问题。在将所有服务器添加到域之前,我发现您需要删除此8.8.8.8地址并将其替换为您创建的第一个域控制器的IP地址。
你会看到我在这个虚拟网络中创建了一个子网,并将其标记为Public。稍后当我们创建我们的虚拟机时,我们将使用公共网络。虽然Azure最近添加了对每个虚拟机多个NIC的支持,但我发现将多个子网和NIC添加到Azure虚拟机可能会产生问题。主要问题是每个NIC都会自动分配一个网关地址,由于在同一台服务器上定义了多个网关,可能会导致路由问题。
创建虚拟网络需要几分钟的时间。
创建一个云服务
您的虚拟机将全部驻留在相同的“Cloud Service”中。祝您找到Azure“云服务”的定义,因为Azure整体上是“云服务”。但是,这是您在开始部署VM之前需要创建的特定于Azure IaaS的特定思路。下面的屏幕截图将引导您完成整个过程。
确保将Cloud Service放置在与虚拟网络相同的区域中。
创建存储帐户
在开始配置VM之前,您必须创建一个存储帐户。按照以下步骤创建存储帐户。
确保您在与虚拟网络相同的位置创建存储帐户
创建您的Azure VMS和存储
如果您尚未下载并安装Azure PowerShell,请立即执行此操作。此外,请确保您设置您的默认订阅和CurrentStorageAccountName。
我们将开始配置第一台将成为域控制器(DC)的VM。在我们的例子中,我们也将DC用作文件共享见证,因此我们将创建一个可用性集,其中包含域控制器和集群中的两个节点。以下是一个示例脚本,它将创建VM并为其分配“静态地址”。
$ AVSet =” SQLHA”
$ InstanceSize =”大”
$ VMNAME =” DC1“
$ AdminName =“myadminaccount”
$ ADMINPASSWORD =”输入mypassword”
$ PrimarySubnet =”公共”
$ PRIMARYIP =” 10.0.0.100“
$ CloudService =” SQLFailover”
$ VirtualNetwork =” Azure的东”
$ ImageName =” a699494373c04fc0bc8f2bb1389d6106__Windows-服务器-2012-R2-201412.01-en.us-127GB.vhd”
$ image = Get-AzureVMImage -ImageName $ ImageName
$ vm = New-AzureVMConfig -Name $ VMName -InstanceSize $ InstanceSize -Image $ image.ImageName -AvailabilitySetName $ AVSet
Add-AzureProvisioningConfig -VM $ vm -Windows -AdminUserName $ AdminName -Password $ AdminPassword
Set-AzureSubnet -SubnetNames $ PrimarySubnet -VM $ vm
Set-AzureStaticVNetIP -IPAddress $ PrimaryIP -VM $ vm
New-AzureVM -ServiceName $ CloudService -VNetName $ VirtualNetwork -VM $ vm
技术说明 – 我说“静态IP地址”,但它只是创建一个DHCP“请求”。我把它称为DHCP“Request”而不是“Reservation”,因为它只是一个尽力而为的请求。如果此服务器处于脱机状态并且某人启动了新服务器,则DHCP服务器可以将此地址分发给其他人,使其在此服务器处于开启状态时不可用。
一旦创建了第一个VM,就可以创建群集中使用的两个SQL VM。您会看到我试图通过允许您指定不同的变量来使脚本易于使用。我强调了需要为每个虚拟机更改的变量。
$ AVSet =” SQLHA”
$ InstanceSize =”大”
$ VMNAME =” SQL1“
$ AdminName =” myadminaccount”
$ ADMINPASSWORD =” P @ 55w0rd”
$ PrimarySubnet =”公共”
$ PRIMARYIP =” 10.0.0.101“
$ CloudService =” SQLFailover”
$ VirtualNetwork =” Azure的东”
$ ImageName =” a699494373c04fc0bc8f2bb1389d6106__Windows-服务器-2012-R2-201412.01-en.us-127GB.vhd”
$ image = Get-AzureVMImage -ImageName $ ImageName
$ vm = New-AzureVMConfig -Name $ VMName -InstanceSize $ InstanceSize -Image $ image.ImageName -AvailabilitySetName $ AVSet
Add-AzureProvisioningConfig -VM $ vm -Windows -AdminUserName $ AdminName -Password $ AdminPassword
Set-AzureSubnet -SubnetNames $ PrimarySubnet -VM $ vm
Set-AzureStaticVNetIP -IPAddress $ PrimaryIP -VM $ vm
New-AzureVM -ServiceName $ CloudService -VNetName $ VirtualNetwork -VM $ vm
再次运行脚本以配置第二个群集节点
$ AVSet =” SQLHA”
$ InstanceSize =”大”
$ VMNAME =” SQL2“
$ AdminName =“myadminaccount”
$ ADMINPASSWORD =”输入mypassword”
$ PrimarySubnet =”公共”
$ PRIMARYIP =” 10.0.0.102“
$ CloudService =” SQLFailover”
$ VirtualNetwork =” Azure的东”
$ ImageName =” a699494373c04fc0bc8f2bb1389d6106__Windows-服务器-2012-R2-201412.01-en.us-127GB.vhd”
$ image = Get-AzureVMImage -ImageName $ ImageName
$ vm = New-AzureVMConfig -Name $ VMName -InstanceSize $ InstanceSize -Image $ image.ImageName -AvailabilitySetName $ AVSet
Add-AzureProvisioningConfig -VM $ vm -Windows -AdminUserName $ AdminName -Password $ AdminPassword
Set-AzureSubnet -SubnetNames $ PrimarySubnet -VM $ vm
Set-AzureStaticVNetIP -IPAddress $ PrimaryIP -VM $ vm
New-AzureVM -ServiceName $ CloudService -VNetName $ VirtualNetwork -VM $ vm
您会发现每个这些虚拟机都放置在同一个可用性集中,我称之为“SQLHA”。通过将虚拟机放置在相同的可用性集中,可以利用此处所述的故障域和更新域。 http://blogs.technet.com/b/yungchou/archive/2011/05/16/window-azure-fault-domain-and-update-domain-explained-for-it-pros.aspx
一旦你创建了你的虚拟机,你的Azure Portal应该看起来像这样。
关于故障域的智慧的话
配置Active Directory
首先我们将通过RDP连接到DC1并启用活动目录。使用“连接”按钮将RDP连接下载到DC1。使用您在创建Azure VM时指定的用户名和密码。将DC1升级到域控制器。
内幕提示 – 我还发现,如果您移除DNS服务器上的所有DNS转发器并且只使用根提示,则DNS解析工作效果最佳。如果您使用他们的DNS服务器,AZURE有时可能会解决微软网络性能问题。
创建一个群集
将DC1配置为域控制器后,您将连接到SQL1和SQL2并将它们添加到域中。但是,在执行此操作之前,需要将虚拟网络的DNS服务器更改为DC1服务器(10.0.0.100)的DNS服务器,然后重新启动SQL1和SQL2。一旦SQL1和SQL2拥有100.0.0.100作为他们的DNS服务器,您将能够加入域。
一旦您加入到域中,您将必须完成以下说明的步骤才能创建SQL Server故障转移群集实例(FCI)。
首先,在每个节点上启用.Net 3.5 Framework。
如果您发现无法安装.Net Framework,请参阅我的有关DNS的提示。
启用故障转移群集
现在.NET 3.5已启用,您需要在SQL1和SQL2上启用故障转移群集功能。
验证
一旦启用了群集功能,您将需要创建群集。第一步是运行集群验证。我假设你熟悉集群,所以我只会发布一些屏幕截图并记下你需要考虑的事情。
验证将完成,但会有一些警告。大多数警告将围绕存储。您可以忽略这些,因为我们将使用复制存储而不是共享磁盘。另外,您可能会收到关于网络的警告。您也可以忽略该警告,因为我们知道Azure在物理层内置了网络冗余。
创建集群接入点
11/24/2015更新 – 我发现通过Powershell创建集群避免了以下GUI步骤中描述的所有这些问题,因为您可以将集群的IP地址指定为创建过程的一部分。下面的两个PowerShell命令替换本节后面的GUI屏幕截图中显示的所有步骤。确保StaticIaddress参数
测试群集节点服务器1,服务器2
New-Cluster -Name MyCluster -Node Server1,Server2 -StaticAddress 10.0.0.200
如果你运行了上面的Powershell脚本,那么你可以跳过本节的其余部分,直接跳到下一节创建文件共享见证。
我建议创建单击完成以启动群集创建过程。首先为群集选择一个名称。
如果您点击查看报告,您会看到有一些警告。您可以忽略该警告,因为我们将创建一个文件共享见证。
群集创建后,您可能会收到以下消息。“操作”验证配置…“没有完成。
修复集群接入点IP地址
这里的根本问题是由于IP地址冲突,群集没有正确解析群集名称。你会发现Azure DHCP实际上给你刚创建的集群计算机对象提供了一个重复的IP地址。这只是您需要处理的奇怪Azure特性之一,如下所示。
您可能需要在SQL2上打开故障转移群集GUI才能进行连接。一旦能够连接到群集,您将看到群集获取了与其中一个群集节点相同的IP地址。这当然会导致IP地址冲突。
我们需要做的是将10.0.0.102 IP地址更改为此子网中未使用的另一个IP地址。
你会看到我选择10.0.0.200作为我的地址。该地址不在DHCP范围内保留,因为目前没有办法控制DHCP范围或添加预留。我只是在DHCP范围的上端选择一个地址,并确保我没有在该子网内配置足够的虚拟机来达到该IP地址。
现在,群集IP地址已修复,您将能够使用任一节点上的故障转移群集管理器连接到群集。
创建文件共享见证
接下来,我们将为群集仲裁创建一个文件共享见证。有关群集仲裁的完整说明,请阅读我在MSDN上的博客文章,http://blogs.msdn.com/b/microsoft_press/archive/2014/04/28/from-the-mvps-understanding-the-windows-server -failover-集群定额功能于Windows的服务器-2012-r2.aspx
文件共享见证将在域控制器上创建。基本上,您需要在DC1上创建文件共享,并为群集计算机帐户“sioscluster”提供读/写权限。确保如下所示对共享和安全权限进行这些更改。
以下步骤在DC1上完成。
新建一个文件夹。
确保搜索计算机对象并选择群集计算机对象名称,在我们的示例中为SIOSCLUSTER
确保你给它更改权限。
您还需要更改安全性以允许群集计算机对象修改文件夹的权限。
创建共享文件夹后,您将在任一节点上使用Windows Server故障转移群集界面添加文件共享见证,如下所示。
安装DataKeeper
需要来自SIOS Technology的DataKeeper Cluster Edition才能提供复制和集群集成,这将允许您构建无共享存储的故障转移群集实例。首先,您将在群集的两个节点上安装DataKeeper Cluster Edition。执行如下所示的设置。
出于演示目的,我使用了域管理员帐户。唯一的要求是所用的用户帐户位于每台服务器的本地管理员组中。
创建一个DataKeeper卷资源
在每个群集节点上安装软件(SQL1和SQL2)后,即可准备创建第一个复制的卷资源。在任一节点上启动DataKeeper GUI,并按照以下步骤创建DataKeeper卷资源。
连接到两台服务器后,单击服务器概览报告。它应该如下所示。
您会注意到您已连接到两台服务器,但没有列出任何卷。接下来,我们需要为每个群集节点添加额外的存储。通过Azure门户执行此操作,如下所示。
在为每个虚拟机添加额外卷并创建了格式化分区后,DataKeeper GUI应该如图所示。
现在可以启动“创建作业向导”并创建DataKeeper卷资源,如下所示。
创建作业,并给它一个名称和可选的描述。
将SQL安装到群集中
现在您已经配置了集群并且在可用存储中安装了DataKeeper卷,您可以开始安装SQL Server集群了。该过程与使用共享存储安装SQL Server故障转移群集实例的过程完全相同。由于DataKeeper Replicated Volume资源是一个存储类资源,因此故障转移群集将其视为物理磁盘资源。按照下面的步骤将SQL Server安装到群集中。
您可以使用SQL Server 2014 Standard Edition构建2节点故障转移群集。在这种情况下,DataKeeper也可以将数据复制到第三个节点,但该节点不能成为集群的一部分。如果您想创建3+节点群集,则需要使用SQL Server 2014 Enterprise Edition。SQL的早期版本也可以很好地工作。我已经通过SQL 2014测试了SQL 2008。
在单击下一步之前,单击数据目录选项卡。
一旦SQL安装在第一个节点上,您将需要在第二个节点上运行安装。
创建一个内部负载平衡器
一旦配置了集群,您将需要创建将用于所有客户端访问的内部负载均衡器(ILB)。连接到SQL Server的客户端需要连接到ILB,而不是直接连接到群集IP地址。如果此时尝试直接连接群集,则会看到无法从任何远程系统连接到群集。即使SQL Server Management Studio也不能直接连接到群集。
从本地桌面运行此Powershell命令以创建您的内部负载均衡器(ILB)。
#定义变量
$ IP =“10.0.0.201”#希望内部负载平衡器使用的IP地址,它应该与您的SQL Server群集IP地址
$ svc =“SQLFailover”#您的云服务的名称
$ vmname1 =“sql1”#是您的第一个群集节点的VM的名称
$ epname1 =“sql1”#这是您要分配给与第一个群集节点关联的端点的名称,使用任何您喜欢的
$ vmname2 =“sql2”#是第二个群集节点的VM的名称
$ epname2 =“sql2”#这是您想要分配给与第二个群集节点关联的端点的名称,使用任何您喜欢的
$ lbsetname =“ilbsetsqlha”#使用任何你喜欢的名字,这个名字是不重要的
$ PROT =” TCP”
$ locport = 1433
$ pubport = 1433
$ probeport = 59999
$ ilbname =“sqlcluster”#this是客户端连接到的名称,它应该与您一致SQL集群名称资源
$ subnetname =“Public”#您希望内部负载均衡器存活的Azure子网名称
#将内部负载均衡器添加到服务
Add-AzureInternalLoadBalancer -InternalLoadBalancerName $ ilbname -SubnetName $ subnetname -ServiceName $ svc -StaticVNetIPAddress $ IP
#将负载均衡端点添加到主群集节点
Get-AzureVM -ServiceName $ svc -Name $ vmname1 | Add-AzureEndpoint -Name $ epname1 -LBSetName $ lbsetname -Protocol $ prot -LocalPort $ locport -PublicPort $ pubport -ProbePort $ probeport -ProbeProtocol tcp -ProbeIntervalInSeconds 10 -DirectServerReturn $ true -InternalLoadBalancerName $ ilbname |更新AzureVM
#将负载均衡端点添加到辅助群集节点
Get-AzureVM -ServiceName $ svc -Name $ vmname2 | Add-AzureEndpoint -Name $ epname2 -LBSetName $ lbsetname -Protocol $ prot -LocalPort $ locport -PublicPort $ pubport -ProbePort $ probeport -ProbeProtocol tcp -ProbeIntervalInSeconds 10 -DirectServerReturn $ true -InternalLoadBalancerName $ ilbname |更新AzureVM
假设脚本按计划运行,您应该看到以下输出。
更新客户端侦听器
一旦创建了内部负载均衡器,我们将需要在SQL1上运行Powershell脚本来更新SQL Server群集IP地址。该脚本引用群集网络名称和IP资源名称。下面的图片显示您在故障转移群集管理器中找到这两个名称。
下面的脚本应该在其中一个集群节点上运行。确保使用以管理员身份运行启动Powershell ISE。
#在创建内部负载均衡器后,应在主群集节点上运行此脚本
#定义变量
$ ClusterNetworkName =“集群网络1”#集群网络名称
$ IPResourceName =“SQL IP地址1(sqlcluster)”#IP地址资源名称
$ CloudServiceIP =“10.0.0.201”#您的内部负载均衡器的IP地址
导入模块故障转移群集
#如果您使用的是Windows 2012或更高版本,请使用Get-Cluster Resource命令。如果您使用的是Windows 2008 R2,请使用注释掉的cluster res命令。
Get-ClusterResource $ IPResourceName | Set-ClusterParameter -Multiple @ {“Address”=“$ CloudServiceIP”;“ProbePort”=“59999”;
子网掩码=” 255.255.255.255“;”网络” =” $ ClusterNetworkName”;
“OverrideAddressMatch” = 1;” EnableDHCP时” = 0}
#cluster res $ IPResourceName / priv enabledhcp = 0 overrideaddressmatch = 1 address = $ CloudServiceIP probeport = 59999 subnetmask = 255.255.255.255
假设您的脚本按预期运行,输出应如下所示。您会看到,为了应用更改,您需要将群集资源脱机一次,然后将其联机。
火墙
每个服务器的防火墙上打开TCP端口59999,1433和1434。
概要
既然已创建群集,则可以使用名称sqlcluster或直接连接到10.0.0.201,通过内部负载均衡器连接到SQL故障转移群集实例。
查找有关SQL Server故障转移群集实例的文章有用,请阅读我们的其他博客文章。
经Clusteringformeremortal许可转载