Oracle之共享服務器模式


     在共享服務器體系結構中,一個dispatcher分派器將傳入網絡的多個會話請求定向到一個共享服務器進程池,消除了為每個連接分配一個專用服務器進程的需要。作為一般的指導原則,僅當系統需要並發連接到數據庫的數量超過操作系統的處理能力時,才能使用共享服務器。

     共享服務器模式必須使用net services.也就是必須配置tns信息(即使客戶端與服務端為同一台機器,也要配置TNS,且通過IPC協議進行通訊)。它適合用於高並發,事務量小,如果此時采用了共享模式,可以大大減少由於高度並發對於ORACLE服務器的資源消耗。
 
1,共享服務器模式優缺點
     優點:
     (1)減少了實例中的進程數
     (2)增加了更多並發用戶的數量
     (3)實現動態負載均衡
     (4)減少了空閑服務器進程數量
     (5)減少了實例PGA內存
 
     缺點:
     (1)共享服務器的代碼路徑比專用服務器長,所以它天生就比專用服務器慢;
     (2)存在人為死鎖的可能,因為它是串行的,只要一個連接阻塞,則該服務器進程上的所有用戶都被阻塞,並且極可能死鎖;
     (3)存在獨占事務的可能,因為如果一個會話的事務運行時間過長,它獨占共享資源,其它用戶只能等待,而專用服務器,每個客戶端是一個會話;
     (4)共享服務器模式限制了某些數據庫特性,例如:不能單獨啟動和關閉實例,不能進行介質恢復。
 
2,在共享服務器體系結構中需要的進程
     (1)將客戶端進程連接放到 dispatcher 或者 專有服務器進程的 網絡監聽器(PS:監聽器是Oracle網絡服務的一分部,而不是Oracle數據庫的一部分)。
     (2)一個或多個分派器進程(Dnnn)
     (3)一個或多個共享服務器進程(Snnn)
 
3,請求處理流程
     分派器將請求放入請求隊列,然后共享服務器進程檢查公共請求隊列並取出處理,最后服務器進程將響應結果置於分派器的響應隊列。(每一個分派器都有一個響應隊列)
 
4,分派器進程(Dnnn)
     分派器進程使得客戶端進程可以共享數量有限的服務器進程。可以為單個數據庫實例創建多個分派器進程。分派器進程的最佳個數取決於操作系統的限制和每個進程的連接數。
     當客戶端進程發出連接請求時,監聽器將確定客戶端進程是否應使用共享服務器進程,這個在配置文件里面有配:
     
     ○ 如果明確配置的是server = shared 並且建立了和dispatcher的通信,則使用共享服務器模式。
     ○ 如果配置的是server = shared但是無法建立和任何dispatcher的通信,或者配置的是server = dedicated,則使用專有服務器模式。
 
     一個典型的實例分派器設置如下(參數文件中設置):
     dispatchers="(protocol=TCP)(serv=orcl)(list=orcl)(poo=on)(disp=5)(conn=33)(sess=224)"
      protocol=tcp--協議
      list=orcl--監聽器別名,並非監聽器的名字,實際是一個tnsnames.ora中的網絡服務名
      serv=orcl--網絡服務名
      poo=on--是否啟用共享池
      disp=5--初始調度進程數
      sess=224--每個調度進程的最大會話數
      max_dispatchers=19--最大調度進程的數
 
     通過v$dispatcher視圖可以查看數據庫實例目前存在多少個調度器進程(分派器):select * from v$dispatcher;
     修改調度進程數量:alter system set dispatchers="(protocol=tcp)(disp=6)" scope=both;
     也可以手動的殺掉一個指定的調度器進程:ALTER SYSTEM SHUTDOWN IMMEDIATE 'D000';
 
5,共享服務器進程(Snnn)
     在共享服務器配置中,每個共享服務器進程為多個客戶端請求服務。除了共享服務器進程不與特定客戶端進程相關聯外,共享服務器進程和專用服務器進程提供相同的功能。
     (1)共享服務進程的設置主要受三個參數的影響:
     ○ shared_servers
     指定了當instance啟動的時候share_servers啟動的數量(可通過shared server process查看),不要將這個參數設置得太大,否者啟動數據庫instance的時候就會花更多時間,Oracle啟動過后會根據負載來動態調整shared_servers。如果為0,表示數據庫沒有啟動共享服務模式。這個參數是配置shared server必須的,而且只有這個參數是必須的。
     修改參數:  alter system set shared_servers=1;
 
     ○ max_shared_servers
     ORACLE在同一個時刻最大能夠使用的share_servers數量,不要將這個參數設置小於shared_servers,如果動態修改shared_servers大於max_shared_servers,ORACLE會覆蓋max_shared_servers的值,此時你需要修改max_shared_servers,同時也不能大於processes的值。這個參數是為了給占用很大資源操作而設的(批處理),為了預留一些process給DBA任務(rman備份)。
 
     ○ shared_server_sesions:
     指定了總共允許的的shared server session的數量。如果設置了這個參數,那么就不要將這個值超過sessions,如果沒有設置這個值,那么只要還有空閑的session,就可以被使用。設置這個值是為專有連接預留user sessions的。
 
     (2)把服務器從共享服務器模式改為專用服務器模式
       alter system set shared_servers = 0 scope = both;   --已經存在的共享進程需要等到會話結束才能結束
       或
       alter system set max_share_servers=0 scope=both; --立即強制結束所有共享服務器進程
     
6,判斷當前session的連接模式
     數據庫可以同時支持共享服務器連接和專用服務器連接。因此如果參數shared_servers=0 ,可以確定所有連接均是專用模式。但是如果shared_servers>0,那么就需要通過v$session視圖的SERVER字段來進一步判斷當前連接模式了。
 
補充:Oracle11gR2安裝后初始設置shared_servers=1;同時,數據庫還創建了一個調度器進程,在參數文件中有如下配置:dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)',service "orclXDB"是Oracle9i后創建數據庫時默認包含的XML DB特性,提供http、ftp等服務。通過lsnrctl service可以查看監聽器監聽的網絡服務:(orclXDB是Oracle網絡體系中的一個服務,而不是操作系統層面的服務)
  
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM