10、應(yīng)用程序架構(gòu)
這一章定義了應(yīng)用程序架構(gòu),描述了Oracle數(shù)據(jù)庫服務(wù)器和數(shù)據(jù)庫應(yīng)用程序在分布式處理環(huán)境中是如何工作的。這個架構(gòu)幾乎可以應(yīng)用到任何類型的Oracle數(shù)據(jù)庫系統(tǒng)環(huán)境中。
本章包含下列內(nèi)容:
u 客戶端/服務(wù)器架構(gòu)介紹
u 多層體系架構(gòu)概述
u Oracle網(wǎng)絡(luò)服務(wù)概述
在Oracle數(shù)據(jù)庫系統(tǒng)環(huán)境中,數(shù)據(jù)庫應(yīng)用程序和數(shù)據(jù)庫分成兩個部分:一個前端或者客戶端部分,一個后端或服務(wù)器部分,就是常用的術(shù)語:客戶端/服務(wù)器架構(gòu)。客戶端運行數(shù)據(jù)庫應(yīng)用程序,負責通過鍵盤、屏幕和點擊設(shè)備(例如鼠標)來訪問數(shù)據(jù)庫信息和與用戶交互。服務(wù)器運行Oracle軟件和處理對數(shù)據(jù)庫的并發(fā)、共享訪問需要的功能。
雖然客戶端應(yīng)用程序和Oracle可以運行在一臺服務(wù)器上,但通過網(wǎng)絡(luò)連接在不同的機器上運行客戶端和服務(wù)器可以獲得更高的性能。下一部分討論了Oracle客戶端/服務(wù)器架構(gòu)可能的變體。
分布式處理就是在不同的系統(tǒng)上使用多個處理器來執(zhí)行單個任務(wù)的處理。Oracle數(shù)據(jù)庫系統(tǒng)的分布式處理例子在圖10-1中有展現(xiàn)。
u 在圖表的A部分,客戶端和服務(wù)器位于不同的計算機上,這些計算機通過網(wǎng)絡(luò)連接。Oracle數(shù)據(jù)庫系統(tǒng)的客戶端和服務(wù)器端通過Oracle網(wǎng)絡(luò)服務(wù)(Oracle網(wǎng)絡(luò)接口)通訊。
u 在圖表的B部分,單個計算機有多個處理器,不同的處理器獨立的執(zhí)行Oracle客戶端應(yīng)用程序。
注意:這章應(yīng)用的環(huán)境是一臺服務(wù)器上一個數(shù)據(jù)庫。在分布式數(shù)據(jù)庫中,一個服務(wù)器(Oracle)可能需要訪問另一臺服務(wù)器上的數(shù)據(jù)庫。
圖10-1 客戶端/服務(wù)器架構(gòu)和分布式處理
Oracle的客戶端/服務(wù)器架構(gòu)在分布式處理環(huán)境提供下列優(yōu)勢:
u 客戶端應(yīng)用程序并不負責執(zhí)行任何數(shù)據(jù)處理。它從用戶獲得輸入,從服務(wù)器獲得數(shù)據(jù),然后使用客戶端工作站的顯示能力或者終端來分析和展現(xiàn)數(shù)據(jù)(比如使用圖形界面或電子表格)
u 客戶端應(yīng)用程序不依賴數(shù)據(jù)的物理位置。即使數(shù)據(jù)被移動或者分布到另一臺數(shù)據(jù)庫服務(wù)器,應(yīng)用程序只要做微小的調(diào)整或者不需要調(diào)整仍然可以發(fā)揮作用。
u Oracle可以利用底層操作系統(tǒng)的多任務(wù)和共享內(nèi)存能力。因此,它可以給它的客戶端應(yīng)用程序提供最高等級的并發(fā)、數(shù)據(jù)完整性和性能。
u 客戶端工作站或者終端可以優(yōu)化數(shù)據(jù)展現(xiàn)(例如,通過提供圖形和鼠標支持),服務(wù)器可以優(yōu)化數(shù)據(jù)處理和存儲(例如,通過提供更多的內(nèi)存和磁盤空間)。
u 在網(wǎng)絡(luò)環(huán)境下,你可以使用便宜的客戶端工作站高效的訪問遠程服務(wù)器的數(shù)據(jù)。
u 如果需要的話,當系統(tǒng)性能增長,Oracle性能也可以提高。你可以為分布式數(shù)據(jù)庫處理負載在網(wǎng)絡(luò)中增加多個服務(wù)器(水平擴展),你也可以將Oracle遷移到小型機或大型機,來利用大型系統(tǒng)的性能(垂直擴展)。在任何情況下,所有的數(shù)據(jù)和應(yīng)用程序都不需要或者只需要一點點修改,因為Oracle在系統(tǒng)之間非常容易遷移。
u 在網(wǎng)絡(luò)環(huán)境中,共享數(shù)據(jù)是保存在服務(wù)器中,而不是保存系統(tǒng)中的所有計算機中。這是的管理并發(fā)訪問更容易和更高效。
u 在網(wǎng)絡(luò)環(huán)境中,客戶端應(yīng)用程序使用SQL語句向數(shù)據(jù)庫提交需求。數(shù)據(jù)庫收到之后,處理SQL語句并將結(jié)果返回給客戶端應(yīng)用程序。網(wǎng)絡(luò)流量保持最小,因為只有請求和結(jié)果才在網(wǎng)絡(luò)上傳輸。
在多層體系環(huán)境中,一個應(yīng)用服務(wù)器為客戶端提供數(shù)據(jù)并作為數(shù)據(jù)庫服務(wù)器和客戶端之間的接口。這個架構(gòu)隨著Internet應(yīng)用的流行而變得更加重要。
啟用應(yīng)用服務(wù)器的架構(gòu)可以:
u 驗證客戶端(比如Web瀏覽器)的證書
u 連接數(shù)據(jù)庫服務(wù)器
u 執(zhí)行請求的操作
多層體系結(jié)構(gòu)的例子如圖10-2所示。
圖10-2 多層體系結(jié)構(gòu)環(huán)境例子
客戶端提交一個請求,數(shù)據(jù)庫服務(wù)器負責執(zhí)行對應(yīng)的操作??蛻舳丝梢允且粋€Web服務(wù)器或者其他最終用戶進程。在多層體系結(jié)構(gòu)中,客戶端通過一個或多個應(yīng)用程序服務(wù)器來連接數(shù)據(jù)庫服務(wù)器。
客戶端通過應(yīng)用服務(wù)器訪問數(shù)據(jù)。應(yīng)用服務(wù)器在客戶端和一個或多個數(shù)據(jù)庫服務(wù)器之間作為一個接口服務(wù),它提供了額外的安全性。它還能為客戶端執(zhí)行一些查詢處理,因而可以減輕數(shù)據(jù)庫服務(wù)器的負載。
在應(yīng)用服務(wù)器為客戶端在數(shù)據(jù)庫服務(wù)器執(zhí)行操作時就像一個客戶端一樣。應(yīng)用服務(wù)器的權(quán)限是嚴格限制的,避免在客戶端操作期間執(zhí)行不必要的和多余的操作。
數(shù)據(jù)庫服務(wù)器為代表一個客戶端請求的應(yīng)用服務(wù)器提供數(shù)據(jù)。數(shù)據(jù)庫服務(wù)器處理剩余所有的查詢。
Oracle數(shù)據(jù)庫服務(wù)器可以審核代表單獨客戶的應(yīng)用服務(wù)器執(zhí)行的操作,就好像應(yīng)用服務(wù)器自己執(zhí)行操作一樣。例如,一個客戶端操作可以請求在客戶端請求信息,但是應(yīng)用服務(wù)器的操作可能是針對數(shù)據(jù)庫服務(wù)器的連接請求。
Oracle網(wǎng)絡(luò)服務(wù)提供了在分布式、異構(gòu)計算環(huán)境中企業(yè)級別的連接解決方案。Oracle網(wǎng)絡(luò)服務(wù)負責啟動從客戶端應(yīng)用程序到Oracle數(shù)據(jù)庫的網(wǎng)絡(luò)會話。
Oracle網(wǎng)絡(luò)服務(wù)使用通訊協(xié)議或者支持大范圍網(wǎng)絡(luò)的應(yīng)用程序接口(API)來為Oracle提供分布式數(shù)據(jù)庫和分布式處理。
u 一個通訊協(xié)議是一系列的協(xié)議,負責指定應(yīng)用程序如何訪問網(wǎng)絡(luò)、數(shù)據(jù)如何分包以便跨網(wǎng)絡(luò)傳輸。
u 一個API是一系列的子程序,負責在網(wǎng)絡(luò)條件下提供通過一個通訊協(xié)議來構(gòu)建遠程進程間通訊的途徑。
網(wǎng)絡(luò)會話建立之后,Oracle網(wǎng)絡(luò)服務(wù)就成了客戶端應(yīng)用程序和數(shù)據(jù)庫服務(wù)器之間的數(shù)據(jù)通訊員。它的責任是在客戶端應(yīng)用程序和數(shù)據(jù)庫服務(wù)器之間構(gòu)建和維護連接,還包括在它們之間交換數(shù)據(jù)。在網(wǎng)絡(luò)中的每一臺計算機上都有Oracle網(wǎng)絡(luò)服務(wù),所以它能夠執(zhí)行這個工作。
Oracle網(wǎng)絡(luò)服務(wù)提供了位置透明性、集中的配置和管理以及快速簡潔的安裝和配置。它還可以最大限度利用系統(tǒng)資源和提高系統(tǒng)性能。Oracle共享服務(wù)器架構(gòu)提高了應(yīng)用程序的伸縮性和可以同時訪問數(shù)據(jù)庫的客戶端數(shù)量。虛擬接口(Virtual Interface,VI)協(xié)議通過高速網(wǎng)絡(luò)硬件上處理大部分的消息,這樣就減輕了CPU的負擔來處理更重要的工作。
Oracle支持工業(yè)級別的網(wǎng)絡(luò)協(xié)議,可以為在網(wǎng)絡(luò)中運行Oracle進程的數(shù)據(jù)庫服務(wù)器和運行用戶進程的Oracle應(yīng)用程序的計算機之間提供接口。
Oracle協(xié)議從Oracle應(yīng)用程序的接口獲得SQL語句,并將它們打包,通過一個支持的工業(yè)標準的高級別協(xié)議或者程序接口傳輸給Oracle。協(xié)議從Oracle中獲得應(yīng)答,并將它們打包,通過同樣的高級別的通訊機制傳輸給應(yīng)用程序。這個過程不依賴于網(wǎng)絡(luò)操作系統(tǒng)。
依賴運行Oracle的操作系統(tǒng),數(shù)據(jù)庫服務(wù)器的Oracle網(wǎng)絡(luò)服務(wù)軟件可以包含驅(qū)動軟件,也可以作為額外的Oracle后臺進程啟動。
當一個實例啟動,一個監(jiān)聽進程為Oracle 構(gòu)建一個通訊鏈路。當用戶進程發(fā)出連接請求,監(jiān)聽器確認它應(yīng)該使用共享服務(wù)器調(diào)度器進程還是專用服務(wù)器進程,從而構(gòu)建合適的連接。
監(jiān)聽器還在數(shù)據(jù)庫之間構(gòu)建通訊鏈路。當多個數(shù)據(jù)庫或?qū)嵗\行在一臺計算機上,例如真正應(yīng)用集群(RAC),服務(wù)名(service name)自動注冊到同一臺計算機的其他監(jiān)聽器中。一個服務(wù)名可以標識多個實例,一個實例可以屬于多個服務(wù)名??蛻舳诉B接到服務(wù)名,不需要指定它們想連接哪個實例。
動態(tài)服務(wù)注冊降低了多數(shù)據(jù)庫和多實例的管理難度。監(jiān)聽器傳遞給客戶端請求的服務(wù)名是注冊到監(jiān)聽器上的。服務(wù)信息可以通過一個叫做服務(wù)注冊的特性動態(tài)在監(jiān)聽器上注冊,或者在listener.ora文件中靜態(tài)配置。
服務(wù)注冊依賴于PMON進程(一個實例后臺進程)來向監(jiān)聽器注冊實例信息,還包括實例和共享服務(wù)器調(diào)度器的當前狀態(tài)和負載。注冊信息使得監(jiān)聽器將客戶端的連接請求傳遞到合適的服務(wù)處理程序。服務(wù)注冊并不需要在listener.ora文件中配置。
初始化參數(shù)SERVICE_NAME標識了一個實例屬于哪個數(shù)據(jù)庫服務(wù)。在啟動時,每個實例想同屬一個服務(wù)的其他實例的監(jiān)聽器注冊。在數(shù)據(jù)庫操作中,每個服務(wù)的實例都發(fā)送CPU使用信息和當前連接數(shù)量給同一服務(wù)的監(jiān)聽器。這樣才可以啟動動態(tài)負載均衡和連接失敗轉(zhuǎn)移。