Oracle中被忽略的好功能: Server Pool, Policy-Managed, RAC One Node - 1


         你是否熟悉主动/被动集群(active/passive cluster)的概念,如 HP ServiceGuard 和 IBM HACMP ? 这里简单说一下基本概念,主动/被动集群:任何时候都只有一台server拥有负载,辅助server以被动模式运行,时刻等待着主动服务器停机进而接管主服务器,对于数据库服务器而言,集群将在被动服务器上挂载磁盘并启动数据库实例。它还将IP地址(称为虚拟IP)移至被动服务器,这样,客户端实际上无需任何更改。集群会面临短暂停机,但很快会继续运转。并且被动服务器一直与主动服务器保持同步。

         RAC One Node 可以认为是主动/被动集群的一种,不过它的被动服务器又不是真正的闲置资源。在它的配置中,Oracle Clusterware 通过 ASM 创建一个使存储在多个节点都可见的集群。可以对这个概念进行扩展,以创建一种特殊类型的 RAC 数据库:一个节点上只运行一个实例(其他节点有此实例的一个或多个冷备模式存在)。如果某个节点发生故障,那么可以将另一个实例安排到集群中的其他节点上以继续处理。RAC One Node只有一个实例运行,不存在跨实例间通信,因此可能感受不到由此产生的性能问题(大家熟悉的GC问题)。

         这种实例的重定向是11gR2中Oracle Omotion在线移植工具与RAC one node新特性共同来完成的,一般Oracle实例重定向的时间少于20秒。这虽不是持续可用,但比严重的非计划故障要好很多。Oracle实例重定向功能很有意义,因为它比Data Guard使用更少的资源。对于实例重定向,一个备用服务器可以为几百个实例提供服务。备用服务器上也可以创建实例使其成为新数据库的主动服务器, 通过以这种方式使用许多数据库,可以创造一种负载平衡的假象(多数据库间的load balance, 而不是一个数据库的多个实例间的负载均衡),同时使所有这些数据库具有更好的可用性(都可以fail over)。

用于数据库的主动/被动节点的服务器组称为“服务器池”(server pool),服务器池有两种类型,在基本概念中会讲到。

1.  基本概念

1.1  Server Pool
       Server pools are logical divisions of a cluster into pools of servers, which are allocated to host databases or other applications. Server pools are managed using crsctl and srvctl commands.   Each server pool name must be unique within the cluster. You cannot have two server pools using the same name.

        默认情况下,在一个全新的安装之后会产生两个池:自由池(free pool)和通用池(generic pool),通用池用于向后兼容,它存储11.2版本以前的数据库或者11.2版本里管理员管理模式(admin-managed)的数据库。所有非指定的节点都分配给自由池。

        服务器池相互间是独占的,包含一些属性,比如最大最小的节点数、重要性(优先级)、名称。服务器池的重要性属性用来确保低优先级的工作量不会击败高优先级的来获得资源。将服务器从一个池重新分配到另一个池是可能的,这将在容量管理上发生有趣的情况。集群软件可以自动从其他服务器池中移动服务器来得知服务器池大小的最小要求。这些将在后面详细讲到。

1.1.1   Admin-Managed 
       我们在通过DBCA图形界面创建一个RAC数据库的时候,默认会手工指定将数据库实例运行在这个集群的哪几台主机上(或2台,或3台,或更多),那么只要在安装的时候选定了几台主机,那么以后除了手工增加或减少节点,数据库实例都只会运行在这几台机器上。这些在安装后都不会自动变化。这种就是我们常用的Admin-Managed方式,这一步在DBCA安装步骤中的Database Identification中设置。 简而言之就是,DBA指定数据库资源运行的所有服务器,并且按需手动放置资源。这是之前版本Oracle数据库使用的管理策略。 这几台指定的主机也被称为Server Pool, Oracle将它称为 "Generic Server Pool", 当我们使用DBCA或SRVCTL增加或删除一个admin-managed数据库时,Oracle RAC会创建或删除这个Server Pool。 

       对于RAC one node,假设一个Cluster(GI)有三台主机,如果选择Admin-Managed,创建四个RAC one node数据库,DB1,DB2,DB3,DB4,那么在创建DB1这个RAC one node数据库时,需要管理员指定DB1这个数据库建立在哪几个节点上(虽然它只是one node是active的,但它的一个或多个备用数据库也需要确定创建在哪些节点上),比如这里选择DB1创建在node1,node2,node3上,那么默认会在node1上创建DB1_1这样的实例,在node2,node3上不会有DB1_2及DB1_3类似这样的实例,甚至连对应的目录等信息都没有,只有在做failover或relocate的时候才会在其他节点配置这些信息并开启实例,但是在fail over后也只是在另外一个备用节点上开启一个实例,而不是多个,因为要保持rac one node,测试发现在GI上任意节点都可以发出relocate,实例名称也是交替出现,比如node1上DB1_1是active, 在任何一个节点发出 srvctl relocate database -d  DB1 -n node3,那么实例就会在node1上先关闭,在node3上启动,这时的实例名是DB1_2,如果在GI中任意节点再次发出relocate命令切换到其他节点,实例名又变回DB1_1,再次relocate又变成DB1_2,依此类推。 当然,这是人工relocate。出现异常时Oracle根据什么来判断切换到哪一个节点,需要测试一下,个人猜测是节点number离自己最近且较小的节点。 在哪个节点上执行的DBCA,本节点就一定会被使用,RAC one node中的active节点就在本地节点上。 
请使用浏览器的分享功能分享到微信等