顯示具有 AlwaysOn 標籤的文章。 顯示所有文章
顯示具有 AlwaysOn 標籤的文章。 顯示所有文章

2023年12月29日 星期五

如何在 SQL SERVER 標準版上架設 AlwaysOn 的唯讀複本-超級省錢架構

        在 SQL SERVER 的標準版,AlwaysOn 基本上只有支援二個節點,只有 SQL SERVER 企業版才有與作業系統的節點數量有相同的支援,而且標準版的第二個節點,無法設定為唯讀複本,所以如果要設定唯讀複本時,只能升級到企業版。

Editions and supported features of SQL Server 2019
https://learn.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2019?view=sql-server-ver16

許多公司由於在標準版與企業版在價格上的差異,許多企業版的功能上並沒有使用到,所以仍會先採用 SQL SERVER 標準版進行,但問題來了,如果希望增加一個節點來進行唯讀分攤負載時,除了升級到企業版之外,本篇就來提供一個不同的方式給大家參考。

SQL Server 2022 pricing and licensing
https://www.microsoft.com/en-us/sql-server/sql-server-2022-pricing

本篇我會透過 SQL SERVER AlwasyOn 標準版與交易式複寫(Transaction Replication)來達到上述的需求,在這個架構下,重點就是當 AlwaysOn 進行角色轉移 (Failover) 後,如何讓原本的交易式複寫仍可以正常的運作,就是本篇介紹的重點。

在介紹之前,我還是要先說一下這個架構的缺點,大家可以再考慮後是否合適,再進行考慮。

  • 無法透過 AlwaysOn Listener 進行讀寫/唯讀的路由。
  • 唯讀複本由於是透過交易式複寫進行,所以該節點不是真的唯讀,當用戶端不小心將資料寫入至該節點的話,造成資料衝突時,只能重新進行交易式複寫的設定(打掉重作)。
  • 如果在後續資料傳輸過慢的問題需進行排除時,由於多重的架構,所以比較不容易查出問題瓶頸,但大神們可以忽略此問題。
  • 管理時,需同時確認 AlwaysOn 與交易式複寫的情況,無法單純的透過 AlwaysOn 的 Dashboard 進行確認。

環境說明:

  • SQLAGNode1: Windows 2019 + SQL Server 2019 Standard
  • SQLAGNode2: Windows 2019 + SQL Server 2019 Standard
  • SQLRep1: Windows 2019 + SQL Server 2019 Standard

複寫角色對應:

  • 散發 (Distribution): SQLRep1
  • 發行 (Publishing): SQLAGNode1 + SQLAGNode2
  • 訂閱 (Subscription): SQLRep1

開始安裝設定:

1. 一開始請先依照先前的文件,將 SQLAGNode1 + SQLAGNode2 設定安裝 SQL SERVER,並啟用 AlwaysOn 的功能,最後也建議進行 Failover 測試確認可以正常的完成節點的切換。

SQL Server 2012 新功能 - AlwaysOn安裝與設定
https://caryhsu.blogspot.com/2012/04/sql-server-2012-alwayson.html


2. 設定散發主機 (SQLRep1)

散發的部份一樣可以設定在不同的主機上,此部份是與訂閱者設定在同一台的機器上。

2-1 請將第三台主機(SQLRep1)安裝好 SQL SERVER 單機環境,而且安裝時需增加勾選 SQL Server Replication 的功能。

2-2 安裝完成後,加入同網域,不用加入叢集,也不用加入 AlwaysOn 中(也無法加入,因為 SQL Server 標準版的限制)。

2-3 設定散發初使設定。









2-4 由於二台發行的資料,都要透過散發來進行,所以在此主機上,要手動設定散發並指定二台發行可以透過此台主機進行散發。



3. 設定第一台發行集

這個需確認 AlwaysOn 的主要節點在那一台上,目前假設在 SQLAGNode1,所以我們就以此台進行。

3-1 新增發行集,基本上動作都相同,只是在散發主機的部份,必須指定到 SQLRep1。














3-2 第二台的發行集不用特別設定,當進行 Failover 時,你就會發現該發行會切換到第二台上。


4. 設定訂閱者 (SQLRep1)

這部份只需注意先指定到主要節點的部份,目前假設在 SQLAGNode1上。












5. 這時候已完成初步的可讀複本的部份,請先嘗試新增一筆資料至主要節點中,目前假設在 SQLAGNode1上,然後確認可以正確的將資料複寫至 SQLRep1 的節點中。


6. 設定重新導向發行端於散發主機上 (SQLRep1)


在散發主機上,執行下列的語法,主要就是將目前指定到第一台的發行,重新導向,指定到 SQL Server Listener上。

USE distribution;  

GO  

EXEC sp_redirect_publisher   

@original_publisher = 'SQLAGSTD1',  

@publisher_db = 'carytestdb',  

@redirected_publisher = 'sqlstdaglst';

7. 測試 Failover 後,確認是否可以正常的透過複寫將資料寫到訂閱端。

此時,我們第二台其實都還沒有設定發行端,但其實你在主要節點進行 Failover 切換後,您就會發現訂閱就會顯示在第二台的節點上,所以您可以嘗試在第二台也新增資料,確認資料也是有複寫到訂閱端,這樣就都完成了。

最後補充,許多文章提到可以透過 sys.sp_validate_replica_hosts_as_publishers 進行驗證,但因為驗證時,會同時到主節點與備援節點進行確認,而由於 SQL SERVER 標準版 上的第二個節點是無法設定為可讀取的,所以如果有遇到下列的錯誤,其實是可以忽略的。

USE distribution;  

GO

EXEC sys.sp_validate_replica_hosts_as_publishers  

    @original_publisher = 'SQLAGSTD1',  

    @publisher_db = 'carytestdb',  

    @redirected_publisher = 'sqlstdaglst';

錯誤訊息:

OLE DB provider "MSOLEDBSQL" for linked server "[F9C2EDD8-1050-488F-97D3-BD64AFE91CCA]" returned message "Deferred prepare could not be completed.".

Msg 21899, Level 11, State 1, Procedure sys.sp_hadr_verify_subscribers_at_publisher, Line 109 [Batch Start Line 2]

The query at the redirected publisher 'SQLAGSTD1' to determine whether there were sysserver entries for the subscribers of the original publisher 'SQLAGSTD1' failed with error '976', error message 'Error 976, Level 14, State 1, Message: The target database, 'carytestdb', is participating in an availability group and is currently not accessible for queries. Either data movement is suspended or the availability replica is not enabled for read access. To allow read-only access to this and other databases in the availability group, enable read access to one or more secondary availability replicas in the group.  For more information, see the ALTER AVAILABILITY GROUP statement in SQL Server Books Online.'.

One or more publisher validation errors were encountered for replica host 'SQLAGSTD1'.

2023年12月4日 星期一

如何建立 SQL Server AlwasyOn 分散式可用性群組 - 進階高可用性

        在之前陸續介紹多種不同方式 SQL Server AlwaysOn 的設定與安裝的方式,可以有效的提高資料庫的高可用性,這次我們再來介紹 AlwaysOn 進階的部份 分散式可用性群組 (Distributed availability groups) 的功能。

相關連結參考:
在混合雲的架構上建立完整的AlwaysOn架構
http://caryhsu.blogspot.com/2015/12/alwayson.html
SQL Server 2012 新功能 - AlwaysOn安裝與設定
http://caryhsu.blogspot.com/2012/04/sql-server-2012-alwayson.html
如何在Amazon上透過EC2,架設完整的AlwaysOn架構。
https://caryhsu.blogspot.com/2015/10/amazonec2alwayson.html

一般的情況下,我們在 AlwaysOn 的設定上以2個節點為主,進一步的設定,可以將第三個節點放在不同的地區或雲端,藉以當問題發生時,可以將 AlwaysOn 的節點轉移至雲端上,而且也可以當作可讀副本,藉以減輕主節點的壓力。

但在發生問題時,可能由於地端的網域或叢集等問題,所以轉移後,可能仍需及時的確認等問題,所以如果在預算允許的情況下,其實可以建立相同的第二組藉以問題發生時進行移轉,而 AlwaysOn 可以透過 分散式可用性群組 (Distributed availability groups)進行管理,當發生問題時,可以進行轉移的動作。

常見的方式,直接將第三個或第四個節點放在不同區或雲端上。


可用性群組 (Distributed availability groups) 的方式,也是本篇介紹的方式。


在使用 分散式可用性群組 (Distributed availability groups) 的部份,有下列的幾個優點:

  1. 將叢集節點建立在不同的地區,而且真正作到多叢集多節點的情境。
  2. 資料中心(DataCenter) 轉移。
  3. 延伸可讀副本至不同的地區上。

環境說明:
==============

  1. AD - Windows Server 2022
  2. SQL Server Nodes, 這裡主要有四台 SQL Server,一個叢集中有二個SQL Server的節點


安裝方式:
==============

1. 請依照下列的文章將二組叢集建立好. 

SQL Server 2012 新功能 - AlwaysOn安裝與設定
http://caryhsu.blogspot.com/2012/04/sql-server-2012-alwayson.html

2. 請在第一組叢集的部份,建立第一組的 AlwaysOn,然後確認轉移等功能皆正常。

3. 在第二組叢集時,AlwaysOn 可以透過自動同步的方式進行建立,但通常如果資料庫較大,會透過備分的方式進行還原,而且這樣在建立上,問題也會比較單純。

4. 目前請確認二組的叢集在 Failover 上皆正常,可以 Listener 也可以正常的連接,最後在 Endpoint 的部份,也都確認有建立完成。

透過 SQL 語法進行查詢

SELECT * FROM sys.endpoints
where type = 4

5. 請透過下列的語法,建立 分散式可用性群組 (Distributed availability groups)

CREATE AVAILABILITY GROUP [distributedag]  

   WITH (DISTRIBUTED)   

   AVAILABILITY GROUP ON  

      'sqlag2019-1' WITH    

      (   

         LISTENER_URL = 'tcp://sqlag2019ag1lt.mscaryhsu.com:5022',    

         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   

         FAILOVER_MODE = MANUAL,   

         SEEDING_MODE = MANUAL   

      ),   

      'sqlag2019-2' WITH    

      (   

         LISTENER_URL = 'tcp://sqlag2019ag2lt.mscaryhsu.com:5022',   

         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   

         FAILOVER_MODE = MANUAL,   

         SEEDING_MODE = MANUAL   

      );    

GO 

上述中可以看到 分散式可用性群組 (Distributed availability groups) 主要是將二個 AlwaysOn 透過 Listener 進行綁定,其中在 AVAILABILITY_MODE 一定要設定為 ASYNCHRONOUS_COMMIT 模式,因為如果設定為 SYNCHRONOUS_COMMIT 的模式,因為要等於第一個叢集完成後,也要同時寫到第二個叢集才算一個交易的完成,一來會造成交易的時間過長,二來也會因為跨區的網路延遲造成問題,由於是 ASYNCHRONOUS_COMMIT 模式,所以在 FAILOVER_MODE 也會是手動的方式(MANUAL),最後在 SEEDING_MODE 也就是在同步時,如果資料庫不存在,進行初使化為同步傳送,還是透過手動進行,因為我們上一個步驟是透過手動進行還原,所以這個步驟就設定成 SEEDING_MODE = MANUAL。

6. 最後建立完成後,如果要進行手動的 Failover,可以透過下列的方式進行轉移。

ALTER AVAILABILITY GROUP [distributedag] FORCE_FAILOVER_ALLOW_DATA_LOSS;

設定完上述的部份即已完成,但其實用性上來說,個人感覺使用第三個節點於雲端上已算是很好的部份,你要地端與雲端都同時發生問題,我想可能真的是發生了很嚴重的事情了,大家也別太擔心,最後也希望這篇有幫助到大家。

2015年12月3日 星期四

在混合雲的架構上建立完整的AlwaysOn架構

在前面的文章中已有多篇介紹如何架設AlwaysOn的教學,不管是在區網內,或在Amazon的EC2上都已有介紹,但是當單一區域發生問題時,還是有可能造成服務的中斷,所以本篇特別介紹如何整合區網與Azure,讓單一區域發生問題時,可以直接飛到雲端,藉以讓服務中斷的可能性降的更低。

在實作這個架構後,坦白說你要遇到系統全部掛掉無法使用的機率應該趨近於0,因為不管是本地端的防護或是雲端皆可當成很好的備援,另外此架構也可以有效的分散系統效能的瓶頸,所以建議大家可以參考,只是在安裝上步驟繁瑣而且可能會遇到許多不同的問題,所以特別整理此篇藉以自我參考,也希望可以幫助到大家。

前導文章:
  1. 如何在Amazon上透過EC2,架設完整的AlwaysOn架構。
  2. SQL Server - AlwaysOn連線設定
  3. SQL Server 2012 新功能 - AlwaysOn安裝與設定
  4. SQL Server 2012 (Code Name Denali) - HA 新功能 - AlwaysOn

架構示意圖:

架構說明:
架構上簡單來說會分為公司內部區網與Azure上的區網,然後中間透過Azure的Site to Site VPN來進行連結,其實你可以想像成有二個區網,一個在地面上,也就是公司內部的區網,另一個是在雲端上,也就是Azure上的區網,然後透過Site to Site VPN的服務彼此進行連結。

1、區網架構:
  • Home-AD(Windows 2012) - 192.168.1.2
  • RRAS Server(Windows 2012) - 192.168.1.1
  • AlwaysOn-Node1(Windows 2012+SQL 2014) - 192.168.1.14
  • AlwaysOn-Node2(Windows 2012+SQL 2014) - 192.168.1.15
2、雲端架構:
  • Azure-AD(Windows 2012) - 192.168.2.4
  • AlwaysOn-Node3(Windows 2012+SQL 2014) - 192.168.2.5


安裝步驟:
1、規畫區網內的IP配配。
2、將二個區網透過Site to Site VPN進行綁定,並確認彼此之間可以相互溝通(Ping)。

這個步驟非常的重要,因為二個區網的溝通都是靠此機制(Site to Site VPN)進行,所以我覺得這是混合雲中的關鍵,所以在此我特別說明一下。

基本上由於我由沒有實體的設備可以進行,所以我是透過微軟的Routing and Remote Access(RRAS)服務來完成,詳細的文章由於已有很多參考資料,所以就先不整理,再請參考下列的文章說明。

VPN Gateway FAQ
https://azure.microsoft.com/en-us/documentation/articles/vpn-gateway-vpn-faq/

Creating a site to site (S2S) VPN to Azure with RRAS, one physical NIC and a NAT gateway
http://blogs.technet.com/b/diegoviso/archive/2014/10/28/creating-a-site-to-site-s2s-vpn-to-azure-with-rras-and-one-physical-nic.aspx

PS:
另外說明,在使用Routing and Remote Access(RRAS)服務時需要注意下列連結提到的幾個事項,比如說我原本是透過IP分享器進行上線,但由於不能透過NAT進行,所以我的RRAS主機改由撥接上網,而且也建議透過固定IP進行,要不然的話每次斷線你就需要手動調整Azure上的區網設定,然後又再進行連接。

檢查清單:安裝及設定 RRAS VPN 伺服器
https://technet.microsoft.com/zh-tw/library/dd469733.aspx

3、建議在雲端上建立複本的AD與地面上的AD進行同步,藉以達到備援的動作。

Installing an Additional Domain Controller by Using the Graphical User Interface (GUI).
https://technet.microsoft.com/en-us/library/cc753720(v=ws.10).aspx

Installing a Domain Controller in an Existing Domain
https://technet.microsoft.com/zh-tw/library/cc816609(v=ws.10).aspx

4、請先依照下列的文件將AlwaysOn安裝完成。

特別說明,由於我們透過Site to Site VPN將二個網路綁在一起後,基本上你可以把二個區網當成同一個網路有不同的網段,所以在後續上你可以直接把第三個節點(AlwaysOn-Node3)直接加入Cluster之中,另外在建立AlwaysOn的服務時,也可以直接將第三個節點(AlwaysOn-Node3)直接加入即可。

另外在建立各個節點的分配上,我建議可以透過下列的方式進行配置,如下表所示。

4-1 第一個與第二個節點由於皆在同一個區網內,所以建議可以透過同步的方式進行交易,另外此二個節點也建議不要設定成可讀取,因為在日後交易量過大時,容易造成瓶頸問題。

4-2 另外第三個節點由於在不同的區網內,為了不影響運作,建議採用非同步的交易進行,然後此節點可以開啟唯讀設定,這樣的設定一來可以分散流量,二來又不會影響到交易時間,在實作上是比較合適的作法。


SQL Server 2012 新功能 - AlwaysOn安裝與設定
http://caryhsu.blogspot.tw/2012/04/sql-server-2012-alwayson.html

5、建立AlwaysOn Listener。

其實這個步驟如同我在Amazon上建立時相同,其實我覺得才是最關鍵的部份,而且在建立後其實也有遇到與Amazon上相同的情況,我稍後再整理說明。

5-1 由於我的各個節點都是安裝Windows 2012,所以必須先安裝下列的Hotfix進行修正。

PS:這邊指的是所有的SQL節點,只要是OS為2008R2 or 2012,都需要檢查此KB是否已有安裝,如果沒有的話,則必須一定要安裝。

更新可讓 Windows Server 2008 R2 和 Windows Server 2012 基礎 Windows Azure 虛擬機器上的 SQL Server 可用性群組接聽程式
https://support.microsoft.com/zh-tw/kb/2854082

5-2 為雲端上的每一個節點設定Endpoint藉以進行訊息回傳(direct server return)

5-2-1 請先設定你的PowerShell環境,相關設定請先參考我下列的文章說明。

如何變更Azure上虛擬網路已配置虛擬主機的IP
http://caryhsu.blogspot.tw/2015/09/azureip.html

5-2-2 查詢Azure網段內可用IP有那些

PowerShell語法:
(Test-AzureStaticVNetIP -VNetName "VNet" -IPAddress 192.168.2.0).AvailableAddresses

由於在Azure上目前只有二台主機分別是AzureAD(192.168.2.4)與AlwaysOn-Node3(192.168.2.5),所以照我的規劃有192.168.2.6-192.168.2.11可以使用,所以我預計以192.168.2.9進行使用。

5-2-3 增加Azure-VM-Endpoint

PowerShell語法
$ServiceName = "alwayson-node3" #主機在Azure上的名稱
$AGNodes = "alwayson-node3"     #VM名稱
$EndpointName = "AGLE"          #endpoint name
$EndpointPort = 1433            #endpoint port
$ILBName = "ILBAG"              #internal load balancer name
$SubnetName = "Subnet-1"        #目前在Azure上規劃的子網路(如下圖)
$ILBStaticIP = "192.168.2.9"    #預計設定給Endpoint的IP位址

Get-AzureVM -ServiceName $ServiceName -Name $AGNodes | Add-AzureEndpoint -Name $EndpointName -LBSetName "$EndpointName" -Protocol tcp -LocalPort $EndpointPort -PublicPort $EndpointPort -ProbePort 59999 -ProbeProtocol tcp -ProbeIntervalInSeconds 10  -InternalLoadBalancerName $ILBName -DirectServerReturn $true | Update-AzureVM



建立完成後,你如果仍是使用舊的Portal時,會無法看到,但是透過新的Portal時,就可以看到新增的Endpoint,如下圖所示。

新的Portal:

舊的Portal:

當然你也可以透過PowerShell來查詢特定VM上是否已建立的Endpoint。
Get-AzureInternalLoadBalancer -ServiceName alwayson-node3


5-2-4 建立AlwaysOn Listener

在混合雲的架構下,要新增AlwaysOn Listener是比較特別的,不像一般以往透過SQL Server Management Studio,這時就要透過Failover Cluster Manager來進行,開啟後,請點選目前Primary Node -> Add Resource -> Client Access Point。

輸入你想要的Listener Name,然後再將目前公司區網內預計要分配給Listener的IP指定在下方,另外你還需要配置Azure Listener的IP,但由於介面的關係,所以後續再進行設定即可。


設定完成後,即可在Resource區中看到剛剛新增的項目,此時請再修改Azure節點的IP設定。


先調整名稱的部份,由於原本是設定成動態分配,所以名稱的尾碼為0,目前由於我們改分配成192.168.2.9,所以建議更改成正確認名稱,另外就是設定下方IP分配的選項,如下圖所示。


再請確認剛剛設定的Listener屬性中相依性是否為 "OR" ,因為在節點上不會二個同時上線,所以在規則上請設定成 "OR"即可。

設定完成後,請嘗試將此Listener設定成Online,此時成功後,你就會看到如下圖所示。


最後再選擇 agdemo -> other resources -> agdemo -> Dependences 將Listener加入相依性,最後我們在回到SQL Server Management Studio即可看到Listener已新增完成。



Configure an external listener for AlwaysOn Availability Groups in Azure
https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-sql-server-configure-public-alwayson-availability-group-listener/

6、AlwaysOn Listener問題處理

建立完成後,坦白說跟我在建立Amazon的時候一樣存在二個問題,一個是連線逾時的問題,另一個是無法進行readonly routing的問題,詳細的說明與解法與我下面的文章說明相同,也是一樣的情況,再請參考下列的連結設定,在此我就不再加以贅述。

如何在Amazon上透過EC2,架設完整的AlwaysOn架構。
http://caryhsu.blogspot.tw/2015/10/amazonec2alwayson.html

關鍵字:Hybrid CloudAlwaysOnSite to Site VPNRouting and Remote AccessMulti-Subnet