Oracle RAC的优势在于利用多个节点(数据库实例)组成一个数据库,这样在保证了数据库高可用性的情况下更充分的利用了多个主机的性能,而且可以通过增加节点进行性能的扩展。实现Oracle RAC需要解决的关键问题就是多节点进行数据访问时如何保证数据的一致性,Oracle是通过各节点间的私有连接进行内存融合(cache fusion)来保证各节点数据访问的一致性。用一个例子来解释一下内存融合的过程,在存在A、B两个节点的RAC环境中,当A节点使用DML语句(如Update)对一个数据块中的数据进行修改时,A节点实例会到GRD(Global Resource Directory)中查找该数据块的信息,这些信息包括该数据块的Master(第一次读这个数据块的节点),Owner(当前拥有这个数据块的节点),以及数据块在各个节点间的传递记录。A节点如果发现GRD中没有需要读取的数据块的信息,说明该数据块是一个干净的数据块,A节点从磁盘或Buffer Cache中获得该数据块,然后对需要修改的行加锁,进行相应的修改,当然SCN会随之增加。在A完成修改而没有提交或回滚的情况下,如果B节点也需要访问这个数据块修改某些行(假设不同于A修改的行),B同样去到GRD中查找该数据块的信息,当然B发现该数据块的Master为A,Owner也为A,为了保证A的修改不丢失,B需要发信息给A,让A将需要修改的数据块通过私有连接直接从内存中传给B,当然该数据块中包含A的锁信息,这样A节点与B节点间的一次内存的数据传递就是内存融合。Oracle RAC的内存融合也面临一些问题,继续刚刚的例子,如果A又再次请求对该数据块修改或者结束事务(提交或回滚)的时候,又需要从B节点内存中取得数据块,又要发生内存融合,这样在两个节点业务没有合理分割的情况下,数据库繁忙时,大量的内存融合会对数据库性能造成严重的影响。通过对Oracle RAC技术的理解,在实现Oracle RAC架构时的业务分割就成为了保证系统性能的重要手段,业务分割的根本在于使不同的实例不能访问相同的数据块,这样业务分割规则可以小到表的级别(不同的表不会共享一个数据块),大到表空间、Schema的级别。心跳应该用独立的网卡。
当然,rac本身之保证了数据库服务器的高可用和高性能,所以最好有其他的存储技术来保证存储的高可用,例如raid\vplex等。
在距离不太远(几十公里),且速度较快(例如裸光纤)下,延时较小,,米足够多,可以考虑使用oracle rac实现双活或者灾备,RTO RPO=0。