实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力。通常情况下有两种方式来实现负载均衡,一个是基于客户端连接的负载均衡,一个是基于服务器端监听器(Listener)收集到的信息来将新的连接请求分配到连接数较少实例上的实现方式(客户端负载均衡只是连接数上的负载均衡,而性能上负载均衡需要配置服务端负载均衡来实现)
客户端的负载均衡配置(客户端连接的负载均衡配置起来非常简单,与RAC数据库的实例负载和监听没有任何关系,因此也就不需要在集群节点进行任何设置,只要在客户端机器上的tnsnames.ora文件中添加负载均衡策略配置即可)
tnsnames.ora配置内容如下:
AZUAY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.76)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.94)(PORT = 1521))
(LOAD_BALANCE = yes) 启动了负载均衡功能
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = azuay)
(FAILOVER_MODE = failover_mode是实现故障转移的关键选项
(TYPE = session)
(METHOD = basic)
(RETRIES = 180) 表示重试次数
(DELAY = 5) 表示重试间隔时间
)
)
)
查看查看RAC数据库的service_names
SQL> show parameter service_names
NAME TYPE VALUE
---------------------- -------------- -------------
service_names string azuay
这里需要说明的是,在配置RAC负载均衡时,客户端连接的是RAC数据库的服务名,而不是实例名,也就是SERVICE_NAME必须设置为“SERVICE_NAME = azuay”
LOAD_BALANCE = yes表示程序走sword连接的时候,将在下面2个地址里面随机的选择一个,达到接点间连接均匀(如果未开启load_balance=yes时,Oracle Net会根据地址列表按顺序来选择一个进行连接,直到连接成功为止。
如果第一个host主机连接失败,在有多个地址的情形下,接下来选择第二个地址连接,依此类推,直到连接成功为止。
当开启了load_balance=yes时,则Oracle Net会从多个地址中随机地选择一个地址进行连接,直到连接成功为止。
注意,此连接方式仅根据地址列表随机选择,并不考虑到各个实例上当前真正连接数量的多少,也即是没有考虑各个节点真实的连接负载情况。)
failover表示开启TAF(Transparent Application Failover)特性,其中TYPE = SESSION表示当一个连接好的会话的实例发生故障,系统会自动将会话切换到其他可用的实例,前台应用无须再度发起连接,但会话正在执行的SQL需要重新执行,METHOD = BASIC表示初始连接就连接一个接点,他还有个选项是preconnect,表示初始连接所有的接点,在failover的时候可以很快就切过去,这个基本是资源浪费
FAILOVER_MODE配置项。这个条目有4个子项目需要定义
1.METHOD: 用户定义何时创建到其实例的连接,有BASIC 和 PRECONNECT 两种可选值。
BASIC: 是指在感知到节点故障时才创建到其他实例的连接。
PRECONNECT: 是在最初建立连接时就同时建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。
两种方法比较: BASIC方式在Failover时会有时间延迟,PRECONNECT方式虽然没有时间延迟,但是建立多个冗余连接会消耗更多资源,两者就是是用时间换资源和用资源换时间的区别。
2.TYPE: 用于定义发生故障时对完成的SQL 语句如何处理,有3种类型可选,分别是SESSION、SELECT和NONE
这3种方式对于未提交的事务都会自动回滚,区别在于对select 语句的处理,对于select,用户正在执行的select语句会被转移到新的实例上,在新的节点上继续返回后续结果集,而已经返回的记录集则抛弃。
假设用户正在节点1上执行查询,整个结果集共有100条记录,现在已从节点1上返回10条记录,这时节点1宕机,用户连接被转移到节点2上,如果是session模式,则需要重新执行查询语句;如果是select方式,会从节点2上继续返回剩下的90条记录,而已经从节点1返回的10条记录不会重复返回给用户,对于用户而言,感受不到这种切换。
显然为了实现select 方式,Oracle 必须为每个session保存更多的内容,包括游标,用户上下文等,需要更多的资源也是用资源换时间的方案。
NONE,这个是客户端默认值,表示禁止SQL接管功能。
3. DELAY 和 RETRIES: 这2个参数分别代表表示两次尝试之间等待的秒数和表示当前节点失败后,失败切换功能尝试连接备用节点的次数。
服务端的负载均衡配置
客户端的负载均衡解决了连接数据库的负载问题,但是由于连接是由客户端发起的,它并不知道RAC数据库集群中各个节点的繁忙状态和连接信息,因此负荷较大的节点仍然会增加新的连接,这样就可能导致RAC节点无法真正做到负载均衡。不过幸运的是,从Oracle 10g开始,服务器端负载均衡就可以根据RAC中各节点的负荷及连接数情况,将新的请求分配到集群中负载较低、连接数较少的节点上来,这样就从根本上实现了数据库的负载均衡,并且使客户端连接的负载均衡与服务器端的负载均衡可以配合使用,互不影响。
每个集群节点的负载情况是由PMON进程来定期更新的。PMON进程每3秒会将集群中每个节点的负载信息及连接数写入service_register中,当节点的负载发生变化时,将会立刻通知监听程序,最后由监听程序来决定将新的客户端连接分配到哪个节点上,通过这种方式,RAC数据库实现了真正的负载均衡
1:配置tnsnames.ora(服务器端的监听配置是在各节点的tnsnames.ora里面添加一个连接到各个节点监听的条目)
# LISTENERS_azuay,azuay是数据库名,可以使用netmgr,netca编辑或直接使用Vim创建
添加内容如下:
LISTENERS_azuay=
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.76)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.94)(PORT = 1521))
)
LISTENERS_azuay1 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.76)(PORT = 1521))
)
LISTENERS_azuay2 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.94)(PORT = 1521))
)
添加完成后各节点的tnsnames.ora内容如下:
# tnsnames.ora Network Configuration File: F:\oracle\product\10.2.0\client_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
azuay =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.76)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.94)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = azuay)
(FAILOVER_MODE =
(TYPE = session)
(METHOD = basic)
(RETRIES = 180)
(DELAY = 5)
)
)
)
azuay1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.76)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = azuay)
(instance_NAME = azuay1)
)
)
azuay2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.94)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = azuay)
(instance_NAME = azuay2)
)
)
LISTENERS_azuay=
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.76)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.94)(PORT = 1521))
)
LISTENERS_azuay1 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.76)(PORT = 1521))
)
LISTENERS_azuay2 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.94)(PORT = 1521))
)
2:配置参数文件remote_listener
查询参数文件
SQL> show parameter remote_listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_listener string
local_listener string
如果remote_listener的值为空,可以通过如下命令修改每个实例的remote_listener参数:
修改参数文件
SQL> alter system set remote_listener=' LISTENERS_azuay ' scope=both sid='*';
查询参数文件
SQL> show parameter remote_listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_listener string LISTENERS_azuay
local_listener string
这样,服务器端的负载均衡就配置完成了。
SQL> lsnrctl status
正确配置参数后,通过lsnrctl status命令看到在监听启动以后,可以看到监听器上有2个instance确配置参数后,通过lsnrctl status命令看到在监听启动以后,可以看到监听器上有2个instance
服务器段的负载均衡主要是通过REMOTE_LISTENER参数控制的,在连接被定位到某个接点后,系统会根据REMOTE_LISTENER考虑多个接点的负载(主机load是个很重要的参考标准),把连接再次分发出去,这个和客户段的load balance是可以结合
在一起混合使用的,互不干扰
服务器端的负载均衡需要配置remote_listener参数,而该参数的值依赖于tnsnames.ora的连接字符串
对于基于服务器端的连接负载均衡,监听器会根据当前节点、实例上的连接负载情况进行转发到空闲的实例
转发的依据仅仅是当前节点监听的连接数量的多少,而非当前实例的过度负载
RAC的负载均衡只和通过监听建立的连接数有关,而和其他因素没有关系。Oracle的这个负载均衡,只是连接数的均衡,而不是性能上的均衡(此为客户端负载均衡)