潘 欣
民航總醫(yī)院計算機中心,北京 100000
為了最大程度地保證醫(yī)院信息系統(tǒng)(HIS)的業(yè)務連續(xù)性,實現24×7不間斷地可靠地運行,各醫(yī)院特別是大中型醫(yī)院對數據庫服務器都實施了主機容錯保護。某些醫(yī)院還應用了更高級的Oracle RAC技術,實現在保證數據庫服務器高可用的同時分攤數據訪問負載。
Oracle RAC是甲骨文公司專門針對Oracle數據庫提供的多個數據庫實例并行訪問數據庫的高可用并行計算技術。通過多個服務器節(jié)點和共享存儲組成的集群,并自動均分數據訪問負載,在其中一個節(jié)點發(fā)生故障時可以對系統(tǒng)進行容錯和恢復處理,實現數據庫實例節(jié)點的透明應用程序故障切換(Transparent Application Fail Over,TAF),在保證數據庫系統(tǒng) 24×7 的高可用性的同時最大程度發(fā)揮硬件性能[1]。
Oracle RAC雖然功能強大但內部結構十分復雜,在以生產系統(tǒng)運行之前,必須針對Oracle RAC的運行機制結合醫(yī)院信息系統(tǒng)的特點對數據庫集群進行優(yōu)化配置,否則整個Oracle數據庫集群很可能將面臨嚴重的性能問題。
Oracle RAC的運行機制
Oracle RAC集群是建立在共享存儲架構之上的,為了降低數據庫實例訪問共享存儲的頻率,最大限度地降低磁盤I/O,Oracle開發(fā)了一項稱為高速緩存融合(Cache Fusion)的技術,使得集群中的節(jié)點可以通過高速集群互聯高效地在各數據庫實例中同步其內存高速緩存中的數據塊,這樣可以避免必須首先將塊推送到磁盤,然后再重新讀入到其它實例的緩存中[2]。盡管Cache Fusion技術可以消除共享存儲結構中磁盤的pin操作,從而大大提升了集群數據庫系統(tǒng)的性能,但在數據并發(fā)訪問量很大的環(huán)境下,如果有一些熱點數據塊很頻繁地被各個節(jié)點查詢并修改,Cache fusion會頻繁地使用內聯心跳網絡來在節(jié)點之間拷貝數據,從而導致大量的全局Cache等待事件,影響整個RAC系統(tǒng)的性能,甚至使得RAC系統(tǒng)的響應速度還不如單實例的數據庫系統(tǒng)響應速度快[3]。
圖1 Oracle RAC系統(tǒng)內部結構
因此對RAC系統(tǒng)優(yōu)化的最基本原則是,避免發(fā)生大規(guī)模的、不同節(jié)點頻繁修改同一數據塊,盡量降低全局數據塊的數量[4]。我們知道在Oracle數據庫中數據塊(Block)是數據庫中的最小單位,區(qū)間(Extent)是由一系列連續(xù)的數據塊組成的數據庫用來進行存儲空間分配的邏輯單位。而以數據表(Table)或索引(Index)等邏輯方式存在的段(Segment)又是由多個區(qū)間組成。因此對在OLTP應用的RAC環(huán)境中,可以通過對業(yè)務系統(tǒng)進行水平分割而讓不同的業(yè)務系統(tǒng)單獨訪問一個指定節(jié)點的數據庫實例,從而使得每個業(yè)務系統(tǒng)的大量的表或索引都只駐留在一個實例的SGA中,最大程度的減少了數據塊在節(jié)點之間的Cache fusion。系統(tǒng)優(yōu)化方案
我們知道HIS系統(tǒng)從業(yè)務范圍上基本可以劃分為門診和住院兩大子系統(tǒng),同時各子系統(tǒng)的交易數據段各自基本獨立,共享的數據段數據規(guī)模較小。所謂交易數據段就是會實時產生和更新的數據表和索引,例如醫(yī)囑、費用和申請單等。這樣門診的HIS終端基本不會訪問住院系統(tǒng)的交易數據段,住院的HIS終端很少訪問門診系統(tǒng)的交易數據段。這就為我們實施水平數據分割提供了可能。按照這一原則我們將醫(yī)院全部的HIS終端劃分為門診和住院兩大部分。見表1。
有了上面的工作基礎,我們就可以通過在Oracle的服務器端和客戶端進行一系列的自定義配置來更合理地分攤兩個RAC實例的訪問負載,優(yōu)化RAC數據庫的性能。
Oracle服務(Service)是跨多個數據庫實例為前端應用提供的單一數據服務映像,是實現Oracle高可用性連接的基礎元素,一個Oracle服務可以被分配到一個或多個數據庫實例,連接到該服務的數據訪問負載可以被服務根據優(yōu)化原則在這些實例中進行調度,而通過將完成同一種工作的會話連接到同一個Oracle服務,使這些SQL操作穩(wěn)定在一個數據庫實例中,可以使得數據塊在集群各節(jié)點之間的Fusion活動降到最少。由于我們的集群環(huán)境是2節(jié)點的RAC集群,根據前面對HIS系統(tǒng)水平數據分割的成果,我們創(chuàng)建兩個Oracle服務ora1和ora2分別對應門診和住院兩類HIS系統(tǒng)終端,來實現這兩部分HIS系統(tǒng)終端能夠分別連接到集群數據庫中的不同的數據庫實例。
這里我們使用集群配置管理工具srvctl來創(chuàng)建Oracle服務:
srvctl是集群配置管理命令,命令中參數add service代表創(chuàng)建Oracle服務,參數-d rac指明是在名稱是rac的數據庫上創(chuàng)建服務,-s ora1表示創(chuàng)建的服務名稱,-r rac1代表使用創(chuàng)建的Oracle服務ora1的數據庫連接請求將優(yōu)先連接實例rac1(服務器192.168.1.103),-a rac2表示當實例rac1不可用時使用Oracle服務ora1的數據庫會話將被轉移至實例rac2(服務器192.168.1.104),-PBASIC代表只在發(fā)生故障切換(Fail Over)時服務才在可用實例上創(chuàng)建數據庫會話。
表1 劃分后的HIS終端列表
在運行HIS系統(tǒng)的終端上,我們通過對Oracle客戶端Oracle Net Services的配置來實現HIS系統(tǒng)的門診應用使用Oracle服務ora1,HIS系統(tǒng)的住院和其它應用使用Oracle服務ora2。
Oracle Net Services為數據庫連接提供了連接負載均衡。客戶端負載均衡跨集群中所有監(jiān)聽程序進行連接請求均衡,方法是將集群中的所有服務器列入客戶連接字符的地址表。SQL*NET將隨機選擇其中的一個服務器,如果選中的服務器不可用,將嘗試列表中的下一個服務器。服務器端負載均衡是在監(jiān)聽程序中實現的,每個監(jiān)聽程序會識別出集群中刺探每個服務的所有實例。
通過在HIS系統(tǒng)客戶端上的編輯tnsnames.ora來完成客戶端Oracle Net Services的配置:
通過對Oracle RAC運行機制的研究,為避免因熱點數據塊頻繁地被各個節(jié)點查詢和修改而造成整個數據庫系統(tǒng)性能上的瓶頸,我們總結了采用“水平業(yè)務分割”的方式可以有效的對整個Oracle集群數據庫進行優(yōu)化。結合醫(yī)院信息系統(tǒng)的特點,我們確定了 “水平業(yè)務分割”的實施方案,通過對集群系統(tǒng)的優(yōu)化配置,實現了在平衡兩臺服務器負載的同時最大程度地減少兩個節(jié)點間數據塊的傳遞,從而最大程度地發(fā)揮了Oracle RAC的優(yōu)勢,使醫(yī)院信息系統(tǒng)能夠更加高效可靠地運行。
[1]Andrew Babb,Tammy Bednar.Oracle High Availability Best Practices[M].Oracle,2006:11-14.
[2]陳吉平.構建Oracle高可用環(huán)境:企業(yè)級高可用數據庫架構、實戰(zhàn)與經驗總結[M].北京:電子工業(yè)出版社,2008:166-171.
[3]Mark Bauer.Oracle9i Real Application Clusters Concepts[M].Oracle,2002:61-64.
[4]王紅艷 李濤.ORACLE數據庫集群技術的具體實施[J].電腦知識與技術,2011(2):11-12.