我不是 DB 甚至 Oracle 专家,但我想了解 Oracle 何时以及为何向客户端返回不同的非 VIP 地址,假设这是正确的行为?
监听器.ora
LISTENER_DB-A =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DB-A-VIP)(PORT = 1521)(IP = FIRST))
# this is the VIP 10.0.0.15
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.10)(PORT = 1521)(IP = FIRST))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)
这里,Oracle服务器连接IP地址10.0.0.15后,将10.0.0.10地址返回给客户端。这是我对上述行为的网络嗅探:
客户端到甲骨文
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.15)(PORT=1521)))
(CONNECT_DATA=(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))(SERVER=DEDICATED)
(SERVICE_NAME=my_db)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=5)(DELAY=5))))
甲骨文到客户
(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=DB-A))(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.10)(PORT=1521)))
我知道这种行为不是强制性的,因为我已经看到 Oracle 服务器在没有上述重定向的情况下做出响应。服务器以这种方式运行的原因是什么?提前致谢!
当涉及到 11gR2 和 SCAN 侦听器时,它甚至更加复杂。但假设背后的原因是负载平衡。侦听器会将客户端重定向到负载最少的节点。
另一个原因也可能是工作负载平衡。想象一下,您
SERVICE_NAME
在我们的集群上有两个服务 ()。一个称为 LOADERS,由将数据推送到数据库的进程使用。另一个称为WEB,由应用程序使用,它从数据库中获取数据。每个服务位于不同的节点上。然后,此重定向将保证数据库得到有效使用,并且即使其中一个节点发生故障,所有加载程序都使用相同的集群节点。顺便说一句:我认为重定向消息不包含 IP 地址,而是主机名。因此,数据库客户端和数据库服务器之间不应有任何 NAT,并且它们也应使用相同的 DNS 服务器。