詳解Oracle RAC 的“HA”和“LB”及如何用腳本測(cè)試負(fù)載均衡
概述
今天主要介紹一下ORACLE RAC的“HA”和“LB”概念,以及分享一個(gè)腳本測(cè)試一下RAC是否兩個(gè)節(jié)點(diǎn)有平均負(fù)載到。
1、相關(guān)概念
- HA:High Availiablity 高可用
- LB:Load balance 負(fù)載均衡,把負(fù)載均衡的分配到集群中的各個(gè)節(jié)點(diǎn),從而提供整體的吞吐能力。
可用性是指一個(gè)系統(tǒng)可用時(shí)間的比率。
一般使用“平均故障間隔時(shí)間(MTTF)” 和 “平均故障修復(fù)時(shí)間(MTTR)”作為評(píng)價(jià)可用的度量標(biāo)準(zhǔn)。
公式:
可用性=MTTF/(MTTF+MTTR)
如果一個(gè)服務(wù)器連續(xù)運(yùn)行6個(gè)月出現(xiàn)了一次故障,修復(fù)使用了20分鐘,那么可用性為:
6個(gè)月/(6個(gè)月+20分鐘)*100=99.92%
2、Rac(Real application cluster)

2.1、Failover(故障轉(zhuǎn)移)
Rac的高可用技術(shù)基礎(chǔ)是Failover,就是指集群中任何一個(gè)節(jié)點(diǎn)的故障都不會(huì)影響用戶使用,可以***程度的解決單節(jié)點(diǎn)的故障,接到故障節(jié)點(diǎn)的用戶會(huì)被自動(dòng)轉(zhuǎn)移到健康節(jié)點(diǎn),用戶感知不到這種故障切換。
2.2、SCAN(single client access name)
SCAN-VIP是oracle 11gR2引入的一個(gè)非常重要的特性,通過(guò)它可以實(shí)現(xiàn)負(fù)載均衡的連接到數(shù)據(jù)庫(kù)實(shí)例,scan提供統(tǒng)一的名稱來(lái)訪問(wèn)集群,不需要像10g那種在每個(gè)訪問(wèn)數(shù)據(jù)庫(kù)的客戶端配置多個(gè)vip地址實(shí)現(xiàn)負(fù)載均衡。
添加和刪除節(jié)點(diǎn)的情況下也不需要對(duì)客戶端做任何配置修改,就可以實(shí)現(xiàn)所有節(jié)點(diǎn)的負(fù)載均衡。
PS:SCAN只能實(shí)現(xiàn)負(fù)載均衡,自動(dòng)Failover,需要使用service服務(wù)。
3、監(jiān)聽(tīng)及TAF
3.1、監(jiān)聽(tīng)
本地監(jiān)聽(tīng):公有IP和VIPSCAN監(jiān)聽(tīng):SCAN VIP
3.2、TAF(Transparent Application Faiover)透明應(yīng)用程序故障轉(zhuǎn)移
大部分的應(yīng)用系統(tǒng)(例如Tomcat)都是啟動(dòng)時(shí)就建立若干到數(shù)據(jù)庫(kù)的長(zhǎng)連接,在應(yīng)用程序調(diào)整生命周期內(nèi)重用這些鏈接。未提交事務(wù)會(huì)回滾。
鏈接建立以后,應(yīng)用系統(tǒng)運(yùn)行過(guò)程中,如果某個(gè)實(shí)例發(fā)生故障,鏈接到這個(gè)實(shí)例上的用戶會(huì)被自動(dòng)遷移到其他的健康實(shí)例上。
JDBC不支持TAF。
分為:
- client-side TAF(10g用的較多)
- server-sid TAF(11g常用)
4、測(cè)試服務(wù)端的TAF
- 使用TAF服務(wù)名/scan_ip進(jìn)行連接
- 查看當(dāng)前連接的實(shí)例是哪個(gè)(例如:rtbrac1)
- 查詢select instance_name from v$instance
- 直接shutdown -h now rtbrac1所在的服務(wù)器
- sqlplus端不用執(zhí)行exit退出,再次執(zhí)行select instance_name from v$instance,如果等會(huì)兒有返回,說(shuō)明已經(jīng)可以自動(dòng)進(jìn)行failover切換。
- 查看當(dāng)前scanip在哪個(gè)節(jié)點(diǎn)(應(yīng)該漂移到健康節(jié)點(diǎn))
5、腳本測(cè)試TAF服務(wù)端的負(fù)載均衡
1.shell執(zhí)行腳本(taf_load.sh)
- #!/bin/sh
- count=0
- while [ $count -lt $1 ]
- do
- count=`expr $count + 1`
- sqlplus -s glogowner/Q5$gEGy4@172.16.10.30:1521/otmdb @/home/oracle/scripts/test.sql
- done
2.SQL執(zhí)行腳本(test.sql)
- col instance_name format a20
- select instance_name from v$instance
- /
- exit;

3、執(zhí)行taf_load.sh(./taf_load.sh 1000 >> taf_load.log)
查看log對(duì)比兩個(gè)實(shí)力的連接負(fù)載情況
- [oracle@RFDB1 scripts]$ ./taf_load.sh 1000 >> taf_load.log
- [oracle@RFDB1 scripts]$ cat taf_load.log |grep "RFDB1" |wc -l
- 634
- [oracle@RFDB1 scripts]$ cat taf_load.log |grep "RFDB2" |wc -l
- 366
