2020年8月12日 星期三

4.4 Oracle Server

Oracle Server 的類型可分為專屬伺服器 (Dedicated Server) 與共享伺服器 (Shared Server) 兩種,資料庫預設使用的是專屬伺服器模式。兩者的差別簡單來說,就是專屬伺服器會針對每一個使用者的連線產生出一個獨立的 Server Process;共享伺服器則是預先會在 Server 上建立好固定數量的 Process 等待使用者連線。兩者的架構說明如下:


專屬伺服器 (Dedicated Server):

 Oracle 預設的模式,每一個 user process 都會產生一個獨立的 server process。


當使用者對資料庫進行連線時,首先會經過監聽器 (Listener) 確認連線字串所設定的 Host、Port,以及 Service Name 是否正確,驗證完畢之後便會在 Server 上為這個連線建立一個 Server Process,然後將 client 端的連線建立起來,由於每一個連線都會產生一個 Server Process,因此稱做專屬伺服器。使用者若想要透過專屬伺服器模式連線的話,可以在 client 端 tnsnames.ora 的設定中加入 (SERVER=DEDICATED) ,例如:

orcl = 

(DESCRIPTION= 

 (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.49.250)(PORT=1521))

 (CONNECT_DATA=

 (SERVER=DEDICATED)

 (SERVICE_NAME=orcl)))



因為專屬伺服器是資料庫預設的模式,所以即使不加 (SERVER=DEDICATED) 也會使用專屬伺服器模式進行連線。


共享伺服器 (Shared Server):

共享伺服器 (Shared Server) 又可稱為 Multi-Threaded Server,在 Oracle 8i 時稱做 MTS,不同於專屬伺服器的地方在於共享伺服器是預先將固定數量的 Shared Server Process 建立好,所有的使用者連線需共享這些 Process。由於 Shared Server Process 的數量是固定的,但使用者連線的數量是浮動的,因此在這中間便產生了一個調度者 (Dispatchers) 的角色來分配 Shared Server Process 給使用者連線所使用。


當使用者對資料庫進行連線時,監聽器 (Listener) 會把使用者連線的請求交給調度者 (Dispatcher),此時調度者會於 SGA 產生一個 Request Queue 請求是否有空閒的 Shared Server Process 可以給這一個連線使用,當空閒的 Shared Server Process 接收到請求後,便會產生一個 Response Queue 告訴調度者說這個 Shared Server Process 可以接收使用者的連線,最後將 client 端的連線建立起來。使用 Shared Server 模式,資料庫最少需設定如下參數:


shared_servers: 設定初始 Shared Server Process 的數量

max_shared_servers: 設定最大 Shared Server Process 的數量

dispatchers: 設定 Dispatchers process

例如:

開啟 Shared Server 模式設定:

SQL> alter system set shared_servers=5;

SQL> alter system set max_shared_servers=50;

SQL> alter system set dispatchers='(PROTOCOL=TCP)(SERVICE=ORA11)';


關閉 Shared Server 模式設定:

SQL> alter system set shared_servers=0;

SQL> alter system set max_shared_servers=0;

SQL> alter system set dispatchers='';


設定了 dispatchers 之後 ,Listener 所註冊的 service 便會多了一個 “D000”,此為 Shared Server 所使用的 service:

$ lsnrctl service

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 25-OCT-2015 16:47:16

Copyright (c) 1991, 2011, Oracle.  All rights reserved.


Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

Services Summary...

Service “ORA11” has 1 instance(s).

 Instance “ORA11”, status READY, has 2 handler(s) for this service...

 Handler(s):

 “DEDICATED” established:0 refused:0 state:ready

 LOCAL SERVER

 “D000” established:0 refused:0 current:0 max:1022 state:ready

 DISPATCHER <machine: db11gr2, pid: 7856> (ADDRESS=(PROTOCOL=tcp)(HOST=db11gr2)(PORT=63053))



使用者若想使用 Shared Server 模式連線資料庫的話,必須於 client 端的 tnsnames.ora 設定 (SERVER=SHARED),否則 client 端仍然會使用預設的 DEDICATED 模式連線,例如:

orcls = 

(DESCRIPTION= 

 (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.49.250)(PORT=1521))

 (CONNECT_DATA=

 (SERVER=SHARED)

 (SERVICE_NAME=orcl)))

 

Shared Server 有如在 Server 上創建了一個 Process Pool,所有的連線都會使用這個 Pool 中的 Process,優點是 Process 已經預先創建好在 Server 上,對於 Server 上資源的使用也僅此於這些數量的 Process,不會造成因連線數突然增多而使得系統資源不足的情形;缺點是 Shared Server 需透過 Dispatcher 來調度,其連線的效能會不如 Dedicated Server,且若當下沒有可用的 Shared Server Process 時,連線會一直在  Request Queue 中等待,直到有可用的 Shared Server Process 為止;另外部分的 Database 功能是無法使用 Shared Server 模式來進行,例如 RMAN 就只能使用 Dedicated Server,SQL Trace 對於 Shared Server 來說是沒有意義的,因為 Shared Server 的 Session 都是共享的,因此無法判定 SQL Trace 所得到的 SQL 語法是否為當前連線所使用的。在現行的環境中,使用 Dedicated Server 模式仍然是目前的主流。

沒有留言:

張貼留言