REMOTE_LISTENER 与 LOCAL_LISTENER
我们以实例来说明这两种监听。
假设我们有一个双节点集群:host1 和 host2, 其 VIP 分别为 host1_vip 和 host2_vip。此集群上运行一个 RAC 数据库 (orcl);其中,实例1(orcl1)位于 host1 上,shili2 (orcl2)位于 host2 上。
两个监听,listener_host1 在 host1 上运行,listener_host2 在 host2 上运行。
listener_host1 可以看作是实例 orcl1 的本地监听(local listener),而对同一个实例 oracl1,listener_host2 可以看作是远端监听 (remote listener)(因为监听和数据库实例不在同一个机器上运行)。
类似地,listener_host2 可以看做是实例 orcl2 的本地监听(local listener),orcl1 的远端监听(remote listener)。
我们模拟真实环境,在两个实例中,我们都设置两个参数 local_listener 和 remore_listener。
orcl1.local_listener=(address of listener_host1)
orcl1.remote_listener=(addresses of both listener_host1 and listener_host2)
orcl2.local_listener=(address of listener_host2)
orcl2.remote_listener=(addresses of both listener_host1 and listener_host2)
(如你所见,简单起见,我们在 remote listener 的设置中,我们把两个监听都用起来了。当然你也可以只用一个,orcl1.remote_listener=(addres of listener_host2) 。)
有了这样的设置,集群中的两个监听就都能识别两个实例和两个主机了(也就能够感知主机负载和实例负载了),也就可以对是否将客户端的连接请求转发给另一个负载较轻的节点做出判断了。这就是服务器端负载均衡所用的机制。
客户端的 tnsnames 设置通常使用两个主机的两个 VIP(也就是说,可连接到两个主机中的任何一台)。所以,如果客户端尝试用第一个 IP 地址( listener_host1)连接数据库,假使 host1 比 host2 负载更重,那么监听 listener_host1 知道在 host2 上运行的另外一个实例负载较轻。此时,监听 listener_host1 会给客户端发送一个带有重定向指令的数据包,要求客户端重新尝试连接到 listener_host2,以与建立数据库连接。当然,这些对用户来说都是透明的。
没有这种远端监听(remote listener)的设置,每个监听就只能识别其本地实例,客户端只能连接到在监听程序所在的主机上运行的实例。此时,就只有客户端的负载均衡,而未实现服务器端的负载均衡。
原问地址:http://dbaoracledba.blogspot.kr/2012/04/remote-listener-vs-local-listener.html