潘 欣
民航總醫院計算機中心,北京 100000
為了最大程度地保證醫院信息系統(HIS)的業務連續性,實現24×7不間斷地可靠地運行,各醫院特別是大中型醫院對數據庫服務器都實施了主機容錯保護。某些醫院還應用了更高級的Oracle RAC技術,實現在保證數據庫服務器高可用的同時分攤數據訪問負載。
Oracle RAC是甲骨文公司專門針對Oracle數據庫提供的多個數據庫實例并行訪問數據庫的高可用并行計算技術。通過多個服務器節點和共享存儲組成的集群,并自動均分數據訪問負載,在其中一個節點發生故障時可以對系統進行容錯和恢復處理,實現數據庫實例節點的透明應用程序故障切換(Transparent Application Fail Over,TAF),在保證數據庫系統 24×7 的高可用性的同時最大程度發揮硬件性能[1]。
Oracle RAC雖然功能強大但內部結構十分復雜,在以生產系統運行之前,必須針對Oracle RAC的運行機制結合醫院信息系統的特點對數據庫集群進行優化配置,否則整個Oracle數據庫集群很可能將面臨嚴重的性能問題。
Oracle RAC的運行機制
Oracle RAC集群是建立在共享存儲架構之上的,為了降低數據庫實例訪問共享存儲的頻率,最大限度地降低磁盤I/O,Oracle開發了一項稱為高速緩存融合(Cache Fusion)的技術,使得集群中的節點可以通過高速集群互聯高效地在各數據庫實例中同步其內存高速緩存中的數據塊,這樣可以避免必須首先將塊推送到磁盤,然后再重新讀入到其它實例的緩存中[2]。盡管Cache Fusion技術可以消除共享存儲結構中磁盤的pin操作,從而大大提升了集群數據庫系統的性能,但在數據并發訪問量很大的環境下,如果有一些熱點數據塊很頻繁地被各個節點查詢并修改,Cache fusion會頻繁地使用內聯心跳網絡來在節點之間拷貝數據,從而導致大量的全局Cache等待事件,影響整個RAC系統的性能,甚至使得RAC系統的響應速度還不如單實例的數據庫系統響應速度快[3]。

圖1 Oracle RAC系統內部結構
因此對RAC系統優化的最基本原則是,避免發生大規模的、不同節點頻繁修改同一數據塊,盡量降低全局數據塊的數量[4]。我們知道在Oracle數據庫中數據塊(Block)是數據庫中的最小單位,區間(Extent)是由一系列連續的數據塊組成的數據庫用來進行存儲空間分配的邏輯單位。而以數據表(Table)或索引(Index)等邏輯方式存在的段(Segment)又是由多個區間組成。因此對在OLTP應用的RAC環境中,可以通過對業務系統進行水平分割而讓不同的業務系統單獨訪問一個指定節點的數據庫實例,從而使得每個業務系統的大量的表或索引都只駐留在一個實例的SGA中,最大程度的減少了數據塊在節點之間的Cache fusion。系統優化方案
我們知道HIS系統從業務范圍上基本可以劃分為門診和住院兩大子系統,同時各子系統的交易數據段各自基本獨立,共享的數據段數據規模較小。所謂交易數據段就是會實時產生和更新的數據表和索引,例如醫囑、費用和申請單等。這樣門診的HIS終端基本不會訪問住院系統的交易數據段,住院的HIS終端很少訪問門診系統的交易數據段。這就為我們實施水平數據分割提供了可能。按照這一原則我們將醫院全部的HIS終端劃分為門診和住院兩大部分。見表1。
有了上面的工作基礎,我們就可以通過在Oracle的服務器端和客戶端進行一系列的自定義配置來更合理地分攤兩個RAC實例的訪問負載,優化RAC數據庫的性能。
Oracle服務(Service)是跨多個數據庫實例為前端應用提供的單一數據服務映像,是實現Oracle高可用性連接的基礎元素,一個Oracle服務可以被分配到一個或多個數據庫實例,連接到該服務的數據訪問負載可以被服務根據優化原則在這些實例中進行調度,而通過將完成同一種工作的會話連接到同一個Oracle服務,使這些SQL操作穩定在一個數據庫實例中,可以使得數據塊在集群各節點之間的Fusion活動降到最少。由于我們的集群環境是2節點的RAC集群,根據前面對HIS系統水平數據分割的成果,我們創建兩個Oracle服務ora1和ora2分別對應門診和住院兩類HIS系統終端,來實現這兩部分HIS系統終端能夠分別連接到集群數據庫中的不同的數據庫實例。
這里我們使用集群配置管理工具srvctl來創建Oracle服務:

srvctl是集群配置管理命令,命令中參數add service代表創建Oracle服務,參數-d rac指明是在名稱是rac的數據庫上創建服務,-s ora1表示創建的服務名稱,-r rac1代表使用創建的Oracle服務ora1的數據庫連接請求將優先連接實例rac1(服務器192.168.1.103),-a rac2表示當實例rac1不可用時使用Oracle服務ora1的數據庫會話將被轉移至實例rac2(服務器192.168.1.104),-PBASIC代表只在發生故障切換(Fail Over)時服務才在可用實例上創建數據庫會話。

表1 劃分后的HIS終端列表
在運行HIS系統的終端上,我們通過對Oracle客戶端Oracle Net Services的配置來實現HIS系統的門診應用使用Oracle服務ora1,HIS系統的住院和其它應用使用Oracle服務ora2。
Oracle Net Services為數據庫連接提供了連接負載均衡。客戶端負載均衡跨集群中所有監聽程序進行連接請求均衡,方法是將集群中的所有服務器列入客戶連接字符的地址表。SQL*NET將隨機選擇其中的一個服務器,如果選中的服務器不可用,將嘗試列表中的下一個服務器。服務器端負載均衡是在監聽程序中實現的,每個監聽程序會識別出集群中刺探每個服務的所有實例。
通過在HIS系統客戶端上的編輯tnsnames.ora來完成客戶端Oracle Net Services的配置:

通過對Oracle RAC運行機制的研究,為避免因熱點數據塊頻繁地被各個節點查詢和修改而造成整個數據庫系統性能上的瓶頸,我們總結了采用“水平業務分割”的方式可以有效的對整個Oracle集群數據庫進行優化。結合醫院信息系統的特點,我們確定了 “水平業務分割”的實施方案,通過對集群系統的優化配置,實現了在平衡兩臺服務器負載的同時最大程度地減少兩個節點間數據塊的傳遞,從而最大程度地發揮了Oracle RAC的優勢,使醫院信息系統能夠更加高效可靠地運行。
[1]Andrew Babb,Tammy Bednar.Oracle High Availability Best Practices[M].Oracle,2006:11-14.
[2]陳吉平.構建Oracle高可用環境:企業級高可用數據庫架構、實戰與經驗總結[M].北京:電子工業出版社,2008:166-171.
[3]Mark Bauer.Oracle9i Real Application Clusters Concepts[M].Oracle,2002:61-64.
[4]王紅艷 李濤.ORACLE數據庫集群技術的具體實施[J].電腦知識與技術,2011(2):11-12.