这些天做11g的RAC实验,才发现oracle 11g的scan ip这个概念,当时在安装的时候,直接在host文件中加入了一条scan对应的解析,之后安装成功。之后才在网上搜了很多资料,自认为对scan ip有了一定的认识,只是身边每个讨论的人,也许有错误的地方,请看到的人不吝指正。
scan全程为simple client access name的缩写,并不是英文扫描的意思。这个功能是在Oracle 11gR2版本才有的。
这个功能的作用是:在服务器端和客户端之间增加了一层虚拟接口,原本客户端的tnsnames中为了实现负载均衡,需要同时注册多个节点服务器的侦听信息,这样,当服务器端增加或删除节点的时候,相应的服务器端的tnsnames文件就要做相应的维护,比如服务器端增加节点,要在客户端的tnsnames中增加该节点的侦听信息,删除节点则要在客户端的tnsnames中删除该节点的侦听信息。这是在11gR2之前的负载均衡实现方式。
scan与vip的区别
这种方式看起来挺好,但是,如果对于大型局域网,客户端有成百上千个,而且分布在各个地方,原本简单的事就不简单了。scan ip就是针对这一问题出现的,它是在服务器端和客户端之间建立一层虚拟访问层,客户端的tnsnames中只有scan ip的侦听信息,即客户端直接访问scan ip而不直接访问真实的服务器ip。而scan ip是浮动的,它和节点本身的vip的区别就在于,vip的监听程序是跟instance绑定的,设置vip的作用是,当节点宕机之后,vip会自动的跳到正常节点上,但是vip对应的监听程序并不会跳转,本来,如果不适用vip的话,原本连接到宕机节点上的程序就会得不到服务器回应,然后等待连接超时的时候走完,客户端再重试,重试一定次数仍然失败才会转到其他节点上,这个过程就相当耗时了。若果使用vip的话,节点宕机之后vip跳到正常节点上,原本访问宕机节点的程序请求就发送到了vip跳转的节点,该正常节点收到连接请求后直接给该端点返回错误信息,告知它原本访问的节点已经坏掉了,这是客户端就会使用tns中的其他地址。这个时间相对于不适用vip的时间要小很多。
而scan ip机制是ip跟对应的监听程序一起浮动,如果a节点宕机,则原本停留在该节点的scan ip和监听程序会一起跳转到其他可用节点上。因此对于客户端而言,就不需要更改原本的配置信息,只需要一直访问scan ip就可以正常使用数据库,至于scan ip跟真实的节点的对应关系,则是scan ip这层要关心和实现的
scan的实现方式
scan ip有两种实现方式,一种是DNS,一种是oracle自身提供的GNS(grid Naming Service)。其中GNS是针对DHCP方式的,即服务器端的vip和scan ip是动态分派的,具体什么的都没有研究,我只是看了DNS的实现方式。
因为host文件的域名解析方式不能实现一个域名和多个ip的对应,如果在host文件中有一个域名对应多个不同ip的解析行,则在域名解析的时候会只有第一行起作用。而DNS服务器却可以实现一个域名与多个ip的对应。并且DNS服务器使用 round-robin(轮叫调度)的算法进行多个ip之间的调度。
比如域名与ip的对应为
scan.scan.com 192.168.1.221
192.168.1.222
19 2.168.1.223
则cmd下使用nslookup scan.scan.com时,则连续多次解析出的结果的第一个ip会依次为221,222,223。从这个层面上看,也是实现了一定程度的负载均衡。
此外,oracle规定scan ip最多有3个,最少有1个。
DNS服务器的设置
首先说一下dns服务器的位置,dns服务器常理上位于独立于节点服务器的一台单独服务器上。它跟oracle服务器几乎没有联系,主要对所有的客户端提供域名解析服务。因此,所有客户端的DNS服务器地址需要是这台服务器的ip。但是,如果没有单独的服务器,也可以把DNS服务安装在节点上,不过,因为如果恰好DNS服务所在节点坏掉的话,会直接影响数据库的访问,所以,最好在所有的节点上都安装上DNS服务。
我是在window server 2003R2上做的dns,建好DNS服务器后,新建一个域名(这个域可以实际不存在),在这个域下新建主机,例如建立主机名scan,然后输入ip地址,依次建立三个同样主机名不同ip的对应DNS条目即可。
建好之后可以使用nslookup测试一下。
我的实验环境为两个节点,使用了DNS方式实现解析。因此,一个scan ip在一个节点,另外两个scan ip在另外一个节点上,但如果服务器端有超过3个节点,那这个scan ip不够分啊,是不是有的节点就不在工作了,不再参与负载均衡了,答案肯定是否定的,但那些没有分到scan ip的节点是怎么工作的呢?这个问题曾困扰了我一段时间。
现在我的理解是:
虽然scan ip浮动到某个节点上,但是并不是跟它所在的节点的实例绑定的,客户端访问域名解析出来的scan ip,则这个访问请求会在scan ip所在节点由scan层根据负载均衡机制进行处理,处理结果会确定这个请求被分配到那个vip,这个vip才是确定节点的关键。