服務(wù)器和應(yīng)用系統(tǒng)遷移方案
2020-02-14 14:52 作者:艾銻無限 瀏覽量:
迎戰(zhàn)疫情,艾銻無限用愛與您同行
為中國中小企業(yè)提供免費IT外包服務(wù)

這次的肺炎疫情對中國的中小企業(yè)將會是沉重的打擊,據(jù)釘釘和微信兩個辦公平臺數(shù)據(jù)統(tǒng)計現(xiàn)有2億左右的人在家遠程辦公,那么對于中小企業(yè)的員工來說不懂IT技術(shù)將會讓他們面臨的最大挑戰(zhàn)和困難。
電腦不亮了怎么辦?系統(tǒng)藍屏如何處理?辦公室的電腦在家如何連接?網(wǎng)絡(luò)應(yīng)該如何設(shè)置?VPN如何搭建?數(shù)據(jù)如何對接?服務(wù)器如何登錄?數(shù)據(jù)安全如何保證?數(shù)據(jù)如何存儲?視頻會議如何搭建?業(yè)務(wù)系統(tǒng)如何開啟等等一系列的問題,都會困擾著并非技術(shù)出身的您。
好消息是當(dāng)您看到這篇文章的時候,就不用再為上述的問題而苦惱,您只需撥打艾銻無限的全國免費熱線電話:400 650 7820,就會有我們的遠程工程師為您解決遇到的問題,他們可以遠程幫您處理遇到的一些IT技術(shù)難題。
如遇到免費熱線占線,您還可以撥打我們的24小時值班經(jīng)理電話:15601064618或技術(shù)經(jīng)理的電話:13041036957,我們會在第一時間接聽您的來電,為您提供適合的解決方案,讓您無論在家還是在企業(yè)都能無憂辦公。
那艾銻無限具體能為您的企業(yè)提供哪些服務(wù)呢?
艾銻無限始創(chuàng)于2005年,歷經(jīng)15年服務(wù)了5000多家中小企業(yè)并保障了幾十萬臺設(shè)備的正常運轉(zhuǎn),積累了豐富的企業(yè)IT緊急問題和特殊故障的解決經(jīng)驗,制定了相對應(yīng)的解決方案。我們?yōu)槟钠髽I(yè)提供的IT服務(wù)分為三大版塊:
第一版塊是保障性IT外包服務(wù):如電腦設(shè)備運維,辦公設(shè)備運維,網(wǎng)絡(luò)設(shè)備運維,服務(wù)器運維等綜合性企業(yè)IT設(shè)備運維服務(wù)。
第二版塊是功能性互聯(lián)網(wǎng)外包服務(wù):如網(wǎng)站開發(fā)外包,小程序開發(fā)外包,APP開發(fā)外包,電商平臺開發(fā)外包,業(yè)務(wù)系統(tǒng)的開發(fā)外包和后期的運維外包服務(wù)。
第三版塊是增值性云服務(wù)外包:如企業(yè)郵箱上云,企業(yè)網(wǎng)站上云,企業(yè)存儲上云,企業(yè)APP小程序上云,企業(yè)業(yè)務(wù)系統(tǒng)上云,阿里云產(chǎn)品等后續(xù)的云運維外包服務(wù)。
您要了解更多服務(wù)也可以登錄艾銻無限的官網(wǎng):www.bjitwx.com查看詳細說明,在疫情期間,您企業(yè)遇到的任何困境只要找到艾銻無限,能免費為您提供服務(wù)的我們絕不收一分錢,我們?nèi)w艾銻人承諾此活動直到中國疫情結(jié)束,我們將這次活動稱為——春雷行動。
以下還有我們?yōu)槟峁┑囊恍┘夹g(shù)資訊,以便可以幫助您更好的了解相關(guān)的IT知識,幫您渡過疫情中辦公遇到的困難和挑戰(zhàn),艾銻無限愿和中國中小企業(yè)一起共進退,因為我們相信萬物同體,能量合一,只要我們一起齊心協(xié)力,一定會成功。再一次祝福您和您的企業(yè),戰(zhàn)勝疫情,您和您的企業(yè)一定行。
服務(wù)器和應(yīng)用系統(tǒng)遷移方案
一、遷移方案總體思路
新舊系統(tǒng)的遷移是一個整體系統(tǒng)工程。遷移必須保證用戶系統(tǒng)建設(shè)的相關(guān)要求,在遷移過程中,我們需要重點考慮幾個問題:
1、數(shù)據(jù)遷移如何保障“業(yè)務(wù)中斷停機時間”。業(yè)務(wù)中斷對用用戶無論是生產(chǎn)環(huán)境還是測試環(huán)境均存在較大的恢復(fù)風(fēng)險,這樣的風(fēng)險特別是對于時間敏感型數(shù)據(jù)還是對于數(shù)據(jù)完整性業(yè)務(wù)都是不可以接受的。我們基于這樣的要求,考慮到如何將停機時間最小,能否實現(xiàn)0停機的建設(shè)目標?
i. 對于服務(wù)器操作系統(tǒng)而言,我們可以采用P2V的方式,利用操作系統(tǒng)的Volume Shadow Copy卷影副本復(fù)制服務(wù)作為基礎(chǔ),來實現(xiàn)在舊系統(tǒng)環(huán)境下的系統(tǒng)無修改,無停機的情況下,將數(shù)據(jù)和應(yīng)用軟件、操作系統(tǒng)環(huán)境、系統(tǒng)環(huán)境變量等全部以“快照”形式遷移到新服務(wù)器中。由此實現(xiàn)服務(wù)器環(huán)境的整體遷移。
ii. 對于應(yīng)用IIS和其他應(yīng)用服務(wù)器來說,我們可以基于應(yīng)用服務(wù)器的動態(tài)業(yè)務(wù)擴展集群方式,來實現(xiàn)服務(wù)器不停機環(huán)境下的增加業(yè)務(wù)節(jié)點操作,這樣可以實現(xiàn)應(yīng)用服務(wù)器“熱添加”到新環(huán)境中的故障轉(zhuǎn)移/負載均衡集群系統(tǒng)中,在部分應(yīng)用服務(wù)中我們可以使用session會話復(fù)制來實現(xiàn)舊系統(tǒng)的全局環(huán)境變量和會話請求狀態(tài)也遷移到新環(huán)境中來??紤]到會話復(fù)制和狀態(tài)的快速實時,我們可以采用會話內(nèi)存復(fù)制,考慮到會話復(fù)制和狀態(tài)的安全性,我們可以采用會話數(shù)據(jù)庫復(fù)制管理。
iii. 對于數(shù)據(jù)庫而言,我們可以基于數(shù)據(jù)庫本身自帶的數(shù)據(jù)庫鏡像技術(shù)、數(shù)據(jù)庫日志傳遞技術(shù)來實現(xiàn)各自的分庫、遷移庫的構(gòu)建,數(shù)據(jù)庫鏡像技術(shù)可以讓我們不但保證數(shù)據(jù)庫遷移的不停機,而且還可以保證萬一遷移中出現(xiàn)停機故障也不影響源數(shù)據(jù)庫,而日志傳遞技術(shù)構(gòu)建的遷移可以保證系統(tǒng)數(shù)據(jù)庫遷移以異步方式進行,這樣可以讓我們的系統(tǒng)環(huán)境在網(wǎng)絡(luò)出現(xiàn)故障的情況依然可以進行遷移任務(wù)窗口的正常工作。
2、遷移涉及到的除了應(yīng)用、實例、數(shù)據(jù)庫的操作以外,還涉及到遷移前規(guī)劃、遷移后測試的完整性測試。這些測試包括但不限于數(shù)據(jù)一致性測試、數(shù)據(jù)完整性測試、應(yīng)用會話狀態(tài)完整性測試、連接中斷測試、
數(shù)據(jù)恢復(fù)測試。只有這樣才能保證遷移的安全性和有效性。
二、服務(wù)器硬件環(huán)境遷移方案
1. 遷移評估
遷移前,對遷移方案進行評估以確保遷移成功。首先需要勘察現(xiàn)有系統(tǒng)的架構(gòu)和資源使用狀況,評估過程必須包含以下信息和內(nèi)容:
現(xiàn)有系統(tǒng)支撐的服務(wù)數(shù)量以及在服務(wù)器中的分布情況
現(xiàn)有物理服務(wù)器資源占用狀況,包括CPU、內(nèi)存、磁盤和網(wǎng)絡(luò)連接狀況,為保證遷移成功,目標虛擬機規(guī)格應(yīng)不低于原物理機標準
當(dāng)前的物理環(huán)境是否支持虛擬化,是否支持資源擴展,因為在遷移之前須在物理服務(wù)器上完成虛擬化
對當(dāng)前的存儲容量和資源利用率進行評估,需在目標系統(tǒng)中規(guī)劃好遷移需要的存儲空間。需明確現(xiàn)有存儲如何利用,比如有些服務(wù)器是在本地磁盤上創(chuàng)建系統(tǒng)盤和用戶盤,有些服務(wù)器則在本地磁盤上創(chuàng)建系統(tǒng)盤而在SAN/NAS上創(chuàng)建用戶盤。
2. 遷移計劃
通過對現(xiàn)有網(wǎng)絡(luò)環(huán)境的評估,我們對現(xiàn)有資源利用率,服務(wù)以及系統(tǒng)需求非常清晰。評估后才能開始對遷移進行計劃,步驟如下:
一、確定遷移步驟,包括所有服務(wù)器的遷移先后順序,其順序按風(fēng)險的高低降序排列。
二、確定備份方案,由于現(xiàn)有系統(tǒng)會被加固,某些服務(wù)器通過虛擬化重復(fù)利用,而在虛擬化前需要清除所有的數(shù)據(jù),因此需要對這些服務(wù)器進行備份保證服務(wù)的連續(xù)性。
三、確定并準備好遷移所需的工具,包括工具在遷移中必備的一系列功能和使用工具所需具備的網(wǎng)絡(luò)環(huán)境。
四、在實際遷移開始之前確定額外的測試環(huán)境,該測試環(huán)境能夠引導(dǎo)測試從而確保遷移成功。因此,測試環(huán)境需明確設(shè)計的服務(wù)器和存儲數(shù)量。
五、規(guī)劃網(wǎng)絡(luò)環(huán)境,由于網(wǎng)絡(luò)中的服務(wù)器各處不同位置,因此在遷移中需考慮到網(wǎng)絡(luò)連接情況、數(shù)據(jù)備份方式,以及網(wǎng)絡(luò)流量來源,確定網(wǎng)絡(luò)流量是否會引發(fā)網(wǎng)絡(luò)擁塞
六、確定遷移周期以及參與人員,包括遷移起止時間,團隊能力建設(shè)以及團隊成員的角色。
3. 測試計劃
遷移計劃后,執(zhí)行小批量的測試遷移方案,這里會涉及到首批遷移的測試和審核,步驟如下:
準備用于測試遷移的測試系統(tǒng)環(huán)境,在測試時,第一批服務(wù)器將會遷移到該系統(tǒng)環(huán)境中。
安裝并核實遷移工具,此時要執(zhí)行第一批服務(wù)器的P2V遷移。
對第一批服務(wù)器,需分析存儲系統(tǒng),不管該服務(wù)器在存儲遷移中采用本地磁盤存儲還是遠端SAN/NAS存儲系統(tǒng)。
4. 遷移測試
在第一批服務(wù)器和服務(wù)的小批量測試遷移后,需對遷移后的服務(wù)器進行測試,包括單元測試和性能測試。
5. 遷移實施
在遷移實施過程中,所有的服務(wù)器都會被遷移到虛擬化系統(tǒng)下。執(zhí)行步驟如下:
確保批量遷移的整個網(wǎng)絡(luò)環(huán)境已準備完畢,并通過遷移工具完成源系統(tǒng)和目標系統(tǒng)之間的連通。此處的目標系統(tǒng)屬于中轉(zhuǎn)系統(tǒng)。
對遷移系統(tǒng)進行性能審核和健康檢查,如果系統(tǒng)狀態(tài)監(jiān)視則停用舊系統(tǒng)并將其服務(wù)暫時轉(zhuǎn)移到新的虛擬化系統(tǒng)中。
進行利舊,對于一部分可用的舊硬件可在服務(wù)器虛擬化中重新再利用,一些軟件資源需擴展,如內(nèi)存和硬盤。這些服務(wù)器構(gòu)成最終的虛擬化基礎(chǔ)設(shè)施,即最終系統(tǒng)。
最后,在目標系統(tǒng)和最終系統(tǒng)之間進行V2V遷移。這樣,最終系統(tǒng)完成了現(xiàn)存硬件的重復(fù)利用。
a. 服務(wù)器虛擬化前進行備份
為了對舊系統(tǒng)中的物理服務(wù)器進行虛擬化,需考慮服務(wù)器虛擬化帶來的影響。例如,現(xiàn)有服務(wù)器的重復(fù)利用,服務(wù)器虛擬化時會對這些服務(wù)器的CPU,內(nèi)存以及硬盤資源進行再利用,然而這些服務(wù)器上存在某些服務(wù)仍在運行,若無備份則會影響現(xiàn)有業(yè)務(wù)。因此,在執(zhí)行遷移和虛擬化之前,必須先對需利舊的服務(wù)器進行備份。
遷移步驟如下圖所示。
提供物理備份服務(wù)器,并已進行虛擬化,數(shù)據(jù)和服務(wù)器已備份到虛擬化系統(tǒng)。
首先,對于要被遷移的服務(wù)器上,一般會存在多種服務(wù)正在運行,而且這些服務(wù)器在遷移評估后認為在虛擬化場景下可再利用的。但是,遷移過程中不允許存在較長的停機時間,因此需要準備一臺采用虛擬化平臺的備份虛擬機,通過P2V將該服務(wù)器備份到虛擬機上。
備份完所有需要進行虛擬化的服務(wù)器之后,這些服務(wù)器上安裝虛擬化軟件進行虛擬化,根據(jù)評估階段確定的容量規(guī)劃,在虛擬化平臺上創(chuàng)建相應(yīng)規(guī)格的虛擬機,其計算資源用于承接舊系統(tǒng)中的服務(wù)。
準備好所有的虛擬機后,規(guī)劃和安裝相關(guān)遷移工具,將備份系統(tǒng)中的服務(wù)遷移到虛擬化系統(tǒng)的虛擬機中。虛擬機遷移是指將備份的虛擬化系統(tǒng)中的應(yīng)用服務(wù)遷移到最終的虛擬化系統(tǒng)中。
虛擬機遷移完畢后,要對這些服務(wù)進行測試,最后停用舊系統(tǒng),所有服務(wù)切換到虛擬化系統(tǒng)中。
b. 遷移的詳細操作步驟
遷移的具體步驟及描述如下圖所示:
A. 在評估階段,虛擬化和遷移之前需收集的信息如下:
性能統(tǒng)計:包括CPU使用率,內(nèi)存使用率,硬盤IOPS和硬盤使用情況;
物理服務(wù)器配置:包括CPU規(guī)格,內(nèi)存容量,硬盤容量
統(tǒng)計物理服務(wù)器部署位置,分析是否支持虛擬化,累計支持虛擬化的服務(wù)器數(shù)量,并規(guī)劃出虛擬化中需新增的硬件情況;
通過上述無代理收集和代理收集兩種場景收集當(dāng)前系統(tǒng)的使用和配置情況??刹捎萌A為信息收集工具或者第三方工具。
B. 分析現(xiàn)有服務(wù)的依賴條件,對當(dāng)前系統(tǒng)進行備份。
上圖描述了一種應(yīng)用系統(tǒng)下的依賴關(guān)系,可作為遷移參考,確定所有服務(wù)器的遷移優(yōu)先級順序。
在確定各服務(wù)的依賴條件后,對需進行虛擬化的服務(wù)器進行備份。具體備份過程參見本小節(jié)遷移實施方案中 “服務(wù)器虛擬化前進行備份”部分的內(nèi)容。
C. 容量規(guī)劃和虛擬化執(zhí)行
根據(jù)當(dāng)前的資源使用和需求情況,計算虛擬化所需的容量。
D. 規(guī)劃應(yīng)用服務(wù)
在華為虛擬化解決方案中,同類虛擬機部署在同一個計算資源池中,在同一個池中可相互共享存儲/計算資源,一個集群的故障不會影響其他資源池。
E. 虛擬化規(guī)劃和虛擬機分配
建立虛擬化平臺后,要準備最終的遷移資源。遷移前,如果服務(wù)器a具備雙核CPU和2G內(nèi)存,那么在虛擬化平臺中就創(chuàng)建一個2核/2G內(nèi)存的虛擬機,并分配相應(yīng)的硬盤。
F. 規(guī)劃遷移工具
采用遷移工具從物理或虛擬的服務(wù)器向最終的虛擬化系統(tǒng)中進行磁盤復(fù)制。
G. 通過工具執(zhí)行在線遷移
準備好源系統(tǒng),目標虛擬機以及目標系統(tǒng)后,決定遷移時需使用的遷移工具和遷移策略。
H. 遷移測試
遷移后,需進行測試來驗證遷移是否成功,測試場景如下:
應(yīng)用服務(wù)遷移后對虛擬化基本功能的監(jiān)測;
遷移前后應(yīng)用服務(wù)的特性功能是否幾乎相同;
虛擬化系統(tǒng)的性能監(jiān)控;
….
I. 停用舊系統(tǒng)
截至目前現(xiàn)有的服務(wù)器已經(jīng)被虛擬化和重復(fù)使用,其他一些不支持虛擬化的服務(wù)器上對應(yīng)的服務(wù)也已經(jīng)遷移到虛擬化平臺,那么現(xiàn)在可將應(yīng)用服務(wù)切換到虛擬系統(tǒng)并停用舊系統(tǒng),其步驟如下:
三、應(yīng)用系統(tǒng)數(shù)據(jù)庫遷移方案
1. 應(yīng)用服務(wù)器遷移到群集環(huán)境
為滿足企業(yè)不斷的成長需求,實現(xiàn)企業(yè)服務(wù)器的高可伸縮性、高可用、高可靠性和高性能,提升服務(wù)器的SLA,Microsoft到目前為止,提出了五種解決方案:
我們對于IIS等應(yīng)用環(huán)境以及.net應(yīng)用程序框架我們提出構(gòu)建IIS環(huán)境的NLB群集,將當(dāng)前系統(tǒng)不停機加入到NLB群集中,使之成為群集中的一個節(jié)點,而新環(huán)境則為另外一個節(jié)點。實施完成后再退出此遷移群集,將新環(huán)境加入到新的構(gòu)建的NLB群集。
微軟的網(wǎng)絡(luò)負載平衡可以提供最多32臺主機的負載平衡,當(dāng)我們的Web站點需要分擔(dān)更多用戶訪問請求的時候,負載均衡無疑是值得考慮的一個解決方案。當(dāng)然NLB也有相應(yīng)的限制,像廣域網(wǎng)環(huán)境中,我們就不能使用NLB進行設(shè)置,因為其網(wǎng)絡(luò)不允許使用同一個MAC地址,也就違反了NLB的基本要求。 在安全方面,除了我們進行的端口規(guī)則設(shè)定,Windows 2003 Server本身基于TCP/IP 堆棧的集成是動態(tài)的,不用進行任何人工干預(yù),這種設(shè)置有效的防止了DOS攻擊等惡意攻擊。除此之外,企業(yè)結(jié)合自身的網(wǎng)絡(luò)安全,確保NLB站點的高效運作。
NLB不但能實現(xiàn)均衡負載,而且還能實現(xiàn)多種形式的冗余。NLB主要用于那些文件改動不大,并且不常駐內(nèi)存的環(huán)境,比如WEB服務(wù)、FTP服務(wù)、和VPN服務(wù)等。NLB不適合用于數(shù)據(jù)庫、郵件等服務(wù),因為不能保證每個節(jié)點的數(shù)據(jù)是一樣的。
當(dāng)用戶訪問集群的時候,集群能將訪問請求分攤到集群中的每個服務(wù)器上,以達到均衡負載的效果。這些服務(wù)器被稱為集群節(jié)點。在負載平衡中,每個節(jié)點的文件一般都要求是一樣的。這樣每個節(jié)點返回給客戶的結(jié)果都是一致的。一般來說組建一個NLB要求至少兩個節(jié)點,其中一個節(jié)點不能使用,這全部負載將落入到剩下的那個節(jié)點上,即全載。Windows server 2003 最多支持32個節(jié)點。節(jié)點越多,可用性,可靠性就越高。
NLB能提供三種冗余功能,軟件冗余、硬件冗余、站點冗余。
基于NLB集群的Web網(wǎng)站
數(shù)據(jù)庫設(shè)計
1.MSCS,提供后端服務(wù)與應(yīng)用程序的容錯移轉(zhuǎn),可提升系統(tǒng)的可用性。常見的應(yīng)用有SQL Server與Exchange Server等。
MSCS是由客戶端來決定由誰來處理服務(wù)請求,所有服務(wù)器共享一個共享存儲器來儲存會話狀態(tài)。當(dāng)主動服務(wù)器掛了,則繼續(xù)由被動服務(wù)器接手。被動服務(wù)器會從共享存儲器取出會話狀態(tài),繼續(xù)未完成的工作,以達到容錯移轉(zhuǎn)的目的。
2.數(shù)據(jù)庫是數(shù)據(jù)管理最有效的手段,要使用它來高效地管理和存取各種數(shù)據(jù)資源,必須設(shè)計出結(jié)構(gòu)合理、功能完善的數(shù)據(jù)庫。數(shù)據(jù)庫設(shè)計時一項復(fù)雜的工作,它是一項涉及多學(xué)科的綜合技術(shù),要求數(shù)據(jù)庫管理員既要懂得數(shù)據(jù)庫知識,又要充分了解應(yīng)用領(lǐng)域的專業(yè)知識。
在進行數(shù)據(jù)庫設(shè)計時,要根據(jù)企業(yè)組織中各類用戶的信息要求和處理需求來對數(shù)據(jù)庫進行設(shè)計。數(shù)據(jù)庫設(shè)計的主要內(nèi)容包過機構(gòu)性設(shè)計和行為特性設(shè)計,設(shè)計的過程主要包括需求分析、概念設(shè)計、邏輯設(shè)計和物理設(shè)計四個階段。
(1)需求分析
需求分析就是對現(xiàn)實世界要處理的對象進行詳細調(diào)查,在了解原系統(tǒng)的概況、確定新系統(tǒng)功能的過程中,獲得用戶對數(shù)據(jù)庫的數(shù)據(jù)要求、功能要求、安全要求和完整性要求。
(2)概念設(shè)計
概念設(shè)計時將需求說明中關(guān)于數(shù)據(jù)的要求,綜合為一個統(tǒng)一的概念模型。概念模型是表達概念模型設(shè)計結(jié)果的工具,是設(shè)計人員對系統(tǒng)的抽象的概括,它能表達用戶的需求,且獨立于支持數(shù)據(jù)庫的數(shù)據(jù)庫的管理系統(tǒng)和硬件系統(tǒng)。
(3)邏輯設(shè)計
概念設(shè)計的結(jié)果是得到一個與數(shù)據(jù)庫的管理系統(tǒng)無關(guān)的概念模型,而邏輯設(shè)計的目的是吧概念設(shè)計的概念模型,轉(zhuǎn)換成與選用的具體機器上的DBMS所支持的數(shù)據(jù)模型相符合的邏輯結(jié)構(gòu)。
(4)物理設(shè)計
物理設(shè)計的任務(wù)是確實數(shù)據(jù)庫的存儲結(jié)構(gòu),主要包括確定數(shù)據(jù)庫文件和索引文件的記錄格式和物理結(jié)構(gòu),懸著存取方法,決定訪問路徑和外存儲器的分配策略,實現(xiàn)完整性和安全性以及程序設(shè)計等。
對于一個比較大的網(wǎng)站來說,數(shù)據(jù)庫集群也應(yīng)該是以集群的方式建立,這樣可以增強網(wǎng)站的性能,提高網(wǎng)站的可靠性。數(shù)據(jù)庫可分為三類:故障切換集群、分布式數(shù)據(jù)庫系統(tǒng)、共享磁盤系統(tǒng)。
NLB集群系統(tǒng)的總體設(shè)計
(1)環(huán)境下實現(xiàn)Windows 2003服務(wù)器集群;
(2)在域內(nèi)環(huán)境內(nèi)的windows2003 web server群集;
(3)利用IIS搭建了一個WEB站點,域名為dzx.com。由于業(yè)務(wù)的逐漸增加,網(wǎng)站速度也越來越慢,而且經(jīng)常出現(xiàn)故障,為公司的利益帶來了很多的不便;公司決定使用兩臺WEB站點為客戶機提供訪問。因此采用了網(wǎng)絡(luò)負載均衡技術(shù)。
NLB集群工作原理及算法
1.NLB的工作原理
當(dāng)客戶向NLB群集(NLB的虛擬IP地址)發(fā)起請求時,其實客戶的請求數(shù)據(jù)包是發(fā)送到所有的NLB節(jié)點,然后運行在NLB節(jié)點上的NLB服務(wù)根據(jù)同樣的NLB算法來確定是否應(yīng)該由自己進行處理,如果不是則丟棄客戶的請求數(shù)據(jù)包,如果是則進行處理。 如何將請求數(shù)據(jù)包發(fā)送到所有的NLB節(jié)點是NLB運行的關(guān)鍵之處,單播和多播這兩種操作模式就是用于實現(xiàn)這一需求。NLB不支持單個NLB群集中的單播/多播的混合環(huán)境;在每一個NLB群集中,該群集中的所有節(jié)點都必須配置為多播或單播,否則,此NLB群集將無法正常工作。
2.負載平衡算法
一個負載平衡算法都包含以下三個組成部分:
策略:制定任務(wù)放置策略的制定者使用的負載和任務(wù)量,以及分配的方式。 傳送策略:基于任務(wù)和計算機負載,判定是否要把一個任務(wù)傳送到其它計算機上處理。 放置策略:對于適合傳送到其它計算機處理的任務(wù),選擇任務(wù)將被傳送的目的計算機。
負載平衡的上述三個部分之間是以不同的方式相互作用的。放置策略利用策略提供的負載,僅當(dāng)任務(wù)被傳送策略判定為適于傳送之后才行動。
總之,負載平衡的目標是:提供最短的平均任務(wù)響應(yīng)時間;能適于變化的負載;是可靠的負載平衡機制。
(1)策略
人們用來描述負載采用的參數(shù)有:
運行隊列中的任務(wù)數(shù)、系統(tǒng)調(diào)用的速率、CPU上下文切換率、空閑CPU時間百分比、空閑存儲器的大小(K字節(jié))、1分鐘內(nèi)的平均負載。
對于這些單個的負載描述參數(shù),第(1)個,即采用運行隊列中的任務(wù)數(shù)作為描述負載的參數(shù)被證實是最有效的,即它的平均任務(wù)響應(yīng)時間最短,并且已經(jīng)得到廣泛應(yīng)用。但是,假如為了使系統(tǒng)更全面而采集了更多的參數(shù),則往往由于增加了額外開銷,卻得不到所希望的性能改善。例如,采用將六個參數(shù)中的某兩個進行"AND"或"OR"組合,得到的平均響應(yīng)時間反而比單個參數(shù)的平均響應(yīng)時間還要差一些。
(2)傳送策略
為了簡單起見,在選用傳送策略時,多選用閥值策略。例如,Eager等人的方法是:在判定是否要在本地處理一個任務(wù)時,無需交換計算機之間的狀態(tài),一旦服務(wù)隊列或等待服務(wù)隊列的長度大于閥值時,就傳送這個任務(wù),而且傳送的是剛剛接收的任務(wù)。而進程遷移能夠遷移正在執(zhí)行的任務(wù),是對這種只能傳送剛剛接收的任務(wù)的一種改進。
在模擬研究七個負載平衡算法時,其傳送策略都采用閥值策略。它的閥值策略基于兩個閥值∶計算機的負載閥值Load和任務(wù)執(zhí)行時間閥值TCPU。假如計算機的負載超過Load并且任務(wù)的執(zhí)行時間超過TCPU時,就把此任務(wù)傳送到其它計算機執(zhí)行。
(3)放置策略
經(jīng)過總結(jié),共有以下四種放置策略
①集中策略。每隔P秒,其中一個計算機被指定為"負載中心"(LIC),接受所有其它負載的變更值,并把它們匯集到一個"負載向量"中,然后把負載向量廣播給所有其它的計算機。當(dāng)一臺計算機認為一個任務(wù)適于傳送到其它計算機上執(zhí)行時,它就給LIC發(fā)送一個請求,并告知當(dāng)前負載的值。LIC選一臺具有最短運行隊列長度的計算機,并且通知任務(wù)所在的計算機把任務(wù)發(fā)送給它,同時,它把目的主機負載值增加1。
②閥值策略。隨機選擇一臺計算機,判定若把任務(wù)傳送到那臺計算機后,那臺計算機的任務(wù)隊列長度是否會超過閥值。假如不超過閥值,就傳送此任務(wù);否則,隨機選擇另一臺計算機,并以同樣方式判定,繼續(xù)這樣做直到找到一臺合適的目的計算機,或探測次數(shù)超過一個靜態(tài)值限制LP,當(dāng)任務(wù)真正到達計算機以后,不管狀態(tài)如何,必須處理該任務(wù)。
③最短任務(wù)隊列策略。隨機選擇LP臺不同的計算機,察看每臺計算機的任務(wù)隊列長度,任務(wù)被傳送到具有最短任務(wù)隊列長度的計算機。當(dāng)任務(wù)真正到達計算機,無論狀態(tài)如何,目的計算機必須處理該任務(wù)。對此策略的一個簡單改進時,無論何時,碰到一臺隊列長度為0的計算機時,不再繼續(xù)探測,因為可以確定此計算機是一臺可以接受的目的計算機。
④保留策略。當(dāng)一個任務(wù)從一臺計算機離開時,該計算機檢查本地負載,假如負載小于閥值T1,就探測其它計算機,并在R個負載大于T1的計算機中登記該計算機的名字,并把登記的內(nèi)容保留到一個棧中。當(dāng)一個任務(wù)到達一臺超載的計算機時,就把這個任務(wù)傳送到此臺計算機棧頂?shù)挠嬎銠C上。假如一個計算機的負載低于T1,就清空棧里保留的所有計算機名。
從論文中,比較了②和③兩種策略,結(jié)論是:以簡單(計算不昂貴)的方式,利用少量狀態(tài),第②中方法往往獲得比第③種方法更好的效果。第③中方法比較復(fù)雜,它必須用性能的改善來補償額外花費,所以取得的效果會稍差一些。
4.3 地址分配
在NLB群集中,每臺服務(wù)器都會有一個屬于自己的靜態(tài)IP地址,同時NLB群集中的所有服務(wù)器還有一個共同的IP地址—NLB群集地址;
當(dāng)客戶向NLB群集(NLB的虛擬IP地址)發(fā)起請求時,其實客戶的請求數(shù)據(jù)包是發(fā)送到所有的NLB節(jié)點,即:NLB算法需要NLB群集中的所有主機都能看到發(fā)往群集的每一個數(shù)據(jù)包。然后運行在NLB節(jié)點上的NLB服務(wù)根據(jù)同樣的NLB算法來確定是否應(yīng)該由自己進行處理,如果不是則丟棄客戶的請求數(shù)據(jù)包,如果是則進行處理。
網(wǎng)絡(luò)負載平衡使得單個子網(wǎng)上的所有群集主機可以同時檢測群集 IP 地址的傳入網(wǎng)絡(luò)通信。在每個群集主機上,網(wǎng)絡(luò)負載平衡驅(qū)動程序充當(dāng)群集適配器驅(qū)動程序和 TCP/IP 堆棧間的過濾器,以便在主機間分配通信。
在配置負載均衡的時候步驟主要有三個
(1)啟用網(wǎng)絡(luò)負載平衡;
(2)連接到現(xiàn)存的群集;
(3)添加主機到群集。
1.啟用網(wǎng)絡(luò)負載平衡:在開始——運行中輸入nlbmgr,單擊“確定”按鈕,打開“網(wǎng)絡(luò)負載平衡管理器”窗口。如圖所示
網(wǎng)絡(luò)負載均衡管理器
2.右擊“網(wǎng)絡(luò)負載均衡群集”,然后單擊“新建群集”命令,然后在彈出如圖5-2的對話框中的IP地址和其他群集信息,選擇群集操作模式為“多播”,然后單擊“下一步”按鈕。在這里添加的IP地址是和DC所在在同一個網(wǎng)段的,在這里使用一個多播的原因是在客戶端是同時能收到信息。
3.在“群集IP地址”的對話框中可以添加IP地址,如果有多個群集的IP地址也可以來添加多個IP地址,如圖5-3是添加的端口的IP地址,在本次實驗中只有一個網(wǎng)絡(luò)群集的IP地址所以在下面選擇自動添加而不是選擇所有的端口,而在解析的時候是通過DNS服務(wù)器解析而沒有使用其他的協(xié)議因此所采用TCP協(xié)議的端口HTTP80;所以在這里選擇80即可。
4.在完成上面群集IP地址的規(guī)劃之后,會出現(xiàn)如圖5-4所示的端口規(guī)則:端口規(guī)則是可以按照群集中每一個成員的負載量來分派客戶端的通信。當(dāng)然在下面如圖所示的界面中也可以來刪除端口規(guī)則。刪除端口規(guī)則也可以更加明顯的看出群集的效果,刪除端口規(guī)則可以按照端口的優(yōu)先級來響應(yīng)客戶機請求,假設(shè)當(dāng)優(yōu)先級高的出現(xiàn)故障那么優(yōu)先級低的主機會提供服務(wù)。當(dāng)然對于客戶機來說是感覺不到那個到底出現(xiàn)故障。
5.完成上面的步驟在“連接”的對話框中來輸入和服務(wù)器相連的IP地址;及192.168.120.1,點擊“連接”就會彈出如圖5-5所示的對話框。然后在下面的接口中選擇服務(wù)器的網(wǎng)絡(luò)適配器(IP地址)。
6.完成上面的步驟基本在DC上的配置就完成了,在這里所采用系統(tǒng)默認的自動狀態(tài),單擊完成即可。但是要明白在配置優(yōu)先級的時候最多可以配置32位,因為NLB網(wǎng)絡(luò)負載均衡做多支持32臺主機。默認情況下他的初始狀態(tài)是“已啟動”,設(shè)置更高的優(yōu)先級的原因是當(dāng)把“端口規(guī)則”刪除的并且當(dāng)其中的一臺的出現(xiàn)故障的時候,優(yōu)先級就會在這時候起到作用。如圖5-6所示,把第一臺主機的優(yōu)先級設(shè)為1。
7.啟動網(wǎng)絡(luò)負載平衡后,在下圖中5-7所示:在群集cluster.domain.com中已經(jīng)有了一臺主機。根據(jù)實驗的需求還需要添加一臺主機到群集:如果在第二臺上添加的時候首先會連接到“現(xiàn)存的群集”。
8.把第二臺主機連接到現(xiàn)存的群集,在這里連接時候是在第二個服務(wù)器上面添加。在第二臺服務(wù)器上(IP地址為192.168.20.2)的開始——運行中輸入“nlbmgr”,單擊確定單開“網(wǎng)絡(luò)負載均衡管理器”窗口,右擊“網(wǎng)絡(luò)負載均衡平衡群集”,然后“選擇連接到現(xiàn)存的”命令。在彈出的的對話框中輸入第一臺計算機的IP地址“192.168.120.2”單擊“連接”然后完成就可了!
9. 添加主機到群集;在使用“網(wǎng)絡(luò)負載平衡管理器“,右擊“cluster.domain.com”。在彈出的對話框中選擇“添加主機到群集”,添加主機的真正原因就是達到網(wǎng)絡(luò)負載平衡的原因,如圖5-9所示:
10.在完成上面的配置后,在下面圖的界面中添加將要成為群集成員的IP地址(或者主機的名稱)單擊連接按鈕,將在底部的對話框中會彈出可以用的網(wǎng)絡(luò)適配器。選擇要用網(wǎng)絡(luò)負載平衡的網(wǎng)絡(luò)適配器,即可完成。
11.在保持主機參數(shù)為默認狀態(tài),注意優(yōu)先級是“2”它是默認的:一切按照默認的即可。
12.添加主機到群集后,在群集cluster.domain.com中會有兩臺服務(wù)器,最多可以有32臺主機。在圖5-12中可以知道兩臺主機的IP地址是192.168.20.1和192.168.20.2;這樣就完成了網(wǎng)絡(luò)負載均衡的配置了。
網(wǎng)絡(luò)負載均衡的最佳操作
1.正確保護網(wǎng)絡(luò)負載平衡主機和經(jīng)過負載平衡的應(yīng)用程序;
2. 在每一個群集主機上至少配置兩個網(wǎng)絡(luò)適配器,但是并非必要;
3.在群集適配器上只使用TCP/IP協(xié)議;
4.保證群集中的所有主機屬于同一個子網(wǎng)并且客戶機能夠訪問該子網(wǎng);
5.使用網(wǎng)絡(luò)負載均衡管理器配置NLB群集;
6.不要啟用網(wǎng)絡(luò)負載平衡遠程訪問控制;
7.啟用日志記錄;
8.獨立使用NLB群集和服務(wù)器群集。
2. 數(shù)據(jù)庫遷移實施
一、實施概述
在做SQL Server數(shù)據(jù)庫維護的時候,當(dāng)上司要求我們把幾十G的數(shù)據(jù)文件搬動到其它服務(wù)器,并且要求最小宕機時間的時候,我們有沒什么方案可以做到這些要求呢?
在這里我們假設(shè)這兩臺機器并不是在一個機房上,這樣看起來我們的解決方案才更有意義,如果你那么好運這兩臺機器在同一個局域網(wǎng),那么恭喜你,你可以多很多的方案可以做到。
二、分析與設(shè)計思路
其實我們假設(shè)的環(huán)境有兩個特點:第一個是數(shù)據(jù)庫文件比較大;第二個就是我們的傳送文件的速度可能會比較慢。也許這傳送速度我們是沒有辦法了,但是我們可以就從文件的大小這個問題出發(fā),結(jié)合SQL Server的特性,這樣就有了下面的解決方案了。
為了使宕機時間最短,我們這里使用了完整備份和差異備份來遷移數(shù)據(jù)庫,在白天的時候?qū)π枰w移的數(shù)據(jù)庫進行一次完整備份(XXX_full.bak),并把備份文件拷貝(這里可以使用FTP軟件進行斷點續(xù)傳)到目標服務(wù)器進行還原,等到下班時間之后再進行一次差異備份(XXX_diff.bak),再把這個差異備份拷貝到目標服務(wù)器,在完整還原的基礎(chǔ)上再進行差異還原。
這里的宕機時間 = 差異備份時間 + 傳送差異備份文件時間 + 還原差異備份文件時間,這宕機時間是不是讓你感覺這時間很短呢?
三、參考腳本
注意修改下面腳本中數(shù)據(jù)庫的名稱,還有絕對路徑。
--1:完整備份
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--'+@dbname+'_full
BACKUP DATABASE ['+@dbname+']
TO DISK = ''D:\DBBackup\'+@dbname+'_full.bak''
WITH NOFORMAT, NOINIT, NAME = '''+@dbname+'-完整數(shù)據(jù)庫備份'',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO'
print @sql
--生成的SQL
--DataBaseName_full
BACKUP DATABASE [DataBaseName]
TO DISK = 'D:\DBBackup\DataBaseName_full.bak'
WITH NOFORMAT, NOINIT, NAME = 'DataBaseName-完整數(shù)據(jù)庫備份',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
--2:完整備份還原
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--RESTORE '+@dbname+'_full
RESTORE DATABASE ['+@dbname+']
FROM DISK = ''D:\DBBackup\'+@dbname+'_full.bak'' WITH FILE = 1,
MOVE N''DataBase_Name'' TO N''D:\DataBase\'+@dbname+'.mdf'',
MOVE N''DataBase_Name_log'' TO N''D:\DataBase\'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
GO'
print @sql
--生成的SQL
--RESTORE DataBaseName_full
RESTORE DATABASE [DataBaseName]
FROM DISK = 'D:\DBBackup\DataBaseName_full.bak' WITH FILE = 1,
MOVE N'DataBase_Name' TO N'D:\DataBase\DataBaseName.mdf',
MOVE N'DataBase_Name_log' TO N'D:\DataBase\DataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
GO
--3:差異備份
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--'+@dbname+'_diff
BACKUP DATABASE ['+@dbname+']
TO DISK = N''D:\DBBackup\'+@dbname+'_diff.bak''
WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'''+@dbname+'-差異數(shù)據(jù)庫備份'',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
'
print @sql
--生成的SQL
--DataBaseName_diff
BACKUP DATABASE [DataBaseName]
TO DISK = N'D:\DBBackup\DataBaseName_diff.bak'
WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'DataBaseName-差異數(shù)據(jù)庫備份',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
--4:差異備份還原
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--RESTORE '+@dbname+'_full
RESTORE DATABASE ['+@dbname+']
FROM DISK = ''D:\DBBackup\'+@dbname+'_diff.bak'' WITH FILE = 1,
NOUNLOAD, STATS = 10
GO'
print @sql
--生成的SQL
--RESTORE DataBaseName_full
RESTORE DATABASE [DataBaseName]
FROM DISK = 'D:\DBBackup\DataBaseName_diff.bak' WITH FILE = 1,
NOUNLOAD, STATS = 10
GO
四、后記
以測試的700G的數(shù)據(jù)文件,我是通過數(shù)據(jù)庫的作業(yè)進行愚公移山的,搬數(shù)據(jù)到新的服務(wù)器上的,這樣的好處就是對之前的數(shù)據(jù)庫進行優(yōu)化,比如進行數(shù)據(jù)庫參數(shù)的設(shè)置,比如表分區(qū),在對之前數(shù)據(jù)庫影響盡量小的情況進行數(shù)據(jù)搬遷。
四、遷移重難點分析及措施
1. 如何保證數(shù)據(jù)遷移過程中的安全性和操作可審計性?
回答:數(shù)據(jù)遷移中的安全性不可忽略,我們基于多重數(shù)據(jù)審計功能實現(xiàn)遷移安全性和操作審計性。
若要將登錄和密碼從服務(wù)器 A 上的 SQL Server 實例傳輸?shù)椒?wù)器 B 上的 SQL Server 實例,請執(zhí)行以下步驟:
1 在服務(wù)器 A 上,啟動 SQL Server Management Studio,然后連接到要從中移動數(shù)據(jù)庫的 SQL Server 實例。
2 打開新的查詢編輯器窗口,然后運行以下腳本。
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary varbinary (256)
DECLARE @PWD_string varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)
DECLARE @defaultdb sysname
IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF (@type IN ( 'G', 'U'))
BEGIN -- NT authenticated account/group
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
END
ELSE BEGIN -- SQL Server authentication
-- obtain password and sid
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
-- obtain password policy state
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
IF ( @is_policy_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
END
IF ( @is_expiration_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
END
END
IF (@denylogin = 1)
BEGIN -- login is denied access
SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
END
ELSE IF (@hasaccess = 0)
BEGIN -- login exists but does not have access
SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
END
IF (@is_disabled = 1)
BEGIN -- login is disabled
SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
END
PRINT @tmpstr
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
3 注意:此腳本會在“master”數(shù)據(jù)庫中創(chuàng)建兩個存儲過程。兩個存儲過程分別命名為“sp_hexadecimal”存儲過程和“sp_help_revlogin”存儲過程。
4 運行下面的語句。
EXEC sp_help_revlogin
5 由“sp_help_revlogin”存儲過程生成的輸出腳本是登錄腳本。此登錄腳本創(chuàng)建具有原始安全標識符 (SID) 和原始密碼的登錄。
6 在服務(wù)器 B 上,啟動 SQL Server Management Studio,然后連接到您將數(shù)據(jù)庫移動到的 SQL Server 實例。 重要信息:在執(zhí)行步驟 5 之前,請檢查“備注”一節(jié)中的信息。
7 打開新的查詢編輯器窗口,然后運行步驟 3 中生成的輸出腳本。
如何解決在運行 SQL Server 的服務(wù)器之間移動數(shù)據(jù)庫時的權(quán)限問題
· 如果服務(wù)器 A 和服務(wù)器 B 處于同一域中,則使用相同的 SID。因此,用戶不可能是孤立的。
· 在輸出腳本中,通過使用加密密碼來創(chuàng)建登錄。這是因為 CREATE LOGIN 語句中使用了 HASHED 參數(shù)。此參數(shù)指定在 PASSWORD 參數(shù)后輸入的密碼已經(jīng)過哈希處理。
· 默認情況下,只有“sysadmin”固定服務(wù)器角色的成員可以從“sys.server_principals”視圖運行 SELECT 語句。除非“sysadmin”固定服務(wù)器角色的成員授予用戶必需的權(quán)限,否則用戶無法創(chuàng)建或運行輸出腳本。
· 本文中的步驟不會為特定登錄傳輸默認數(shù)據(jù)庫信息。這是因為默認數(shù)據(jù)庫不可能總是存在于服務(wù)器 B 上。若要定義某個登錄的默認數(shù)據(jù)庫,請使用 ALTER LOGIN 語句,并傳入登錄名和默認數(shù)據(jù)庫作為參數(shù)。
· 服務(wù)器 A 的排序順序可能不區(qū)分大小寫,而服務(wù)器 B 的排序順序可能區(qū)分大小寫。在此情況下,當(dāng)您將登錄和密碼傳輸?shù)椒?wù)器 B 上的實例之后,必須以大寫字母的形式來鍵入密碼中的所有字母。 或者,服務(wù)器 A 的排序順序可能區(qū)分大小寫,而服務(wù)器 B 的排序順序可能不區(qū)分大小寫。在此情況下,您將無法使用傳輸?shù)椒?wù)器 B 上的實例的登錄和密碼進行登錄,除非滿足下面的條件之一:
o 原始密碼不包含字母。
o 原始密碼中的所有字母都是大寫字母。
· 服務(wù)器 A 和服務(wù)器 B 的排序順序可能都區(qū)分大小寫,或者可能都不區(qū)分大小寫。在這些情況下,用戶不會遇到問題。
· 已經(jīng)位于服務(wù)器 B 上的實例中的登錄可能具有與輸出腳本中的某個名稱相同的名稱。在此情況下,當(dāng)對服務(wù)器 B 上的實例運行輸出腳本時,會接收到下面的錯誤消息:
消息 15025,級別 16,狀態(tài) 1,行 1 服務(wù)器主體 'MyLogin' 已存在。
· 類似地,已經(jīng)位于服務(wù)器 B 上的實例中的登錄可能具有與輸出腳本中的某個 SID 相同的 SID。在此情況下,當(dāng)對服務(wù)器 B 上的實例運行輸出腳本時,會接收到下面的錯誤消息:
消息 15433,級別 16,狀態(tài) 1,行 1 所提供的參數(shù) sid 正在使用。
· 因此,必須執(zhí)行以下操作:
7 仔細檢查輸出腳本。
7 檢查服務(wù)器 B 上的實例中的“sys.server_principals”視圖的內(nèi)容。
7 相應(yīng)地解決這些錯誤消息。
· 在 SQL Server 2005 中,登錄的 SID 用作實現(xiàn)數(shù)據(jù)庫級別訪問的基礎(chǔ)。一個登錄可能在服務(wù)器的兩個不同數(shù)據(jù)庫中具有兩個不同的 SID。在此情況下,該登錄只可以訪問具有與“sys.server_principals”視圖中的 SID 匹配的 SID 的數(shù)據(jù)庫。在從兩個不同的服務(wù)器合并這兩個數(shù)據(jù)庫時,可能會出現(xiàn)此問題。若要解決此問題,可使用 DROP USERT 語句,從具有不匹配的 SID 的數(shù)據(jù)庫中手動刪除相應(yīng)的登錄。然后,通過使用 CREATE USER 語句再次添加該登錄。
2. 如何保證數(shù)據(jù)庫遷移0停機,實時遷移?
回答:我們基于CDC技術(shù) + 數(shù)據(jù)庫鏡像技術(shù) 來實現(xiàn)遷移0停機。
在常見的企業(yè)數(shù)據(jù)平臺管理中有一項任務(wù)是一直困擾SQL Server DBA們的,這就是對數(shù)據(jù)更新的監(jiān)控。很多數(shù)據(jù)應(yīng)用都需要捕獲對業(yè)務(wù)數(shù)據(jù)表的更新。筆者見過幾種解決方案:
1、在數(shù)據(jù)表中加入特殊的標志列; 2、 通過在數(shù)據(jù)表上創(chuàng)建觸發(fā)器; 3、通過第三方產(chǎn)品,例如IBM的Log Explorer。
其實第1種和第2中方案都不好,因為第1種方法需要在應(yīng)用程序編碼的時候尤為小心,如果有一段數(shù)據(jù)訪問邏輯忘了更新標志位就會導(dǎo)致遺漏某些數(shù)據(jù)更新,而第2種方法對性能影響過于明顯,因為觸發(fā)器的性能開銷是眾所周知的。第3種方法其實屬于一種叫做Log Audit的方案體系。因為SQL Server同其他關(guān)系型數(shù)據(jù)庫一樣,所有數(shù)據(jù)操作都會在日志中記錄,因此通過分析日志就可以獲得完整的數(shù)據(jù)操作歷史。SQL Server其實早就有內(nèi)部的API可供ISV開發(fā)者中Log Audit的方案,不過微軟對這套API控制比較嚴格,只有簽署了一堆協(xié)議的核心級合作伙伴才能了解這套API。
因此,現(xiàn)對業(yè)務(wù)數(shù)據(jù)更新的跟蹤在SQL Server平臺上一直是一件非常頭疼的事情,用戶需要在投入大量開發(fā)精力和投入額外采購成本之間做出選擇。幸運的事,微軟終于在SQL Server 2008中提供了一套半公開的Log Audit機制,就是我們所說的Change Data Capture,我們后面簡稱CDC。
◆當(dāng)DML提交到應(yīng)用數(shù)據(jù)庫時,SQL Server必須寫入日志,并在緩存中更新數(shù)據(jù),然后在檢查點將內(nèi)存中的數(shù)據(jù)刷回數(shù)據(jù)文件。 ◆CDC的內(nèi)部進程根據(jù)CDC的設(shè)置,在日志文件中提取更新歷史信息,并將這些個更新信息寫入對應(yīng)的更新跟蹤表。 ◆DBA或開發(fā)人員通過調(diào)用CDC的函數(shù)來訪問更新跟蹤表,提取感興趣的更新歷史信息,并通過ETL應(yīng)用程序更新數(shù)據(jù)倉庫。 ◆理論上面更新跟蹤表事會無限制增長的,因此CDC內(nèi)部有一個清理進程,在默認情況下更新跟蹤信息在寫入跟蹤表三天后會被自動清理。
CDC的配置
由于CDC是一項比較高端的功能,因此只有在SQL Server 2008的企業(yè)版、開發(fā)版和評估版中才能找到CDC功能。
啟用數(shù)據(jù)庫級別的CDC
要啟用CDC功能,首先需要一個sysadmin服務(wù)器角色的成員用戶激活數(shù)據(jù)庫級別的CDC,這個過程可以通過sys.sp_cdc_enable_db_change_data_capture存儲過程來完成。如果想知道一個數(shù)據(jù)庫是否啟用了CDC功能,可以通過查詢sys.databases系統(tǒng)目錄的is_cdc_enabled字段。
當(dāng)一個數(shù)據(jù)庫啟用CDC功能后,SQL Server會自動在這個數(shù)據(jù)庫中創(chuàng)建cdc架構(gòu)和cdc用戶,所有CDC相關(guān)的數(shù)據(jù)表和用戶函數(shù)都會存放在cdc架構(gòu)下。
CDC功能啟用后,SQL Server會首先在cdc架構(gòu)下創(chuàng)建五張表用于記錄一些CDC的原數(shù)據(jù),分別是ddl_history,change_tables,captured_columns,index_columns和lsn_time_mapping。
在數(shù)據(jù)庫啟用了CDC后,接下來我們就需要在數(shù)據(jù)表上啟用CDC了。屬于db_owner角色的用戶可以通過存儲過程sys.sp_cdc_enable_table_change_data_capture來啟用對某張數(shù)據(jù)表的更新跟蹤,一張數(shù)據(jù)表最多可以設(shè)置兩個跟蹤實例。每個跟蹤實例中可以設(shè)置對原始數(shù)據(jù)表的所有列或部分列進行更新跟蹤。如果想知道數(shù)據(jù)表是否進行了更新跟蹤,DBA可以查詢sys.tables系統(tǒng)目錄的is_tracked_by_cdc字段。
對一張數(shù)據(jù)表啟用CDC跟蹤實例后,SQL Server會在cdc架構(gòu)下創(chuàng)建一張數(shù)據(jù)表用于記錄從日志中解析出來的更新歷史信息。
一段CDC的評估腳本
為了評估CDC功能,我特地寫了一段腳本如下:
1、首先創(chuàng)建一個測試數(shù)據(jù)庫;
2、然后激活TestCDC數(shù)據(jù)庫上的更新捕獲功能;
USE TestCDC
GO
EXEC sp_cdc_enable_db_change_date_capture;
GO
執(zhí)行了存儲過程sp_cdc_enable_db_change_data_capture后,就會在數(shù)據(jù)庫TestCDC中看到有一些新的表被創(chuàng)建了,分別是ddl_history,change_tables,captured_columns,index_columns和lsn_time_mapping,并且這5張表都是在cdc架構(gòu)下。
3、然后在TestCDC數(shù)據(jù)庫中創(chuàng)建測試表
USE TestCDC GO CREATE TABLE dbo.Product
(
ProductID int PRIMARY KEY NOT NULL,
ProductName nvarchar(100),
Category nvarchar(50)
)
GO
4、在dbo.Product表上激活更新跟蹤
EX
EC sp_cdc_enable_table_change_data_capture'dbo',
'Product',
@role_name= NULL,
@supports_net_changes =1;
成功提交上述命令后,就可以在數(shù)據(jù)表change_tables,captured_columns和index_columns表中看到相應(yīng)的記錄,其中change_table中一條,capture_column中三條,index_columns中一條。同時cdc架構(gòu)下有增加了一張新表叫做dbo_Product_CT,這張表的結(jié)構(gòu)和Product表的結(jié)構(gòu)有點相似,Product表中的三列在dbo_Product_CT中都有,同時dbo_Product_CT表中還增加了_$start_lsn,_$end_lsn,_$seqval,_$operation和_$update_mask五個新的字段。-hU:i B%P%B&X 其實在存儲過程sp_cdc_enable_table_change_data_capture中有一系列的參數(shù),在這里我們?yōu)榱撕喕雎粤艘粋€參數(shù)就是@captured_column_list,這個參數(shù)可以對表中特定的某些字段啟用更新跟蹤。
5、在Product表上提交INSERT語句
INSERT INTO dbo.Product VALUES (1, N'ABC', N'A');
提交完了這條命令后,就會在lsn_time_mapping和dbo_Product_CT中分別看到一條新記錄。其中dbo_Product_CT表中的_$operation字段的值是2,_$update_mask字段的值是0x07。 _$operation字段是代表DML操作類型,1是delete,2是insert,3是update的舊值,4是update的新值。 $update_mask字段是表示一個字段列表的掩碼,那些在DML操作中被更新了的字段位為1,而沒有更新的字段位為0。在本例中Product表一共有三列被跟蹤,所以應(yīng)該是一個三位的二進制數(shù),右邊低位第一位是第一列ProductID,低位第二位是第二列ProductName,第三位就是Category了。因為這是一次INSERT,所以更新涉及到了所有的三列,所以_$update_mask字段就應(yīng)該是0x7了。
6、 繼續(xù)在Product表上提交UPDATE語句
UPDATE dbo.Product SET Category = N'B' WHERE ProductID = 1;
提交完這條命令后,當(dāng)然也會在lsn_time_mapping和dbo_Product_CT中看到新記錄了。不過這次lsn_time_mapping中是一條,而dbo_Product_CT中則是兩條。(為什么會這樣呢?建議大家自己試一下咯,一試就明白了。)
其中dbo_Product_CT表中的_$operation字段的值是第一條是3,第二條是4,_$update_mask字段的值兩條都是0x04。在這次操作中我們更新的是第三列,所以_$update_mask字段就應(yīng)該是0x4了。(如果我們更新的是ProductID會發(fā)現(xiàn)_$update_mask并非是0x1,而同樣是0x7,這估計是因為ProductID是主鍵,更新主鍵應(yīng)該視同一條新的記錄。)
7、再來一次UPDATE
UPDATE dbo.Product SET Category = N'A' WHERE ProductID = 1;
提交完這條命令后,在dbo_Product_CT中又看到兩條新記錄了。其中dbo_Product_CT表中的_$operation字段的值是第一條是3,第二條是4,_$update_mask字段的值兩條都是0x04。(看來CDC確實會記錄下數(shù)據(jù)的每次修改。)
8、繼續(xù)在Product表上提交DML語句
DELETE dbo.Product WHERE ProductID = 1;
提交完了這條命令后,就會在lsn_time_mapping和dbo_Product_CT中分別看到一條新記錄。
其中dbo_Product_CT表中的_$operation字段的值是1,_$update_mask字段的值是0x07。
9、提交一個DDL試試看
ALTER TABLE dbo.Product ADD Description nvarchar(100);
提交完這句命令后,只會在ddl_history表中看到一條新的記錄。
10、然后再試試DML
UPDATE dbo.Product SET Description = N'NA';
提交完這句語句后,所有cdc架構(gòu)下的表中都沒有看到新記錄。說明新增的列Description不跟蹤更新了......估計有人會說(細心的人哦!):“這次當(dāng)然看不到新記錄了,因為在前面第7步我們已經(jīng)刪除了所有的記錄,因此這次的UPDATE語句沒有影響到任何記錄,當(dāng)然CDC的表中不會有任何記錄了。”那么到底對Description更新會不會記錄呢,經(jīng)過測試確實是不記錄的。
那么如果我們想對Description也進行更新跟蹤應(yīng)該怎么辦呢?很簡單的,由另外一個存儲過程叫做sp_cdc_disable_table_change_data_capture可以禁用對某張表的更新跟蹤,可以使用這個存儲過程先對Product表禁用更新跟蹤,然后再重新啟用對Product表的更新跟蹤就可以了。
11、最后試一下DROP命令
DROP TABLE dbo.Product;
dbo.Product表消失了,同時cdc.dbo_Product_CT表也消失了。
12. 評估結(jié)束。一定有人問,捕獲到的更新怎么用呢,還有一堆系統(tǒng)函數(shù)和存儲過程可以幫助用戶,但是那段測試的過程就不詳細寫了。
其中最重要的應(yīng)該就是cdc.fn_cdc_get_all_changes_和cdc.fn_cdc_get_net_changes_兩個函數(shù)了,這兩個函數(shù)可以幫助我們獲取dbo_Product_CT表中數(shù)據(jù),其中cdc.fn_cdc_get_all_changes_是用于獲取所有更新,而cdc.fn_cdc_get_net_changes_則是用于獲取精簡后的更新,在精簡的更新中有一些重復(fù)的更新就會被合并成一條記錄,比如說我們把產(chǎn)品類型由A改為B,然后又改回A,在cdc.fn_cdc_get_all_changes_中應(yīng)該有3條記錄,而在cdc.fn_cdc_get_net_changes_中則只有1條記錄。兩個函數(shù)的范例如下(你會發(fā)現(xiàn)精簡結(jié)果集的函數(shù)運算相當(dāng)慢,至少在CTP4中是這樣的,不知道以后的版本會不回有改進):
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Product(0x00000048000001760004, 0x00000048000001F70004, 'all');
SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Product(0x00000048000001760004, 0x00000048000001F70004, 'all');