实例环境

node1:rac1
node2:rac2
node3:rac3
node4:rac4

每台实例 listener 配置方法

node1:<listener.ora>

LISTENER_RAC1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = TCP)(HOST = node1-priv)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
      )
    )
  )

node2:<listener.ora>

LISTENER_RAC2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = TCP)(HOST = node2-priv)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
      )
    )
  )

node3:<listener.ora>

LISTENER_RAC3 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = node3-vip)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = TCP)(HOST = node3-priv)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
      )
    )
  )

node4:<listener.ora>

LISTENER_RAC4 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = node4-vip)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = TCP)(HOST = node4-priv)(PORT = 1521)(IP = x.x.x.x))
        (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
      )
    )
  )

每个实例中tnsnames.ora都加入下面信息.

LISTENER_RAC =
  (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)(IP = x.x.x.x))
     (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521)(IP = x.x.x.x))
     (ADDRESS = (PROTOCOL = TCP)(HOST = node3-vip)(PORT = 1521)(IP = x.x.x.x))
     (ADDRESS = (PROTOCOL = TCP)(HOST = node4-vip)(PORT = 1521)(IP = x.x.x.x))
  )
LISTENER_RAC1 =
  (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)(IP = x.x.x.x))
  )
LISTENER_RAC2 =
  (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521)(IP = x.x.x.x))
  )
LISTENER_RAC3 =
  (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = node3-vip)(PORT = 1521)(IP = x.x.x.x))
  )
LISTENER_RAC4 =
  (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = node4-vip)(PORT = 1521)(IP = x.x.x.x))
  )

为避免出现连接问题, 主动定义让 pmon 能够为 listener 注册, 在每个实例中修改一下 local_listener 与 remote_listener, 以防万一, 注 local_listener 定义了每个实例的 listener 名称,  sid 定义每个实例 sid

ALTER SYSTEM SET LOCAL_LISTENER='LISTENER_RAC1' SCOPE=BOTH SID='RAC1';
ALTER SYSTEM SET LOCAL_LISTENER='LISTENER_RAC2' SCOPE=BOTH SID='RAC2';
ALTER SYSTEM SET LOCAL_LISTENER='LISTENER_RAC3' SCOPE=BOTH SID='RAC3';
ALTER SYSTEM SET LOCAL_LISTENER='LISTENER_RAC4' SCOPE=BOTH SID='RAC4';

ALTER SYSTEM SET REMOTE_LISTENER='LISTENER_RAC' SCOPE=BOTH SID='RAC1';
ALTER SYSTEM SET REMOTE_LISTENER='LISTENER_RAC' SCOPE=BOTH SID='RAC2';
ALTER SYSTEM SET REMOTE_LISTENER='LISTENER_RAC' SCOPE=BOTH SID='RAC3';
ALTER SYSTEM SET REMOTE_LISTENER='LISTENER_RAC' SCOPE=BOTH SID='RAC4';

 

客户端的 tns 也需要做一下处理,  当连接到 sqlplus tt@rac 之后, 就可以实现 load balance 调度了.

rac =
(DESCRIPTION =
   (ADDRESS_LIST =
     (LOAD_BALANCE=ON)
     (FAILOVER=ON)
     (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)(IP = x.x.x.x))
     (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521)(IP = x.x.x.x))
     (ADDRESS = (PROTOCOL = TCP)(HOST = node3-vip)(PORT = 1521)(IP = x.x.x.x))
     (ADDRESS = (PROTOCOL = TCP)(HOST = node4-vip)(PORT = 1521)(IP = x.x.x.x))
   )
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RAC)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
      )
   )
)

产生多个连接后利用 gv$session 查询一下调度情况吧.

注: v$session 是某个实例的环境, gv$session 是全局环境