2015年10月23日 星期五

如何在Amazon上透過EC2,架設完整的AlwaysOn架構。

        在我的之前的分享(SQL Server 2012 - AlwaysOn 安裝與設定教學)中,已有介紹到如何進行AlwaysOn的安裝,但是在Amazon上透過EC2的虛擬主機進行安裝時,卻發現了有些限制與不同的部份,在歷經一次的失敗後,終於解決,所以將相關的重點整理如此。

基本上的安裝可以參考我上述的安裝步驟進行,但是有一點需要特別注意的事,那就是IP與網段的設定,在EC2上由於私有IP的設定都需要綁定在網卡上,所以無法像在自已的環境中先行配置與保留,所以在一開始的IP設定與網段設定,非常的重要,因為這一部份如果沒有先行規劃好的話,後面你要更改非常的麻煩,這也是我重新安裝的原因之一。

首先我先將我目前主機的規劃整理如下。

預期架構:
目前希望架設三個節點,二個節點為同步模式,另一個節點為非同步模式,並且可以進行唯讀讀取的動作。

主機資訊:
Host Name OS Version SQL Version
Cary-AD Windows 2012 R2  
Cary-SQLN1 Windows 2012 R2 SQL Server 2012 SP2
Cary-SQLN2 Windows 2012 R2 SQL Server 2012 SP2
Cary-SQLN3 Windows 2012 R2 SQL Server 2012 SP2

IP配置(很重要):
Host Name Public IP Private IP Cluster IP Listener IP Subnet
Cary-AD 52.88.0.0 172.31.33.5

172.31.32.0
Cary-SQLN1 54.185.0.0 172.31.24.231 172.31.24.232 172.31.24.233 172.31.16.0
Cary-SQLN2 52.87.0.0 172.31.42.72 172.31.42.73 172.31.42.74 172.31.32.0
Cary-SQLN3 54.185.0.0 172.31.13.11 172.31.13.12 172.31.13.13 172.31.0.0

1、在Amazon EC2上,建議先將上述的IP先配置好,然後再進行後續的動作,詳細的流程可以參考下列的安裝步驟,裡面有詳細關於Private IP配置的方式。

Implementing Microsoft Windows Server Failover Clustering (WSFC) and SQL Server 2012 AlwaysOn Availability Groups in the AWS Cloud
https://media.amazonwebservices.com/AWS_WSFC_SQL_Server_AlwaysOn.pdf

2、安裝完Failover Clustering之後,由於我是沒有透過iSCSI進行,所以建議在AD上建立一個分享目錄藉以進行Heartbeat,方法上可以透過介面進行,或是透過下列的PowerShell語法進行建立。

set-clusterquorum -NodeAndFileShareMajority "Cary-AD\Witness"

PS:建議在建立前可以先附予分享的目錄讓叢集名稱可以有讀寫的權限。

參考說明:
Set-ClusterQuorum

3、安裝完成後,由於預設是透過DHCP進行,可以看到服務是offline,需再將預期配置的Cluster IP也設定上去,設定完成後,再將服務設定成Online即可完成,再如下圖所示。


4、當全部都設定完成後,重頭戲就是關於Availability Group Listeners的建立,這個部份非常的重要,如果你在之前沒有作好網段的規劃,你會遇很多的問題,如你無法加入特定的私有IP,就算強制加入後,你在進行Failover時,你也會一直失敗,這也是我重裝的主要地雷,設定的畫面如下。



5、最後你可能這樣就都完成了,其實還有二個問題,一個是當我Failover到第二個節點時,如果我透過Listener連接時,會發現無法連接,但設定Timeout時間加長到30秒時,就可以連,後來找到解決方法如下。

相關的說明可以參考下列的連結,解決方法只需要修改二個參數即可。

先開啟PowerShell視窗,輸入下列的指令確認目前的參數為何。

a. Import-Module FailoverClusters
b. Get-ClusterResource

確認目前叢集的資源有那些,其中需確認你目前的Listener的完整名稱,通常名稱都是Cluster Name + Listener Name,知道名稱後,再透過下列的指定捉取Listener的參數值。

c. Get-ClusterResource cary-cluster_cary-listener | get-clusterparameter

列出參數值後,需特別注意二個參數值,HostRecordTTL與RegisterAllProvidersIP,需分別進行更改。



d. Get-ClusterResource cary-cluster_cary-listener | Set-ClusterParameter -Name HostRecordTTL -Value 120
e. Get-ClusterResource cary-cluster_cary-listener | Set-ClusterParameter -Name RegisterAllProvidersIP -Value 0

當完成上述的設定後,需要再重新啟動Listener才會生效,可以透過下列的指令進行。

ALTER AVAILABILITY GROUP cary-cluster RESTART LISTENER 'cary-listener';

PS:此段指令是放在SQL Server中進行執行。

Connection Timeouts in Multi-subnet Availability Group
http://blogs.msdn.com/b/alwaysonpro/archive/2014/06/03/connection-timeouts-in-multi-subnet-availability-group.aspx

最後一個問題是針對Readonly Routing的問題,我目前測試發現可能暫時無解,我也確認在相關的Readonly設定無誤,但發現由於節點的IP只能有一個唯一的是Online,所以就算您透過sys.availability_read_only_routing_lists查出有多個路由順序的設定,但仍然只能連到Primary Node,目前的作法我是直接設定一組DNS然後搭配ApplicationIntent=readonly;的參數直接連到第三個節點,當然如果有其他較佳的作法,也歡迎提出分享。

參考連結:
  1. Implementing Microsoft Windows Server Failover Clustering (WSFC) and SQL Server 2012 AlwaysOn Availability Groups in the AWS Cloud
    https://media.amazonwebservices.com/AWS_WSFC_SQL_Server_AlwaysOn.pdf
  2. Set-ClusterQuorum
    https://technet.microsoft.com/en-us/library/ee461013.aspx
  3. Connection Timeouts in Multi-subnet Availability Group
    http://blogs.msdn.com/b/alwaysonpro/archive/2014/06/03/connection-timeouts-in-multi-subnet-availability-group.aspx

關鍵字:AmazonAlwaysOnReadonly RoutingEC2Connection TimeoutsWSFC