在说Oracle RAC之前,按照惯例,阿呆来一段前戏~
最近阿呆在看资治通鉴,看得津津有味。每当看到那些叱咤风云的英雄人物最终淹没于历史长河之中,不禁放下手机,望着地铁车厢里的茫茫人海(一排排后脑勺),怅然若失。。。今天我们来讲一对好兄弟张耳和陈馀的故事,他们本来是生死之交,最后却斗得你死我活。
话说魏国有两个名士张耳和陈馀,是刎颈之交。陈馀年轻,他就像对待父亲一样侍奉张耳。秦国统一了六国,听说这两个人很有名,就悬赏百金捉拿他们(有名士不拉拢,反而消灭,真吊)。他俩改名换姓,一块儿逃到陈地,充当里正卫维持生活。里中小吏曾因陈馀犯了小的过失鞭打他,陈馀打算起来反抗,张耳赶快用脚踩他,示意不动接受鞭打,小吏走后,张耳就把陈馀带到桑树下,责备他说:”当初和你怎么说的?如今遭到小小的屈辱,就要死在里吏身上吗?”陈馀认为他说的对(张耳年纪大,就是老奸巨猾啊)。
后来陈胜吴广大泽乡起义,他俩也去投奔,拥护赵王占领赵国,陈馀做大将军,张耳做右丞相,真是好搭档啊。不过,接着发生了一件事,秦朝大将章邯手下军队包围了张耳和赵王,陈馀带了几万援军在外面却不进攻,理由是打不过秦军,只会白白牺牲。然后,就是我们熟悉的,项羽带领楚军破釜沉舟,背水一战,打败秦军,解救了赵国。但是张耳却恨陈馀不救援,收了他的军队,两个人从此分道扬镳。项羽做了西楚霸王,分封诸侯,张耳跟他入关,封常山王,陈馀没跟他,只封了个侯。陈馀气坏了,带兵把张耳赶跑了(年轻人真冲动),他们反目成仇。张耳没办法,投降了刘邦,陈馀自己做了代王。刘邦有一次想让陈馀借点兵给他,结果陈馀的条件居然是要刘邦杀掉当年的好兄弟张耳,至此,他们斗得你死我活。刘邦自然没杀张耳,找了个替死鬼。
陈馀的结局很惨,被战神韩信背水列阵法打败,陈馀战死。张耳反而幸运,被刘邦封了王,儿子张敖娶了刘邦的女儿,所以刘邦和吕后消灭异姓王,张家幸免于难。
从张耳和陈馀的故事,阿呆不由得想到了Oracle RAC的脑裂,本来他俩还是有心跳检测的,联络感情,后来各自牛逼了,忙啊,心跳检测就少了,分道扬镳之后,心跳断了。从此,就发生了脑裂,谁都不认输,觉得自己吃亏了,争着要做老大。最终,命运之神做了表决盘Voting Disk,选择张耳活下来。这个故事告诉我们,朋友之间要多交流,定期心跳检测,这样才能知道对方还是一如既往的情深义重。否则,断了联系,很可能就脑裂了。
什么是Oracle RAC?
RAC,全称real application clusters,译为“实时应用集群“,是Oracle数据库支持网格计算环境的核心技术。
集群
-
节点互联起来,向外显示为1台服务器;
-
集群软件把内部结构掩藏起来;
-
磁盘是共享的;
-
每台机器使用相同的操作系统。
-
多个实例访问同一个数据库;
-
每个节点有一个实例;
-
数据库文件支持物理或逻辑访问;
-
数据的读写通过软件控制。
Oracle RAC和单个数据库服务器的区别
如下图,主要区别还是RAC是集群式数据库,通过集群软件管理。
Oracle RAC硬件架构
下图为一个两节点RAC系统,可以看出,从主机到交换机,都做了冗余,无论哪台设备出了故障,业务不会受影响。共享存储是自带RAID冗余的。
其中,主机叫做节点(Node),它们要有相同的CPU、内存等配置,每台至少两个网卡,访问内外网,还有HBA卡连接共享存储,但更多是通过FC交换机连到FC存储阵列。共享存储是RAC架构中的核心,绝大部分文件都在共享存储,很多功能都是为了共享存储的安全性开发的。一般是光纤通过FC接口连接,运行SCSI协议。
Oracle RAC软件架构
如下图,是个双节点RAC系统,Oracle RDBMS是数据库软件,Oracle Clusterware是集群软件。驱动主要是网卡,HBA卡,ASMLib等。
每个节点上必须是相同的操作系统,版本必须一致,包括补丁号等。如操作系统: RHEL AS 4.8 64bit,Linux内核版本: 2.6.9-89.EL。
集群软件:单机情况下只要OS和驱动就可以了,但是多机需要访问其他机器的硬件,需要集群软件。它是集群环境的核心组成部分,管理集群硬件资源,为上层应用提供服务。
集群文件系统:向多个节点提供文件读写功能。Oracle RAC支持OCFS和ASM。
逻辑结构
下图是Oracle RAC的逻辑结构,后面将依次介绍里面的各个组件。
DLM:并发控制
每个节点都有对等的权利访问共享存储的数据,Oracle RAC使用Distribute Lock Management( DLM)进行多个节点间并发访问的控制。分布式锁管理器负责协调节点间对共享资源的竞争,节点访问数据时,先通过DLM申请,确认不会和其他节点冲突时才能使用。
OCR:健忘症
健忘症:如果每个节点都有一份集群配置信息,那么如果修改配置后没有同步就会出错。
所以,集群只能有一个配置信息,所有节点共享。Oracle RAC使用OCR Disk文件解决健忘症。
OCR Disk只有Master节点才能修改,每个节点有一份Copy,在OCR Cache内存中。节点要修改OCR Disk时,请求Master节点,该节点上OCR进程更新本地和其他节点OCR Cache内容。OCR Disk每几个小时定期备份。
Voting Disk:脑裂
脑裂:集群中节点之间通过心跳检测来知道对方是不是好的,如果心跳出了问题,节点双方都认为对方出错了,就会要求独享数据,这样就会破坏数据的一致性。
Voting Disk用来记录节点间成员的状态,出现脑裂的时候,选择票数高的获得控制权,踢出其他节点。
IO隔离:踢出去的节点,不能再让它访问数据,所以要做IO隔离。Oracle RAC的机制就是重启故障节点。
Cache Fusion Lock
数据库文件是共享的,Cache Fusion Lock是在集群层面之外解决存储共享、并发访问控制。
四种网络
1. Public网络:用Public IP,对外提供数据查询、数据库维护、服务器维护。
2. Virtual网络:用Virtual IP,提供应用连接,应用程序使用该IP。
TCP/IP协议中,TCP Header包含源和目标端口,IP header包含源和目标IP,应用层的数据库监听记录IP和端口,在TCP超时时知道数据库或监听出了问题。TCP/IP协议栈超时时间由OS决定,每个OS定义不一样。为了缩短捕获错误的时间,Oracle RAC使用了VIP。Virtual IP是浮动的,并不与物理网卡绑定,某个节点故障,则VIP移到好的节点上,但好节点的监听里找不到该VIP,应用程序会立刻发现问题,转而向其他VIP发送连接请求。
3. Private网络:用Private IP,用于RAC心跳检测和Cache Fusion Lock,速度要求很高。
4. 存储网络:存储设备、HBA卡、FC网络组成。
Oracle Clusterware
单机的时候只要OS就可以处理上层请求,但是多机的时候,集群管理软件Oracle Clusterware会在OS内核之前截获对其他节点的请求,和其他节点的Clusterware通信完成请求。
应用层:RDBMS
应用层由若干CRS Resource组成,每个resource是若干个进程组成的完整服务。LMON(Lock Monitor)监控CRS Resource,异常时进行重启、切换等,保证Oracle RAC服务的高可用性。
Cache Fusion
Cache Fusion从字面就可以理解——缓存融合,其实就是把各个节点的缓存统一管理起来,避免了每次读都是操作磁盘,加速IO性能。因为Private网络速度很快,比读磁盘要快。从不同位置读数据块的时间:
-
本地Cache:0.01 ms
-
网络访问其他节点Cache:2.5 ms
-
磁盘:14 ms。但现在有了存储端的SSD或者全闪存阵列后,延迟就在1 ms左右了。所以有了全闪存阵列后,Cache Fusion估计就没有意义了。
Cache Fusion通过GCS(Global Cache Service)管理,就是把大家的Cache看成是一个大Cache。
读Cache流程
写Cache流程
写磁盘流程
负载均衡
用户像RAC发起各种请求的时候,负载均衡负责把任务平摊到不同机器上。
-
按用户分配
是从几个机器里面随机的挑一个吗?NO!那也太Low了,RAC会根据每个机器的状态动态分配任务。数据库运行时,PMON后台进程节点的负载信息,登记到Listener,1-10分钟更新一次。每个节点的Listener知道所有节点的负载情况,把客户端请求发给最闲的节点。
-
按服务分配
按用户分配有缺点,就是可能让Cache Fusion更忙了。因为RAC节点数据共享,大家通过Cache Fusion同步数据,RAC的性能很大程度上受限于Cache Fusion性能。要么让Private网络更牛,比如用昂贵的InfiniBand,另一种是减少Cache Fusion的流量,其实就是减少节点实例之间的依赖。而按用户分配的机制无益于后面的方案。
所以RAC支持根据服务分配节点,比如生产和销售用不同节点,自己的数据在自己的Cache里面,就不用访问别的节点了。性能得到提升。
三类集群
-
负载均衡集群:按一定算法把请求分配给不同成员;
-
高性能集群(HPC,High Performance Cluster):采用向量处理器等专用软硬件组成的牛逼机器,计算性能强悍,价格超贵,比如天河计算机;
-
高可靠性集群(HAC:High Available Cluster,Failover Cluster):可靠性非常好,硬件和软件的容错性很强,日常使用的数据库集群属于这类。
高可靠性集群
双机热备
平时有一个闲着待命,干活的挂了,就让候补的顶替。
双机互备
平时两台都干自己的活,但是要预留一部分资源,因为有一个挂了,另一个就得干两个人的活。
双机双工
举个例子:
老大老二合开一家店,平时老大主要卖包子,老二主要卖豆浆,老大有问题,老二就又卖包子,又卖豆浆,老二不行了,老大就又卖包子,又卖豆浆。
包子豆浆是数据,互相照应叫做心跳检测,顶替对方工作叫做failover(故障转移)。如果两个兄弟突然都瞎了聋了,不知道现在对方到底是否正在干活,都认为自己要顶对方的工作,这个叫做脑裂,然后需要第三者,比如他们的老爹来解决问题,这个叫做表决,或者让他们两个的媳妇过来拉走其中一个,这个叫做IO隔离。Oracle RAC就是这一类,性能最好,系统最复杂。
参考文章