监听-我的一些理解

来源:互联网 发布:数据库中的约束是什么 编辑:程序博客网 时间:2024/04/27 21:42

 比如如下环境:

说明/etc/hosts

#public

10.233.56.200 node1

10.233.56.210 node2

#vip

10.233.56.201 node1-vip

10.233.56.211 node2-vip

#private

192.168.56.200 node1-priv

192.168.56.210 node2-priv

 

[oracle@node1 admin]$ vi listener.ora 

 

# listener.ora.node1 Network Configuration File:/oracle/app/oracle/product/10.2.0/db_1/network/admin/listener.ora.node1

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER_NODE1 =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME= PLSExtProc)

     (ORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1)

      (PROGRAM =extproc)

    )

  )

 

LISTENER_NODE1 =

 (DESCRIPTION_LIST =

    (DESCRIPTION=

      (ADDRESS =(PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)(IP = FIRST))  ##vip

      (ADDRESS =(PROTOCOL = TCP)(HOST = 10.233.56.200)(PORT = 1521)(IP = FIRST))  ##public

    )

  )

 

如果使用srvctl启动监听那么,其实相当于

Lsnrctl start 监听名(注册到集群里的)

如: lsnrctl start LISTENER_NODE1

 

可以使用srvctl config listener –n node1查看

假设有$ORACLE_HOME/network/admin/listener.Ora文件,那么使用启动监听都会去读取这个文件,当然没有参数文件监听器也是可以启动,那时监听器依据默认的行为操作。如果不指定监听名称启动那么就会按照listener.Ora里记录的名称启动:如上面的LISTENER_NODE1,我做实验期间(SID_LIST_LISTENER_NODE1把后面的NODE1改成别的不受影响,所以暂且认为他不影响监听,或者说他只是所有监听的列表集名称),如果我没有指定名称直接lsnrctl start 那么默认去监听文件里找listener而不会找LISTENER_NODE1,不同的监听名称会产生不同的log日志。(个人认为不管有没有指定名称,都是先找listener.ora再根据默认的启动(默认的配置监听名称是LISTENER),所以当指定的名称不是LISTENER同时在Listener.ora里也找不到,那么就会报错,但是如果没指定LISTENER,也没指定其他的,虽然在lisener.ora里找不到,但是默认的监听配置是可以启动的)


说下上面的服务注册问题,这些服务有静态的有动态注册的,


 

这里的SID_DESC就是静态注册的标识,status是unknow,特点是如果对一个真正的数据库静态注册,那么数据库重启的时候不会重新注册(因为不会去重新读取listener.ora除非监听也重启),所谓动态的就是不写这些(这是瞎扯)。

 

还有之前认为是tnsnames.ora影响监听器监听到的服务,但是其实跟tnsnames.ora没半毛钱关系。

 

这里的原理是如:本节点的pmon负责把服务注册到监听器上,但是这个监听器不一定是本地的,也可以是远程的.

Pmon进程在没有local_listener和remote_listener的情况下,默认是找本机1521端口的服务注册,如果找不到那么就不注册.

如果配置了local_listener,那么pmon就会接着按照这个参数值把对应的服务注册到监听中去,这个结束之后pmon还会找remote_listener的参数值,把本地的数据库注册到remote_listener指定的远程服务器监听上(remote_listener的值可以是tns的netservice或者和local_listener一样直接写)

端口的意思我是这样理解的:

1.在listener.ora中这里写的端口号,两个意思,第一是oracle服务器的端口就是这个,多个数据库可以直接在这里配置多个listener_si类似的文件,第二是说监听器需要找这个端口的服务注册--如监听文件设置的端口是11521,那么监听必须找11521端口的数据库服务,而pmon默认只找1521的数据库服务给监听注册,所以就需要依赖参数local_listener.

       2.在数据库参数里的端口:如local_listener.ora的参数值,就是pmon读取它,然后注册到监听里去,避免端口不是1521,pmon注册不了。参数remote_listener和local的作用差不多,主要是pmon读取它,然后注册到remote指定的远程服务器数据库实例的监听器上。

 

还有说明的一点:如果平常监听正常,但是可能有了改动,导致监听器监听不到服务,查看这些文件和参数发现没什么问题后,建议重启监听,如果参数改了的话有可能没生效之类的,建议把参数改回去然后再改回来。

 

10grac的remote可以不需要配置remote,但是11g racedremote_listener就基本都需要配置,因为scan_listener只会在一个节点上,应用通过连接scan,然后scan自动转发给各个节点,当转发的节点不是本节点,那么因为remote_listener相互注册,所以本节点监听到了其他节点的服务,所以可以把客户端转到其他节点上去。

 

11g rac如:


[grid@rac1 admin]$ crs_stat |grep -i lis

NAME=ora.LISTENER.lsnr

TYPE=ora.listener.type

NAME=ora.LISTENER_SCAN1.lsnr

TYPE=ora.scan_listener.type

NAME=ora.rac1.LISTENER_RAC1.lsnr

NAME=ora.rac2.LISTENER_RAC2.lsnr

 

 

SQL> show parameter lis

 

NAME                                 TYPE        VALUE

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

listener_networks                    string

local_listener                       string       (ADDRESS=(PROTOCOL=TCP)(HOST=

                                                10.233.56.103)(PORT=11521))

recovery_parallelism                 integer     0

remote_listener                      string      racscan:11521

 

local_listener的值里面的ip 是vip

 

10g中

SQL> show parameter lis

 

NAME                                 TYPE        VALUE

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

local_listener                       string      (ADDRESS=(PROTOCOL=TCP)(HOST=1

                                                0.233.56.201)(PORT=11521))

recovery_parallelism                 integer     0

remote_listener                      string      TEST2

 

改监听的不需要改集群里的东西

 

 

当一个请求“如期而至”,监听器对照已经注册的服务列表,查找对应的数据库实例信息,获取到指定实例的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端口。

 

0 0
原创粉丝点击