2011年10月6日 星期四

網路負載平衡 - Reporting Service 與 NLB 的結合

        在許多的企業中為了讓系統的服務不中斷,所以採取了許多 High Availability的架構,在Windows 的架構中,最常見的就是Cluster,並將SQL Server安裝在此叢集上,詳細的作法可以參考我的另一篇文章 [SQL Server 2008 R2 容錯移轉叢集環境架設 - 利用 VM 與 Windows Storage Server - Part I],但是特別強調,並非所有的在SQL Server下的服務都可以掛到Cluster之中,而Reporting Service就是其中一個,我收到許來網友的來信詢問到,為何他們將Reporting Service安裝在Cluster上之後,在容錯叢集管理員還是看不到,而且在第二台為何沒有看到Reporting Service,原因在於Reporting Service本身不支援容錯轉移,雖然可以安裝,但是並不會像SQL Server Service一樣,可以在發生錯誤時容錯轉移到另一個節點,而第二台的Reporting Service如果要安裝,也不能裝在預設的 Instance上面,必須安裝在另一個 Instance上面即可。

看到上面大家也別灰心,雖然Reporting Service不能設定容錯轉移,但可以進行負載平衡的設定,這也是本篇的重點,在設定上有點複雜,我參考官網的步驟整理如下:
  1. 在 NLB 叢集的伺服器節點上安裝 Reporting Services 之前,請先檢查向外延展部署的需求
  2. 設定 NLB 叢集並確認它是否正常運作。
    請務必將主機標頭名稱對應至 NLB 叢集的虛擬伺服器 IP。此主機標頭名稱會用於報表伺服器 URL 中,而且比 IP 位址更容易記得和輸入。
  3. 在僅限檔案模式中,於已經屬於 NLB 叢集之一部分的節點上安裝 Reporting Services,並設定報表伺服器執行個體來進行向外延展部署
  4. 設定檢視狀態驗證
    為了獲得最佳結果,請在您設定向外延展部署之後,而在將報表伺服器執行個體設定為使用虛擬伺服器 IP 之前,執行這個步驟。先設定檢視狀態驗證,就可以在使用者嘗試存取互動式報表時,避免發生有關狀態驗證失敗的例外狀況。
  5. 將 Hostname 和 UrlRoot 設定為使用 NLB 叢集的虛擬伺服器 IP。
  6. 確認伺服器可透過您指定的主機名稱存取。
環境說明:
軟體:
Reporting Server 2008 R2 Enterprise + 向外延展部署

Node 1:
IP -1 :192.168.1.150
IP -2 :10.0.0.150

Node 2:
IP -1 :192.168.1.151
IP -2 :10.0.0.151

PS:在NLB的架構中建議每一個節點要有兩張網卡,以免在透過遠端連線管理時,造成連線的問題。



1、規劃向外延展部署

1-1 詳細的功能說明請參照下列的列表或是官網的說明。
需求說明
版本需求
下列版本支援向外延展部署:Enterprise、Developer 和 Evaluation。
Standard、Workgroup 和 Express 版本不支援向外延展部署。
版本需求
所有報表伺服器都必須是相同的主要版本,而且這些版本必須擁有相同的更新與 Service Pack。
網域需求
所有的報表伺服器必須在同一個網域中,或在受信任的網域中。
參考說明:規劃向外延展部署

2、設定 NLB 叢集

2-1 NLB 說明
NLB全名為 [Network Load Balancing],他是Windows所提供的兩種叢集技術之一,你可以透過 NLB 進行網路負載平衡,將需要分配管理的電腦架設在網路負載平衡叢集上,當有網路需求時,NLB就可以平均的分配給在此叢集上的每一台電腦。


參考說明:網路負載平衡主要功能

2-2 安裝與設定第一個節點的 NLB

2-2-1 由於我是透過 Hyper-V進行 NLB 的架設,原本架設怎麼都架不起來,後來終於找到,必須在Hyper-V的網卡設定中啟用 [Enable spoofing of MAC addresses] 這樣你設定好的 NLB才不會有問題。

2-2-2 新增伺服器功能 -> 網路負載平衡


2-2-3 安裝完成後,選擇 [網路負載平衡管理員]。

2-2-4 開啟後點選 [網路負載平衡叢集] -> [新增叢集]

2-2-5 在連線的地方,請先將第一台的節點加入即可。

2-2-6 設定該節點在此負載平衡上叢集上的優先順序,此值在後面仍然可以進行變動。

2-2-7 針對此負載平衡叢集新增一組IP。



2-2-8 針對此叢集參數,其中最重要的就是 [完整網際網路名稱] 此值日後就不可以更改而且必須在此網路上是唯一的,所以名稱的設定再請多加注意,而叢集操作的模式,可以使用預設值 [單點傳播],關於此操作模式的說明,可以參考下列的說明:


參考文章:網路負載平衡 (NLB):單點傳播 (Unicast) 與 多點傳送 (Multicast) 的差異

2-2-9 連接埠規則設定,也請使用預設值即可,詳細說明請參考:建立新的網路負載平衡連接埠規則。


2-2-10 建立完成後,你就可以新的叢集與加入的節點就顯示出來了。

2-3 將第二個節點加入負載平衡叢集之中。

2-3-1 選擇已新增的叢集名稱,選擇 [新增主機到叢集]。

2-3-2 在 [主機]的地方輸入第二個節點的電腦名稱,然後選擇連線。

2-3-3 選擇此台主機的優先順序

2-3-4 連接埠規則請與第一個節點的設定相同,所以依照預設值即可。

2-3-5 新增完成後,你就可以在下列的地方看到第二個節點加入到網路負載平衡叢集中了。

2-3-6 設定完成請確認在兩台電腦中的狀態必須為 [已交集],然後PING的指令確認新增的網路名稱與 IP 是正常的。

PING cary-nlb
PING 192.168.1.149

3、設定與安裝 Reporting Service向外延展部署

3-1 詳細的設定細節,請參考我的另一篇說明 [設定報表伺服器執行個體來進行向外延展部署]。

4、設定檢視狀態驗證

4-1 由於我們透過 NLB 與 Reporting Service 進行負載平衡處理,所以接下來就必須產生一個MachineKey讓兩台在加解密上的動作都是使用相同的方法進行,你可以透過下列的網站先產生一組Key。

MachineKey WebSite:

MachineKey說明:設定金鑰,用以進行表單驗證 Cookie 資料及檢視狀態資料的加密和解密,並驗證跨處理序 (Out-Of-Process) 工作階段的狀態識別。

 4-2 打開 "\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\Web.config" 的檔案,找到 <system.web> 的區段,然後貼上去,之後再存檔即可。



4-3 重新啟動 Reporting Service 的服務

4-4 重新上述的動作在此NLB中的每一個節點。


5、將 Hostname 和 UrlRoot 設定為使用 NLB 叢集的虛擬伺服器 IP

5-1 打開 "\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\rsreportserver.config" 的檔案。

5-2 找到 <Service> 的區段,然後將剛剛 1-8節的中新增的NLB對外名稱加入到<Hostname>cary-nlb</Hostname>。

PS:預設Hostname的標籤是不存在的,需自行新增。

5-3 在 <Service> 的區段,尋找 <UrlRoot>的標籤值變更成下列的值即可 。
<UrlRoot>http://cary-nlb/reportserver</UrlRoot>

5-4 重新啟動Reporting Service的服務

5-5 重新上述的動作在此NLB中的每一個節點。

修改完成後的設定檔

6 報表測試與問題排除

6-1 解決 HTTP 401 Unauthorized的問題
首先在測試上你不必從本機上進行測試,因為NLB的關係,所以你必須透過第三台來測試,測試的網址可以透過下列二種,但是很可惜的我卻遇到了 HTTP 401 Unauthorized 的問題,解決方法為下列二個步驟。

6-1-1 打開第一個節點中 C:\Windows\System32\drivers\etc\hosts 的檔案,在最後一行中加入下列的位置對照。

192.168.1.150    cary-nlb


6-1-2 同樣地的打開第二個節點中 C:\Windows\System32\drivers\etc\hosts 的檔案,在最後一行中加入下列的位置對照。

192.168.1.151    cary-nlb

6-1-3 新增 [DisableStrictNameChecking] 的登錄值。
  • 按一下 [開始]、 按一下 [執行]、 輸入 regedit,然後按一下 [確定]]。
  • 在 [登錄編輯程式] 中,找出並按一下下列登錄機碼:
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
  • 在登錄值上按一下滑鼠右鍵,指向 [新增],然後再按一下 [DWORD 值]。
  • 鍵入 DisableLoopbackCheck,並按下 ENTER。
  • 在DisableLoopbackCheck 上按一下滑鼠右鍵,然後按一下 [修改]。
  • 選擇 [數值資料] 方塊中鍵入 1,再按 [確定]。
  • 結束 「 登錄編輯程式 」,然後重新啟動您的電腦。
參考網址:
瀏覽的網站,使用 「 整合式驗證 」 且裝載在 IIS 5.1 或更新版本上時,收到 401.1 錯誤

6-2 報表與 NLB 的結合測試
在測試不管是進入 Reports 或是 ReportServer的目錄,網址名稱皆是使用 cary-nlb ,但是要如何知道目前的主機是在第一台還是第二台,本來想透過 Reporting Service 中的內建欄位來完成,但是很可惜沒有這種功能,後來我想到一個方法,由於都是連接到同一個資料庫,所以可以透過資料庫中得到登入的電腦名稱與使用者帳號,所以我就作了一個報表,透過下列的語法進行,一試就完成。

SQL 語法:
SELECT HOST_NAME() as HostName,
SUSER_NAME() LoggedInUser

第一台連線測試:

第二台連線測試:
PS:請特別注意,由於 NLB 會盡量將同一個 Client 導向同一台電腦,所以第二台測試請利用不同的電腦進行測試即可。

最後終於完成這個艱辛的任務,接下來再請大家自行測試,其實安裝上真的我自已也遇到許多的問題,所以如果有遇到任何問題,歡迎大家來信詢問。

參考資源:
如何:在網路負載平衡叢集上設定報表伺服器
Reporting Service 2008 R2 - 如何設定向外延展部署的功能

關鍵字:Network Load Balancing ClustersNLBClusterHigh AvailabilityHAReporting Service向外延展部署

2 則留言:

  1. 這篇真有趣,都沒想過NLB跟SQL的功能可以做結合,感謝分享~

    回覆刪除
  2. Really.. many thanks for starting this up. This site is something that’s needed on the internet, someone with a little originality!

    Regards,
    OST to PST

    回覆刪除