rac的cluster的failover在客户端tnsnames里的配置

rac客户端的配置LOAD_BALANCE默认是打开的,但是FAILOVER_MODE 是需要配置的,平时开发人员几乎是不知道这些参数,售后运维配置的时候也是不考虑这些参数的,所有客户运行中会发现,节点掉了,前台业务立即受到影响,客户反问集成人员你们不是双节点冗余,还有一个节点活着呢,怎么业务会受到影响呢?

原因就是参数大家没概念,如下配置可以保证只要不是所有节点均down,当前会话是不会中断的

rac1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hr)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 10)
        (DELAY = 5)
      )
    )
  )

下边这个配置在连接节点down后,语句会中断执行,报错,但是程序不受到影响,session仍继续保持

rac的cluster的failover在客户端tnsnames里的配置

如果机器连接数能保证,最厉害的应该是如下配置,而且语句切换最快

rac1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hr)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = preconnect)
        (RETRIES = 10)
        (DELAY = 5)
      )
    )
  )

下边

 

参数的含义:
LOAD_BALANE FAILOVER
ON ON 客户端新建连接随机尝试ADDRESS_LIST中的监听,直到连接到一个可用监听,或者连完列表中的所有监听,如没有一个监听可用,则返回错误信息
ON OFF 客户端新建连接随机尝试ADDRESS_LIST中的任一监听,无论这个监听是否可用,如不可用直接返回错误。
OFF ON 客户端新建连接按顺序尝试ADDRESS_LIST中的监听,直到连接到一个可用监听,或者连完列表中的所有监听如没有一个监听可用,则返回错误信息
OFF OFF 客户端新建连接仅连接ADDRESS_LIST中第一个监听,无论这个监听是否可用,如不可用直接返回错误。
对于已有连接的失败切换,首先要求FAILOVER = ON,并且设置了FAILOVER_MODE


FAILOVER_MODE的子参数含义:
TYPE:

1)session---如果用户连接丢失,将创建一个新的会话连接到备用节点,用户的所有未提交的操作必须回滚,然后再次执行,SELECT操作也被中止.
2)select---如果用户连接丢失,将使用游标和之前的快照继续执行SELECT操作,叫做SQL接管,SQL接管能够无缝接管理的事务类型只有SELECT语句.其它的操作也必须要回滚然后再次执行.
3)none---客户端默认值,禁止SQL接管功能,主要用于测试的目地,在实际应用中TYPE应指定为session或者select

METHOD:

1)basic---仅仅在FAILOVER发生时才连接备用节点
2)preconnect---在用户连接到主节点时同时也在备用节点产生一个连接会话,设置预连接模式,能够快速接管SQL

RETRIES:当前节点失败后,失败切换功能会尝试连接备用节点,这个值确定了尝试的次数,如果仅DELAY被指定,RETRIES默认为5

DELAY:两次尝试之间等待的秒数,如果仅指定RETRIES,DELAY默认为1秒

BACKUP:指定另外一个用于备份连接的网络服务名,当RAC设置为主次模式时,使用此参数,并且METHOD应该设为preconnect
RAC设置为主次模式时的tnsnames配置

 

无客户端负载均衡(主次模式就不要客户端负载均衡了),有透明应用切换且有预连接的tnsnames配置

RAC9I1 =
(DESCRIPTION  =
    (ADDRESS = (PROTOCOL = tcp)(HOST = rac9iaw)(PORT = 1521))
    (ADDRESS = (PROTOCOL = tcp)(HOST = rac9ibw)(PORT = 1521))
 (LOAD_BALANCE = OFF)
 (FAILOVER = ON)
 (CONNECT_DATA =
  (SERVICE_NAME = rac9i.xyf)
  (INSTANCE_ROLE = PRIMARY)
  (INSTANCE_NAME = rac9i1)
  (FAILOVER_MODE =
   (BACKUP=RAC9I2)
   (TYPE = select)
   (METHOD = preconnect)
  )
 )
)
RAC9I2 =
(DESCRIPTION =
   (ADDRESS = (PROTOCOL = tcp)(HOST = rac9ibw)(PORT = 1521))
   (ADDRESS = (PROTOCOL = tcp)(HOST = rac9iaw)(PORT = 1521))
 (LOAD_BALANCE = OFF)
 (FAILOVER = ON)
 (CONNECT_DATA =
  (SERVICE_NAME = rac9i.xyf)
  (INSTANCE_ROLE = SECONDARY)
  (INSTANCE_NAME = rac9i2)
  (FAILOVER_MODE =
   (BACKUP=RAC9I1)
   (TYPE = select)
   (METHOD = preconnect)
  )
 )
)

也可以设置为有透明应用切换但无预连接的模式,只要把上面的设置中的METHOD设置为basic。

与双主模式时的配置相比,多了INSTANCE_ROLE这样一个参数,当这个参数为SECONDARY时,

这个本地服务命名不直接接收连接,只在主节点失败后才会接收连接。不直接接收连接,并不是指在客户端不能连通这个服务命名,只不过这个连接会被路由到主节点,次要次点并不真正有连接连上去。