您的位置:首页 > 数据库 > Oracle

oracle之专用服务器和共享服务器小结

2014-05-29 13:31 337 查看

一、专用服务器和共享服务器
1.1 原理
专有服务器



专有服务器模式中,用户进程运行在客户端的机器,专有服务器进程运行在数据库服务器端的机器。用户进程和专有服务器进程是两种不同类型的进程。当客户端发出连接数据库请求的时候,监听器吧客户端连接到专有服务器进程。即使这个服务进程很空闲,这个专有服务器进行也只为这个用户进程服务。用户进行和专有服务器进程是一一对应的关系。

适合专有服务器环境:
1、只有少数客户端
在纪录量多、连接用户又比较少的情况下,采用专用服务器模式,可以说是比较明智的选择。
2、为数据仓库搭建的数据库系统。
如果这个数据库是为了实现数据仓库而搭建的,则必须要采用专属服务器模式。这是Oracle数据库的强制要求。
3、联机事务处理系统。
若联机事务处理系统统是符合两个条件
A 用户连接请求数大于共享进程
B 事务大部分是长事务或者大事务
则采用专用服务器连接模式比采用共享服务器连接模式效率要高。
共享服务器
而另外的共享服务器连接则是一种在程序编写的时候通常会用到的连接池(pool)的概念。采用这种模式的话,在数据库的初始化的时候就会创建一批服务器连接的进程,然后把这些连接进程放入一个连接池来进行管理。初始化的池中的进程数量在数据库初始化建立的时候是可以手动设置的。在连接建立的时候,Listener首先接受到客户端的建立连接的请求,然后Listener去生成一个叫做调度器(dipatcher)的进程与客户端进行连接。调度器把把客户端的请求放在SGA(系统全局域)的一个请求队列中,然后再共享服务器连接池中查找有无空闲的连接,然后让这个空闲的服务器进行处理。处理完毕以后再把处理结果放在SGA的相应队列中。调度器通过查询相应队列,得到返回结果,再返回给客户端。这种连接模式的优点在于服务器进程的数量可以得到控制,不大可能出现因为连接人数过多而造成服务器内存崩溃。但是由于增加了复杂度以及请求相应队列,可能性能上有所下降。



结构三部分:
1、监听器
2、一个或多个调度进程
3、一个或多个共享服务器进程

监听器和调度进程的关系
当数据库实例启动的时候,调度进程会吧自己的地址告诉监听器。当用户进程请求一个数据库连接的时候,监听器将首先检查这个请求,然后决定该用户进程是否允许使用共享服务器进程。如果允许,监听器把负载最小的调度进程地址给用户进程,然后用户进程直接连接到这个调度进程。
如果用户进程不能连接到调度进程,或用户请求的是一个专有服务器连接,则监听器将创建一个专有服务器进程,并把这个用户进程连接到专有服务器进程。
请求队列和响应队列
当一个用户发出一个调用请求的时候,这个用户进程的调度把这个请求放到请求队列中。这个请求将一直在请求队列中,直到一个空闲的共享服务器进程出现,这个空闲的共享服务器进程将从响应队列总取出这个请求,进行处理。
当共享服务器进程处理玩这个请求的时候,他会吧处理结果放到响应队列中,这个时候,共享服务器进程空闲,他将执行在请求队列中的另一个请求。
请求队列是一个公共的队列,他被多哦有的调度进程所共享。请求队列存在SGA中。共享服务器进程按照先进先出的原则对请求队列中的请求进程处理。
响应队列也存在SGA中,不同的是每个调度都有自己的响应队列调度进程从响应队列中读取完成请求,返回给用户进程。
合适共享服务器环境:
1、 前台客户端数量比较多。
2、 服务器内存限制比较大。
用户若在一些老的服务器上部署Oracle数据库的话,因为其主板对内存的升级有所限制,所以,为了得到一个不错的数据库性能,往往采用共享服务器模式。如此,即时同时访问数据库
的用户有所增加,其内存也不会有多大的影响。可以大大的降低内存的压力。
3、某些特定功能要求采用共享服务器模式。
比较典型的,如Oracle数据库服务器的连接共享、连接集中与负载均衡技术等等。他们必须在共享模式下才能够运行。
负载均衡用来在群集环境下实现多机共享数据库,以保证应用的高可用性。同时可以自动实现并行处理以及均分负载,还能够实现数据库在故障时的容错和无断点恢复。所以,在一些对
于性能与稳定性要求比较高的应用场景中,如银行中,往往都会采用负载均衡技术。此时,数据库管理员在配置数据库的时候,就需要考虑采用共享服务器模式。

共享服务器好处
1、减少操作系统进程/线程数
在一个有上千用户的系统上,如果操作系统力图管理数千个进程,可能很快就崩溃了。如果使用共享模式,可以有效的管理活动的部分用户,效率大大提高,操作系统可以避免了上下
文切换。
2、刻意的限制并发度
如果并发数过大,到一定程度,即使用户量再增加,每秒中完成的相应事物也不会增加。吞吐量到达一定峰值后会下降。利用共享服务器,可以把系统并发度限制到合理的数量上。
3、减少系统所需的内存
可以减少所需内存量,但是在自动PAG内存管理以后,意义不是很大。

1.2 服务器模式的设置

启用专用服务器

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

dedicated servers不需要专门的设置,这个是oracle的默认选项。

启用共享服务器

要切换到共享模式,可以使用以下步骤:

A.设置初始化参数 SHARED_SERVERS大于0,可以使用alter
system命令动态的设置 也 可以在spfile里面修改初始化参数SHARED_SERVERS 的值大于0,然后shutdown oracle,然后
restart oracle 即可启动共享模式,其他的共享服务器参数可以不用设置

参考语句:

alter system set shared_servers = 1 scope=both ;

alter system set max_shared_servers = 5 scope=both ;

B.设置dispatchers参数,可以采用下面的方法设置:

alter system set dispatchers="(PROTOCOL=TCP) (SERVICE=yzdbXDB)(SERVICE=yzdb)";

前面表示的是协议,后面的service 分别指定要采用共享服务器模式的服务名称

oracle文档上说该步骤不是必须做的,但是我在实际中发现如果只是设置了shared_server参数,

而把dispatches参数设置为空的话,不能启动共享服务器,使用上面的模式指定只启动某个服务的

共享模式,如果要设置所有服务都使用共享模式,则设置为:

alter system set dispatchers='(PROTOCOL=TCP)';

C.在客户端的tnsnames.ora的tns设置中,在CONNECT_DATA设置一项中增加(server=shared
)一项,即可使用共享服务器连接

如果服务器端没有启动共享服务器模式,而客户端使用shared方式连接的话,会出现错误提示:

“ORA-12520: TNS: 监听程序无法找到需要的服务器类型的可用句柄”;

关闭调度进程:

首先要查询到DISPATCHERS的NAME: SELECT NAME,NETWORK FROM V$DISPATCHER;

然后关闭调度进程:ALTER SYSTEM SHUTDOWN IMMEDIATE 'D000';

circuits(虚拟回路):指定了virtual circuits 的总数量。

SQL> select * from V$CIRCUIT;

1.3判断数据库使用的连接模式

查看当前数据库服务器的运行情况有一下几种办法:

A.从v$session里面查看:

SQL> select distinct server from v$session ;

SQL>

SERVER

---------

DEDICATED

NONE

SQL>

如果显示的除了dedicated,还有NONE,则说明当前启动了共享服务器,并且server为none的会话正使用共享服务器连接,

同时,如果只显示有dedicated,则不能说明服务器就一定工作在专用服务器下面,此时只能说明有可能启动了共享模式,

但是无连接

可以使用下面的语句查询采用共享服务器的会话信息:

select saddr,program ,server from v$session;

SQL> /

SADDR PROGRAM SERVER

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

296FB24C plsqldev.exe NONE

296FFD1C [email=oracle@B851]oracle @B851[/email] (q001) DEDICATED

29705AA0 [email=oracle@B851]oracle @B851[/email] (q000) DEDICATED
B.查询视图:

在网上有的资料上说只要查询下面三个视图,有记录则说明启动了共享模式,经过验证,具体情况如下:

select * from v$shared_server; ---有记录,且STATUS字段为WAIT(COMMON),则说明启动共享;

status为TERMINATED或者无记录,则说明没有启动共享服务器

select * from v$dispatcher; --有无记录都不能说明启动共享服务器,只能说明是配置了dispatchers参数

select * from V$CIRCUIT ; --有记录说明当前有使用共享模式的连接,无记录则不能判定服务器模式

C.查询监听器的状态:

1.4、客户端建立的连接模式

A.当服务器采用专用服务器模式时,客户端只能使用专用模式连接,也就是在connect_data数据中只能使用 server=dedicated。

B.当服务器采用共享服务器模式时,客户端可以选择建立共享还是专用连接,connection,只要在 connect_data 中指定server=dedicated or server=shared

大多数情况下我们更倾向或习惯专用模式,两种模式下,对sga等分配都会有不同,所以如果转换成mts模式,别忘了sga也是需要调整的。最典型的是mts模式需要较大的large_pool_size。如果真想转换还是仔细看看oracle关于mts的文档。共享连接只是把连接SESSION信息放在LARGE POOL,所以LARGE POOL要大一些。而专用连接的SESION信息放在PGA。

1.5、禁用共享服务器模式

禁用的实验:

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

alter system set shared_servers = 0 ;

alter system set max_shared_servers = 0 ;

在已经建立共享模式的客户端执行查询,一直处于等待,查看视图:

SQL> select circuit,saddr,status,queue from v$circuit;

CIRCUIT SADDR STATUS QUEUE

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

27434010 296F8CE4 NORMAL COMMON

2743471C 296FB24C NORMAL NONE

2 rows selected.

SQL> select program,saddr,server,status from v$session

where saddr in ('296F8CE4','296FB24C');

PROGRAM SADDR SERVER STATUS

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

plsqldev.exe 296F8CE4 NONE INACTIVE

plsqldev.exe 296FB24C NONE INACTIVE

2 rows selected.SQL> 恢复参数值:

SQL>

alter system set shared_servers = 1;

System altered.

SQL> alter system set max_shared_servers = 5;

System altered.

SQL>

前台的查询恢复正常,查看视图:

SQL> select circuit,saddr,status,queue from v$circuit;

CIRCUIT SADDR STATUS QUEUE

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

27434010 296F8CE4 NORMAL NONE

2743471C 296FB24C NORMAL NONE

2 rows selected.

共享服务器 就是 连接池的原理。

共享模式不稳定呀。。。实际应用中很多, 一般会用专业的中间件产品连接,不过原理是一样的。

共享修改方式还有一种方法就是 dbca修改共享,缺点是数据库必须重启。

一般都是楼主提到的 直接修改动态参数。



楼上朋友说的很对,共享服务服务器连接,会话的跟踪信息可能分布在不同的独立跟踪文件中,重建会话比较困难。除非必须要用共享模式,如系统负载太重或特定的性能,否则专用服务器是最佳选择。

1.6、共享服务初始化参数的一些说明:

shared_servers
:指定了当instance 启动的时候shared server process启动的数量,不要将这个参数设置得太大,否者启动数据库instance的时候就会花更多时间,Oracle启动过后会根据负载来动态调整shared_servers。如果为0,表示数据库没有启动共享服务模式。
这个参数是配置shared server 必须的,而且只有这个参数是必须的。
--修改参数: alter system set shared_servers=1;
max_shared_servers:ORACLE在同一个时刻最大能够使用的shared server process.不要将这个参数设置小于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.


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: