顯示具有 MS-SQL 標籤的文章。 顯示所有文章
顯示具有 MS-SQL 標籤的文章。 顯示所有文章

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則都指向主機視別元最小的伺服器上。

以上希望大家參考一下…

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)

2009年4月22日 星期三

透過批次檔及排程自動備援MS-SQL

對於常常應用MS-SQL的廣大鄕民們,對於目前沒有太多錢可運用的單位
MS-SQL備援方案有沒有更經濟一點的呢?這個問題應該帶給大家很大的困擾吧!
其實Jason也曾深深的被困擾過,下列是Jason後來應用的方法,看看能否給大家一些想法。

若要達熱備援(Hot Site)可以透過Cluster技術達成,但其成本之高,若客戶是政府單位,且必須採用中信標的話,其試算如下:


名稱

單價

數量

小計

OS

Windows server 2003 R2 Enterprise edition

NT$ 64,698

1

NT$64,698

Windows Server 用戶端存取授權 (User or Device CAL)

NT$769

5

NT$3,845

DB

Microsoft SQL Server 2005 Std edition

NT$ 24,169

1

NT$ 24,169

SQL Server 用戶端存取授權 (User or Device CAL)

NT$4,332

5

NT$21,660

小計

1組

NT$114,372
總計

2組

NT$228,774

光是個軟體授權費用就要將近11萬5千元,更別說硬體,若是要建置為Failover cluster
除了要一台SAN,兩片Disk Control Card還得要再買兩台中階伺服器
一台SAN至少要買到48萬元,一台伺服器至少買16萬5千元
光是硬體設備就將近85萬元+23萬的軟體授權,將將好快1百萬,老闆不殺了你我才不信,鬼才敢玩。

Failover示意圖

於是,Jason想了一個方法,透過批次檔設定兩台Server的自動工作排程來呼叫整個備份及備援的程序
首先我們先確認一下需求的環境:
1.至少要有一種方法可以傳遞備份檔(.bak) ps.本範例以網芳為例。
2.主要伺服器要能夠信任備援伺服器的服務要求
3.備份檔案名稱必須相同
4.有一組可做還原的SQL帳戶。

為符合上述要求,假設主要伺服器IP為192.168.1.3,備援伺服器IP為192.168.1.5,其程序如下:
1.每天晚間半夜3點整是主要伺服器將資料完整備份至指定的目錄中
2.備援伺服器於每天半夜3點半自動將主要伺服器的備份檔透過網芳將檔案拉取過來
3.將檔案取得後透過T-Script自動的將資料還原到備援伺服器

主要伺服器透過網路讓備份的檔案能直接取取,其路徑為:\\192.168.1.3\databasesync\db.bak
備援伺服器將備份的檔案抓取過來至本機的磁碟內,其路徑為:d:\databasesync\
首先請先於主要伺服器上設定備份工作,並且設定完整備份至指定的檔案名稱,並且使用覆蓋原檔的方式

接下來在備援伺服器中建立一個批次檔(.bat),其內容如下:

xcopy \\192.168.1.3\dabasesync\db.bak d:\databasesync\ /y /s
osql -S "備援伺服器電腦名稱" -U 可執行還原的帳號 -P "可執行還原的帳戶密碼” -i 還原T-Script的實體路徑.sql
exit

其中還原T-Script的檔案(.sql)內容如下:

USE master
GO
ALTER DATABASE 資料庫名稱 SET single_user WITH rollback immediate
GO
RESTORE DATABASE 資料庫名稱 FROM DISK='d:\databasesync\db.bak’ WITH RECOVERY
GO
ALTER DATABASE 資料庫名稱 SET multi_user
GO

接下來手動的執行主要伺服器的備份程序,及備援伺服器的排定工作即可測試。

批次檔運作示意圖

這個方法可以直接在批次檔中加入其它欲備援的資料庫T-script,只要你在主要伺服器上有完整備份出欲備援的資料庫,並且將還原的t-script另外新增即可。

如何截斷MS-SQL Transaction Log

隨著資料庫的運作,MS-SQL記錄著每一個異動的交易記錄,包括備份、更新、刪除…等。

但這些Log增長的速度決對不是你所想的這麼小,往往實體資料並沒任何增長(.MDF)但交易記錄檔(_LOG.LDF)則是以數倍的成長(如果股票也行就太好了!!)

下列語法是針對MS-SQL 2000及MS-SQL 2005的截斷Scritp:

--1.截斷交易記錄
BACKUP LOG [資料庫名稱]
WITH TRUNCATE_ONLY

--2.顯示資料庫檔案,找出交易記錄檔的邏輯檔名
EXEC sp_helpdb '資料庫名稱'

--3.壓縮交易記錄檔
USE 資料庫名稱
DBCC SHRINKFILE([資料庫名稱_log],2)

以上語法最主要的功能是在於ShrinkFile這部份,它是直接實體的將log檔截斷,並且還回實體的磁碟空間,
若沒有使用Electronic Vaulting或是Remote Journaling,在執行完完整備份時
建議即可排程將Transaction Log做截斷,以維持資料庫不因為磁碟空間已滿而造成服務中斷的問題

當然,若有習慣做Transcation log的備份,這個動作也可以在備份作業中最後一個步驟來執行
這個不是最好的作法,但是在SQL的log以倍數成長的狀況下
若以可用性為最終考量,那麼使資料庫不因非資料庫系統產生的問題,而服務中止才是最好的作法。

MS-SQL電腦名稱不符無法建立複寫

上一篇談到如何備援MS-SQL的窮人家作法,但是如果我的伺服器尚有足夠的資源可以跑複寫

往往台灣人在安裝時都沒有顧及到後續的管理問題,電腦名稱先命名了再說,反正就是TEST嘛
等到設備正式上線了,安裝完MS-SQL(2K,及2K5的版本)後,運作了一段時間,才想到名稱問題
這個時侯就直接由原本的TEST改了名字叫做DB-SERVER,但往往事情不是到這裡就結束

有一天老闆跟你說:「我們要導ISO-27001,所以要有備援政策,DBServer是我們的重要資產,要訂一下備援政策」
如果好死不死你選定的備援政策是以複寫來同步資料庫,那麼你就會發現怎麼架的沒辦法成功
原因就出在你的SQL安裝時叫做"TEST",但是現在改名了,你忘了改變SQL中master資料庫內的電腦名稱

所以你當然無法正常的運作,如何解決呢,只要照下列步驟,就可以正常的運作需要確認電腦名稱的所有功能。

--1.檢查伺服器名稱,會看到原本的伺服器名稱
SELECT @@SERVERNAME

--2.將原伺服器名稱卸載掉
EXEC sp_dropserver '原本的伺服器名稱'

--3. 重新掛上正確的伺服器名稱
EXEC sp_addserver
@server='正確的伺服器名稱',
@local = 'local'

--4.重新啟動 SQL Server

--5. 檢查伺服器名稱
SELECT @@SERVERNAME