最近使用VirtualBox搭建了RAC測試環境,一共建立了4個虛拟機,如下:
vm1: RouterOS,路由系統,虛拟機通路外網的網關,同時支援不同内網中的虛拟機互訪
網卡1, 橋接網卡, 連接配接主控端網卡, 192.168.31.88/24
網卡2, 内部網絡, 連接配接LAN01, 用于RAC Public網絡, 172.16.1.254/24
網卡3, 内部網絡, 連接配接LAN02, 用于RAC Private網絡, 10.0.0.254/24
vm2:Openfiler, iSCSI共享存儲服務
網卡1, 内部網絡, 連接配接LAN01, 172.16.1.99/24
網卡2, 内部網絡, 連接配接LAN02, 10.0.0.99/24
vm3: OEL-6.8_x86-64, 安裝Oracle RAC 節點1
網卡1, 内部網絡, 連接配接LAN01, 172.16.1.1/24
網卡2, 内部網絡, 連接配接LAN02, 10.0.0.1/24
vm4: OEL-6.8_x86-64, 安裝Oracle RAC 節點2
網卡1, 内部網絡, 連接配接LAN01, 172.16.1.2/24
網卡2, 内部網絡, 連接配接LAN02, 10.0.0.2/24
節點1 VIP 172.16.1.11
節點2 VIP 172.16.1.22
SCAN IP 172.16.1.100
與RouterOS網卡1橋接的主控端網卡IP位址為192.168.31.40
RAC測試環境部署完成後,檢查各項服務和監聽均運作正常,之後進行用戶端連接配接測試:
1. 在RouterOS中添加DST-NAT條目
192.168.31.88:15211 -->172.16.1.11:1521
192.168.31.88:15212 -->172.16.1.22:1521
192.168.31.88:15210--> 172.16.1.100:1521
2. 在主控端上安裝了PL/SQL程式,修改tnsnames.ora檔案,通過Connect TimeConnection Failover方式連接配接:
mydb =
(DESCRIPTION=
(FAILOVER=ON)
(ADDRESS_LIST=
(LOAD_BALANCE=OFF)
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.31.88)(PORT=15211))
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.31.88)(PORT=15212))
)
(CONNECT_DATA=(SERVICE_NAME=mydb))
)
連接配接成功。
修改tnsnames.ora,通過Runtime Connection Failover方式連接配接:
mydb-scan =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST=192.168.31.88)(PORT=15210))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb)
(FAILOVER_MODE =
(TYPE = session)
(METHOD = basic)
(RETRIES = 180)
(DELAY = 5)
)
)
)
無論是SQL*PLUS還是PL/SQL均連接配接失敗,提示資訊為:連接配接逾時,ORA-12170,Google了半天,幾乎把所有解決方法都試了一遍,仍然沒找到問題所在,看來很可能是目前測試環境造成的,沒辦法先開個Server2008的虛拟機(Oracle伺服器,IP位址172.16.1.30),由于這台伺服器屬于内部網絡LAN01,不通過RouterOS進行位址映射,需要對tnsnames.ora稍做改動:
mydb-scan =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST=172.16.1.100)(PORT=1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb)
(FAILOVER_MODE =
(TYPE = session)
(METHOD = basic)
(RETRIES = 180)
(DELAY = 5)
)
)
)
使用SQL*PLUS連接配接成功,看來十有八九和網絡環境有關了。
使用指令tcpdump –nn port 1521 看了下連接配接成功的資料包,發現前幾個資料包是172.16.1.30和172.16.1.100收發的,第14個包是用戶端(172.16.1.30)向172.16.1.11發送的SYN包,之後的資料包都是這兩個位址在傳輸。
同樣指令檢視了下通過主控端連接配接,并且失敗情況下傳輸的資料,發現前13個資料包是主控端和172.16.1.100收發的,之後再無捕獲資料包,仔細想了下,如果存在第14個資料包,應該是主控端向172.16.1.11或172.16.1.22發送的SYN包,但主控端上并沒有到172.16.1.0/24這個網絡的路由存在,肯定會發送失敗了,使用以下指令在主控端上添加路由即可:
C:\>route –p add 172.16.1.0 mask 255.255.255.0 192.168.31.88
添加後再次連接配接成功。