Oracle tnsname 配置两个ip,先连哪个
在 Oracle 的
tnsnames.ora配置中,如果为同一服务配置了多个 IP 地址,客户端会按照地址列表的顺序依次尝试连接,直到成功建立连接。例如:MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
)
(CONNECT_DATA = (SERVICE_NAME = orcl))
)
上述配置中,客户端会优先尝试连接
192.168.1.100,若该 IP 不可达或监听未响应,才会尝试192.168.1.101。这种顺序性是 Oracle TNS 的默认行为,由客户端的连接逻辑决定。一、默认行为的技术原理
-
地址列表的线性遍历
Oracle 客户端在解析tnsnames.ora时,会按ADDRESS_LIST中地址的物理顺序逐个尝试。例如,第一个地址对应第一个ADDRESS条目,第二个地址对应第二个条目,依此类推。这一机制在 Oracle 的 Net Services 文档中明确说明docs.oracle.com。 -
连接终止条件
一旦某个地址的连接成功(即监听器响应并建立会话),客户端会立即停止后续地址的尝试。即使后续地址的响应更快,也不会切换连接。 -
故障转移的隐含逻辑
这种顺序性本质上是一种隐式故障转移(Implicit Failover)。客户端仅在当前地址不可达时(如超时或网络错误),才会尝试下一个地址。例如,若第一个 IP 的监听端口未打开,客户端会等待超时后转向第二个 IP。
二、影响连接顺序的关键配置
1. 负载均衡的显式配置
若需打破顺序性,实现随机或负载均衡连接,需在
ADDRESS_LIST中添加LOAD_BALANCE=ON参数:MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = ON) -- 启用负载均衡
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
)
(CONNECT_DATA = (SERVICE_NAME = orcl))
)
此时,客户端会随机选择 IP 地址,而非按顺序连接ibm.com。这一特性适用于 RAC(Real Application Clusters)等多节点环境,可分散连接压力。
2. 故障转移策略的定制
若需在连接失败时自动切换地址(显式故障转移),可配置
FAILOVER_MODE参数:MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)) -- 启用SELECT语句的故障转移
)
)
此配置下,客户端不仅在连接时按顺序尝试地址,还会在会话中遇到故障(如实例崩溃)时自动切换到备用 IPibm.com。
三、验证连接顺序的方法
-
tnsping 工具测试
使用tnsping命令可观察地址尝试顺序:tnsping MYDB
输出结果会显示客户端依次尝试每个 IP 的耗时。例如:TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 06-AUG-2025 14:30:00 Copyright (c) 1997, 2023, Oracle. All rights reserved. Used parameter files: /home/oracle/network/admin/tnsnames.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.101)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl))) OK (0 msec) -- 第一个IP成功 -
抓包分析
通过 Wireshark 等工具捕获网络流量,可直接观察客户端向哪个 IP 发起 TCP 三次握手。若第一个 IP 的 SYN 包未得到 ACK 响应,客户端会在超时后向第二个 IP 发送 SYN 包。
四、优化建议与注意事项
-
地址顺序的业务逻辑
- 若主节点可靠性更高,应将其 IP 放在首位。
- 若需优先利用低延迟链路,可按网络拓扑排序(如同一机房的 IP 优先)。
-
超时参数的配置
通过sqlnet.ora中的TCP.CONNECT_TIMEOUT参数,可控制每个地址的连接超时时间:TCP.CONNECT_TIMEOUT = 10000 -- 10秒超时
避免因某个 IP 长时间无响应而阻塞整体连接。 -
与监听器配置的协同
确保服务器端的listener.ora中注册了所有 IP 对应的监听地址,且服务状态正常。例如:LISTENER = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
若监听器仅监听其中一个 IP,即使tnsnames.ora配置了多个地址,未被监听的 IP 也会导致连接失败。
总结
- 默认行为:按
tnsnames.ora中地址列表的顺序依次连接,直到成功。 - 负载均衡:需显式配置
LOAD_BALANCE=ON以随机选择地址。 - 故障转移:通过
FAILOVER_MODE参数实现会话级自动切换。 - 验证手段:使用
tnsping或抓包工具确认连接顺序。
合理利用地址顺序和参数配置,可在保证连接可靠性的同时优化性能。
浙公网安备 33010602011771号