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

2009年5月1日 星期五

Windows 2008 & SQL Server 2008以NLB及複寫功能達成HA

今天晚上Jason與公司即將畢業的同事辦歡送會,在會中與同部們的伙伴們討論到某個案子因硬體設備相當的缺乏
但是該單位又想達成HA架構,一來是可以讓公司人員有反應的時間,畢竟公司地處南方,要到各地比較不方便
加上高鐵減班直達高鐵成變成每站停的慢鐵,有沒有辦法可以透過即有的功能來達成HA的架構呢?

有幾個因素必須滿足,首先以Web base的專案來舉例,有兩台web及兩台db,但是沒有shared storage可供使用成為claster架構
假設透過loadbalance及複寫功能來達成呢?
LoadBalance的設定請看小弟的所寫的劣帖:Windows Server 2008怎麼設定網路負載(Network LoadBalance)

WEB 部份
●兩台web伺服器
●loadbalance架構(多重主機-設定為無模式;Active/Active)來達成80port的負載
●資料透過DFS達成File Replication

DB 部份
●兩台資料庫伺服器
●loadbalance架構(單一主機;Active/Standby)來達成1433port的負載
●資料庫的資料同步透過合併式複寫達成

明天來實作看看,如果可用的話,再把詳細的步驟與各位網友鄉民分享


完全HA的假想圖

2009/8/4 更新

經過上篇文章SQL Server 2008 複寫實作中將複寫環境建置起來之後,配合前幾個前寫的Windows Server 2008怎麼設定網路負載(Network LoadBalance)Netowork LoadBalance下ASP.NET工作階段的Session states如何處理?,測試環境之下把HA架構測試了一下,下面是我的實作步驟,供大家參考看看…

我們先從一個遠端使用者連入電腦後資訊流的過程來跟大家解釋及說明…
1.使用者輸入網址後,DNS解析後指向Web Load Balance IP。
2.此時Web接禺使用者發出的query時,將session states指向到SQL Server Network Load Balance IP中。
3.Session States透過合併式複寫將Session寫到ASPState資料庫。
4.Web server在將Session回存到資料庫後,讀取Web.config資料庫連結字串取出動態頁面的連接內容
5.讀出字串後,連接到SQL Server Network Load Balance IP,存取所需的資料庫
6.資料庫連結時透過Load Balance分配將資料庫的內容取出
7.經由Web程式整合後再由負責的Web將所需的資訊回覆予使用者。

在實作的部份小弟切割為下列順序:
1.設定web為80 port Load Balance架構
2.設定SQL為1433 port Load Balance架構
3.設定SQL的Session states轉存資料庫(ASPState)
4.設定SQL複寫功能,複寫ASPState及所需存取的資料庫。
5.設定WEB.CONFIG轉存Session連接資訊及manchineKey,若無使用view state則可不需處理ManchineKey問題。
6.開站!!測試,開壓力測試工具實際測試,WEB端流量還是有偏重一某一台,DB則都指向主機視別元最小的伺服器上。

以上希望大家參考一下…

Windows Server 2008怎麼設定網路負載(Network LoadBalance)

Windows 2003設定NLB相信大家對於該部份不默生,但是在Windows 2008的NLB設定似乎與2003的界面相差太大
害大家都找不到,當然Jason的同事也有相關的問題,那麼如果Jason不會設定NLB那MCITP-Enterprise administrator及Server administrator一定是背來的
光是衝著這句話,Jason就一定要在這裡跟大家分享一下,其實兩者大同小異,差異…不大,只是界面上比較生疏一點點。

首先我們先來解釋一下Windows Server的LoadBalance要那些需求:
1.一定要有兩台以上的伺服器。
2.要有n+1個IP(例如:四台伺服器要做NLB那要有5個IP)
3.最好有內部的網路串接(Jason指的是有一個封閉的LAN,方便伺服器不要跟外部使用者搶頻寬)
※要對外服務的網路接到WAN,要伺服器們相互溝通的接到另一個封閉的LAN。

其工作原理就是不論有多少台伺服器,全部都虛擬一個共用的IP,依照負載平衡的類型來做分配(Active/Active, Active/Standby…)
因此,使用者在外端就只會看到一個IP,而後端有多少台伺服器呢?使用者並不需要知道

另外有同事問到LoadBalance的效能如何呢?基本上在軟體的loadbalance之上的效能一定不會是1+1=2,但可以提高可用度(Availability)
對於DoS或DDoS攻擊承受如何呢??這個嘛!!!如果千軍萬馬攻過來,即使你做的再強,正常的頻寬還是被消耗掉還是達陣成功
所以只能單純的提升A.I.C.中的A,下面就是NLB的示意圖,請看~~~

負載平衡架構
NLB示意圖

這在個例範中,我們就以兩台伺服器要建置一個LoadBalance的架構來看,其預設環境如下:

共用IP為:192.168.1.243
網域名稱為:www.jason.com.tw

A伺服器
內部IP:10.10.10.1
外部IP:192.168.1.241

B伺服器
內部IP:10.10.10.2
外部IP:192.168.1.242

首先於『開始』->『系統管理工具』->『伺服器管理員』
未命名 - 6

於『伺服器管理員』中選擇『功能』,並選擇『新增功能』
未命名 - 7

核選『網路負載平衡』,並按下『下一步』按鈕進行安裝
未命名 - 9
未命名 - 11
未命名 - 12

安裝完成後,你可以在『開始』->『系統管理工具』中就會看到『網路負載平衡管理員』
未命名 - 14

接下來,請在A伺服器上執行『網路負載平衡管理員』並且選擇『叢集』->『新增』
未命名 - 15

於連線中選擇連線至A伺服器的IP(192.168.1.241)上再按下連線,並且選擇Outbound的網路卡做為叢集的界面。
未命名 - 17

在叢集的架構之下,有主機的識別元,這個是應用在Active/Standby模式下的應用,依照識別元的順序來做分配流量的依據。
未命名 - 18

接下來要設定叢集的IP,將要使用做為公用的叢集IP(192.168.1.243)新增至叢集設定中。
未命名 - 19
未命名 - 20

完成叢集IP設定後,可選擇輸入FQDN及叢集操作模式。
叢集操作模式的解說如下:(由MSDN轉載而來)
●若您選取單點傳播支援,NLB 會自動指示屬於叢集介面卡的驅動程式覆寫介面卡的唯一、內建網路位址,並將其 MAC 位址變更為叢集的 MAC 位址。這是用在所有叢集主機上的位址。您不需要手動設定網路介面卡來辨識此位址。(請注意,某些網路介面卡不支援變更其 MAC 位址。如果您遇到此問題,就必須安裝支援變更 MAC 位址的網路介面卡。)
以上說明如果很難理解可以向Jason詢問,不過,一般狀況之下,我們會設定成為單點傳播,以降低因硬體或網路環境可能造成的問題。
●[叢集操作模式] 參數指定是否應針對叢集操作使用多點傳送 MAC 位址。如果多點傳送已啟用,NLB 會將屬於叢集介面卡的叢集 MAC 位址轉換為多點傳送位址。它也可確保叢集的主要 IP 位址解析為此屬於 ARP 通訊協定的多點傳送位址。介面卡現在可使用單點傳播模式中停用的原始、內建 MAC 位址。
●在多點傳送模式中,您也可啟用網際網路群組管理通訊協定 (IGMP) 支援,這可限制流量只流向網路負載平衡連接埠來限制切換氾濫。也就是說,啟用 IGMP 支援可確保供 NLB 叢集處理的流量只通過服務叢集主機的連接埠而非所有切換連接埠。
未命名 - 21

接下來必須選擇連接埠的規則,其中包含有要做負載平衡的連接埠範圍、協定範圍、篩選模式。
當然各位大大對於前兩者(連接埠範圍、協定範圍)不會有啥問題,那麼篩選模式呢??
●[多重主機](Active/Active) 參數指定叢集中的多部主機會處理相關連接埠規則的網路流量。此篩選模式可將網路負載分散到多部主機,提供延展的效能與容錯。您可指定負載平均分散到各主機或各主機處理指定的負載權數。
●[單一主機] (Active/Standby)參數指定叢集中的單一主機根據指定的處理優先順序處理相關連接埠規則的網路流量。此篩選模式為處理網路流量提供連接埠特定容錯。
●[停用這個連接埠範圍] 應該沒有人會選這一個吧,選擇這個選項代表不會有loadbalance的功能,因為你把它停用掉了。

但是選定了多重主機又有三個選項,這三個選項是分配的依據:
●[無] 選項指定來自相同用戶端 IP 位址的多個連線可由不同的叢集主機處理 (沒有用戶端相似性)。為了讓網路負載平衡可正確處理 IP 片段,針對通訊協定設定選取 [UDP] 或 [兩者] 時,應避免使用 [無]。
●[單一] 選項指定 NLB 應將來自同一個用戶端 IP 位址的多個要求導向到同一部叢集主機。這是 [相似性] 的預設設定。您可選擇修改 NLB 用戶端相似性,啟用 [網路] 選項而非 [單一] 選項,將來自 TCP/IP C 類別位址範圍 (而非單一 IP 位址) 的所有用戶端要求導向到單一叢集主機。此功能確保使用多部 Proxy 伺服器存取叢集的用戶端可使其 TCP 連線導向到同一部叢集主機。
●[網路] 選項指定 NLB 將來自同一個 TCP/IP C 類別位址範圍的多個要求導向到同一部叢集主機。啟用 [網路] 相似性而非 [單一] 相似性,確保使用多部 Proxy 伺服器存取叢集的用戶端可使其 TCP 連線導向到同一部叢集主機。
※選擇用「無」會很平衡的將連線平均的分配到每台叢集主機上,選擇單一可以確保session不會有中斷的問題,選擇網路則是以c class的網段來分配連入主機。
因此我們先以靜態網頁的設定選擇使用「無」相似性。完成於伺服器設定NLB後。
未命名 - 22
未命名 - 23

切換至伺服器B,開啟『網路負載平衡管理員』->『叢集』->『連線到現有的叢集』
未命名 - 24

並輸入伺服器的封閉IP(10.10.10.1)按下連線,此時伺服器B會透過封閉連線向伺服器A要求Loadbalance相關設定及通訊。
選定叢集名稱後,點下完成,隨即可以於伺服器B以封閉連線向伺服器A登入叢集。
未命名 - 26

於叢集名稱上按『右鍵』選擇『新增主機到叢集』
未命名 - 27

輸入伺服器B的封閉IP(10.10.10.2)點選連線,並且選擇外部IP(192.168.1.242)加入叢集介面中
未命名 - 28

設定主機參數部份來設定優先順序的主機識別元並點選下一步
未命名 - 29

此時伺服器B會向叢集取得連線規則,若此時要再加入其它規則也會一併的發佈至叢集中
未命名 - 30

完成後切換至伺服器A中點選『叢集』->『重新整理』,可以於叢集中看到伺服器B已交集至叢集中了。
未命名 - 31
未命名 - 32

接下來於伺服器A上瀏覽網頁可看到預設的文件”我是ServerA”
未命名 - 33

切換至伺服器B上上瀏覽網頁可看到預設的文件為我是ServerB
未命名 - 34

呼~~~~!拉拉雜雜的寫了一大篇,希望對要考MCITP的伙伴或是必須要設定高可用性架構的苦主有所幫助,有任何建議請您不吝指教,謝謝大家~!

參考資料

# Geek Lectures - Things geeks should know about » Blog Archive » Installing Network Load Balancing (NLB) on Windows Server 2008
PingBack from http://geeklectures.info/2008/01/07/installing-network-load-balancing-nlb-on-windows-server-2008/

Tuesday, January 08, 2008 12:50 AM by Geek Lectures - Things geeks should know about » Blog Archive » Installing Network Load Balancing (NLB) on Windows Server 2008
# MSDN Blog Postings » Installing Network Load Balancing (NLB) on Windows Server 2008
PingBack from http://msdnrss.thecoderblogs.com/2008/01/08/installing-network-load-balancing-nlb-on-windows-server-2008/

Tuesday, January 08, 2008 12:52 AM by MSDN Blog Postings » Installing Network Load Balancing (NLB) on Windows Server 2008
# Microsoft Windows Update » Installing Network Load Balancing (NLB) on Windows Server 2008
PingBack from http://microsoft-windows-update.blogyblog.info/?p=4834

Tuesday, January 08, 2008 1:45 AM by Microsoft Windows Update » Installing Network Load Balancing (NLB) on Windows Server 2008
# Anderson Patricio Blog » Blog Archive » Installing Network Load Balancing (NLB) on Windows Server 2008
PingBack from http://blogs.msexchange.org/patricio/2008/01/08/installing-network-load-balancing-nlb-on-windows-server-2008/

Tuesday, January 08, 2008 11:00 AM by Anderson Patricio Blog » Blog Archive » Installing Network Load Balancing (NLB) on Windows Server 2008
# Discount Airline Tickets » Installing Network Load Balancing (NLB) on Windows Server 2008
PingBack from http://www.travel-hilarity.com/travel-airline-tickets/?p=603

2009年4月29日 星期三

Netowork LoadBalance下ASP.NET工作階段的Session states如何處理?

在靜態網頁之下,若架構以NLB(Network Load Balance)做Active/Active mode是沒有什麼太大的問題,因為靜網頁並沒有工作處理的狀態問題
但是如果想要達成在動態網頁之下,使網站服務可以達成完全loadbalance,這時侯,我們常常應用的一些互動性的功能可能會出現問題
原因就出在當有使用互動性的功能時,Session States是直接存在處理服務的那台伺服器上
你可能填寫問卷填的比較久,當你按下送出時,已經被NLB切到另一台伺服器上了,這時你的工作階段則沒有轉移至這台伺服器
而有可能使的互動性的功能完全的喪失,除非運氣好不然這種狀況應該會讓你的客戶把你打個半死。

那麼在NLB架構之下,又使用的是完全Loadbalance有什麼方法可以將Session Stats讓每台伺服器都能接續下去呢?
全都存一份到所有的服務成員伺服器?還是找個Shared Storage來存放呢?其實我們可以透過SQL Server將資料轉存下去
這麼一來,即使是硬體的Loadbalance設備,而且負載的規則是依照負載狀況而定的這種架構也可以適用。

首先,我們必須先設定將SQL Server設定成可存放Session States,在SQL Server上開啟InstallSqlState.sql到Query Analyzer(SQL 2K及2K5都通用)執行
路徑置放於system drive\WinDir\Microsoft.NET\Framework\version\,一般是放在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727之中
這樣子就好了嗎???當然還沒有呀!這樣只是在SQL Server上建立一個資料庫(ASPState)供Web將Session States存放至SQL

但是Web Server怎麼會把Session States丟到SQL Server上存放呢?此時,我們必須先在SQL Server上建立一個可連線的資料庫使用者
並且他對於ASPState這個資料庫要是DBOwner的身份,這樣它才能將各種資訊依照需求來建立或刪減資料表、預存程序…等

接下來我們只要在Web.conf檔中,加上這一行程式碼即可讓web將session sates存至SQL Server在加完下面這一行程式碼後,請記得將IISADMIN重啟讓它生效

<configuration>
<system.web>
<sessionState mode="SQLServer"
sqlConnectionString="data source=<SQL Server IP or Name>;user id=<username>;password=<strongpassword>"
cookieless="false"
timeout="20" />
</system.web>
</configuration>

謝謝JamesWu大大的提醒,在NLB的架構下,伺服器會隨機的自動產生一組Key以供識別用,但是若沒有在web.config中設定好這組key,有可能在轉移的時侯有可能會產生無法解View states或是cookies的問題
因此除了JamesWu大大所寫的Validation of viewstate MAC failed 驗證ViewState時 MAC 失敗 以外
下面這個連結是可以直接取得這把machineKey的產生器供大家參考,謝謝大家!!
ASP.NET machineKey Generator

MSDN也有相關的資料可供參考:machineKey Element (ASP.NET Settings Schema)