1.RAC原理mysql
Oracle 数据库系统是美国oracle公司(甲骨文股份有限公司)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一,至今仍在数据库市场上占有主要份额。sql
1.1 RAC原理数据库
对于每一个软件相关从业人员来讲,都有必要了解一下Oracle数据库,下面我将对Oracle RAC原理作以下介绍。服务器
Oracle RAC是Oracle Real Application Cluster的简写,官方中文文档通常翻译为“真正应用集群”。RAC集群是由若干物理机组成,每一个物理机为一个节点,这些节点间经过网线链接(也叫心跳网络)。每一个节点上都运行一个实例,这些实例经过CRS(CRS经过一系列的进程和服务来保证集群的运行,提供高可用性)的协助,共同操做一个数据库,是一个典型的“多实例,单数据库”架构,数据库被全部节点共享、并行访问。共享存储是RAC架构的核心。数据库的数据文件、控制文件、参数文件、重作日志文件等等都要放到共享存储上,各节点能够对这些文件进行并行访问。若是其中某个节点发生故障,RAC可以将链接自动切换到另一个节点上,无单点故障问题,从而实现应用的无缝切换。网络
下图为基本的RAC拓扑图:架构
2.RAC 特性并发
依上文所说,RAC是一堆特性应用的集合,下面重点介绍几个特性:VIP漂移、脑裂和IO隔离。oracle
2.1 VIP漂移特性分布式
这里有必要解释下RAC为何要使用VIP地址:在TCP/IP四层模型中,TCP header中最重要的信息是源端口和目标端口,IP header 中记录的最重要的信息是源IP和目标IP地址,而数据库监听中记录了IP地址和端口号,位于应用层,因此客户端的链接请求只有发现TCP层超时才能感知数据库或者是监听出了问题。TCP/IP协议栈超时,其时间阀值由OS内核决定,每一个操做心跳的阀值不相同。为了解决TCP/IP协议栈超时问题,Oracle RAC引进了VIP。工具
VIP 和通常的IP不一样的是:通常的IP是固定到物理网卡上的,VIP是浮动的。一旦某个节点出现了故障,其上运行的VIP会漂移到活着的节点上,可是活着的节点上的监听里找不到该VIP的地址。应用程序立马会感知到,并向其余VIP地址发起链接请求。捕获错误的时间大大缩短。
VIP漂移原理:假设有两个节点的RAC,分别是节点1和节点2。正常运行时节点1上有VIP1,节点2上有VIP2 ;当节点1发生故障,RAC 会作以下操做:
1) CRS 在检测到节点1异常后,会触发Clusterware 重构,最后把节点1剔除集群,由节点2组成新的集群。
2)RAC的Failover 机制会把节点1的VIP转移到节点2上(也就是VIP漂移),这时节点2的PUBLIC 网卡上就有3个IP 地址: VIP一、VIP二、PUBLIC IP2。
3)用户对VIP1的链接请求会被IP层路由转到节点2。
4)由于在节点2上有VIP1的地址,全部数据包会顺利经过路由层、网络层、传输层。
5)可是节点2上只监听VIP2和PUBLIC IP2的两个IP地址。并无监听VIP1,故应用层没有对应的程序接收这个数据包,这个错误当即被捕获。
6)客户端可以当即接收到这个错误,以后客户端会从新发起向VIP2的链接请求。VIP2就自动接管交易处理。
2.2 脑裂
在集群环境中,节点间须要心跳机制了解彼此的健康情况,假如心跳出了故障,就会出现脑裂。这时每一个节点还在正常运行,每一个节点都会认为其余节点都不复存在,本身是惟一的幸存者,以后就会控制整个集群。数据是共享的,若是每一个节点都想控制独享,势必会破坏共享数据的完整性和一致性。这样的情况就是脑裂。
为了解决这个脑裂问题,经过投票机制,得到高票数或是最先到达的得到投票,幸存,其余节点被踢出。Oracle RAC中的Voting Disk用来记录节点间成员状态,出现脑裂时,仲裁哪一个节点得到控制权,其余的节点被剔除。
2.3 IO隔离
IO隔离是上一个问题的延伸,投票机制虽然已经判断出哪一个成节点该得到集群掌控权,哪些节点被剔除,但仅仅这样作是不够的,还必须保证被剔除的节点不能操做共享数据。为了限制已踢出节点对共享数据的访问,必须进行IO隔离。Oracle RAC采起的是直接重启故障节点。
3.RAC测试案例
上文介绍了RAC的原理以及三个特性,下面我将重点讲解“如何在测试中测试RAC的有效性”。
3.1 测试案例1名称:RAC有效性测试-异常关机
测试目的:
验证系统数据库RAC中的一个节点发生故障后,另外一个节点可否自动接管交易处理;以及故障恢复后,节点处理能力可否恢复正常。
测试方法:
1)使用HP LoadRunner模拟客户发压,按照混合模型的比例,以被测试系统最大处理能力的50%做为负载压力向被测试系统施压,待系统稳定运行5分钟;
2)在某一台数据库服务器上手工执行halt -q(不一样OS命令有区别),模拟异常宕机;
3)继续稳定运行5分钟;
4)恢复故障节点,同时启动该节点上的Oracle 实例;
5)继续稳定运行5分钟;
6)执行回切操做。
预期测试结果:
1)步骤3后被测试系统数据库RAC切换成功,切换过程当中,交易响应时间延长
2)切换后VIP漂移到另外一个实例;
3)交易在1分钟内可以100%恢复正常,交易错误率、响应时间均知足测试指标,各主机资源使用正常;
4)步骤5后故障节点恢复后,该节点实例不接管交易,链接也不恢复,该实例不处理交易;
5)步骤7后执行回切操做后,服务器状态恢复为初始状态,交易由原主机处理并稳定运行。
实际测试结果:
LoadRunner整体趋势图
节点1: CPU趋势图
节点2:CPU趋势图
查看VIP是否漂移,当节点1故障后,查看节点2的网卡上有节点1的VIP地址,说明节点1的VIP地址漂移到节点2的网卡上。
测试结果分析:
从上述测试结果的图表和日志截图能够清楚的看到:节点1模拟宕机后,RAC切换成功,节点1的VIP 漂移至节点2;TPS降低,交易有少许失败,40秒内TPS彻底恢复。
恢复节点1后,交易由原主机节点1处理并稳定运行。
测试结果符合预期结果,测试结果经过。
3.2 测试案例2名称:RAC有效性测试-停实例(shutdown abort)
测试目的:
考察系统在必定并发下,手动异常中止一个数据库实例后,另外一个数据库实例可否自动接管交易处理;以及故障恢复后,节点处理能力可否恢复正常。
测试方法:
1)使用测试工具LoadRunner发压,按照混合测试场景中交易的比例,以被测试系统最大处理能力的50%做为负载压力向被测试系统施压,稳定运行5分钟;
2)手动(shutdown abort)中止一个数据库实例,场景持续运行5分钟;
3)启动中止的数据库实例,场景持续运行5分钟;
4)执行回切操做,场景持续运行5分钟。
预期测试结果:
1.步骤2手动中止数据库实例后,另外一节点实例会很快接收请求(Failover机制生效)。切换后停掉实例的节点,CPU、IO降低;正常接收交易实例的节点,CPU、IO上升。MTTR(平均失效恢复时间)小于1分钟,失效交易处理能力恢复水平99.99%;
2.步骤3重启中止节点实例后,链接正常,与切换后保持一致;
3.执行回切操做后,服务器状态恢复为初始状态,交易由原主机处理, 并稳定运行。
实际测试结果:
LoadRunner整体趋势图
节点1:128.196.36.22 CPU利用率图
节点2:128.196.36.25 CPU利用率图
测试结果分析:
1)手动中止节点1实例后,节点2实例会很快(2秒内)接收请求。停掉实例的节点1 ,CPU、IO降低,接收交易的节点2,CPU、IO上升;交易有少许失败,在20秒内TPS彻底恢复;
2)重启节点1实例后,AP为长链接,该实例的链接不恢复;交易不受影响;
3)执行回切操做后,TPS降低,交易有少许失败,40秒内TPS彻底恢复,交易由原主机节点1处理,并稳定运行;
4)实际测试结果符合预期结果,测试结果经过。
3.3 测试案例3名称:AC有效性测试-心跳网络异常
测试目的:
验证数据库RAC中的心跳网络(主备网卡置down)异常后,另外一节点可否自动接管交易处理;以及故障恢复后,节点处理能力可否恢复正常。
测试方法:
1)使用测试工具LoadRunner发压,按照混合模型的比例以被测试系统最大处理能力的50%做为负载压力向被测试系统施压;
2)场景平稳运行5分钟时,将节点1的网卡置down,观察各交易错误率、处理能力、响应时间及各主机资源状况;验证VIP是否能够正常切换;
3)恢复该节点心跳主备网卡,重启CRS,交易稳定运行5分钟,观察被测试系统交易恢复状况;
4)场景结束,分析和记录测试结果。
预期测试结果:
1)步骤2后,实例名权重大的实例重启,主机不重启;
2)步骤3后,CRS能正常启动,数据库可正常启动并加入RAC。
实际测试结果:
TPS趋势图
节点1:CPU趋势图
节点2:CPU趋势图
测试结果分析
1)宕掉节点1的心跳主备网卡,出现脑裂,节点2实例重启,CRS重启,节点2的VIP漂移到节点1;TPS降低,交易有少许失败,在50秒内TPS彻底恢复至100%。
2)节点1心跳主备网卡故障恢复后,VIP回漂,数据库可正常启动并加入RAC,交易不受影响。
3)实际测试结果符合预期结果,测试结果经过。
从以上三个案例能够看出:若是其中某个节点发生故障,RAC可以自动切换到另一个节点上,无单点故障问题。