首页 > 代码库 > oracle的高可用与负载均衡

oracle的高可用与负载均衡

浏览了一下Oracle官方的网页以及非官方的ppt,简单了解了一下Oracle提供的高可用方案。
1. RAC
RAC,  Real Application Clusters
多个Oracle服务器组成一个共享的Cache,而这些Oracle服务器共享一个基于网络的存储。这个系统可以容忍单机/或是多机失败。
不过系统内部的多个节点需要高速网络互连,基本上也就是要全部东西放在在一个机房内,或者说一个数据中心内。如果机房出故障,比如网络不通,那就坏了。所以仅仅用RAC还是满足不了一般互联网公司的重要业务的需要,重要业务需要多机房来容忍单个机房的事故。

2. Data Guard.
Data Guard这个方案就适合多机房的。某机房一个production的数据库,另外其他机房部署standby的数据库。Standby数据库分物理的和逻辑的。物理的standby数据库主要用于production失败后做切换。而逻辑的standby数据库则在平时可以分担production数据库的读负载。

3. MAA
MAA(Maximum Availability Architecture)其实不是独立的第三种,而是前面两种的结合,来提供最高的可用性。每个机房内部署RAC集群,多个机房间用Data Guard同步。

Oracle+Fusionio+Dataguard的高可用方案
传统的Oracle的高可用方案必须基于共享存储设备,不管是双机主备模式,还是Oracle RAC,数据库必须放在共享的SAN存储上,通过HA或集群软件实现高可用。Oracle DataGuard是很好的容灾软件,但是作为HA解决方案,功能有很多局限性,比如数据丢失,应用透明切换,只能读无法写(11g)等等,目前都没有非常好的解决方案。
自从固态存储技术出现后,单机的IO能力大幅度提升,比如采用PCIE接口的fusionio卡,单块卡就可以提供数万IOPS的能力,单机的IO能力已经超过了传统的磁盘存储。但是,一直困扰我们的是,如何解决无共享存储环境下Oracle数据库的高可用问题?我们团队设计了一种架构,提供简单可靠的高可用功能。

虽然在Oracle的立场上,总是建议客户能够更好地规划自己的应用,在有其它负载平衡方法的时候,尽量不要依赖于Oracle的Load Balance方法,但是往往在给客户配置完Oracle RAC数据库以后,客户都会要求要测试负载平衡(Load Balance)和TAF(Transparent Application Failover),并且将这两个测试作为RAC是否安装成功的标准。
这是一件很无奈的事情,像把旁枝末节看作了主要功能,甚至有些买椟还珠的感觉,但是毕竟这是客户,更了解Oracle Load Balance(后文用LB表示),才可以更好满足客户需求。

RAC的负载均衡主要是指新会话连接到RAC数据库时,如何判定这个新的连接要连到哪个节点进行工作。在RAC中,负载均衡分为两种,一种是基于客户端连接的,另外一种是基于服务器端的。客户端的负载均衡配置相对简单,只需要在tnsnames.ora中添加LOAD_BALANCE=ON这么一个选项即可。

实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力。
通常情况下有两种方式来实现负载均衡
一个是基于客户端连接的负载均衡
客户端的负载均衡主要是通过为tnsnames.ora增加load_balance=yes条目来实现
如果未开启load_balance=yes时,Oracle Net会根据地址列表按顺序来选择一个进行连接,直到连接成功为止。 如果第一个host主机连接失败,在有多个地址的情形下,接下来选择第二个地址连接,依此类推,直到连接成功为止。当开启了load_balance=yes时,则Oracle Net会从多个地址中随机地选择一个地址进行连接,直到连接成功为止。注意,此连接方式仅根据地址列表随机选择,并不考虑到各个实例上当前真正连接数量的多少,也即是没有考虑各个节点真实的连接负载情况

二是基于服务器端监听器(Listener)收集到的信息来将新的连接请求分配到连接数较少实例上的实现方式。
Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去。当数据库处于运行时,RAC中各节点的PMON进程每3秒会将各自节点的连接负荷数更新到service_register。而对于节点中任意监听器故障或监听器意外失败时,PMON进程会每1秒钟检查当前节点上的监听是否重启,以获得最新的负载信息来及时调整负载均衡。