梁 冰
(遼寧省河庫(kù)管理服務(wù)中心(遼寧省水文局),遼寧 沈陽(yáng) 110003)
隨著水文數(shù)據(jù)量的不斷增加,業(yè)務(wù)的不斷擴(kuò)展,在數(shù)據(jù)安全、訪問(wèn)效率、數(shù)據(jù)共享、數(shù)據(jù)挖掘、數(shù)據(jù)服務(wù)等方面暴露出一系列問(wèn)題,現(xiàn)有數(shù)據(jù)管理及服務(wù)模式已無(wú)法滿足水文現(xiàn)代化發(fā)展的迫切需求,改變現(xiàn)有數(shù)據(jù)及業(yè)務(wù)的服務(wù)模式是非常必要和有意義的。因此對(duì)現(xiàn)有數(shù)據(jù)庫(kù)系統(tǒng)中存在的主要問(wèn)題進(jìn)行深入分析,并提出基于集群的解決方案,在對(duì)比各種集群技術(shù)后,最終選擇 SQL Server Always On無(wú)域集群,將單實(shí)例數(shù)據(jù)庫(kù)升級(jí)到數(shù)據(jù)庫(kù)集群[1],以提升水文數(shù)據(jù)安全性能。
雨水情數(shù)據(jù)庫(kù)中有少量敏感數(shù)據(jù),數(shù)據(jù)庫(kù)在水利政務(wù)外網(wǎng)上運(yùn)行,存在數(shù)據(jù)泄露風(fēng)險(xiǎn);水文局對(duì)外提供數(shù)據(jù)的方式為業(yè)務(wù)系統(tǒng)直接訪問(wèn)水情數(shù)據(jù)庫(kù)的形式,缺乏安全監(jiān)管監(jiān)控?cái)?shù)據(jù)、跟蹤數(shù)據(jù)流向的能力;現(xiàn)有數(shù)據(jù)庫(kù)為單實(shí)例 SQL Server,存在不可用風(fēng)險(xiǎn)[2]。
單實(shí)例 SQL Server 數(shù)據(jù)庫(kù)存在訪問(wèn)效率不高的問(wèn)題,一旦某應(yīng)用系統(tǒng)訪問(wèn)量過(guò)大,將造成訪問(wèn)緩慢,甚至將數(shù)據(jù)庫(kù)系統(tǒng)拖垮,那么基于此數(shù)據(jù)庫(kù)系統(tǒng)的其他業(yè)務(wù)系統(tǒng)都將無(wú)法訪問(wèn)到數(shù)據(jù)庫(kù)。
業(yè)務(wù)系統(tǒng)直接訪問(wèn)雨水情數(shù)據(jù)庫(kù)的形式有以下幾個(gè)弊端:
1)安全性不高。數(shù)據(jù)庫(kù)的地址、用戶名和密碼會(huì)儲(chǔ)存在業(yè)務(wù)系統(tǒng)的緩存中,并且要求客戶端具有能夠直接訪問(wèn)數(shù)據(jù)庫(kù)網(wǎng)絡(luò)的鏈路,這種方式存在很大的安全隱患。
2)上層業(yè)務(wù)應(yīng)用與數(shù)據(jù)庫(kù)層耦合緊密。當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)升級(jí)或遷移時(shí),必然導(dǎo)致上層應(yīng)用無(wú)法訪問(wèn)。
3)數(shù)據(jù)庫(kù)層缺乏熔斷機(jī)制。當(dāng)數(shù)據(jù)庫(kù)服務(wù)因?yàn)槟撤N原因突然變得不可用或響應(yīng)過(guò)慢時(shí),沒(méi)有一種有效機(jī)制中斷調(diào)用數(shù)據(jù)庫(kù)服務(wù)。
4)上層應(yīng)用重復(fù)開發(fā)?;谟晁閿?shù)據(jù)庫(kù)的多個(gè)業(yè)務(wù)應(yīng)用系統(tǒng),通常都會(huì)訪問(wèn)同一種類的常用數(shù)據(jù),那么每個(gè)業(yè)務(wù)系統(tǒng)在開發(fā)時(shí)都會(huì)將訪問(wèn)這類數(shù)據(jù)的功能重新開發(fā)一遍,而且每個(gè)業(yè)務(wù)系統(tǒng)的開發(fā)模式不一,這對(duì)數(shù)據(jù)庫(kù)性能優(yōu)化極為不利。
針對(duì)數(shù)據(jù)庫(kù)存在的問(wèn)題,基于國(guó)家及水文相關(guān)技術(shù)標(biāo)準(zhǔn),以信息技術(shù)手段重點(diǎn)解決雨水情數(shù)據(jù)庫(kù)數(shù)據(jù)同步、安全、訪問(wèn)等方面存在的問(wèn)題,如:隔離敏感數(shù)據(jù)與非敏感數(shù)據(jù),提高敏感數(shù)據(jù)的安全性;轉(zhuǎn)變數(shù)據(jù)服務(wù)模式,從直接訪問(wèn)數(shù)據(jù)庫(kù)方式向訪問(wèn)數(shù)據(jù)接口方式轉(zhuǎn)變;加強(qiáng)對(duì)數(shù)據(jù)訪問(wèn)的監(jiān)管;提高數(shù)據(jù)訪問(wèn)效率[3]。
因部分水文數(shù)據(jù)比較敏感,為保證數(shù)據(jù)的安全性,建立與水利政務(wù)外網(wǎng)物理隔離的局域網(wǎng),實(shí)時(shí)數(shù)據(jù)通過(guò)單向網(wǎng)閘設(shè)備由水利政務(wù)外網(wǎng)向局域網(wǎng)中的數(shù)據(jù)庫(kù)服務(wù)器推送,其中推送服務(wù)器可直連網(wǎng)閘,也可通過(guò)交換機(jī)連接,敏感數(shù)據(jù)只供內(nèi)部人員使用,以保障數(shù)據(jù)安全。
針對(duì)水文數(shù)據(jù)庫(kù) API 接口(應(yīng)用程序接口)提供多種審計(jì)規(guī)則,監(jiān)管水文數(shù)據(jù)安全,監(jiān)控、跟蹤水文數(shù)據(jù)流向。建設(shè)水文數(shù)據(jù)審計(jì)系統(tǒng),在所有請(qǐng)求的策略底層處理上設(shè)置以下 2 種基礎(chǔ)行為:
1)允許、拒絕行為。當(dāng)發(fā)生請(qǐng)求時(shí),任何審計(jì)行為都會(huì)觸發(fā)該過(guò)程,依照策略判定后允許或者拒絕請(qǐng)求發(fā)生。
2)記錄訪問(wèn)行為。當(dāng)發(fā)生請(qǐng)求時(shí),記錄訪問(wèn)信息,請(qǐng)求人、應(yīng)用 IP,發(fā)生時(shí)間,檢索的數(shù)據(jù)量、組織范圍、條件,系統(tǒng)的處理情況、狀態(tài),系統(tǒng)的訪問(wèn)源,接口處理時(shí)間,以及規(guī)則返回記錄。
建設(shè)審計(jì)策略規(guī)則防火墻,包含的規(guī)則如下:1)訪問(wèn)通過(guò)規(guī)則。可以設(shè)定特定用戶是否可以訪問(wèn)某個(gè) Web API 請(qǐng)求。
2)訪問(wèn)時(shí)間規(guī)則??梢酝ㄟ^(guò)時(shí)間限定某個(gè)用戶,在某個(gè)時(shí)間段是否可以訪問(wèn)。
3)訪問(wèn)請(qǐng)求單次數(shù)據(jù)量規(guī)則。在某個(gè)用戶對(duì)特定 API 進(jìn)行訪問(wèn)時(shí),可以將一次請(qǐng)求中獲取的數(shù)據(jù)量限定在允許值以內(nèi),規(guī)則處理方式可以設(shè)置為記錄/拒絕/截?cái)唷?/p>
4)訪問(wèn)請(qǐng)求累計(jì)數(shù)據(jù)量規(guī)則。某個(gè)用戶在一定時(shí)間周期內(nèi)對(duì)特定 API 進(jìn)行訪問(wèn)時(shí),可以將累計(jì)請(qǐng)求數(shù)據(jù)量限定在允許值以內(nèi),規(guī)則處理方式可以設(shè)置為記錄/拒絕/截?cái)唷?/p>
5)訪問(wèn)數(shù)據(jù)范圍規(guī)則??梢栽O(shè)定以行政區(qū)域?yàn)閱挝坏臄?shù)據(jù)訪問(wèn)范圍,從而限定用戶只可以訪問(wèn)特定區(qū)域的數(shù)據(jù)。
6)訪問(wèn)數(shù)據(jù)類型規(guī)則??梢栽O(shè)定以測(cè)站類型為單位的數(shù)據(jù)訪問(wèn)范圍,從而限定用戶只可以訪問(wèn)特定測(cè)站類型的數(shù)據(jù)。
通過(guò)規(guī)則防火墻記錄和限定用戶請(qǐng)求行為實(shí)現(xiàn)水文數(shù)據(jù)審計(jì)業(yè)務(wù),通過(guò)圖表進(jìn)行審計(jì)結(jié)果的圖形化展示,可以便于管理者掌握了解水文數(shù)據(jù)使用的實(shí)際情況。
隨著水文數(shù)據(jù)量的不斷增大,數(shù)據(jù)類型的不斷擴(kuò)展,用戶需求不斷增多,現(xiàn)有的單實(shí)例 SQL Server 數(shù)據(jù)庫(kù)的承載能力已趨于飽和,為滿足將來(lái)上層業(yè)務(wù)系統(tǒng)的需要,計(jì)劃將現(xiàn)有數(shù)據(jù)庫(kù)系統(tǒng)升級(jí)到 Oracle RAC 集群。但是現(xiàn)有的所有業(yè)務(wù)應(yīng)用都是建立在 SQL Server 數(shù)據(jù)庫(kù)服務(wù)之上的,所以短期內(nèi)不可能完成 SQL Server 向 Oracle 的遷移。綜合以上考慮:水文數(shù)據(jù)庫(kù)先由單實(shí)例 SQL Server 數(shù)據(jù)庫(kù)升級(jí)到 SQL Server Always On 無(wú)域集群[4],使數(shù)據(jù)庫(kù)服務(wù)具備高可用和負(fù)載均衡能力,以緩解當(dāng)前數(shù)據(jù)庫(kù)系統(tǒng)的壓力;同時(shí)搭建 Oracle RAC 集群,對(duì)數(shù)據(jù)庫(kù)進(jìn)行集群管理及訪問(wèn)效率上的負(fù)載均衡,提高數(shù)據(jù)安全及訪問(wèn)效率,并逐步將已有的基于 SQL Server 的數(shù)據(jù)庫(kù)服務(wù)遷移到基于 Oracle 的數(shù)據(jù)庫(kù)集群上。
待搭建好數(shù)據(jù)庫(kù)集群后,將數(shù)據(jù)寫入地址變更為數(shù)據(jù)庫(kù)集群地址,因?yàn)榧?IP 會(huì)自動(dòng)綁定到主副本上,所以實(shí)際上數(shù)據(jù)是寫入到集群的主副本中的。與數(shù)據(jù)庫(kù)鏡像技術(shù)相同,Always On 集群會(huì)在各個(gè)結(jié)點(diǎn)上維護(hù) 1 套數(shù)據(jù)副本,主副本上發(fā)生的數(shù)據(jù)變化,會(huì)同步到輔助副本上。所以 Always On 要完成 3 件事:首先把主副本上發(fā)生的數(shù)據(jù)變化記錄下來(lái),其次把這些記錄傳輸?shù)礁鱾€(gè)輔助副本上,最后把數(shù)據(jù)變化在輔助副本上同樣完成 1 遍。Oracle RAC 集群也能提供類似的功能。
Always On 支持主副本和多個(gè)輔助副本。主副本上的數(shù)據(jù)庫(kù)是可讀寫狀態(tài),可稱為主數(shù)據(jù)庫(kù);輔助副本上的數(shù)據(jù)庫(kù)是只讀狀態(tài),可稱為輔助數(shù)據(jù)庫(kù)。如果發(fā)生故障轉(zhuǎn)移,任意輔助副本都可轉(zhuǎn)變?yōu)樾碌闹鞲北尽?/p>
客戶端與主數(shù)據(jù)庫(kù)的讀寫連接由主副本保障。數(shù)據(jù)同步是在數(shù)據(jù)庫(kù)級(jí)別進(jìn)行的,把主數(shù)據(jù)庫(kù)的事務(wù)日志記錄發(fā)送到輔助數(shù)據(jù)庫(kù),每個(gè)次要副本緩存事務(wù)日志記錄,然后將它們應(yīng)用到相應(yīng)的輔助數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)與輔助數(shù)據(jù)庫(kù)進(jìn)行獨(dú)立的數(shù)據(jù)同步,因此,1 個(gè)輔助數(shù)據(jù)庫(kù)可以掛起或失敗而不會(huì)影響其他輔助數(shù)據(jù)庫(kù),1 個(gè)主數(shù)據(jù)庫(kù)可以掛起或失敗而不會(huì)影響其他主數(shù)據(jù)庫(kù)。
部署 Always On 之前,需要先創(chuàng)建部署環(huán)境,即 Windows Server 故障轉(zhuǎn)移群集(WSFC)。給定可用組的每個(gè)可用性副本必須位于相同 WSFC 的不同節(jié)點(diǎn)上。WSFC 將監(jiān)視集群中的節(jié)點(diǎn),以便評(píng)估主副本的運(yùn)行狀況。Always On 可用性組的仲裁針對(duì)WSFC 中的所有節(jié)點(diǎn),而與某一給定群集節(jié)點(diǎn)是否承載任何可用性副本無(wú)關(guān)。從 Windows Server 2016開始,WSFC 可在無(wú)域服務(wù)器的條件下實(shí)現(xiàn),大大簡(jiǎn)化了部署,并且避免了由域服務(wù)器產(chǎn)生的單點(diǎn)故障。所以本次 SQL Server Always On 集群的搭建全部基于 Windows Server 2016 的無(wú)域 WSFC。
待 Oracle 數(shù)據(jù)庫(kù)集群搭建好后,可將掛載在SQL Server 下的現(xiàn)有數(shù)據(jù)庫(kù)遷移至 Oracle 集群中,進(jìn)一步全面提升數(shù)據(jù)安全與訪問(wèn)效率?,F(xiàn)有數(shù)據(jù)庫(kù)體積龐大,并不斷有實(shí)時(shí)數(shù)據(jù)寫入,所以遷移方案采用以下 4 個(gè)步驟進(jìn)行:
1)將現(xiàn)有 SQL Server 數(shù)據(jù)庫(kù)備份到 1 臺(tái)無(wú)聯(lián)機(jī)事務(wù)的實(shí)例上。
2)使用 Oracle Developer 軟件,對(duì)整個(gè)數(shù)據(jù)庫(kù)做 1 次從 SQL Server 數(shù)據(jù)庫(kù)到 Oracle 數(shù)據(jù)庫(kù)的全量遷移,因數(shù)據(jù)庫(kù)體積龐大,此步驟會(huì)花費(fèi)較長(zhǎng)時(shí)間。
3)將實(shí)時(shí)數(shù)據(jù)接入 Oracle 。
4)對(duì)于遷移期間缺失的數(shù)據(jù),編寫腳本根據(jù)時(shí)間戳從聯(lián)機(jī)的 SQL Server 庫(kù)中進(jìn)行遷移。
結(jié)合水文業(yè)務(wù)需求,從現(xiàn)有業(yè)務(wù)應(yīng)用中抽取API 接口,建立一系列 API 數(shù)據(jù)服務(wù),轉(zhuǎn)變數(shù)據(jù)訪問(wèn)方式,通過(guò)服務(wù)接口的方式對(duì)外提供水文數(shù)據(jù)和常規(guī)分析等服務(wù),為社會(huì)、水利及水文系統(tǒng)內(nèi)部,提供安全、可靠、高效的數(shù)據(jù)與業(yè)務(wù)服務(wù)[5]。
在數(shù)據(jù)訪問(wèn)上使用 Web Service API 方式請(qǐng)求獲取數(shù)據(jù),所有的請(qǐng)求通過(guò)服務(wù)層的審計(jì)系統(tǒng),進(jìn)行對(duì)應(yīng)的安全策略授權(quán)控管,確保訪問(wèn)的安全性。對(duì)于暫時(shí)不能切換到 Web API 方式訪問(wèn)的應(yīng)用,系統(tǒng)提供過(guò)渡用的數(shù)據(jù)庫(kù)連接訪問(wèn)模式,超過(guò)過(guò)渡期后,將關(guān)停該模式。
隨著業(yè)務(wù)的擴(kuò)展,將建立多種主題 API 請(qǐng)求,實(shí)現(xiàn)多種業(yè)務(wù)積累的 API 發(fā)布,用戶可以通過(guò)瀏覽API 發(fā)布快速了解請(qǐng)求的 API 接口及示例。
可實(shí)現(xiàn)對(duì)以下各類 API 數(shù)據(jù)接口的查詢與管理:
1)用戶可以通過(guò)系統(tǒng)查看目前的接口發(fā)布信息,或者通過(guò)關(guān)鍵字查詢進(jìn)行檢索。
2)可以查看詳細(xì)的 API 接口標(biāo)準(zhǔn),包括訪問(wèn)URL 參數(shù),返回結(jié)果及示例信息等。
3)通過(guò)平臺(tái)直接申請(qǐng)接口的使用,在管理端,審批核準(zhǔn)后為用戶頒發(fā) App Key,用戶使用此 App Key 按照平臺(tái)接入流程即可訪問(wèn)接口。
4)可以查看自己的接口使用情況,包括 IP、訪問(wèn)時(shí)間等信息,通過(guò)圖表等多種方式進(jìn)行綜合展示。
接口授權(quán)方式主要有以下 2 種:
1)指定調(diào)用服務(wù)器 IP。用戶申請(qǐng)?jiān)L問(wèn) API 時(shí)必須提供調(diào)用 API 的服務(wù)器 IP,管理端綁定后,只要從這臺(tái)服務(wù)器發(fā)起的合法請(qǐng)求都會(huì)授權(quán)。
2)采用 OAuth2 標(biāo)準(zhǔn)協(xié)議。大致流程如下:a. 客戶端提交賬號(hào)信息到服務(wù)端;b. 服務(wù)端驗(yàn)證成功,返回 Access Token 給客戶端;c. 訪問(wèn)受限資源時(shí),客戶端帶入 Access Token 就可訪問(wèn)。
系統(tǒng)可根據(jù)實(shí)際業(yè)務(wù)需求選擇 API 授權(quán)方式。
通過(guò)集群技術(shù)應(yīng)用前后對(duì)比,發(fā)現(xiàn)數(shù)據(jù)庫(kù)集群運(yùn)行穩(wěn)定,用戶訪問(wèn)數(shù)據(jù)庫(kù)效率也有很大的提高,比單實(shí)例數(shù)據(jù)庫(kù)有更高的安全性與效率,對(duì)單實(shí)例數(shù)據(jù)庫(kù)想升級(jí)到集群系統(tǒng)的用戶有一定的借鑒作用。應(yīng)用結(jié)果表明:
1)數(shù)據(jù)庫(kù)集群技術(shù)擁有實(shí)時(shí)同步的副本,當(dāng)數(shù)據(jù)庫(kù)面臨災(zāi)難時(shí),可以在短時(shí)間內(nèi)通過(guò)故障轉(zhuǎn)移的方式保證數(shù)據(jù)庫(kù)的可用性,比原有的單實(shí)例數(shù)據(jù)庫(kù)更加安全。
2)通過(guò)使用數(shù)據(jù)庫(kù)集群可以使讀寫分離,提高數(shù)據(jù)庫(kù)的系統(tǒng)性能。
3)數(shù)據(jù)同步消耗大量資源,集群管理技術(shù)復(fù)雜,需要數(shù)據(jù)庫(kù)管理員具備一定的專業(yè)知識(shí)。