ในสภาพแวดล้อม Oracle Real Application Clusters (RAC) อินสแตนซ์หรือเซิร์ฟเวอร์ทั้งหมดสื่อสารกันโดยใช้การเชื่อมต่อระหว่างกันความเร็วสูงบนเครือข่ายส่วนตัว หากสมาชิกของอินสแตนซ์ใน RAC ไม่สามารถ ping หรือไม่สามารถเชื่อมต่อกันได้ผ่านการเชื่อมต่อส่วนตัวนี้ เซิร์ฟเวอร์ทั้งหมดที่กำลังทำงานอยู่ (และอินสแตนซ์ฐานข้อมูลบนเซิร์ฟเวอร์เหล่านั้น) อาจอยู่ในสภาวะที่เรียกว่า split-brain .
ในคลัสเตอร์ Oracle (ก่อนเวอร์ชัน Oracle RAC 12c รีลีส 2) เมื่อปัญหา asplit-brain เกิดขึ้นเนื่องจากปัญหาเครือข่ายหรือดิสก์ โหนดที่มีหมายเลขโหนดต่ำสุดจะรอดชีวิตในคลัสเตอร์ อย่างไรก็ตาม ด้วย Oracle RAC 12cRelease 2 ล่าสุด มีการเปลี่ยนแปลงในอัลกอริธึมโดยที่ระบบเลือก Candidatenodes ที่จะถูกขับออกสำหรับกรณีเฉพาะที่ split-brain ส่งผลให้เกิดการสร้างโหนดในจำนวนที่เท่ากันใน sub-cluster .
บล็อกโพสต์นี้ครอบคลุมการเปลี่ยนแปลงของอัลกอริธึมการขับโหนดใน OracleRAC 12c รีลีส 2 โดยอิงตามฟีเจอร์การถ่วงน้ำหนักโหนดใหม่
ข้อมูลเบื้องต้นเกี่ยวกับอัลกอริทึมการถ่วงน้ำหนักโหนด
รูปภาพต่อไปนี้แสดงอัลกอริทึมการถ่วงน้ำหนักโหนด
การถ่วงน้ำหนักโหนดใน Oracleที่มา:https://goo.gl/images/qarxrq
Node Weighting เป็นคุณลักษณะใหม่ที่นำมาใช้กับ Oracle RAC 12c Release 2 ซึ่งพิจารณาปริมาณงานที่โฮสต์ในคลัสเตอร์ระหว่างการฟันดาบ เมื่อเกิดการแยกสมองออกจากกัน Oracle Clusterware จะใช้กฎเกณฑ์บางอย่างเพื่อเลือกกลุ่มผู้รอดชีวิต และระบบอาจขับไล่โหนดที่ทำงานด้วยทรัพยากรที่สำคัญ เมื่อใช้คุณสมบัติใหม่นี้ เราสามารถกำหนดน้ำหนักให้กับโหนดบางโหนดและบันทึกโหนดไม่ให้ถูกยุติจากคลัสเตอร์
แท็กที่สร้างขึ้นใหม่ CSS\_CRITICAL
สามารถตั้งค่าในระดับหรือส่วนประกอบต่างๆ เพื่อทำเครื่องหมายว่า "สำคัญ" เพื่อให้คลัสเตอร์พยายามรักษาไว้ในกรณีที่เกิดความล้มเหลว เมื่อ Oracle Clusterware ตัดสินใจว่าจะกำจัดโหนดใดในกรณีที่สมองแตก CSS_CRITICAL
แท็กจะได้รับเกียรติตราบเท่าที่ไม่มีเหตุผลทางเทคนิคอื่นๆ ที่ห้ามการอยู่รอดของโหนด (โดยที่โหนดมีองค์ประกอบที่สำคัญอย่างน้อยหนึ่งองค์ประกอบในขณะที่เกิดความล้มเหลว) แนวคิดนี้ช่วยให้งานส่วนใหญ่ไม่ได้รับผลกระทบ หากทุกอย่างเท่าเทียมกัน
งานอัลกอริทึมการถ่วงน้ำหนักโหนด
อัลกอริทึมการถ่วงน้ำหนักโหนดทำงานดังต่อไปนี้:
- กำหนดน้ำหนักให้กับอินสแตนซ์ฐานข้อมูลหรือบริการ เราสามารถตั้งค่า
-css_critical
ถึงyes
ด้วย srvctl เพิ่มฐานข้อมูล หรือ srvctl เพิ่มบริการ คำสั่งเมื่อเราเพิ่มอินสแตนซ์ฐานข้อมูลหรือบริการ นอกจากนี้เรายังสามารถตั้งค่าหรือเปลี่ยนพารามิเตอร์ด้วย srvctl แก้ไขฐานข้อมูล และ srvctl แก้ไขบริการ คำสั่ง - กำหนดน้ำหนักให้กับทรัพยากรที่ไม่ใช่ ora.* เราใช้ -attr
CSS_CRITICAL=yes
พารามิเตอร์ด้วยคำสั่ง *crsctl add resource* และ *crsctl modified resource* เมื่อเราเพิ่มหรือแก้ไขทรัพยากร - กำหนดน้ำหนักให้กับเซิร์ฟเวอร์ เราตั้งค่า
-css_critical
พารามิเตอร์เป็นyes
ด้วย เซิร์ฟเวอร์ชุด crsctl คำสั่ง
ต่อไปนี้คือตัวอย่างการกำหนดน้ำหนักให้กับอินสแตนซ์ฐานข้อมูลหรือบริการ:
$srvctl modify database –d <dbname> css\_critical yes
$srvctl modify service –db <dbname> -service <service_name> css_critical yes
หากไม่ได้กำหนดน้ำหนักให้กับทรัพยากร อัลกอริทึมจะตรวจสอบข้อควรพิจารณาต่อไปนี้:
- โหนดใดสร้างบริการได้สูงสุด
- บริการซิงเกิลตันถูกสร้างขึ้นสำหรับอินสแตนซ์หรือไม่
- โหนดเป็นอินสแตนซ์ Flex ASM ที่กำหนดค่าไว้หรือไม่
- มีความล้มเหลวของเครือข่ายสาธารณะหรือไม่
- โหนดเป็นประเภทใด - ฮับหรือลีฟ
กรณีทดสอบ
คำแนะนำโค้ดต่อไปนี้จะตรวจสอบกรณีที่ bond2 ถูกใช้เป็นการเชื่อมต่อระหว่างกันแบบส่วนตัวสำหรับคลัสเตอร์แบบสองโหนด
$oifcfg getif
bond0 147.167.80.0 global public
bond2 10.168.33.32 global cluster\_interconnect
$olsnodes -s -n
node1 1 Active
node2 2 Active
$
$crsctl set server css\_critical yes
$crsctl get server css\_critical
CRS-5092: Current value of the server attribute CSS_CRITICAL is yes.
$
มาหยุด bond2 เพื่อจำลองความล้มเหลวในการสื่อสารระหว่าง node1 และ node2:
#ifdown bond2
$olsnodes -s -n
node1 1 Active
node2 2 Inactive
เอาต์พุตจาก OCSSD.trc
2018-01-09 11:01:21.220 : CSSD:1825834752: clssnmrCheckNodeWeight: node(1) has weight stamp(393228187) pebbles (0) goldstars (0) flags (3) SpoolVersion (0)
2018-01-09 11:01:21.220 : CSSD:1825834752: clssnmrCheckNodeWeight: node(2) has weight stamp(0) pebbles (0) goldstars (0) flags (0) SpoolVersion (0)
2018-01-09 11:01:21.727 : CSSD:1825834752: clssnmrCheckNodeWeight: node(1) has weight stamp(393228187) pebbles (0) goldstars (0) flags (3) SpoolVersion (0)
2018-01-09 11:01:21.727 : CSSD:1825834752: clssnmrCheckNodeWeight: node(2) has weight stamp(0) pebbles (0) goldstars (0) flags (0) SpoolVersion (0)
2018-01-09 11:01:21.727 : CSSD:1825834752: clssnmrCheckNodeWeight: Server pool version not consistent
2018-01-09 11:01:21.727 : CSSD:1825834752: clssnmrCheckNodeWeight: stamp(393228187), completed(1/2)
บทสรุป
เริ่มตั้งแต่ RAC 12c รีลีส 2 อัลกอริธึมใหม่จะตัดสินใจว่าโหนดจะถูกขับออกหรือถูกรักษาไว้ (ระหว่างสถานการณ์สมมติสมองแตก) ดังนี้:
-
หากคลัสเตอร์ย่อยมีขนาดต่างกัน ฟังก์ชันการทำงานจะเหมือนกับในรุ่นก่อนหน้า
-
หากคลัสเตอร์ย่อยทั้งหมดมีขนาดเท่ากัน ฟังก์ชันการทำงานได้รับการแก้ไขดังนี้:
- หากคลัสเตอร์ย่อยมีน้ำหนักโหนดเท่ากัน คลัสเตอร์ย่อยที่มีหมายเลขโหนดต่ำสุดจะอยู่รอดเพื่อให้แน่ใจว่าในคลัสเตอร์แบบสองโหนด โหนดที่มีหมายเลขโหนดต่ำสุดจะยังคงอยู่
- หากคลัสเตอร์ย่อยมีน้ำหนักโหนดไม่เท่ากัน คลัสเตอร์ย่อยที่มีน้ำหนักสูงกว่าจะอยู่รอดเพื่อให้แน่ใจว่าในคลัสเตอร์แบบสองโหนด โหนดที่มีหมายเลขโหนดต่ำสุดจะถูกขับออกเนื่องจากน้ำหนักที่ต่ำกว่า
การใช้การขับไล่โหนดตามน้ำหนักของเซิร์ฟเวอร์ทำให้เราสามารถควบคุมกลไกการกู้คืนความล้มเหลวของ OracleClusterware ได้มากขึ้นโดยการเลือกโหนดคลัสเตอร์ที่ควรยุติหรือขับไล่ในกรณีที่สมองแตก หากคุณมีคำถามหรือต้องการคำแนะนำในหัวข้อนี้ คุณสามารถเพิ่มความคิดเห็นในช่องด้านล่างได้