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