当tnsnames.ora文件中包含至少2个协议地址的时候,用于指定故障转移和负载均衡的参数可以再文件中被包含。
sample1=
(DESCRIPTION=
(SOURCE_ROUTE=yes)
(ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1630)) # hop 1
(ADDRESS_LIST=
(FAILOVER=on)
(LOAD_BALANCE=off) # hop 2
(ADDRESS=(PROTOCOL=tcp)(HOST=host2a)(PORT=1630))
(ADDRESS=(PROTOCOL=tcp)(HOST=host2b)(PORT=1630)))
(ADDRESS=(PROTOCOL=tcp)(HOST=host3)(PORT=1521)) # hop 3
(CONNECT_DATA=(SERVICE_NAME=Sales.us.acme.com)))
1客户端被指导连接oracle连接第一个oracle连接管理器的协议地址
(ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1630))
2然后在连接下一个oracle连接管理器中的第一个协议地址。如果第一个协议地址失败了,那么会尝试第二个协议地址。通过下面的配置来指定顺序的
(ADDRESS_LIST=
(FAILOVER=ON)
(LOAD_BALANCE=off)
(ADDRESS=(PROTOCOL=tcp)(HOST=host2a)(PORT=1630))
(ADDRESS=(PROTOCOL=tcp)(HOST=host2b)(PORT=1630))
3然后在连接下个地址
(ADDRESS=(PROTOCOL=tcp)(HOST=host3)(PORT=1521))
客户端的负载均衡
sample2=
(DESCRIPTION=
(LOAD_BALANCE=on)
(FAILOVER=on)
(ADDRESS_LIST=
(SOURCE_ROUTE=yes)
(ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1630))
(ADDRESS=(PROTOCOL=tcp)(HOST=host2)(PORT=1521)))
(ADDRESS_LIST=
(SOURCE_ROUTE=yes)
(ADDRESS=(PROTOCOL=tcp)(HOST=host3)(port=1630))
(ADDRESS=(PROTOCOL=tcp)(HOST=host4)(port=1521)))
(CONNECT_DATA=(SERVICE_NAME=sales.us.acme.com)))
1客户端随机选择一个address_list,如果选择的address_list失败了,那么会故障转移到另一个上,
2当address_list被选择了,客户端先连接到1630上
3oracle连接管理器然后使用address_list中的协议地址连接到数据库服务上。
lists的可选参数
对多个地址,下面的参数是可用的
FAILOVER
LOAD_BALANCE
RECV_BUF_SIZE
SDU
SEND_BUF_SIZE
SOURCE_ROUTE
TYPE_OF_SERVICE
failover参数指定多协议地址的连接时故障转移 ,这个参数在description_list或description,或是address_list参数下面指定
load_balance 这个参数指定了客户端的负载均衡,如果这个参数设置成了on,yes或true,oracle net进程随机的选择地址,在不同的监听中负载均很。当设置了off,no,或是false,oracle net就顺序的读取地址列表直到一个成功了。
recv_buf_size这个参数指定了接收操作的的buffer space,单位是bytes,
sdu这个参数指导oracle net调整发送sdu大小的数据包的频率,默认是2KB
send_buf_size 发送操作的bufer space
source_route使用这个参数能在多协议地址中路由。当设置了on或yes,oracle net使用每个地址直到目的地到达。
type_of_service使用这个参数来指定oracle rdb数据库使用的服务类型。这个参数只有在包含rdb和oracle数据库服务的时候才有用。
connect_data 有下面的参数
FAILOVER_MODE
GLOBAL_NAME
HS
INSTANCE_NAME
RDB_DATABASE
SERVER
SERVICE_NAME
SID
failover_mode
使用该参数可以让oracle net在运行的时候第一个监听失败了就转移到别的监听上去。这种类型的叫taf,和连接时的故障转移failover参数不是一回事。
instance_name来标记要访问的数据库实例。
server来指定连接的服务处理器的类型
service_name来指定要访问的服务
security部分,使用这个参数可以实现安全的连接
例如
net_service_name=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=sales1-svr)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=sales2-svr)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=sales.us.acme.com))
(SECURITY=
(SSL_SERVER_CERT_DN="cn=sales,cn=OracleContext,dc=us,dc=acme,dc=com")))