เพิ่ม Interface ให้ KVM Guest สำหรับ Oracle Exadata มีขั้นตอนอย่างไร
เมื่อมิชิเกียงได้รับบัญชาให้เพิ่ม tagged VLAN interface สำหรับเพิ่ม IP วงใหม่ให้ Exadata
ขอกล่าวทักทายทุกท่านที่หลงเข้ามาค่ะ เราชื่อเกียง ปัจจุบันเป็น Database Administrator อยู่ที่บริษัท Sirisoft แต่ละวันของ DBA ก็มีงานต่าง ๆ กันไป maintenance บ้าง migrate บ้าง ช่วงหลัง ๆ ได้แตะ Exadata มากขึ้น และครั้งหนึ่งก็เคยลองเพิ่ม tagged VLAN interface ให้ DB Exadata ค่ะ
ตามปรกติ บน Environment ทั่วไปอย่างใน Oracle VM หากต้องการให้ database มีอีกสัก IP ก็คงลั่น nmtui แล้ว fix IP ให้เลยใช่ไหมล่ะคะ แต่สำหรับ Exadata ที่ตัวเครื่องเป็น host แบบ KVM (Kernel-based Virtual Machine) มันไม่ง่ายดายขนาดนั้นน่ะสิ! เลยอยากจะนำวิธีที่ใช้เพิ่มสำเร็จมาแบ่งปันค่ะ(☆▽☆)(☆▽☆)
อารัมภบท
KVM คืออะไร?
Kernel-based Virtual Machine (KVM) เป็นเทคโนโลยีแบบ virtualization (ระบบเสมือน) ที่ทำให้ Host machine หนึ่ง ๆ สามารถรัน VM หลาย ๆ ตัวได้ โดยจะมอง VM แต่ละตัวเป็น Guest
Kernel — ส่วนประกอบหลักอย่างหนึ่งของ OS ที่สามารถควบคุมการทำงานของระบบคอมพิวเตอร์ บริหาร resource และทำหน้าที่ติดต่อระหว่าง Hardware และ Software
โครงสร้างของ KVM Architecture จะเป็นประมาณภาพด้านล่างนี้ค่ะ
Hardware — Physical Hardware ต่าง ๆ เช่น CPU, RAM, Disk
Host Kernel — มี KVM Hypervisor ฝังอยู่ใน host OS สิ่งนี้เป็นตัวที่ทำให้ visualization ทำงานในประสิทธิภาพใกล้เคียงกับ raw hardware
KVM— (Kernel-based Virtual Machine) ตัวควบคุม computer server สามารถจัดสรร resource เพื่อแบ่ง workload ให้กับแต่ละ VM การตั้งค่าส่วนใหญ่ของบทความนี้จะดำเนินการที่นี่ค่ะ
QEMU— (Quick Emulator) คอยติดต่อกับ KVM ใน Kernel สามารถจำลองระบบ หน่วยประมวลผล ให้กับ device อื่น รวมถึงบริหารจัดการ VMs และอื่น ๆ
Guest Kernel— เป็น Guest OS ที่อาจมีมากกว่า 1 VM โดย VM เหล่านี้สามารถถูก manage ผ่านทาง Host ได้
Apps — Management Application, Software, user processes, etc.
อธิบาย Environment & เป้าหมาย
เรามี database แบบ non-cdb เวอร์ชัน 19c อยู่ชุดหนึ่ง — เป็น RAC ที่มี 2 instances
RAC — Real Application Cluster เทคโนโลยีที่ทำให้ผู้ใช้งานสามารถเข้าถึง DB แบบ single instance ได้จากหลาย server โดย DB ที่เข้าถึงจากแต่ละ server ล้วนใช้ที่เก็บข้อมูลร่วมกัน
- Instance แรก UAT01 อยู่ที่ KVM Host ตัวแรก
- Instance ที่สอง UAT02 อยู่ที่ KVM Host อีกตัว
เราอยากจะเพิ่ม IP อีกวงให้ KVM Guest โดยจะเพิ่มให้แค่ KVM Guest ตัวแรกที่มี UAT01 อยู่ ฉะนั้นจะไม่กล่าวถึง Instance ที่สองหรือ KVM Host อีกตัวที่ host UAT02 ต่อในบทความนี้ค่ะヾ(@⌒ー⌒@)ノヾ(@⌒ー⌒@)ノ
หลักการโดยคร่าว
- Backup guest config file
- สร้าง bonded interface & bridge
- Allocate bridge
- Restart Guest ผ่าน Host
- เพิ่ม IP บน Guest
อ้างอิงจาก documentation ของ Oracle, layout ทั่วไปอาจเป็นประมาณนี้
พอทำแบบ tagged VLAN, layout จะเป็นประมาณนี้ค่ะ
Requirement
- Tagged VLAN ต้องมี DNS และ IP
- มี KVM deploy บน Exadata ไว้อยู่ก่อนแล้ว
- Tagged VLAN ต้องสร้างบน KVM Host เท่านั้นแล้วถึงไป map interface ใน KVM Guest (จะไม่สร้างบน guest ค่ะ)
- มีการ allow host-based tagged VLAN อยู่ก่อนแล้วเรียบร้อย
เริ่ม implement กันเลย
- Backup guest configuration file เก็บไว้เผื่อกรณีต้อง rollback action
2. สร้าง Tagged bonded interface และ bridge
#creation
vm_maker --add-bonded-bridge <BOND_NAME> --first-slave <ethX> --second-slave <ethY> --vlan <VLANID>
Note: สามารถดูว่า interface ไหนเป็นของ bonded ไหนได้จากการ
cat
ไฟล์ อันเป็นผลมาจากคำสั่งนี้ค่ะls -lhrt /etc/sysconfig/network-scripts
3. หลังสร้างแล้ว ใช้คำสั่ง ip addr show
จะเห็น bonded interface และ bridge ดังภาพล่าง
4. Allocate สิ่งที่สร้างไปเมื่อครู่กับ KVM Guest
#allocation
vm_maker --allocate-bridge <BOND_NAME> --vlan <VLANID> --domain [GUEST_NAME]
Note: สามารถดู bridge configuration ได้ด้วยคำสั่ง
brctl show
ค่ะ
5. นำบรรทัดนี้ไปเพิ่มในไฟล์ /etc/udev/rules.d/70-persistent-net.rules
ของ KVM Guest
ณ KVM Guest
ตัวอย่างการเพิ่มไฟล์จะเป็นดังภาพล่างนี้ค่ะ
6. [optional] หากที่ KVM Guest มี database อยู่ก็ควรปิดให้เรียบร้อยก่อนนะคะ จะได้ไม่มี transaction ค้างอยู่จนต้องถูก abort ออกไป ┗|`O′|┛┗|`O′|┛
ของเราเป็น RAC มี 2 instances จึงจะใช้คำสั่งนี้ในการปิดค่ะ
#stop db services on both sites
srvctl stop database -d DB_NAME
#check cluster status
crsctl stat res -t
ณ KVM Host
7. รีสตาร์ท KVM Guest ผ่าน KVM Host
vm_maker --stop-domain [GUEST_NAME]
vm_maker --start-domain [GUEST_NAME]
ณ KVM Guest
8. เพิ่ม IP ใหม่ให้ Guest ได้โดยรัน command นี้ค่ะ
/opt/oracle.cellos/ipconf.pl -nocodes
จะมี prompt nameserver, timezone และ NTP Server ขึ้นมา หากไม่ต้องการแก้ไขอะไรก็เคาะ enter
เพื่อใช้ค่า default ที่มันแนะนำได้เลยค่ะ
จากนั้นมีแสดงข้อมูล interface ทั้งหมดที่มีตั้งค่าไว้อยู่แล้วบนเครื่อง
จากภาพจะเห็นว่ามี IP วง SCAN, Management, Backup และ Replication เป็น Net Type ต่าง ๆ config เอาไว้แล้ว ในที่นี้เราจะใช้
beth90
ซึ่งยังไม่ได้ config เพื่อเพิ่มให้เป็น interface อีกตัวของเครื่องนี้ค่ะจากนั้นก็เพิ่ม IP ที่ได้รับมา (allow FWแล้ว), เพิ่ม GW, และเลือก type ของ network interface ค่ะ
เนื่องจากเรามีวง SCAN และ Management ไว้อยู่แล้ว ไม่สามารถตั้งซ้ำได้อีก เลยเลือก type เป็น
Other
ค่ะเราไม่ต้องการตั้งชื่อ hostname ใหม่จึงใส่
none
เข้าไปใน prompt ถัดมา
สำหรับ default GW เราใช้ bondeth0
ค่ะ หลังจาก enter
มันจะ repeat pattern คล้าย ๆ ช่วงแรกที่ให้เราดูอีกรอบ ต่างตรงที่รอบนี้ beth90
ได้ถูกตั้งค่าให้เป็น IP ใหม่ตามข้อมูลที่เราป้อนไปข้างต้นแล้วนั่นเอง
9. [optional] สืบเนื่องมาจากข้อ 6 หากที่ KVM Guest มี database อยู่ก็ควรเปิดกลับคืนมาค่ะ เราใช้คำสั่งนี้ในการเปิด ლ(╹◡╹ლ)ლ(╹◡╹ლ)
#start db services on both sites
srvctl start database -d DB_NAME
#check cluster status
crsctl stat res -t
จบกันไปแล้วสำหรับการเพิ่ม Tagged VLAN Interface ค่ะ ถึงงานแบบนี้จะไม่ค่อยเหมือน task ของ DBA เท่าไหร่ แต่ถ้าเรียนรู้ได้ก็จะทำให้การทำงานของเราคืบหน้าได้ไม่น้อยเลย
โอกาสหน้าหากมีอะไรสนุก ๆ จะแวะมาแบ่งปันอีกนะคะ! หากสนใจงาน DBA ไม่ว่าจะเป็น services หรือมาร่วมงานกับเราก็ติดต่อมาได้ตามช่องทางด้านล่างนี้เลยนะคะ ขอให้ทุกท่านโชคดีค่ะ (*^▽^*)(*^▽^*)