วันจันทร์ที่ 13 กรกฎาคม พ.ศ. 2552

เปิด firewall policy อย่างไรกับ Oracle RAC


connect โดยใช้ VIP แล้ว
เวลาที่ cluster ตอบกลับ มันจะใช้ Public IP หรือ VIP ตอบกลับมาครับ เพราะน้องเขาต้องไปเปิด โพรีซีของพวกไฟร์วอลนะครั

นั่นเป็นคำถามที่ คนทำ Oracle RAC DBA อาจจะสงสับว่า ความจริงเป็นอย่างไร... แน่นอนถ้าเรา install Oracle RAC โดยที่ไม่ได้ มีการปรับปรุงไรเลย
นั่นเป็นสิ่งที่ผิดจริงหรือ ไม่

ลอง lsnrctl services แล้วลองดูว่า เห็นอะไร

$ lsnrctl services...Service "service1" has 2 instance(s).
Instance "db1", status READY, has 1 handler(s) for this service...
Handler(s):"DEDICATED" established:2 refused:0 state:ready
REMOTE SERVER(ADDRESS=(PROTOCOL=TCP)(HOST=rac01)(PORT=1521))
Instance "db2", status READY, has 2 handler(s) for this service...Handler(s):"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER(ADDRESS=(PROTOCOL=TCP)(HOST=rac02)(PORT=1521))
"DEDICATED" established:8316 refused:0 state:readyLOCAL SERVER

นี่คือ default ที่ install เรียบร้อย เมื่อลอง TCPDUMP เพื่อจำ packets จากคำถามข้างบน
จะเห็นว่าตอนแรกนั้น client ติดต่อที่ VIP จริงแต่พอใช้งานไม่ใช่ แล้วดันไปใช้ที่ Public IP

client -> rac01-vip:1521..
client -> rac01:1521.
.
.


อย่างนี้ FailOver=ON ก็ไม่โอเคแน่นอน เพราะมันไม่ได้ใช้ VIP ดังนั้น เมื่อ node down ย่อมมีปัญหา (Firewall ต้องเปิดทั้ง VIP + Public IP)

ถ้า ศึกษาจาก Expert จะรู้ว่า client ต้องติดต่อ RAC Database ด้วย VIP ส่วนของ RAC servers เองต้อง register listener ที่ VIP ไม่ใช่ Public IP (metalink: มองว่าการ register listener ด้วย Public IP เป็นบัก จากการใช้ netca และ oracle tools ตอนสร้าง Listener)

กลับมาเรื่องของเรา ผมได้แก้ไขเกี่ยวกับ Listener อย่างคร่าวๆ เพื่อให้ register listener กับ VIP
-> listener.ora

rac01:
LISTENER_rac01 =
(DESCRIPTION_LIST =
(DESCRIPTION =(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01-vip)(PORT = 1521)(IP = FIRST)))
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01)(PORT = 1521)(IP = FIRST))))
)

rac02:
LISTENER_rac02 =
(DESCRIPTION_LIST =
(DESCRIPTION =(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02-vip)(PORT = 1521)(IP = FIRST)))
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02)(PORT = 1521)(IP = FIRST)))
))

-> tnsnames.ora on both nodes

LISTENERS_DB =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02-vip)(PORT = 1521))
)

LISTENERS_rac01 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac01-vip)(PORT = 1521))
)

LISTENERS_rac02 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac02-vip)(PORT = 1521))
)

-> DATABASE


rac01:

SQL> show parameter listener

NAME TYPE VALUE
-----------------------------------------------------------------
local_listener string LISTENERS_rac01
remote_listener string LISTENERS_DB

rac02:
SQL> show parameter listener

NAME TYPE VALUE
-----------------------------------------------------------------
local_listener string LISTENERS_rac02
remote_listener string LISTENERS_DB

จากนั้นเช็ค lsnrctl services
$ lsnrctl services
.
.
Service "service1" has 2 instance(s).
Instance "db1", status READY, has 1 handler(s) for this service...
Handler(s):"DEDICATED" established:2 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=rac01-vip)(PORT=1521))
Instance "db2", status READY, has 2 handler(s) for this service...Handler(s):"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER(ADDRESS=(PROTOCOL=TCP)(HOST=rac02-vip)(PORT=1521))
"DEDICATED" established:8316 refused:0 state:readyLOCAL SERVER


โอเค และทดสอบอีกครั้งด้วย TCPDUMP
client -> rac01-vip:1521..
client -> rac01-vip:1521.
.
.

ซึ่งตอนนี้ไม่เห็น Packets ที่ใช้ Public IP อีกแล้ว(งั้นเปิด firewall ที่ VIP เป็นอันพอ)...
นี่เป็นสิ่งที่ Oracle RAC DBA เรียนรู้และพัฒนาไอเดีย ;)




ไม่มีความคิดเห็น: