วันจันทร์ที่ 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 เรียนรู้และพัฒนาไอเดีย ;)




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