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 的默认行为,由客户端的连接逻辑决定。

一、默认行为的技术原理

  1. 地址列表的线性遍历
    Oracle 客户端在解析tnsnames.ora时,会按ADDRESS_LIST中地址的物理顺序逐个尝试。例如,第一个地址对应第一个ADDRESS条目,第二个地址对应第二个条目,依此类推。这一机制在 Oracle 的 Net Services 文档中明确说明docs.oracle.com
  2. 连接终止条件
    一旦某个地址的连接成功(即监听器响应并建立会话),客户端会立即停止后续地址的尝试。即使后续地址的响应更快,也不会切换连接。
  3. 故障转移的隐含逻辑
    这种顺序性本质上是一种隐式故障转移(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

三、验证连接顺序的方法

  1. 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成功
    
     
  2. 抓包分析
    通过 Wireshark 等工具捕获网络流量,可直接观察客户端向哪个 IP 发起 TCP 三次握手。若第一个 IP 的 SYN 包未得到 ACK 响应,客户端会在超时后向第二个 IP 发送 SYN 包。

四、优化建议与注意事项

  1. 地址顺序的业务逻辑
    • 若主节点可靠性更高,应将其 IP 放在首位。
    • 若需优先利用低延迟链路,可按网络拓扑排序(如同一机房的 IP 优先)。
  2. 超时参数的配置
    通过sqlnet.ora中的TCP.CONNECT_TIMEOUT参数,可控制每个地址的连接超时时间:
     
    TCP.CONNECT_TIMEOUT = 10000  -- 10秒超时
    
     

    避免因某个 IP 长时间无响应而阻塞整体连接。
  3. 与监听器配置的协同
    确保服务器端的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或抓包工具确认连接顺序。

合理利用地址顺序和参数配置,可在保证连接可靠性的同时优化性能。

posted on 2025-08-07 09:43  数据派  阅读(92)  评论(0)    收藏  举报