在演讲中,Kamus首先介绍了在Oracle Real Application Cluster(RAC)环境中的Loadbalancing(负载均衡)以及Failover(失效接管)的概念和实现方法,同时介绍在当今的大型企业数据库架构中较为常见的负载均衡以及失效接管架构,并且根据演讲者的工作经验介绍了在Loadbalancing和Failover方面较为常见的错误现象以及处理方法。
他谈到,RAC环境下的负载均衡可以分为客户端负载均衡和服务器端的负载均衡。客户端负载均衡与数据库实例无关,与监听有关 ;与数据库真实负载无关;连接之后不会再次rebalancing。
既然是Client端的负载均衡,那么也就是不需要在数据库服务器端配置任何参数,完全由客户端机器上的tnsnames.ora文件中对于TNS的配置来决定,实际上也就是LOAD_BALANCE参数。
RACDB常见配置:
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip3)(PORT = 1521))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
)
)
以上配置等同于:
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip3)(PORT = 1521))
(LOAD_BALANCE = yes)
(FAILOVER = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
)
)
如果在TNS配置时使用的是ADDRESS_LIST语法,那么必须显示设置LOAD_BALANCE = yes,默认值LOAD_BALANCE = no(而默认FAILOVER = yes)。
(LOAD_BALANCE = yes)指示SQLNet随机选择ADDRESS_LIST列表中的任意一个监听,将客户端请求发送到此监听上,通过这种方法来实现负载平衡。
如果 (LOAD_BALANCE = no)那么将会按照ADDRESS_LIST列表中的顺序选择监听,只要这个监听能够正常连接那么就使用该监听。
因此在某些负载平衡的解决方案中会使用(LOAD_BALANCE = no)但是在多个客户端或者应用服务器端配置顺序不同的ADDRESS_LIST,以此来实现人为的负载平衡。
服务器端负载平衡包含Listener (Connection) Balancing (Oracle9i and Higher)和Service Balancing(Only on Oracle10gR2 and Higher )两个方面。
对于Listener Balancing,要实现server side load balance要求监听能够知道在整个RAC环境中的各节点负载情况,节点负载情况是由PMON进程来定期更新的,而要让PMON进程能够通知其它节点自己节点的负载情况则需要设置数据库初始化参数REMOTE_LISTENER。PMON更新的时间间隔最小是1分钟。
设置方法:
TNSNAMES.ORA :
LISTENERS_RAC =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip3)(PORT = 1521))
)