說說Oracle監聽器(二)

forrest_itpub發表於2016-12-03

監聽器工作過程

 

下面我們談談監聽器的工作過程。一般,監聽器作為一個獨立process在作業系統中執行,守候在特定網路埠(預設為:1521),等待客戶端請求的到來。注意:我們在客戶端配置命名服務的時候,輸入的1521也就是為了與監聽器程式建立連線。

 

當一個請求“如期而至”,監聽器對照已經註冊的服務列表,查詢對應的資料庫例項資訊,獲取到指定例項的ORACLE_HOME路徑。相當於表明可以進行連線。

 

客戶端與例項的互動不是直接的,是透過Server Process作為代理中介來實現的。所有指令SQL都是客戶端透過Server Process傳送到例項中,這種體系結構是Oracle對於例項和資料庫檔案一種保護機制。

 

當監聽器獲得請求之後,要從Oracle例項中分配一個Server Process與之對應。這裡不同的Oracle連線方式存在一些差別。

 

如果是專用連線模式,也就是一個客戶端連線對應一個Server Process。監聽器就會向OS請求fork(創造)出一個Server Process,與監聽器嘗試互動。

 

如果是共享連線模式,也就是多個客戶端共享一個Server Process(注意:這裡還不是連線池)。監聽器就會向Dispatcher程式(管理共享模式連線的程式)請求一個Server Process與之互動。

 

Server Process與監聽器的連線,實際上就是相互資訊的交換。Server Process將自身在OS中的程式編號、連線地址資訊發給監聽器。監聽器將客戶端資訊傳遞給Server Process

 

監聽器獲取到Server Process的資訊之後,將其返回給客戶端連線程式。客戶端獲取到資訊之後,進行重連線,根據返回的資訊與Server Process在制定的伺服器埠進行聯絡。

 

直到這個時候,客戶端程式才將連線使用者名稱、密碼等資訊發給Server Process,進行登入驗證等操作。監聽器的工作也就到此結束。

 

這裡面有一個技術細節,就是Server Process與客戶端連線的時候,是允許不使用1521埠的。具體連線的埠,是帶有隨機因素的。在9i版本Windows平臺下,如果安裝了防火牆,只允許1521埠通訊,是會帶來一些連線問題。好在在其他平臺上和之後的版本中,實現了一種埠共享技術,連線可以和監聽器一起使用1521埠。

 

介紹了監聽器工作原理,下面我們說說動靜態註冊的機制。

 

 

 

動靜態序號產生器制

 

在上面的內容中,我們已經初步瞭解了註冊的作用,就是實現資料庫例項名和服務名註冊到執行的監聽器程式中。目前的Oracle,支援靜態註冊和動態註冊兩種註冊方式。

 

靜態註冊顧名思義,就是顯示的指定出監聽器程式要為那個例項以哪個服務名做監聽。在啟動監聽器的時候,監聽程式是不知道所監聽例項服務是否存在。直到有客戶端請求指定的服務。

 

指定靜態註冊的位置是在listener.ora引數檔案,下面是一個典型引數檔案的結構。

 

# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = D:\oracle)

      (PROGRAM = extproc)

    ) 

    (SID_DESC =

      (GLOBAL_DBNAME = orcl)

      (ORACLE_HOME = D:\oracle)

      (SID_NAME = orcl)

    )

 

  )

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

    )

  )

 

其中,SID_LIST配置節點中的SID_DESC就是配置靜態註冊的節點專案。SID_LIST裡用來配置當前監聽器註冊的服務專案,透過多個SID_DESC進行配置,每個SID_DESC基本上就是一個配置專案。預設是動態註冊的時候,只有PLSExtProc專案。

 

靜態配置專案中,透過GLOBAL_NAME配置服務專案,透過SID_NAME指定資料庫例項的名稱,透過ORACLE_HOME配置Oracle資料庫軟體安裝的基本目錄。

 

動態註冊是與靜態註冊相對應的一種註冊方法。同樣也是透過listener.ora進行配置。下面是一個典型的配置引數檔案。

 

# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = D:\oracle)

      (PROGRAM = extproc)

    )

  )

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =     

      (ADDRESS = (PROTOCOL = TCP)(HOST = www-0e6111dff74)(PORT = 1521))

    )

  )

 

對比上面的靜態註冊檔案,可以發現顯示指定服務名稱和資料庫例項名的專案不見了。只有本地地址和監聽器埠資訊。

 

動態註冊的動作是監聽器所在主機上資料庫例項完成。動態註冊是Oracle上一個不能關閉的功能。例項的background process PMON,每隔一段時間(一到兩分鐘)就會將例項的引數資訊註冊到監聽器上,實現動態註冊。

 

註冊的資訊是資料庫引數service_nameinstance_name。可以透過Show Parameter命令檢視。

 

SQL> show parameter instance_name;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

instance_name                        string      orcl

 

SQL> show parameter service_names;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

service_names                        string      orcl

 

一般資料庫在建立的時候,這兩個引數都是已經設定好的,不會輕易的發生變化。

 

如果instance_name引數沒有設定,則系統會選取引數db_name作為例項名稱返回。如果service_names沒有設定,則會將db_namedb_domain兩個引數組合成服務名實現註冊。

 

值得注意的一個問題是,service_names引數是一個可以指定多個服務名稱的引數,以逗號分隔。也就是說,一個Oracle例項時可以同時作為多個服務名向外提供服務的。Service_nameOracle在新近版本中提出,替代SID_NAME的概念。使用Service的指定方式,多個Oracle例項就可以統一提供一致的資料訪問服務(也就是RAC)。

 

 

通常,對instance_nameservice_name兩個引數,還是建議設定上。因為會在一定程度上影響到動態註冊的效果。

 

如果沒有顯示的指定這兩個引數,那麼只有在資料庫例項啟動在監聽器例項之後的時候,才會一次動態註冊。一旦之後監聽器重新啟動,動態註冊的資訊就不會存在,而且很難再次註冊上。所以,我們是推薦將這兩個引數設定上的。

 

只有顯示設定兩個值的情況下,PMON才會週期性的將註冊資訊加以註冊。透過命令列,也可以強迫PMON立即執行一次註冊操作。

 

SQL> alter system register

  2  ;

 

System altered

 

 

最後,我們聊一聊動態註冊的作用,支援錯誤轉移failover。註冊操作的發動方是PMON後臺程式,PMONOracle例項最重要的後臺程式,很多資料和DBA都是以該程式的狀態確定資料庫例項的狀態。PMON負責動態註冊,如果不能進行動態註冊,說明PMON已經失去了工作能力,也就意味著監聽程式所服務的例項已經不能工作。

 

透過動態註冊的機制,監聽程式是可以知道所服務的伺服器例項已經崩潰,對於客戶端的請求,可以實現錯誤轉移。

 

當然,我們這裡談到的崩潰是例項的崩潰。如果監聽器程式崩潰了,情況又是另一種樣子了。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25097694/viewspace-2129624/,如需轉載,請註明出處,否則將追究法律責任。

相關文章