基于Oracle的私有云架构探析(连载二)@【DTCC干货分享】

• RAC One Node

根据整合的数据库的SLA要求,还需要决定整合数据库所选用的数据库类型,在数据库的类型上,11GR2版本之前,要不是单实例要不是RAC,单实例不具有HA的功能,只能做冷的HA,通过使用类似HACMP之类的软件进行切换,有不可用时间,而且由于引入了第三方的HA软件,让整个架构、运维变得复杂,如果使用RAC架构,那么对于数据库整合来说,显得有点资源浪费,RAC要求至少是双节点,对于整合的数据库来说,一般都是非核心库,往往压力不大,对于高可用的需求也没有那么高,因此使用RAC显得有点浪费,那么有没有一种折中的方案呢?既然Oracle的ClusterWare一个很重要的功能就是为其上的资源提供监控、故障处理、故障切换服务,为什么不能在ClusterWare之上跑单节点的RAC,然后在发生故障后对资源进行尝试重启,如果重启不成功,在另外的节点再进行实例的拉起。RAC One Node就是这样一种技术,顾名思义,RAC One Node是单节点的RAC,它跑在GI之上,通过GI基础组件实现HA,借助于GI集群件,RAC One Node作为其上的资源在发生故障后,可以尝试进行重启或切换,这一切都会自动完成,而不需要人工干预。RAC One Node除了能做故障切换外,还可以实现有计划性的在线漂移。漂移过程中,会阶段性的存在2个实例,等旧实例上的事务都完成后会被关闭,然后新实例对外提供服务。客官可能会问,在线迁移有啥用?做了数据库的整合后,一台机器上可能跑的就是多个数据库实例了,如果发现某些机器上的负载比较高,那么就可以使用RAC One Node的在线迁移功能,把负载较高的主机上的一些实例在线的迁移到其他负载低的机器上。仔细想想,Oracle能做到这一点还挺不容易的,因为里面涉及到了一些技术细节,只是你还没认识到。11GR2之前,增加实例是一个复杂的过程:

增加了一个RAC 实例,需要经过上面一系列的繁琐的操作。但是11GR2后,RAC One Node的在线迁移,本质上其实就是Oracle自动在另外一个节点帮你增加了一个实例,而创建REDO THREAD,UNDO这些事情它都已经帮你做好了,不用DBA再去干预做什么。

不过这里需要强调,RAC One Node是单节点的RAC,在发生故障后才去做切换的,也就是cold failover,那么实例在发生故障后其实是有不可用的时间的,所以对于RAC One Node的使用场景就是那些对于可用性要求不是那么高的应用场景,毕竟对于任何企业来说,不是所有的数据库可用性要求都是零RTO,RPO,因此找对合适的应用场景,RAC One Node就大有用武之地,它占用的系统资源更少,整合的密度可以更大,而且具有HA。下面我会详细讲解下RAC One Node的几个特性:在线漂移、故障切换、弹性伸缩。

在线漂移

数据库一旦做了整合,一个主机之上就可能会有多个实例,实例之间可能会互相影响性能,如果DBA发现某台主机上的负载较高,或者由于其他原因需要对RAC One Node进行节点迁移,就可以使用RAC One Node的在线漂移功能,DBA通过命令人为的把数据库实例迁移到其他机器上运行,在迁移过中,RAC One Node会等待旧的实例上的事务完成,同时在目标机器上启动一个新实例,在迁移这段时间内,会有两个实例以active-active双活的模式运行,当旧实例上的事务都完成后,这些连接会被转移到新的实例上来,一旦所有的连接转移工作都完成后,旧实例会被关闭,整个转移过程也完成了。

RAC One Node的在线漂移时间窗口默认为30分钟,在这段时间内,Oracle会等待旧实例上的事务完成,如果超过这个时间窗口后,还有事务未完成,那么会被强制取消,实例也会被强制关闭,可以通过srvctl命令增加-w参数来增加或减少这个默认的时间窗口。

漂移的命令是通过srvctl来完成的,具体用法如下:

其中的参数机器说明如下:

• -d:数据库的名称

• -n:目标节点

• -w:等待旧实例事务完成的时间窗口

• -a:放弃失败的在线漂移

下面给出一个在线漂移的例子,让读者更为直观的感受一下在线漂移的过程。本例中会把oltp8从节点RAC2迁移到目标节点RAC1.首先观察一下数据库的当前状态是否正常:

oltp8为RAC One Node只有一个实例oltp8_1,当前运行在节点RAC2上,在线漂移的状态为INACTIVE。接下来我们对RAC One Node进行在线漂移,这是通过srvctl的relocate语法来完成的

漂移过程中,另开一个会话观察漂移的状态:

输出的信息非常的详细,oltp8_1这个实例正运行在RAC2上,ACTIVE关键字说明在线漂移也正在进行中,漂移的源端为RAC2,目标端为RAC1,并且目标端的实例名发生了变化:oltp8_2。

漂移完成后再查看状态,在线漂移状态已经为INACTIVE,实例oltp8_2也已经运行在新的节点上了

这里补充一个小细节,上面我已经提到过,这种在线漂移实例名是会发生变化,其实内部的操作就是在另外的节点帮我们自动的增加了一个实例,手工增加过实例的朋友都知道增加实例一般需要增加redo thread,增加undo表空间,那我们来看看,Oracle自动帮我们增加的实例有没有帮我们来搞定这些事

上面的内容显示,有2个undo表空间,undotbs1 是之前oltp8_1实例用的,而undotbs2是新增加的。不过遗憾的是,这个undo表空间比较小,一般难以满足我们的要求。这里告诉大家一个小技巧,可以创建完RAC One Node后,手工增加undo表空间和redo thread,Oracle非常的智能,下次做实例漂移,它会自动使用上你手工创建的这些redo thread和undo表空间了,而且大小也都符合你的要求。

同样,redo thread也都帮我们创建好了,包括对应的日志文件。

故障切换

RAC One Node不但可以做有计划性的在线漂移,同时对于主机等故障发生后,通过GI的HA组件把失败主机上的实例迁移到其他节点,不过这种迁移有不可用时间。 下面我们通过杀死CRS进程的方式,模拟主机故障,来观察RAC One Node的故障切换。

oltp8正在运行的节点1上,在节点1上杀掉CRS进程

在RAC2节点上观察数据库的状态,实例已经为not running状态。

通过crsctl stat命令查看故障切换是否已经发生

从crsctl stat res -t的输出可以清楚看到,集群正在RAC2节点上尝试拉起实例。过2分钟再次查看,数据库已经完成故障切换,整个过程不到五分钟,非常的棒!

虽然RAC One Node的HA是Cold Failover的,但是对于一些边缘、测试、开发环境,对于可用性要求不是那么高的环境,它都是一种非常好的整合方案。试想,有几个客户会把自己最为核心的数据库来进行整合呢?

RAC One Node扩展性

RAC和RAC One Node之间可以通过srvctl命令轻松的做转换,我们以把RAC One Node扩展成多个节点的RAC。这里给出转换的示例:

查看当前RAC One Node的运行状态

运行在RAC2节点上,运行状态正常。

使用srvctl convert命令进行转换,-c参数代表了要把RAC One Node扩展成标准的RAC。

转换完成后,查看数据库的实例状态

非常好,Oracle帮我们自动增加了实例,而且增加的实例已经启动。需要注意,笔者的测试环境为12C,如果为11GR2,增加的实例需要DBA手工去启动。

就这样轻松的完成了RAC One Node到RAC的转化。

同样我们看如何来“缩”,把RAC 转化为RAC One Node,同样通过srvctl 命令来完成,-c参数代表了把RAC“收缩”为RAC One Node.

提示有2个实例在运行,看来需要关闭一个实例才能进行RAC到RAC One Node的转化

转换完成后,再次查看数据库实例的状态

oltp8已经只有一个实例在运行了。

从上面的实验过程中可以看出,RAC One Node具有非常好的可用性、伸缩性,而且这一切的操作都非常的简便。

到这里你已经对RAC One Node有了一定了解,由于是以单实例的状态运行,而且还具有非常高的可用性,那么用来做数据库的整合太合适了,整合的密度可以很大,适用于那些对于可用性要求没有那么的高的开发、测试、QA、边缘系统。

12C CDB

12C出现了容器数据库CDB,虚拟化整合方案共享了宿主机,多实例整合方案共享了宿主机和OS,而12C的容器数据库共享了宿主机、OS和实例,共享的层次越多,内耗越少,性能越高,整合的密度就可以越大,但隔离性上会弱一些,一旦实例层面出现问题,所有的PDB都会出问题。Oracle通过在12C增强了Resource Manager的功能来进一步提供PDB之间的资源隔离实现。由于PDB的创建可以基于模板和克隆,因此资源供应速度上得到了很大的提升。12CR1版本,一个容器数据库最多支持252个PDB,到了12CR2版本已经增强到4096个。笔者所在公司-沃趣科技也一直在研发12C的相关数据库平台和产品,就我们的使用测试情况来看,12CR1版本的BUG还比较多,有些BUG在MOS上还没有记录,因此建议不要着急上12C,等12CR2发布后再做决定。

• 资源快速供应

资源快速供应是DBaaS出现之后延伸出来的一个概念,意在用户通过自服务的方式去快速的获取资源。以前数据库简直就是世界的中心,想申请一个数据库资源从项目的立项到最终获得资源,要经过相对漫长的时间,所有人都要围着它转,而DBaaS做为一个大的数据库平台,有着“无限”大的可用性能、可用容量,因此只需要用户在云平台之上点点鼠标,就能完成资源的获取,Oracle 12C出现的容器数据库让资源的获取更加的快速和便捷,它本身通过数据库的模板来快速提供PDB。要实现资源的快速供应,你需要:

• 有一个强大的硬件平台,比如一体机产品

• 有一个云平台,开发、测试、QA可以便捷的在云平台之上完成资源的申请和获取

• 决定使用何种技术提供资源,PDB? SCHEMA?DB?

目前我们沃趣科技也是在研发DBaaS云平台产品DBPool,在其上可以方便的完成资源的申请、获取、使用、下线,资源的整个生命周期都可以在平台之上完成,可以极大提升获取资源的敏捷性,为企业的数据库提供一个标准化的操作平台。

• 服务质量管理QoS

数据库做了整合之后,面临着几个问题:

• 资源隔离如何做,如果不做资源隔离,就难以保证数据库对外的服务质量,实例之间、PDB之间会互相影响

• 可不可以对资源进行灵活的调配,以满足不同业务,不同时间段的对资源的需求情况

• CPU资源隔离技术Instance Caging

我们首先来看第一个问题,资源隔离如何做,如果资源是无限的,就不需要对他们进行管理,资源隔离是DBaaS里一个非常重要的概念,也是每一个DBaaS平台都需要去解决的核心问题。

以前使用Oracle的方式大多都是一台机器跑一个实例,但是数据库一旦进行整合,一台机器可能就不是跑一个实例了,而是多个实例,实例一多,一个现实的问题摆在面前:资源隔离如何做?

为了保证每个数据库实例的服务质量,你需要提前对每个实例分配资源,在它的整个活跃周期内都不能跑出给它分配的数据库资源。如果资源不加以不加限制,就可能出现这样的情况:一个优先级非常低的业务由于应用程序BUG进而导致侵占了主机上的绝大部分CPU资源,最终导致主机上其他重要度高的应用受到非常大的影响,业务被降级。如下图:

Instance Caging就是这样的技术,用于CPU资源的管控,它能够管理CPU在实例间的分布,确保每个实例可以使用的CPU资源不跑出它的一亩三分地。

Instance Caging相对于其他资源管理的技术,例如操作系统的Cgroup,它具有一些天然的优势:

• Instance Caging是11GR2自带的功能,不需要额外安装软件

• 它是免费的,不需要支付额外的licence费用

• 由于是自带的功能,因此它能与Oracle数据库库高度的集成,可以感知到数据库内部的负载

• 最为重要的一点,它的使用特别的简便

关于Instance Caging使用特别简便这一点,请看下一节12C版本可以利用数据库的参数processor_group_name结合LINUX Cgroup来一起使用,这部分内容本文不做详细介绍。

待续

基于Oracle的私有云架构探析(连载一)@【DTCC干货分享】

原文发布于微信公众号 - 沃趣科技(woqutech)

原文发表时间:2016-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Puppet,Ansible,Saltstack 有哪些区别和联系

目前主流的自动化运维工具有puppet、ansible、saltstack,实际上每一个工具都基本上能够完成你的运维任务,也都是久经考验的。都有NB的地方,也有...

1612
来自专栏Java面试通关手册

Java多线程学习(七)并发编程中一些问题

我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailc...

1803
来自专栏做全栈攻城狮

GitHub这么火,程序员你不学学吗? 超简单入门教程干货2

本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制。帮助大家摆脱命令行工具,简单快速的使用GitHub。

792
来自专栏Golang语言社区

Golang协程与通道整理

协程goroutine 不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换。Go在底层进行协助实现 涉及系统调用的地方由Go标准库...

2737
来自专栏一名合格java开发的自我修养

交易系统使用storm,在消息高可靠情况下,如何避免消息重复

概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理。这个时候仅仅开启storm的ack机制并不能解...

1013
来自专栏Java面试笔试题

使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?

要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略);要提升更新数据...

1101
来自专栏左瞅瞅,右瞅瞅

DNS上线之路(五)——DNS视图

智能DNS是域名服务在业界首创的智能解析服务。能自动判断访问者的IP地址并解析出对应的IP地址,使网通用户会访问到网通服务器,电信用户会访问到电信服...

2444
来自专栏云加头条

腾讯云服务器配置不用愁 只需这几步

作为云计算服务的重要组成部分,云服务器以其简单高效、安全可靠、弹性扩展的特性成为核心力量,构建了包括计算、网络、存储在内的综合服务平台。以腾讯云服务器为例,CV...

24K7
来自专栏刺客博客

FinalShell: 优秀 SSH 客户端 / 堪比Xshell

7453
来自专栏Linyb极客之路

分布式事务的实现原理

事务是数据库系统中非常有趣也非常重要的概念,它是数据库管理系统执行过程中的一个逻辑单元,它能够保证一个事务中的所有操作要么全部执行,要么全不执行;在 SOA 与...

1603

扫码关注云+社区

领取腾讯云代金券