การปรับสมดุลโหลดเครือข่าย โหลดบาลานซ์คืออะไร? จะเลือกอะไรดี

ประเด็นของการวางแผนโหลดควรได้รับการตัดสินใจตั้งแต่ระยะเริ่มต้นของการพัฒนาโครงการเว็บใดๆ การ "ล่มสลาย" ของเซิร์ฟเวอร์ (และมักจะเกิดขึ้นโดยไม่คาดคิดในช่วงเวลาที่ไม่เหมาะสมที่สุด) เต็มไปด้วยผลที่ตามมาที่ร้ายแรงมาก - ทั้งทางศีลธรรมและทางวัตถุ ในตอนแรก ปัญหาประสิทธิภาพของเซิร์ฟเวอร์ไม่เพียงพอเนื่องจากการโหลดที่เพิ่มขึ้น สามารถแก้ไขได้โดยการเพิ่มพลังของเซิร์ฟเวอร์ หรือโดยการเพิ่มประสิทธิภาพอัลกอริธึมที่ใช้ รหัสโปรแกรม และอื่นๆ แต่ไม่ช้าก็เร็วเมื่อมาตรการเหล่านี้ไม่เพียงพอ

เราต้องใช้การทำคลัสเตอร์: เซิร์ฟเวอร์หลายเครื่องถูกรวมเข้าเป็นคลัสเตอร์ โหลดจะถูกกระจายระหว่างกันโดยใช้ชุดวิธีการพิเศษที่เรียกว่าการปรับสมดุล นอกเหนือจากการแก้ปัญหาการโหลดสูงแล้ว การทำคลัสเตอร์ยังช่วยให้แน่ใจว่าเซิร์ฟเวอร์มีความซ้ำซ้อนต่อกัน
ประสิทธิภาพของการจัดกลุ่มโดยตรงขึ้นอยู่กับวิธีการกระจายโหลด (สมดุล) ระหว่างองค์ประกอบคลัสเตอร์

การทำ Load Balancing ทำได้โดยใช้ทั้งฮาร์ดแวร์และ เครื่องมือซอฟต์แวร์- เราอยากจะพูดถึงวิธีการหลักและอัลกอริธึมของการปรับสมดุลในบทความนี้

ระดับความสมดุล

ขั้นตอนการปรับสมดุลดำเนินการโดยใช้อัลกอริธึมและวิธีการทั้งชุดที่สอดคล้องกับระดับของแบบจำลอง OSI ต่อไปนี้:
  • เครือข่าย;
  • ขนส่ง;
  • สมัครแล้ว

มาดูรายละเอียดระดับเหล่านี้กันดีกว่า

ปรับสมดุลในระดับเครือข่าย

กำลังปรับสมดุลอยู่ ระดับเครือข่ายเกี่ยวข้องกับการแก้ปัญหาต่อไปนี้: คุณต้องตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ที่แตกต่างกันรับผิดชอบต่อที่อยู่ IP หนึ่งรายการ เครื่องจักรทางกายภาพ- การปรับสมดุลนี้สามารถทำได้หลายวิธี

สมดุลในระดับการขนส่ง

การปรับสมดุลประเภทนี้เป็นวิธีที่ง่ายที่สุด: ไคลเอนต์ติดต่อกับบาลานเซอร์ ซึ่งจะเปลี่ยนเส้นทางคำขอไปยังเซิร์ฟเวอร์ใดเซิร์ฟเวอร์หนึ่งซึ่งจะประมวลผล การเลือกเซิร์ฟเวอร์ที่คำขอจะถูกประมวลผลสามารถดำเนินการได้ตามอัลกอริธึมที่หลากหลาย (ซึ่งจะกล่าวถึงด้านล่าง): โดยการค้นหาแบบ Round-robin แบบง่ายๆ โดยการเลือกเซิร์ฟเวอร์ที่โหลดน้อยที่สุดจากพูล ฯลฯ

บางครั้งก็สมดุลกัน ระดับการขนส่งยากที่จะแยกแยะจากการปรับสมดุลในระดับเครือข่าย ลองพิจารณาดู กฎถัดไปสำหรับ เครื่องป้องกันไฟกระชาก pf ในระบบ BSD: ตัวอย่างเช่น อย่างเป็นทางการที่นี่ เรากำลังพูดถึงเกี่ยวกับการรักษาสมดุลการรับส่งข้อมูลเฉพาะเจาะจง พอร์ต TCP(ตัวอย่างสำหรับตัวกรองเครือข่าย pf บนระบบ BSD):

Web_servers = "( 10.0.0.10, 10.0.0.11, 10.0.0.13 )" จับคู่ใน $ext_if proto tcp ไปยังพอร์ต 80 rdr-to $web_servers Round-robin Sticky-address

มันพูดถึงการปรับสมดุลการรับส่งข้อมูลบนพอร์ต TCP เฉพาะ

ตอนนี้เรามาดูตัวอย่างอื่น:

ส่งผ่าน $int_if จาก $lan_net \route-to ( ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) )\ Round-robin

กฎนี้พูดถึงการสร้างสมดุลการรับส่งข้อมูลขาออกในระดับเครือข่าย ไม่ได้ระบุพอร์ตเฉพาะหรือโปรโตคอลเฉพาะ

ความแตกต่างระหว่างระดับความสมดุลสามารถอธิบายได้ดังต่อไปนี้ ระดับเครือข่ายประกอบด้วยโซลูชันที่ไม่ยุติเซสชันผู้ใช้ พวกเขาเพียงแค่เปลี่ยนเส้นทางการรับส่งข้อมูลและไม่ทำงานในโหมดพร็อกซี
ในระดับเครือข่าย บาลานเซอร์เพียงตัดสินใจว่าเซิร์ฟเวอร์ใดที่จะส่งต่อแพ็กเก็ตไป เซสชันกับไคลเอนต์ดำเนินการโดยเซิร์ฟเวอร์

ที่เลเยอร์การขนส่ง การสื่อสารกับไคลเอนต์จะจำกัดอยู่ที่บาลานเซอร์ซึ่งทำงานเป็นพร็อกซี มีการโต้ตอบกับเซิร์ฟเวอร์ในนามของตนเอง โดยส่งข้อมูลเกี่ยวกับไคลเอนต์ในข้อมูลเพิ่มเติมและส่วนหัว นี่คือวิธีการทำงานของซอฟต์แวร์บาลานเซอร์ยอดนิยม HAProxy เป็นต้น

ปรับสมดุลในระดับการใช้งาน

เมื่อทรงตัวแล้ว ระดับการใช้งานบาลานเซอร์ทำงานในโหมด "พร็อกซีอัจฉริยะ" จะวิเคราะห์คำขอของลูกค้าและเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์ต่างๆ ขึ้นอยู่กับลักษณะของเนื้อหาที่ร้องขอ นี่คือวิธีการทำงานของเว็บเซิร์ฟเวอร์ Nginx โดยกระจายคำขอระหว่างส่วนหน้าและส่วนหลัง โมดูล Upstream มีหน้าที่รับผิดชอบในการปรับสมดุลใน Nginx คุณสามารถอ่านเพิ่มเติมเกี่ยวกับคุณสมบัติของการปรับสมดุล Nginx ตามอัลกอริธึมต่างๆ ได้ เป็นต้น

อีกตัวอย่างหนึ่งของเครื่องมือปรับสมดุลในระดับแอปพลิเคชันคือ pgpool ซึ่งเป็นเลเยอร์กลางระหว่างไคลเอนต์และเซิร์ฟเวอร์ PostgreSQL DBMS ด้วยความช่วยเหลือ คุณสามารถกระจายคำขอไปยังเซิร์ฟเวอร์ฐานข้อมูลโดยขึ้นอยู่กับเนื้อหา ตัวอย่างเช่น คำขออ่านจะถูกส่งไปยังเซิร์ฟเวอร์หนึ่ง และเขียนคำขอไปยังอีกเซิร์ฟเวอร์หนึ่ง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ pgpool และลักษณะเฉพาะของการทำงานได้ในบทความนี้)

การปรับสมดุลอัลกอริธึมและวิธีการ

มีอัลกอริธึมและวิธีการปรับสมดุลโหลดที่แตกต่างกันมากมาย เมื่อเลือกอัลกอริธึมเฉพาะ คุณต้องดำเนินการขั้นแรกจากข้อมูลเฉพาะของโครงการนั้น ๆ และประการที่สองจากเป้าหมาย ซึ่งเราวางแผนที่จะบรรลุเป้าหมาย

ในบรรดาเป้าหมายที่ใช้การปรับสมดุล ควรเน้นสิ่งต่อไปนี้:

  • ความยุติธรรม: คุณต้องแน่ใจว่ามีการจัดสรรทรัพยากรเพื่อดำเนินการแต่ละคำขอ ทรัพยากรระบบและป้องกันไม่ให้สถานการณ์เกิดขึ้นเมื่อคำขอหนึ่งได้รับการประมวลผลในขณะที่คำขออื่นทั้งหมดกำลังรอถึงตาของพวกเขา
  • ประสิทธิภาพ: เซิร์ฟเวอร์ทั้งหมดที่ประมวลผลคำขอจะต้องไม่ว่าง 100% ขอแนะนำให้หลีกเลี่ยงสถานการณ์ที่เซิร์ฟเวอร์ตัวใดตัวหนึ่งไม่ได้ใช้งานเพื่อรอคำขอสำหรับการประมวลผล (มาจองทันทีว่าในทางปฏิบัติจริงเป้าหมายนี้ไม่บรรลุเป้าหมายเสมอไป)
  • ลดเวลาในการดำเนินการแบบสอบถาม: คุณต้องแน่ใจว่ามีเวลาขั้นต่ำระหว่างเริ่มประมวลผลคำขอ (หรือวางไว้ในคิวเพื่อประมวลผล) และเสร็จสิ้น
  • ลดเวลาตอบสนอง: เราจำเป็นต้องลดเวลาตอบสนองต่อคำขอของผู้ใช้ให้เหลือน้อยที่สุด

เป็นที่พึงปรารถนาอย่างยิ่งว่าอัลกอริธึมการปรับสมดุลมีคุณสมบัติดังต่อไปนี้:

  • การคาดการณ์ได้: คุณต้องเข้าใจอย่างชัดเจนในสถานการณ์ใดและภายใต้โหลดใดอัลกอริทึมจะมีประสิทธิภาพในการแก้ปัญหาที่ได้รับมอบหมาย
  • ;
  • ความสามารถในการขยายขนาด: อัลกอริธึมจะต้องยังคงใช้งานได้เมื่อโหลดเพิ่มขึ้น

ตัวกลม โรบิน

Round Robin หรืออัลกอริธึมบริการแบบวงกลมเป็นการค้นหาแบบ Round-robin: คำขอแรกจะถูกส่งไปยังเซิร์ฟเวอร์หนึ่ง จากนั้นคำขอถัดไปจะถูกส่งไปยังอีกเซิร์ฟเวอร์หนึ่ง และต่อๆ ไปจนกระทั่ง เซิร์ฟเวอร์สุดท้ายแล้วทุกอย่างก็เริ่มต้นใหม่อีกครั้ง

การใช้งานอัลกอริทึมนี้ที่พบบ่อยที่สุดคือวิธีการปรับสมดุล DNS ของ Round Robin ดังที่คุณทราบ เซิร์ฟเวอร์ DNS ใด ๆ จะจัดเก็บคู่ "ชื่อโฮสต์ - ที่อยู่ IP" สำหรับแต่ละเครื่องในโดเมนเฉพาะ รายการนี้อาจมีลักษณะเช่นนี้ เช่น:

ตัวอย่าง.com xxx.xxx.xxx.2 www.example.com xxx.xxx.xxx.3

แต่ละชื่อในรายการสามารถมีที่อยู่ IP ได้หลายรายการที่เกี่ยวข้องกัน:

ตัวอย่าง.com xxx.xxx.xxx.2 www.example.com xxx.xxx.xxx.3 www.example.com xxx.xxx.xxx.4 www.example.com xxx.xxx.xxx.5 www.example. ดอทคอม xxx.xxx.xxx.6

เซิร์ฟเวอร์ DNS จะผ่านรายการทั้งหมดในตารางและส่งคืนแต่ละรายการ คำขอใหม่ที่อยู่ IP ต่อไปนี้: ตัวอย่างเช่นสำหรับคำขอแรก - xxx.xxx.xxx.2 สำหรับคำขอที่สอง - xxx.xxx.xxx.3 และอื่น ๆ เป็นผลให้เซิร์ฟเวอร์ทั้งหมดในคลัสเตอร์ได้รับการร้องขอในจำนวนเท่ากัน

ข้อได้เปรียบที่ไม่อาจปฏิเสธได้ของอัลกอริธึมนี้คือ ประการแรก ความเป็นอิสระของโปรโตคอล ระดับสูง- ในการทำงานกับอัลกอริธึม Round Robin จะใช้โปรโตคอลใด ๆ ที่เซิร์ฟเวอร์เข้าถึงได้โดยใช้ชื่อ
การปรับสมดุลตามอัลกอริธึม Round Robin ไม่ได้ขึ้นอยู่กับโหลดของเซิร์ฟเวอร์ แต่อย่างใด: การแคชเซิร์ฟเวอร์ DNS จะช่วยรับมือกับการไหลเข้าของไคลเอ็นต์

การใช้อัลกอริธึม Round Robin ไม่ต้องการการสื่อสารระหว่างเซิร์ฟเวอร์ ดังนั้นจึงสามารถใช้สำหรับการปรับสมดุลทั้งในระดับท้องถิ่นและระดับโลก
สุดท้ายนี้ โซลูชันที่ใช้อัลกอริธึม Round Robin มีต้นทุนต่ำ เพียงเพิ่มรายการบางส่วนใน DNS เพื่อให้เริ่มทำงานได้

อัลกอริธึม Round Robin ก็มีจำนวนเช่นกัน ข้อบกพร่องที่สำคัญข้อบกพร่อง เพื่อให้การกระจายโหลดโดยใช้อัลกอริธึมนี้เป็นไปตามเกณฑ์ความเป็นธรรมและประสิทธิภาพที่กล่าวถึงข้างต้น แต่ละเซิร์ฟเวอร์จะต้องมีชุดทรัพยากรที่เหมือนกัน การดำเนินการทั้งหมดต้องใช้ทรัพยากรจำนวนเท่ากันด้วย ในทางปฏิบัติจริง เงื่อนไขเหล่านี้โดยส่วนใหญ่แล้วจะไม่บรรลุผล

นอกจากนี้ เมื่อสร้างสมดุลโดยใช้อัลกอริธึม Round Robin ปริมาณงานของเซิร์ฟเวอร์เฉพาะในคลัสเตอร์จะไม่ถูกนำมาพิจารณาเลย ลองจินตนาการถึงสถานการณ์สมมุติต่อไปนี้: หนึ่งในโหนดโหลด 100% ในขณะที่โหนดอื่นโหลดเพียง 10 - 15% อัลกอริธึม Round Robin ไม่ได้คำนึงถึงความเป็นไปได้ของสถานการณ์ดังกล่าว ดังนั้นโหนดที่โอเวอร์โหลดจะยังคงได้รับคำขอ ในกรณีนี้ ไม่อาจพูดถึงความยุติธรรม ประสิทธิภาพ หรือความสามารถในการคาดเดาได้

เนื่องจากสถานการณ์ที่อธิบายไว้ข้างต้น ขอบเขตของการใช้อัลกอริธึม Round Robin จึงมีจำกัดมาก

โรบินกลมถ่วงน้ำหนัก

นี่เป็นเวอร์ชันปรับปรุงของอัลกอริธึม Round Robin สาระสำคัญของการปรับปรุงมีดังนี้: แต่ละเซิร์ฟเวอร์จะได้รับการกำหนดค่าสัมประสิทธิ์การถ่วงน้ำหนักตามประสิทธิภาพและพลังของมัน ซึ่งช่วยกระจายโหลดได้อย่างยืดหยุ่นมากขึ้น: เซิร์ฟเวอร์ที่มีน้ำหนักมากกว่าจะประมวลผลคำขอได้มากขึ้น อย่างไรก็ตาม การดำเนินการนี้ไม่ได้แก้ปัญหาทั้งหมดเกี่ยวกับความทนทานต่อข้อผิดพลาด วิธีการอื่นมีการปรับสมดุลที่มีประสิทธิภาพมากขึ้น โดยคำนึงถึงพารามิเตอร์จำนวนมากขึ้นเมื่อวางแผนและกระจายโหลด

การเชื่อมต่อน้อยที่สุด

ในส่วนก่อนหน้านี้ เราได้ระบุข้อเสียเปรียบหลักของอัลกอริธึม Round Robin ขอชื่ออีกครั้ง: ไม่คำนึงถึงจำนวนที่ใช้งานอยู่ ในขณะนี้การเชื่อมต่อ

ลองดูตัวอย่างการปฏิบัติ มีเซิร์ฟเวอร์สองเครื่อง เรียกพวกเขาว่า A และ B มีผู้ใช้ที่เชื่อมต่อกับเซิร์ฟเวอร์ A น้อยกว่าเซิร์ฟเวอร์ B ในเวลาเดียวกัน เซิร์ฟเวอร์ A มีโอเวอร์โหลดมากกว่า สิ่งนี้เป็นไปได้อย่างไร? คำตอบนั้นค่อนข้างง่าย: การเชื่อมต่อกับเซิร์ฟเวอร์ A จะถูกเก็บรักษาไว้เป็นเวลานานกว่าเมื่อเปรียบเทียบกับการเชื่อมต่อกับเซิร์ฟเวอร์ B

ปัญหาที่อธิบายไว้สามารถแก้ไขได้โดยใช้อัลกอริธึมที่เรียกว่าการเชื่อมต่อน้อยที่สุด (ตัวย่อว่าน้อยคอนน์) โดยคำนึงถึงจำนวนการเชื่อมต่อที่เซิร์ฟเวอร์รองรับในขณะนี้ คำถามต่อมาแต่ละข้อจะถูกส่งไปยังเซิร์ฟเวอร์ที่มีการเชื่อมต่อที่ใช้งานน้อยที่สุด

มีอัลกอริธึมเวอร์ชันปรับปรุงซึ่งมีจุดประสงค์เพื่อใช้ในกลุ่มซึ่งประกอบด้วยเซิร์ฟเวอร์ที่แตกต่างกันเป็นหลัก ลักษณะทางเทคนิคและ ประสิทธิภาพที่แตกต่างกัน- เรียกว่า Weighted Least Connections และเมื่อกระจายโหลด ไม่เพียงแต่คำนึงถึงจำนวนการเชื่อมต่อที่ใช้งานอยู่เท่านั้น แต่ยังรวมถึงค่าสัมประสิทธิ์การถ่วงน้ำหนักของเซิร์ฟเวอร์ด้วย

เวอร์ชันขั้นสูงอื่นๆ ของอัลกอริทึมการเชื่อมต่อน้อยที่สุด ได้แก่ การจัดกำหนดการการเชื่อมต่อน้อยที่สุดตามท้องถิ่น และการจัดกำหนดการการเชื่อมต่อน้อยที่สุดตามท้องถิ่นด้วยการจัดกำหนดการการจำลอง

วิธีแรกถูกสร้างขึ้นโดยเฉพาะสำหรับการแคชพร็อกซีเซิร์ฟเวอร์ สาระสำคัญของมันมีดังนี้: จำนวนมากที่สุดคำขอจะถูกส่งไปยังเซิร์ฟเวอร์ที่มีการเชื่อมต่อที่ใช้งานน้อยที่สุด หลังละ เซิร์ฟเวอร์ไคลเอนต์มีการกำหนดกลุ่ม IP ไคลเอ็นต์ คำขอจาก IP เหล่านี้จะถูกส่งไปยังเซิร์ฟเวอร์ "ดั้งเดิม" หากไม่ได้โหลดอย่างสมบูรณ์ มิฉะนั้น คำขอจะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์อื่น (ควรโหลดน้อยกว่าครึ่งหนึ่ง)

ในอัลกอริทึมการจัดกำหนดการการเชื่อมต่อน้อยที่สุดตามท้องถิ่นด้วยอัลกอริทึมการจัดกำหนดการการจำลอง แต่ละที่อยู่ IP หรือกลุ่มของที่อยู่ IP จะไม่ถูกกำหนดให้กับ เซิร์ฟเวอร์แยกต่างหากแต่อยู่เบื้องหลังเซิร์ฟเวอร์ทั้งกลุ่ม คำขอถูกส่งไปยังเซิร์ฟเวอร์ที่โหลดน้อยที่สุดในกลุ่ม หากเซิร์ฟเวอร์ทั้งหมดจากกลุ่ม "ดั้งเดิม" มีการใช้งานมากเกินไป เซิร์ฟเวอร์ใหม่จะถูกสงวนไว้ เซิร์ฟเวอร์ใหม่นี้จะถูกเพิ่มในกลุ่มที่ให้บริการ IP ที่มีการร้องขอ ในทางกลับกัน เซิร์ฟเวอร์ที่โหลดมากที่สุดจากกลุ่มนี้จะถูกลบ เพื่อหลีกเลี่ยงการจำลองแบบซ้ำซ้อน

กำหนดการแฮชปลายทางและกำหนดการแฮชต้นทาง

อัลกอริธึมการกำหนดเวลาแฮชปลายทางถูกสร้างขึ้นเพื่อทำงานกับคลัสเตอร์ของพร็อกซีแคช แต่มักใช้ในกรณีอื่น ในอัลกอริทึมนี้ เซิร์ฟเวอร์ที่ประมวลผลคำขอจะถูกเลือกจากตารางแบบคงที่ตามที่อยู่ IP ของผู้รับ

อัลกอริธึม Source Hash Scheduling ยึดตามหลักการเดียวกับหลักการก่อนหน้า เฉพาะเซิร์ฟเวอร์ที่จะประมวลผลคำขอเท่านั้นที่ถูกเลือกจากตารางตามที่อยู่ IP ของผู้ส่ง

เซสชันที่ติดหนึบ

Sticky Sessions เป็นอัลกอริทึมสำหรับกระจายคำขอที่เข้ามา ซึ่งการเชื่อมต่อจะถูกถ่ายโอนไปยังเซิร์ฟเวอร์เดียวกันในกลุ่ม ตัวอย่างเช่นใช้ในเว็บเซิร์ฟเวอร์ Nginx เซสชันผู้ใช้สามารถกำหนดให้กับเซิร์ฟเวอร์เฉพาะโดยใช้วิธีแฮช IP ( ข้อมูลรายละเอียดเกี่ยวกับเรื่องนี้ โปรดดูเอกสารอย่างเป็นทางการ) ด้วยวิธีนี้ คำขอจะถูกกระจายไปยังเซิร์ฟเวอร์ตามที่อยู่ IP ของไคลเอ็นต์ ตามที่ระบุไว้ในเอกสารประกอบ (ดูลิงก์ด้านบน) "วิธีนี้ช่วยให้มั่นใจได้ว่าคำขอจากไคลเอนต์เดียวกันจะถูกส่งไปยังเซิร์ฟเวอร์เดียวกัน" หากเซิร์ฟเวอร์ที่กำหนดให้กับที่อยู่เฉพาะไม่พร้อมใช้งาน คำขอจะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์อื่น ตัวอย่างของส่วนย่อยของไฟล์การกำหนดค่า:

แบ็กเอนด์อัปสตรีม ( ip_hash; เซิร์ฟเวอร์ backend1.example.com; เซิร์ฟเวอร์ backend2.example.com; เซิร์ฟเวอร์ backend3.example.com; เซิร์ฟเวอร์ backend4.example.com; )

ตั้งแต่เวอร์ชัน 1.2.2 ใน Nginx คุณสามารถระบุน้ำหนักสำหรับแต่ละเซิร์ฟเวอร์ได้

วิธีนี้มีปัญหาบางประการ ปัญหาเกี่ยวกับการผูกเซสชันอาจเกิดขึ้นหากไคลเอนต์ใช้ IP แบบไดนามิก ในสถานการณ์ที่ จำนวนมากคำขอต้องผ่านพร็อกซีเซิร์ฟเวอร์ตัวเดียว การปรับสมดุลแทบจะเรียกได้ว่ามีประสิทธิภาพและยุติธรรมไม่ได้เลย อย่างไรก็ตาม ปัญหาที่อธิบายไว้สามารถแก้ไขได้โดยใช้คุกกี้ ใน รุ่นเชิงพาณิชย์ Nginx มีโมดูลเหนียวพิเศษที่ใช้คุกกี้เพื่อปรับสมดุล เขาก็มี อะนาล็อกฟรี- ตัวอย่างเช่น nginx-sticky-module
คุณสามารถใช้วิธี Sticky-sessions ใน HAProxy ได้ - คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ เช่น

บทสรุป

บทความนี้เป็นข้อมูลเบื้องต้นเกี่ยวกับการปรับสมดุลโหลด เราจะอภิปรายหัวข้อนี้ต่อไปในสิ่งพิมพ์ในอนาคต หากคุณมีคำถาม ความคิดเห็น หรือข้อมูลเพิ่มเติม ยินดีต้อนรับสู่ความคิดเห็น เราจะขอบคุณหากคุณแบ่งปันเรื่องไม่สำคัญ ตัวอย่างการปฏิบัติการจัด Load Balance ให้กับโครงการต่างๆ

ผู้อ่านที่ไม่สามารถแสดงความคิดเห็นที่นี่ได้ด้วยเหตุผลใดก็ตาม จะได้รับเชิญให้เข้าสู่บล็อกของเรา

แท็ก:

  • โหลดบาลานซ์
  • เลือก
  • เลือก
เพิ่มแท็ก

ประเด็นของการวางแผนโหลดควรได้รับการตัดสินใจตั้งแต่ระยะเริ่มต้นของการพัฒนาโครงการเว็บใดๆ การ "ล่มสลาย" ของเซิร์ฟเวอร์ (และมักจะเกิดขึ้นโดยไม่คาดคิดในช่วงเวลาที่ไม่เหมาะสมที่สุด) เต็มไปด้วยผลที่ตามมาที่ร้ายแรงมาก - ทั้งทางศีลธรรมและทางวัตถุ ในตอนแรก ปัญหาประสิทธิภาพของเซิร์ฟเวอร์ไม่เพียงพอเนื่องจากการโหลดที่เพิ่มขึ้น สามารถแก้ไขได้โดยการเพิ่มพลังของเซิร์ฟเวอร์ หรือโดยการเพิ่มประสิทธิภาพอัลกอริธึมที่ใช้ รหัสโปรแกรม และอื่นๆ แต่ไม่ช้าก็เร็วเมื่อมาตรการเหล่านี้ไม่เพียงพอ

เราต้องใช้การทำคลัสเตอร์: เซิร์ฟเวอร์หลายเครื่องถูกรวมเข้าเป็นคลัสเตอร์ โหลดจะถูกกระจายระหว่างกันโดยใช้ชุดวิธีการพิเศษที่เรียกว่าการปรับสมดุล นอกเหนือจากการแก้ปัญหาการโหลดสูงแล้ว การทำคลัสเตอร์ยังช่วยให้แน่ใจว่าเซิร์ฟเวอร์มีความซ้ำซ้อนต่อกัน
ประสิทธิภาพของการจัดกลุ่มโดยตรงขึ้นอยู่กับวิธีการกระจายโหลด (สมดุล) ระหว่างองค์ประกอบคลัสเตอร์

การทำโหลดบาลานซ์สามารถทำได้โดยใช้ทั้งเครื่องมือฮาร์ดแวร์และซอฟต์แวร์ เราอยากจะพูดถึงวิธีการหลักและอัลกอริธึมของการปรับสมดุลในบทความนี้

ระดับความสมดุล

ขั้นตอนการปรับสมดุลดำเนินการโดยใช้อัลกอริธึมและวิธีการทั้งชุดที่สอดคล้องกับระดับของแบบจำลอง OSI ต่อไปนี้:
  • เครือข่าย;
  • ขนส่ง;
  • สมัครแล้ว

มาดูรายละเอียดระดับเหล่านี้กันดีกว่า

ปรับสมดุลในระดับเครือข่าย

การปรับสมดุลในระดับเครือข่ายเกี่ยวข้องกับการแก้ปัญหาต่อไปนี้: คุณต้องตรวจสอบให้แน่ใจว่าเครื่องจริงที่แตกต่างกันรับผิดชอบต่อที่อยู่ IP ของเซิร์ฟเวอร์เครื่องเดียว การปรับสมดุลนี้สามารถทำได้หลายวิธี

สมดุลในระดับการขนส่ง

การปรับสมดุลประเภทนี้เป็นวิธีที่ง่ายที่สุด: ไคลเอนต์ติดต่อกับบาลานเซอร์ ซึ่งจะเปลี่ยนเส้นทางคำขอไปยังเซิร์ฟเวอร์ใดเซิร์ฟเวอร์หนึ่งซึ่งจะประมวลผล การเลือกเซิร์ฟเวอร์ที่คำขอจะถูกประมวลผลสามารถดำเนินการได้ตามอัลกอริธึมที่หลากหลาย (ซึ่งจะกล่าวถึงด้านล่าง): โดยการค้นหาแบบ Round-robin แบบง่ายๆ โดยการเลือกเซิร์ฟเวอร์ที่โหลดน้อยที่สุดจากพูล ฯลฯ

บางครั้งการปรับสมดุลที่เลเยอร์การขนส่งเป็นเรื่องยากที่จะแยกแยะจากการปรับสมดุลที่เลเยอร์เครือข่าย พิจารณากฎต่อไปนี้สำหรับตัวกรองเครือข่าย pf ในระบบ BSD: ตัวอย่างเช่น อย่างเป็นทางการเรากำลังพูดถึงการปรับสมดุลการรับส่งข้อมูลบนพอร์ต TCP เฉพาะ (ตัวอย่างสำหรับตัวกรองเครือข่าย pf ในระบบ BSD):

Web_servers = "( 10.0.0.10, 10.0.0.11, 10.0.0.13 )" จับคู่ใน $ext_if proto tcp ไปยังพอร์ต 80 rdr-to $web_servers Round-robin Sticky-address

มันพูดถึงการปรับสมดุลการรับส่งข้อมูลบนพอร์ต TCP เฉพาะ

ตอนนี้เรามาดูตัวอย่างอื่น:

ส่งผ่าน $int_if จาก $lan_net \route-to ( ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) )\ Round-robin

กฎนี้พูดถึงการสร้างสมดุลการรับส่งข้อมูลขาออกในระดับเครือข่าย ไม่ได้ระบุพอร์ตเฉพาะหรือโปรโตคอลเฉพาะ

ความแตกต่างระหว่างระดับความสมดุลสามารถอธิบายได้ดังต่อไปนี้ ระดับเครือข่ายประกอบด้วยโซลูชันที่ไม่ยุติเซสชันผู้ใช้ พวกเขาเพียงแค่เปลี่ยนเส้นทางการรับส่งข้อมูลและไม่ทำงานในโหมดพร็อกซี
ในระดับเครือข่าย บาลานเซอร์เพียงตัดสินใจว่าเซิร์ฟเวอร์ใดที่จะส่งต่อแพ็กเก็ตไป เซสชันกับไคลเอนต์ดำเนินการโดยเซิร์ฟเวอร์

ที่เลเยอร์การขนส่ง การสื่อสารกับไคลเอนต์จะจำกัดอยู่ที่บาลานเซอร์ซึ่งทำงานเป็นพร็อกซี มีการโต้ตอบกับเซิร์ฟเวอร์ในนามของตนเอง โดยส่งข้อมูลเกี่ยวกับไคลเอนต์ในข้อมูลเพิ่มเติมและส่วนหัว นี่คือวิธีการทำงานของซอฟต์แวร์บาลานเซอร์ยอดนิยม HAProxy เป็นต้น

ปรับสมดุลในระดับการใช้งาน

เมื่อปรับสมดุลที่ระดับแอปพลิเคชัน บาลานเซอร์จะทำงานในโหมด "พร็อกซีอัจฉริยะ" จะวิเคราะห์คำขอของลูกค้าและเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์ต่างๆ ขึ้นอยู่กับลักษณะของเนื้อหาที่ร้องขอ นี่คือวิธีการทำงานของเว็บเซิร์ฟเวอร์ Nginx โดยกระจายคำขอระหว่างส่วนหน้าและส่วนหลัง โมดูล Upstream มีหน้าที่รับผิดชอบในการปรับสมดุลใน Nginx คุณสามารถอ่านเพิ่มเติมเกี่ยวกับคุณสมบัติของการปรับสมดุล Nginx ตามอัลกอริธึมต่างๆ ได้ เป็นต้น

อีกตัวอย่างหนึ่งของเครื่องมือปรับสมดุลในระดับแอปพลิเคชันคือ pgpool ซึ่งเป็นเลเยอร์กลางระหว่างไคลเอนต์และเซิร์ฟเวอร์ PostgreSQL DBMS ด้วยความช่วยเหลือ คุณสามารถกระจายคำขอไปยังเซิร์ฟเวอร์ฐานข้อมูลโดยขึ้นอยู่กับเนื้อหา ตัวอย่างเช่น คำขออ่านจะถูกส่งไปยังเซิร์ฟเวอร์หนึ่ง และเขียนคำขอไปยังอีกเซิร์ฟเวอร์หนึ่ง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ pgpool และลักษณะเฉพาะของการทำงานได้ในบทความนี้)

การปรับสมดุลอัลกอริธึมและวิธีการ

มีอัลกอริธึมและวิธีการปรับสมดุลโหลดที่แตกต่างกันมากมาย เมื่อเลือกอัลกอริธึมเฉพาะ คุณต้องดำเนินการขั้นแรกจากข้อมูลเฉพาะของโครงการนั้น ๆ และประการที่สองจากเป้าหมาย ซึ่งเราวางแผนที่จะบรรลุเป้าหมาย

ในบรรดาเป้าหมายที่ใช้การปรับสมดุล ควรเน้นสิ่งต่อไปนี้:

  • ความยุติธรรม: จำเป็นเพื่อให้แน่ใจว่าทรัพยากรระบบได้รับการจัดสรรเพื่อประมวลผลคำขอแต่ละรายการ และเพื่อป้องกันไม่ให้สถานการณ์เกิดขึ้นเมื่อคำขอหนึ่งถูกประมวลผลในขณะที่คำขออื่นๆ ทั้งหมดกำลังรออยู่ในแถว
  • ประสิทธิภาพ: เซิร์ฟเวอร์ทั้งหมดที่ประมวลผลคำขอจะต้องไม่ว่าง 100% ขอแนะนำให้หลีกเลี่ยงสถานการณ์ที่เซิร์ฟเวอร์ตัวใดตัวหนึ่งไม่ได้ใช้งานเพื่อรอคำขอสำหรับการประมวลผล (มาจองทันทีว่าในทางปฏิบัติจริงเป้าหมายนี้ไม่บรรลุเป้าหมายเสมอไป)
  • ลดเวลาในการดำเนินการแบบสอบถาม: คุณต้องแน่ใจว่ามีเวลาขั้นต่ำระหว่างเริ่มประมวลผลคำขอ (หรือวางไว้ในคิวเพื่อประมวลผล) และเสร็จสิ้น
  • ลดเวลาตอบสนอง: เราจำเป็นต้องลดเวลาตอบสนองต่อคำขอของผู้ใช้ให้เหลือน้อยที่สุด

เป็นที่พึงปรารถนาอย่างยิ่งว่าอัลกอริธึมการปรับสมดุลมีคุณสมบัติดังต่อไปนี้:

  • การคาดการณ์ได้: คุณต้องเข้าใจอย่างชัดเจนในสถานการณ์ใดและภายใต้โหลดใดอัลกอริทึมจะมีประสิทธิภาพในการแก้ปัญหาที่ได้รับมอบหมาย
  • ;
  • ความสามารถในการขยายขนาด: อัลกอริธึมจะต้องยังคงใช้งานได้เมื่อโหลดเพิ่มขึ้น

ตัวกลม โรบิน

Round Robin หรืออัลกอริธึมแบบ Round-Robin คือการค้นหาแบบ Round-Robin โดยคำขอแรกจะถูกส่งไปยังเซิร์ฟเวอร์หนึ่ง จากนั้นคำขอถัดไปจะถูกส่งไปยังอีกเซิร์ฟเวอร์หนึ่ง และต่อไปเรื่อยๆ จนกระทั่งถึงเซิร์ฟเวอร์สุดท้าย จากนั้นทุกอย่างจะเริ่มต้นใหม่อีกครั้ง

การใช้งานอัลกอริทึมนี้ที่พบบ่อยที่สุดคือวิธีการปรับสมดุล DNS ของ Round Robin ดังที่คุณทราบ เซิร์ฟเวอร์ DNS ใด ๆ จะจัดเก็บคู่ "ชื่อโฮสต์ - ที่อยู่ IP" สำหรับแต่ละเครื่องในโดเมนเฉพาะ รายการนี้อาจมีลักษณะเช่นนี้ เช่น:

ตัวอย่าง.com xxx.xxx.xxx.2 www.example.com xxx.xxx.xxx.3

แต่ละชื่อในรายการสามารถมีที่อยู่ IP ได้หลายรายการที่เกี่ยวข้องกัน:

ตัวอย่าง.com xxx.xxx.xxx.2 www.example.com xxx.xxx.xxx.3 www.example.com xxx.xxx.xxx.4 www.example.com xxx.xxx.xxx.5 www.example. ดอทคอม xxx.xxx.xxx.6

เซิร์ฟเวอร์ DNS จะผ่านรายการทั้งหมดในตารางและให้ที่อยู่ IP ต่อไปนี้สำหรับคำขอใหม่แต่ละรายการ: ตัวอย่างเช่นสำหรับคำขอแรก - xxx.xxx.xxx.2 สำหรับคำขอที่สอง - xxx.xxx.xxx.3 และอื่น ๆ เป็นผลให้เซิร์ฟเวอร์ทั้งหมดในคลัสเตอร์ได้รับการร้องขอในจำนวนเท่ากัน

ข้อได้เปรียบที่ไม่อาจปฏิเสธได้ของอัลกอริธึมนี้คือ ประการแรก ความเป็นอิสระจากโปรโตคอลระดับสูง ในการทำงานกับอัลกอริธึม Round Robin จะใช้โปรโตคอลใด ๆ ที่เซิร์ฟเวอร์เข้าถึงได้โดยใช้ชื่อ
การปรับสมดุลตามอัลกอริธึม Round Robin ไม่ได้ขึ้นอยู่กับโหลดของเซิร์ฟเวอร์ แต่อย่างใด: การแคชเซิร์ฟเวอร์ DNS จะช่วยรับมือกับการไหลเข้าของไคลเอ็นต์

การใช้อัลกอริธึม Round Robin ไม่ต้องการการสื่อสารระหว่างเซิร์ฟเวอร์ ดังนั้นจึงสามารถใช้สำหรับการปรับสมดุลทั้งในระดับท้องถิ่นและระดับโลก
สุดท้ายนี้ โซลูชันที่ใช้อัลกอริธึม Round Robin มีต้นทุนต่ำ เพียงเพิ่มรายการบางส่วนใน DNS เพื่อให้เริ่มทำงานได้

อัลกอริธึม Round Robin ยังมีข้อเสียที่สำคัญหลายประการ เพื่อให้การกระจายโหลดโดยใช้อัลกอริธึมนี้เป็นไปตามเกณฑ์ความเป็นธรรมและประสิทธิภาพที่กล่าวถึงข้างต้น แต่ละเซิร์ฟเวอร์จะต้องมีชุดทรัพยากรที่เหมือนกัน การดำเนินการทั้งหมดต้องใช้ทรัพยากรจำนวนเท่ากันด้วย ในทางปฏิบัติจริง เงื่อนไขเหล่านี้โดยส่วนใหญ่แล้วจะไม่บรรลุผล

นอกจากนี้ เมื่อสร้างสมดุลโดยใช้อัลกอริธึม Round Robin ปริมาณงานของเซิร์ฟเวอร์เฉพาะในคลัสเตอร์จะไม่ถูกนำมาพิจารณาเลย ลองจินตนาการถึงสถานการณ์สมมุติต่อไปนี้: หนึ่งในโหนดโหลด 100% ในขณะที่โหนดอื่นโหลดเพียง 10 - 15% อัลกอริธึม Round Robin ไม่ได้คำนึงถึงความเป็นไปได้ของสถานการณ์ดังกล่าว ดังนั้นโหนดที่โอเวอร์โหลดจะยังคงได้รับคำขอ ในกรณีนี้ ไม่อาจพูดถึงความยุติธรรม ประสิทธิภาพ หรือความสามารถในการคาดเดาได้

เนื่องจากสถานการณ์ที่อธิบายไว้ข้างต้น ขอบเขตของการใช้อัลกอริธึม Round Robin จึงมีจำกัดมาก

โรบินกลมถ่วงน้ำหนัก

นี่เป็นเวอร์ชันปรับปรุงของอัลกอริธึม Round Robin สาระสำคัญของการปรับปรุงมีดังนี้: แต่ละเซิร์ฟเวอร์จะได้รับการกำหนดค่าสัมประสิทธิ์การถ่วงน้ำหนักตามประสิทธิภาพและพลังของมัน ซึ่งช่วยกระจายโหลดได้อย่างยืดหยุ่นมากขึ้น: เซิร์ฟเวอร์ที่มีน้ำหนักมากกว่าจะประมวลผลคำขอได้มากขึ้น อย่างไรก็ตาม การดำเนินการนี้ไม่ได้แก้ปัญหาทั้งหมดเกี่ยวกับความทนทานต่อข้อผิดพลาด วิธีการอื่นมีการปรับสมดุลที่มีประสิทธิภาพมากขึ้น โดยคำนึงถึงพารามิเตอร์จำนวนมากขึ้นเมื่อวางแผนและกระจายโหลด

การเชื่อมต่อน้อยที่สุด

ในส่วนก่อนหน้านี้ เราได้ระบุข้อเสียเปรียบหลักของอัลกอริธึม Round Robin ลองเรียกอีกอย่างหนึ่ง: มันไม่ได้คำนึงถึงจำนวนการเชื่อมต่อที่ใช้งานอยู่ในปัจจุบันเลย

ลองดูตัวอย่างการปฏิบัติ มีเซิร์ฟเวอร์สองเครื่อง เรียกพวกเขาว่า A และ B มีผู้ใช้ที่เชื่อมต่อกับเซิร์ฟเวอร์ A น้อยกว่าเซิร์ฟเวอร์ B ในเวลาเดียวกัน เซิร์ฟเวอร์ A มีโอเวอร์โหลดมากกว่า สิ่งนี้เป็นไปได้อย่างไร? คำตอบนั้นค่อนข้างง่าย: การเชื่อมต่อกับเซิร์ฟเวอร์ A จะถูกเก็บรักษาไว้เป็นเวลานานกว่าเมื่อเปรียบเทียบกับการเชื่อมต่อกับเซิร์ฟเวอร์ B

ปัญหาที่อธิบายไว้สามารถแก้ไขได้โดยใช้อัลกอริธึมที่เรียกว่าการเชื่อมต่อน้อยที่สุด (ตัวย่อว่าน้อยคอนน์) โดยคำนึงถึงจำนวนการเชื่อมต่อที่เซิร์ฟเวอร์รองรับในขณะนี้ คำถามต่อมาแต่ละข้อจะถูกส่งไปยังเซิร์ฟเวอร์ที่มีการเชื่อมต่อที่ใช้งานน้อยที่สุด

มีอัลกอริธึมเวอร์ชันปรับปรุงซึ่งมีจุดประสงค์เพื่อใช้ในคลัสเตอร์เป็นหลักซึ่งประกอบด้วยเซิร์ฟเวอร์ที่มีคุณสมบัติทางเทคนิคและประสิทธิภาพที่แตกต่างกัน เรียกว่า Weighted Least Connections และเมื่อกระจายโหลด ไม่เพียงแต่คำนึงถึงจำนวนการเชื่อมต่อที่ใช้งานอยู่เท่านั้น แต่ยังรวมถึงค่าสัมประสิทธิ์การถ่วงน้ำหนักของเซิร์ฟเวอร์ด้วย

เวอร์ชันขั้นสูงอื่นๆ ของอัลกอริทึมการเชื่อมต่อน้อยที่สุด ได้แก่ การจัดกำหนดการการเชื่อมต่อน้อยที่สุดตามท้องถิ่น และการจัดกำหนดการการเชื่อมต่อน้อยที่สุดตามท้องถิ่นด้วยการจัดกำหนดการการจำลอง

วิธีแรกถูกสร้างขึ้นโดยเฉพาะสำหรับการแคชพร็อกซีเซิร์ฟเวอร์ สาระสำคัญมีดังนี้: คำขอจำนวนมากที่สุดจะถูกส่งไปยังเซิร์ฟเวอร์ที่มีการเชื่อมต่อที่ใช้งานน้อยที่สุด เซิร์ฟเวอร์ไคลเอนต์แต่ละเครื่องถูกกำหนดกลุ่มของ IP ไคลเอนต์ คำขอจาก IP เหล่านี้จะถูกส่งไปยังเซิร์ฟเวอร์ "ดั้งเดิม" หากไม่ได้โหลดอย่างสมบูรณ์ มิฉะนั้น คำขอจะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์อื่น (ควรโหลดน้อยกว่าครึ่งหนึ่ง)

ในอัลกอริทึม Locality-Based Least Connection Scheduling พร้อม Replication Scheduling ที่อยู่ IP แต่ละรายการหรือกลุ่มของที่อยู่ IP ไม่ได้ถูกกำหนดให้กับเซิร์ฟเวอร์แต่ละเครื่อง แต่ให้กับทั้งกลุ่มของเซิร์ฟเวอร์ คำขอถูกส่งไปยังเซิร์ฟเวอร์ที่โหลดน้อยที่สุดในกลุ่ม หากเซิร์ฟเวอร์ทั้งหมดจากกลุ่ม "ดั้งเดิม" มีการใช้งานมากเกินไป เซิร์ฟเวอร์ใหม่จะถูกสงวนไว้ เซิร์ฟเวอร์ใหม่นี้จะถูกเพิ่มในกลุ่มที่ให้บริการ IP ที่มีการร้องขอ ในทางกลับกัน เซิร์ฟเวอร์ที่โหลดมากที่สุดจากกลุ่มนี้จะถูกลบ เพื่อหลีกเลี่ยงการจำลองแบบซ้ำซ้อน

กำหนดการแฮชปลายทางและกำหนดการแฮชต้นทาง

อัลกอริธึมการกำหนดเวลาแฮชปลายทางถูกสร้างขึ้นเพื่อทำงานกับคลัสเตอร์ของพร็อกซีแคช แต่มักใช้ในกรณีอื่น ในอัลกอริทึมนี้ เซิร์ฟเวอร์ที่ประมวลผลคำขอจะถูกเลือกจากตารางแบบคงที่ตามที่อยู่ IP ของผู้รับ

อัลกอริธึม Source Hash Scheduling ยึดตามหลักการเดียวกับหลักการก่อนหน้า เฉพาะเซิร์ฟเวอร์ที่จะประมวลผลคำขอเท่านั้นที่ถูกเลือกจากตารางตามที่อยู่ IP ของผู้ส่ง

เซสชันที่ติดหนึบ

Sticky Sessions เป็นอัลกอริทึมสำหรับกระจายคำขอที่เข้ามา ซึ่งการเชื่อมต่อจะถูกถ่ายโอนไปยังเซิร์ฟเวอร์เดียวกันในกลุ่ม ตัวอย่างเช่นใช้ในเว็บเซิร์ฟเวอร์ Nginx เซสชันผู้ใช้สามารถกำหนดให้กับเซิร์ฟเวอร์เฉพาะได้โดยใช้วิธีการแฮช IP (ดูรายละเอียดในเอกสารประกอบอย่างเป็นทางการ) ด้วยวิธีนี้ คำขอจะถูกกระจายไปยังเซิร์ฟเวอร์ตามที่อยู่ IP ของไคลเอ็นต์ ตามที่ระบุไว้ในเอกสารประกอบ (ดูลิงก์ด้านบน) "วิธีนี้ช่วยให้มั่นใจได้ว่าคำขอจากไคลเอนต์เดียวกันจะถูกส่งไปยังเซิร์ฟเวอร์เดียวกัน" หากเซิร์ฟเวอร์ที่กำหนดให้กับที่อยู่เฉพาะไม่พร้อมใช้งาน คำขอจะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์อื่น ตัวอย่างของส่วนย่อยของไฟล์การกำหนดค่า:

แบ็กเอนด์อัปสตรีม ( ip_hash; เซิร์ฟเวอร์ backend1.example.com; เซิร์ฟเวอร์ backend2.example.com; เซิร์ฟเวอร์ backend3.example.com; เซิร์ฟเวอร์ backend4.example.com; )

ตั้งแต่เวอร์ชัน 1.2.2 ใน Nginx คุณสามารถระบุน้ำหนักสำหรับแต่ละเซิร์ฟเวอร์ได้

วิธีนี้มีปัญหาบางประการ ปัญหาเกี่ยวกับการผูกเซสชันอาจเกิดขึ้นหากไคลเอนต์ใช้ IP แบบไดนามิก ในสถานการณ์ที่คำขอจำนวนมากผ่านพร็อกซีเซิร์ฟเวอร์เดียว การปรับสมดุลแทบจะเรียกได้ว่ามีประสิทธิภาพและยุติธรรมไม่ได้เลย อย่างไรก็ตาม ปัญหาที่อธิบายไว้สามารถแก้ไขได้โดยใช้คุกกี้ Nginx เวอร์ชันเชิงพาณิชย์มีโมดูลเหนียวพิเศษซึ่งใช้คุกกี้เพื่อปรับสมดุล นอกจากนี้ยังมีแอนะล็อกฟรี เช่น nginx-sticky-module
คุณสามารถใช้วิธี Sticky-sessions ใน HAProxy ได้ - คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ เช่น

บทสรุป

บทความนี้เป็นข้อมูลเบื้องต้นเกี่ยวกับการปรับสมดุลโหลด เราจะอภิปรายหัวข้อนี้ต่อไปในสิ่งพิมพ์ในอนาคต หากคุณมีคำถาม ความคิดเห็น หรือข้อมูลเพิ่มเติม ยินดีต้อนรับสู่ความคิดเห็น นอกจากนี้ เราจะยินดีอย่างยิ่งหากคุณแบ่งปันตัวอย่างที่เป็นประโยชน์ของการจัดระเบียบโหลดบาลานซ์สำหรับโครงการต่างๆ

ผู้อ่านที่ไม่สามารถแสดงความคิดเห็นที่นี่ได้ด้วยเหตุผลใดก็ตาม จะได้รับเชิญให้เข้าสู่บล็อกของเรา

แท็ก: เพิ่มแท็ก

ในคำศัพท์เฉพาะทางของเครือข่ายคอมพิวเตอร์ การปรับสมดุลโหลด (การปรับระดับ) คือการกระจายกระบวนการดำเนินงานไปยังเซิร์ฟเวอร์เครือข่ายต่างๆ เพื่อเพิ่มประสิทธิภาพการใช้ทรัพยากรและลดเวลาในการคำนวณ

ประเภทของเซิร์ฟเวอร์ที่ควรสมดุล:

    คลัสเตอร์เซิร์ฟเวอร์

    ไฟร์วอลล์;

    เซิร์ฟเวอร์ตรวจสอบเนื้อหา (เช่น เซิร์ฟเวอร์ AntiVirus หรือ AntiSpam)

โดยทั่วไปแล้ว ระบบปรับสมดุลโหลดเซิร์ฟเวอร์จะใช้ความสามารถ L4 (UDP/TCP) ในกรณีนี้ ความพร้อมใช้งานของเซิร์ฟเวอร์จะถูกตรวจสอบโดยที่อยู่ IP และหมายเลขพอร์ต และทำการตัดสินใจ: อันไหน เซิร์ฟเวอร์ที่มีอยู่ควรส่งต่อคำขอ ส่วนใหญ่แล้ว อัลกอริธึมแบบ Round-robin จะถูกใช้เพื่อเลือกเซิร์ฟเวอร์ ตัวเลือกนี้จะถือว่าคำขอทั้งหมดสร้างโหลดและระยะเวลาดำเนินการเท่ากัน อัลกอริธึมเวอร์ชันขั้นสูงเพิ่มเติมใช้ระดับการเข้าถึงเซิร์ฟเวอร์และจำนวนการเชื่อมต่อที่ใช้งานอยู่

ก่อนหน้านี้ ความสามารถในการปรับสมดุลโหลดถูกสร้างขึ้นใน โปรแกรมประยุกต์หรือระบบปฏิบัติการ ระบบปรับสมดุลโหลดสมัยใหม่ต้องเป็นไปตามข้อกำหนดต่อไปนี้:

    จัดเตรียม การจัดการจราจรเพื่อรับประกันความพร้อมใช้งานของแอปพลิเคชันและการกระจายโหลดในเซิร์ฟเวอร์ฟาร์ม (กลุ่มของเซิร์ฟเวอร์ที่เชื่อมต่อด้วยเครือข่ายข้อมูลและทำงานเป็นหน่วยเดียว)

    เร่งความเร็วการดำเนินการแอปพลิเคชันหลายครั้ง

    รับประกัน การป้องกันแอปพลิเคชันความปลอดภัยของข้อมูลและการตรวจสอบการรับส่งข้อมูล

สิ่งสำคัญที่ควรทราบที่นี่คือความพร้อมใช้งานของที่อยู่ IP และพอร์ตไม่ได้รับประกันการเข้าถึงแอปพลิเคชัน

เมื่อเร็ว ๆ นี้ Application Layer ถูกนำมาใช้มากขึ้นในการแก้ปัญหาเรื่องการทำ Load Balancing กระบวนการตัดสินใจจะพิจารณาถึงประเภทของไคลเอนต์, URL ที่ร้องขอ, ข้อมูลจากคุกกี้, ความสามารถของเซิร์ฟเวอร์เฉพาะ และประเภทของแอปพลิเคชันซึ่งช่วยให้สามารถเพิ่มประสิทธิภาพการใช้ทรัพยากรระบบได้

ระบบ GSLB (Global Server Load Balancing) สามารถให้ข้อได้เปรียบที่สำคัญได้ค่อนข้างมากซึ่งสามารถแก้ไขปัญหาการปรับสมดุลสำหรับเซิร์ฟเวอร์ฟาร์มที่อยู่แบบสุ่มโดยคำนึงถึงระยะห่างจากไคลเอนต์ ระบบนี้สามารถรองรับอัลกอริธึมการปรับสมดุลโหลดที่แตกต่างกันได้หลายแบบ และให้บริการที่ดีที่สุดแก่ลูกค้าที่กระจายอยู่ทั่วโลก สำหรับผู้ดูแลระบบ ระบบทำให้สามารถสร้างนโยบายการจัดการทรัพยากรที่ยืดหยุ่นได้

วิธีหนึ่งในการเร่งความเร็วบริการคือการแคช ในกรณีของแคชที่มีการกำหนดค่าไว้อย่างดี เปอร์เซ็นต์ของคำขอที่แคชพึงพอใจจะสูงถึง 40% ขณะเดียวกันสามารถปรับปรุงการเร่งความเร็วการบริการได้ 30 เท่า

อีกวิธีในการเร่งความเร็วบริการคือการเก็บข้อมูล เนื่องจากตัวเลือกนี้จะช่วยลดระดับความแออัดของช่องสัญญาณเครือข่าย

การจัดการโหลดบาลานซ์สามารถใช้ร่วมกับฟังก์ชันไฟร์วอลล์ของแอปพลิเคชัน (70% ของการบุกรุกที่ประสบความสำเร็จใช้ประโยชน์จากช่องโหว่ของแอปพลิเคชัน) และการใช้ SSL บนอุโมงค์ VPN SSL – Secure Sockets Layer – เป็นโปรโตคอลการเข้ารหัสที่ช่วยให้มั่นใจได้ถึงการสร้างการเชื่อมต่อที่ปลอดภัยระหว่างไคลเอนต์และเซิร์ฟเวอร์

เพื่อให้ได้ปริมาณงานสูงสุดและความทนทานต่อข้อผิดพลาด ไฟร์วอลล์จะอนุญาตให้คุณกระจายหรือปรับสมดุลโหลดโดยใช้ช่องทางอินเทอร์เน็ต (เซิร์ฟเวอร์) ทั้งหมดที่มีอยู่พร้อมกัน ตัวอย่างเช่น คุณสามารถหลีกเลี่ยงสถานการณ์ที่แพ็กเก็ตที่ส่งผ่านเครือข่ายผ่านผู้ให้บริการรายหนึ่ง ในขณะที่การเข้าถึงอินเทอร์เน็ตผ่านผู้ให้บริการรายอื่นไม่ได้ใช้งาน หรือกระจายบริการและการรับส่งข้อมูลโดยตรงผ่านช่องทางอินเทอร์เน็ตที่มีอยู่ทั้งหมด คุณสามารถกำหนดค่าการปรับสมดุลโหลดได้หากการเชื่อมต่อกับผู้ให้บริการทำด้วยประเภทการเชื่อมต่อที่แตกต่างกัน (IP แบบคงที่, PPPoE, PPTP/L2TP) รวมถึงสร้างสมดุลการรับส่งข้อมูลที่ส่งผ่านอุโมงค์ VPN ที่ติดตั้งบนอินเทอร์เฟซทางกายภาพที่แตกต่างกัน

ข้าว. 4.12.โหลดบาลานซ์ในหลายเส้นทาง

ไฟร์วอลล์ซีรีส์ D-Link NetDefend มีฟังก์ชันที่ออกแบบมาเพื่อปรับสมดุลโหลดเครือข่ายในเส้นทางที่แตกต่างกัน - เส้นทาง โหลด การปรับสมดุล (อาร์แอลบี) ความสามารถที่ให้:

    ปรับสมดุลการรับส่งข้อมูลระหว่างอินเทอร์เฟซตามนโยบาย

    การปรับสมดุลปริมาณการรับส่งข้อมูลด้วยการเข้าถึงอินเทอร์เน็ตหลายรายการพร้อมกัน โดยใช้บริการของผู้ให้บริการตั้งแต่สองรายขึ้นไป

    ปรับสมดุลการรับส่งข้อมูลที่ส่งผ่านอุโมงค์ VPN ที่ติดตั้งบนอินเทอร์เฟซทางกายภาพที่แตกต่างกัน

คุณลักษณะการปรับสมดุลโหลดในไฟร์วอลล์ NetDefend ถูกเปิดใช้งานตามตารางเส้นทางโดยการสร้างวัตถุ RLB ตัวอย่างซึ่งมีการกำหนดพารามิเตอร์สองตัว: ตารางเส้นทางและอัลกอริทึม RLB วัตถุอินสแตนซ์เดียวเท่านั้นที่สามารถเชื่อมโยงกับตารางเส้นทางได้

ข้าว. 4.13.การเลือกอัลกอริธึมการปรับสมดุลโหลดในไฟร์วอลล์ NetDefend

คุณสามารถเลือกอัลกอริธึมการกระจายโหลดระหว่างอินเทอร์เฟซอินเทอร์เน็ตได้:

    อัลกอริทึม ตัวกลม โรบินกระจายโหลดระหว่างอินเทอร์เฟซ WAN1 และ WAN2 ตามลำดับ (สลับกัน) ทุกครั้งที่มีเซสชันขาออกใหม่เกิดขึ้นจากอินเทอร์เฟซ LAN อินเทอร์เฟซ WAN1 หรือ WAN2 จะถูกเลือกเพื่อส่งแพ็กเก็ต

    อัลกอริทึม ในอนาคต แพ็กเก็ตจากเซสชันนี้จะใช้อินเทอร์เฟซ WAN ที่กำหนดไว้ก่อนหน้านี้ เซสชัน TCP ถูกเปิดและปิดบนอินเทอร์เฟซ WAN เดียวกันปลายทาง

    จะหลีกเลี่ยงปัญหากับโปรโตคอลบางอย่างเมื่อใช้การปรับสมดุล เช่น FTP อัลกอริทึมนี้ทำงานคล้ายกับอัลกอริทึม Round Robin ยกเว้นว่าข้อมูลทั้งหมดไปยังโฮสต์ระยะไกลจะต้องผ่านอินเทอร์เฟซที่ใช้สร้างการเชื่อมต่อ ความหมายกำหนดขีดจำกัดการโหลดสำหรับพอร์ต WAN หลัก ( การกำหนดเส้นทาง → การปรับสมดุลโหลดเส้นทาง > การตั้งค่าอัลกอริทึม- เมื่อถึงโหลดนี้ภายในระยะเวลาที่กำหนด พอร์ต WAN ที่สองจะเริ่มใช้งาน (สำหรับเซสชันใหม่) ทันทีที่โหลดในช่องหลักลดลง เซสชันใหม่จะถูกเปิดขึ้น

กลมโรบิน

ตัวชี้วัดเริ่มต้นของแต่ละเส้นทางคือศูนย์ เมื่อใช้อัลกอริธึมที่เชื่อมต่อถึงกัน กลม โรบินและ ในอนาคต แพ็กเก็ตจากเซสชันนี้จะใช้อินเทอร์เฟซ WAN ที่กำหนดไว้ก่อนหน้านี้ เซสชัน TCP ถูกเปิดและปิดบนอินเทอร์เฟซ WAN เดียวกันคุณสามารถตั้งค่าเมตริกต่างๆ เพื่อสร้างลำดับความสำคัญในการเลือกเส้นทางได้ เส้นทางที่มีค่าเมตริกขั้นต่ำจะถูกเลือกบ่อยกว่าเส้นทางที่มีค่าเมตริกสูงกว่า

หากในสถานการณ์ที่มีผู้ให้บริการอินเทอร์เน็ตสองราย (มักใช้นิพจน์ "ISP") เช่น ผู้ให้บริการอินเทอร์เน็ต คุณต้องการให้การรับส่งข้อมูลส่วนใหญ่ผ่านการเชื่อมต่อ ISP รายการใดรายการหนึ่ง คุณควรเปิดใช้งาน RLB และกำหนดหน่วยวัดที่ต่ำกว่า ค่าของเส้นทางของการเชื่อมต่อ ISP หลัก (เช่น 90) ที่สัมพันธ์กับเส้นทางที่สอง (เช่น 100)

หากงานคือการสร้างสมดุลการรับส่งข้อมูลระหว่างผู้ให้บริการอินเทอร์เน็ตสองรายให้เท่ากัน ควรกำหนดค่าเมตริกสำหรับทั้งสองเส้นทางให้เท่ากัน

การใช้การวัดเส้นทางด้วยอัลกอริทึมความหมาย

เมื่อใช้อัลกอริทึม ความหมายสำหรับแต่ละเส้นทาง จะต้องกำหนดหน่วยเมตริก ในกรณีนี้ NetDefendOS จะเลือกเส้นทางที่มีค่าเมตริกต่ำที่สุดเสมอ อัลกอริธึมไม่ได้ออกแบบมาให้ทำงานกับค่าเมตริกเดียวกันของเส้นทาง ดังนั้นผู้ดูแลระบบควรตั้งค่าเมตริกที่แตกต่างกันสำหรับทุกเส้นทางที่ใช้อัลกอริธึมความหมาย.

ค่าเมตริกจะกำหนดลำดับที่การรับส่งข้อมูลถูกเปลี่ยนเส้นทางไปยังเส้นทางอื่น หลังจากที่เส้นทางที่เลือกเกินขีดจำกัดการรับส่งข้อมูล

คุณสามารถสร้างเส้นทางทางเลือกได้หลายเส้นทางด้วยค่าเมตริกที่แตกต่างกัน โดยแต่ละเส้นทางจะมีการกำหนดค่าเกณฑ์สำหรับการตั้งค่าอัลกอริทึม - ความหมาย การตั้งค่า– สำหรับแต่ละอินเทอร์เฟซ ขั้นแรก เลือกเส้นทางที่มีหน่วยเมตริกขั้นต่ำ เมื่อเกินเกณฑ์การตั้งค่าอัลกอริทึมที่อนุญาต เส้นทางถัดไปจะถูกเลือก

หากถึงเกณฑ์การตั้งค่าการล้นบนเส้นทางอื่นทั้งหมด เส้นทางจะไม่เปลี่ยนแปลง

ความสนใจ: ค่าเมตริกบนอินเทอร์เฟซ (เส้นทาง) ที่ใช้ในการปรับสมดุลควรตั้งค่าให้สูงกว่าอินเทอร์เฟซ (เส้นทาง) อื่นๆ ยิ่งค่าเมตริกบนอินเทอร์เฟซ (เส้นทาง) ต่ำลง อินเทอร์เฟซ (เส้นทาง) นี้จะถูกใช้เพื่อสร้างการเชื่อมต่อบ่อยขึ้น โดยสัมพันธ์กับอินเทอร์เฟซ (เส้นทาง) ที่มีค่าเมตริกสูงกว่า ส่วนแบ่งการใช้งานอินเทอร์เฟซ (เส้นทาง) จะเป็นสัดส่วนกับความแตกต่างระหว่างค่าเมตริกบนอินเทอร์เฟซ (เส้นทาง) เหล่านี้

การปรับสมดุลโหลดเครือข่ายและการจัดกลุ่ม NA (อุปกรณ์ซ้ำซ้อน) ของไฟร์วอลล์เน็ตดีเฟนด์

ความทนทานต่อข้อผิดพลาดของเครือข่ายในระดับสูงทำได้โดยการใช้ไฟร์วอลล์ NetDefend สองตัว: อุปกรณ์หลัก (หลัก) และ อุปกรณ์สำรองข้อมูล(ทาส). ไฟร์วอลล์หลักและไฟสำรองเชื่อมต่อกันและสร้างคลัสเตอร์ HA แบบลอจิคัล

ไฟร์วอลล์ NetDefend ไม่สนับสนุนโหลดบาลานซ์ใน การจัดกลุ่ม HAอุปกรณ์ต่างๆ เช่น การกระจายโหลดระหว่างพวกเขา ไม่ได้จัดเตรียมไว้ให้เนื่องจากอุปกรณ์เครื่องหนึ่งทำงานอยู่เสมอ ในขณะที่อีกเครื่องอยู่ในโหมดสแตนด์บาย (พาสซีฟ)

ข้าว. 4.14.การจัดกลุ่ม HA ของไฟร์วอลล์ NetDefend

โหลดบาลานซ์คืออะไร? อันที่จริงนี่คือการกระจายของขาเข้า การเชื่อมต่อเครือข่ายระหว่างโหนดคอมพิวเตอร์หลายเครื่อง ในขณะเดียวกันก็มีการใช้ฮาร์ดแวร์หรือ โซลูชั่นซอฟต์แวร์เช่นเดียวกับอัลกอริธึมที่ใช้ในการกระจายสาระสำคัญไม่มีการเปลี่ยนแปลงเลย แต่ด้วยการกระจายโหลด จึงสามารถแก้ไขปัญหาร้ายแรงสองข้อได้
ประการแรก มันคือการกระจายโหลดระหว่างโหนดการประมวลผลในสถานการณ์ที่ทรัพยากรของเซิร์ฟเวอร์เครื่องเดียวไม่เพียงพอ และไม่สามารถขยายกำลังในแนวดิ่งได้อีกต่อไป ในกรณีนี้ จำเป็นต้องเพิ่มหน่วยประมวลผลอีกเครื่องหนึ่ง และใช้การปรับสมดุลประเภทใดประเภทหนึ่ง
ประการที่สอง สร้างความมั่นใจในการเข้าถึง ดังที่ทราบกันดีว่าความทนทานต่อความผิดพลาดของระบบใดๆ ก็ตาม โซลูชันฮาร์ดแวร์หรือซอฟต์แวร์ทำได้โดยการทำซ้ำส่วนประกอบหลัก น่าเสียดายที่ไม่มีเลย เชื่อถือได้อย่างหนักดิสก์ ตัวควบคุม RAID และอุปกรณ์อื่นๆ และ ระดับทันสมัยการเขียนโปรแกรมไม่รับประกันว่าจะไม่มีข้อผิดพลาดในซอฟต์แวร์ ด้วยเหตุนี้ เมื่อสร้างบริการที่ทนทานต่อข้อผิดพลาด ทุกอย่างจะถูกทำซ้ำ รวมถึงตัวควบคุมเครือข่าย สวิตช์ และท้ายที่สุดคือตัวโหนดการประมวลผลเอง ตัวอย่างเช่น โหลดที่สร้างขึ้นบนเซิร์ฟเวอร์เครื่องหนึ่งอาจไม่มาก แต่ในขณะเดียวกัน คุณต้องการให้แน่ใจว่าความล้มเหลวของโหนดตั้งแต่หนึ่งโหนดขึ้นไปจะไม่ทำให้บริการหยุดทำงาน ในกรณีนี้ โหลดบาลานเซอร์อาจเป็นวิธีแก้ปัญหาอีกครั้ง

ประเภทและเทคนิคพื้นฐานของการทรงตัว

โดยพื้นฐานแล้วทุกอย่าง สายพันธุ์ที่มีอยู่ความสมดุลสามารถแบ่งออกเป็นสาม กลุ่มระดับโลกแตกต่างกันใน “ความลึก” ของการวิเคราะห์คำขอที่เข้ามาและระดับการตรวจสอบความพร้อมใช้งานของเซิร์ฟเวอร์

วิธีการดั้งเดิม

กลุ่มนี้รวมถึงวิธีการปรับสมดุลที่ไม่ได้วิเคราะห์ในทางใดทางหนึ่ง การจราจรขาเข้าและอย่าตรวจสอบความพร้อมใช้งานของโหนดคอมพิวเตอร์ที่อยู่ด้านหลัง ที่สุด ตัวแทนที่สดใสกลุ่มที่กำหนดนี่คือการกระจายคำขอด้วย โดยใช้ DNSเกี่ยวกับเรื่องไหนด้านล่าง

DNS แบบวนรอบ

บางทีวิธีการที่พบบ่อยที่สุด ขึ้นอยู่กับข้อเท็จจริงที่ว่าข้อกำหนด DNS อนุญาตให้สร้างบันทึก A ที่เหมือนกันหลายรายการโดยมีที่อยู่ IP ที่แตกต่างกัน ตัวอย่างเช่น คุณสามารถสร้างสองรายการสำหรับโหนด srv-01.company.com โดยมีที่อยู่ IP ที่แตกต่างกันเป็นของ เซิร์ฟเวอร์ที่แตกต่างกัน- นอกจากนี้ ต้องเปิดใช้งานตัวเลือกพิเศษ (Round robin) บนเซิร์ฟเวอร์ DNS ด้วยเหตุนี้ เมื่อมีการร้องขอบันทึก srv-01.company.com ใหม่แต่ละครั้ง จะมีการมอบที่อยู่ IP ที่แตกต่างกัน ซึ่งจะนำไปสู่การกระจายการเชื่อมต่อระหว่างโหนดอย่างสม่ำเสมอ
แต่ถึงแม้จะมีความสะดวกและความถูกก็ตาม การตัดสินใจครั้งนี้มีข้อจำกัดหลายประการ ประการแรก ไม่มีวิธีการตรวจสอบความพร้อมใช้งานของโหนด นั่นคือเซิร์ฟเวอร์อาจล้มเหลว แต่ DNS จะยังคงให้ที่อยู่ IP แก่ลูกค้า ประการที่สอง จำนวนเซสชันปัจจุบันบนโหนดใดโหนดหนึ่งจะไม่ถูกนำมาพิจารณา สถานการณ์อาจเกิดขึ้นเมื่อหนึ่งในเซิร์ฟเวอร์มีเซสชันที่เปิดมากกว่าเซิร์ฟเวอร์อื่นอย่างมีนัยสำคัญ แต่การเชื่อมต่อจะยังคงกระจายเท่าๆ กัน และประการที่สาม DNS จะไม่คำนึงถึงเซิร์ฟเวอร์ที่ผู้ใช้เชื่อมต่อครั้งสุดท้าย เป็นไปได้ว่าในการเชื่อมต่อใหม่แต่ละครั้ง เช่น ไปยังเทอร์มินัลหรือเว็บเซิร์ฟเวอร์ เซสชันใหม่จะถูกเปิดบนโหนดอื่น ซึ่งอาจไม่เป็นที่ต้องการ
แยกกัน ณ จุดนี้ฉันต้องการเน้นบริการเช่น Amazon Route 53 นี่คือโฮสติ้ง DNS บนคลาวด์ที่อนุญาตให้คุณยกเว้นได้ คุณสมบัติมาตรฐานระบุ "น้ำหนัก" ของบันทึก A ที่เหมือนกัน ซึ่งช่วยให้คุณสามารถกระจายคำขอที่เข้ามาได้อย่างยืดหยุ่นมากขึ้น นอกจากนี้ ยังสามารถผสานรวมกับโหลดบาลานเซอร์บนคลาวด์ Elastic Load Balancing ที่มีอยู่ใน Amazon Web Services ได้ ซึ่งช่วยให้คุณปรับสมดุลได้ดียิ่งขึ้น

นอกจากนี้ วิธีการดั้งเดิมยังรวมถึงการปรับสมดุลด้วยตนเองด้วย

สาระสำคัญของวิธีนี้คือการแบ่งผู้ใช้ทั้งหมดออกเป็นหลายกลุ่มและเชื่อมต่อเข้าด้วยกัน เซิร์ฟเวอร์ต่างๆ- ตัวอย่างเช่น องค์กรหนึ่งจ้างสองคน เทอร์มินัลเซิร์ฟเวอร์ประสิทธิภาพที่เหมือนกัน ผู้ใช้ครึ่งหนึ่งมีทางลัดบนเดสก์ท็อปเพื่อเชื่อมต่อกับเซิร์ฟเวอร์เครื่องแรก และผู้ใช้ที่เหลือไปยังเซิร์ฟเวอร์เครื่องที่สอง นอกจากนี้ ในกรณีที่โหนดปัจจุบันล้มเหลว ทางลัดจะถูกสร้างขึ้นเพื่อเชื่อมต่อกับเซิร์ฟเวอร์อื่น ซึ่งจะทำหน้าที่เป็นข้อมูลสำรอง บางทีวิธีการดังกล่าวอาจใช้ได้เฉพาะในองค์กรขนาดเล็กเท่านั้น และจุดประสงค์ของการกระจายดังกล่าวคือการทนต่อข้อผิดพลาดได้อย่างแม่นยำ และไม่สร้างความสมดุล ในกรณีนี้ก็ไม่จำเป็นต้องมี อุปกรณ์เพิ่มเติมและ ซอฟต์แวร์แต่คุณจะต้องทำงานด้วยตนเองเล็กน้อย

การปรับสมดุลชั้นการขนส่ง (L4)

นี่เป็นกลไกที่เป็นสากลและแพร่หลายที่สุด ใช้ได้กับ TCP และ โปรโตคอล UDPและด้วยเหตุนี้จึงสามารถกระจายการรับส่งข้อมูลจากบริการเกือบทุกชนิด ในระดับนี้ เฉพาะที่อยู่ IP และหมายเลขพอร์ตปลายทางเท่านั้นที่ถูกตรวจสอบในแพ็กเก็ตขาเข้า หากตรงกับกฎข้อใดข้อหนึ่ง การรับส่งข้อมูลจะถูกเปลี่ยนเส้นทางไปที่ เซิร์ฟเวอร์ที่ระบุโดยใช้กลไก sNAT ใน ในลักษณะที่กำหนด- ไม่ได้ตรวจสอบเนื้อหาของแพ็คเกจ นอกจากนี้ยังไม่มีเทคนิคพิเศษในการตรวจสอบความพร้อมใช้งานของโหนดการคำนวณ อยู่ระหว่างดำเนินการ ตรวจสอบง่ายๆความพร้อมของที่อยู่และพอร์ต หากพอร์ตเปิดอยู่ เซิร์ฟเวอร์จะถือว่าสามารถเข้าถึงได้ และคำขอยังคงถูกส่งไปยังพอร์ตดังกล่าว
บาลานเซอร์ซอฟต์แวร์และฮาร์ดแวร์ยอดนิยมส่วนใหญ่ทำงานโดยใช้กลไกนี้ รวมถึง Network Load Balancing (NLB) ที่ใช้ด้วย วินโดวส์เซิร์ฟเวอร์- หมวดหมู่นี้ยังรวมถึงบริการคลาวด์ยอดนิยมในปัจจุบัน เช่น Elastic Load Balancing จาก Amazon ที่กล่าวถึงข้างต้น

การปรับสมดุลระดับแอปพลิเคชัน (L7)

รูปแบบการปรับสมดุลโหลดที่พัฒนาแบบไดนามิกในระดับแอปพลิเคชัน บาลานเซอร์ดังกล่าวเรียกอีกอย่างว่าตัวควบคุมการนำส่งแอปพลิเคชัน มุ่งเน้นไปที่การทำงานกับโปรโตคอลระดับสูง ส่วนใหญ่เป็น HTTP\HTTPS เช่นเดียวกับในกรณีของมุมมองก่อนหน้านี้ มีการอธิบายกฎต่างๆ เมื่อมีการสร้างการเชื่อมต่อบนพอร์ตใดพอร์ตหนึ่ง แพ็กเก็ตจะถูกส่งต่อไปยัง ที่อยู่ที่ระบุและพอร์ตของโหนดคอมพิวเตอร์ แต่เมื่อเลือกเซิร์ฟเวอร์เฉพาะเพื่อส่งต่อการรับส่งข้อมูล ประเภทของไคลเอ็นต์, URL, เนื้อหาคุกกี้, เนื้อหาที่ร้องขอ และพารามิเตอร์อื่น ๆ จะถูกนำมาพิจารณาด้วย นอกจากนี้ การตรวจสอบความพร้อมใช้งานของบริการบนโหนดคอมพิวเตอร์ยังได้รับการตรวจสอบอย่างชาญฉลาดยิ่งขึ้นอีกด้วย ตัวอย่างเช่น อาจมีคำขอ URL หนึ่งและตรวจสอบเนื้อหาแล้ว
อีกหนึ่ง คุณสมบัติที่โดดเด่นประเภทนี้จาก L4 คือเซิร์ฟเวอร์ในคลัสเตอร์อาจไม่เหมือนกัน ตัวอย่างเช่น บางโหนดอาจให้บริการข้อมูลคงที่ เช่น ภาพถ่ายและวิดีโอ ในขณะที่เซิร์ฟเวอร์อื่นๆ นำเสนอเนื้อหาโดยใช้สคริปต์, HTML และ CSS ในกรณีนี้ คุณสามารถสร้างกฎสำหรับเนื้อหาแต่ละประเภทด้วยอัลกอริธึมพิเศษสำหรับการเปลี่ยนเส้นทางการรับส่งข้อมูลไป กลุ่มต่างๆเซิร์ฟเวอร์ ในหมวดหมู่นี้ ยังมีคลาสบาลานเซอร์โปรไฟล์อีกคลาสหนึ่งด้วย เช่น Citrix NetScaler โซลูชันนี้เชี่ยวชาญด้านการปรับสมดุลโหลดและปรับปรุงประสิทธิภาพของผลิตภัณฑ์ Citrix (XenApp, XenDesktop) รวมถึงเว็บแอปพลิเคชัน นอกเหนือจากการปรับสมดุลขั้นสูงแล้ว ยังสามารถทำการบีบอัดเนื้อหา การแคชที่มีประสิทธิภาพ ให้การเข้ารหัส รวมถึงการวิเคราะห์และการกรองการรับส่งข้อมูล มันเป็นเพียง ส่วนเล็ก ๆความสามารถซึ่งสมควรได้รับบทความแยกต่างหาก

เมื่อความจุของเซิร์ฟเวอร์ไม่เพียงพออีกต่อไป คำถามก็เกิดขึ้นว่าจะต้องดำเนินการอย่างไรต่อไป การอัพเกรดมักไม่ได้ให้การเพิ่มขึ้นตามสัดส่วน และยิ่งไปกว่านั้น ไม่ได้ให้ความทนทานต่อข้อผิดพลาดที่จำเป็น ดังนั้นที่สุด ขั้นตอนที่ถูกต้องจะมีการติดตั้งเซิร์ฟเวอร์ตัวที่สองซึ่งจะทำหน้าที่โหลดบางส่วน สิ่งที่เหลืออยู่คือการเลือกแอปพลิเคชันที่จะให้ความสมดุล

มีอะไรให้เลือกบ้าง?

โซลูชันการปรับสมดุลโหลดเครือข่ายจะมีลักษณะเหมือนกันตั้งแต่แรกเห็น ในความเป็นจริง มีเทคโนโลยีและอัลกอริธึมมากมายที่เกี่ยวข้องกับกระบวนการนี้ ดังนั้นจึงเป็นไปไม่ได้ที่จะพบผลิตภัณฑ์ที่เหมือนกันสองรายการ คุณลักษณะที่ไม่ชัดเจนอาจรองรับโปรโตคอลบางตัว (เช่น เฉพาะ HTTP หรืออื่นๆ) และยังมีพารามิเตอร์อื่นๆ อีกมากมาย

นอกจากนี้ โหลดบาลานเซอร์สามารถเปลี่ยนเส้นทางการรับส่งข้อมูลไคลเอ็นต์ไปยังเซิร์ฟเวอร์ที่ต้องการได้หลายวิธี ที่นิยมมากที่สุด: การออกอากาศ ที่อยู่เครือข่าย(การแปลที่อยู่เครือข่าย) และส่งผ่านเกตเวย์ TCP ในกรณีแรก บาลานเซอร์จะแทนที่ที่อยู่ IP ในแพ็กเก็ตทันที ดังนั้นจึงซ่อน IP ของเซิร์ฟเวอร์จากไคลเอ็นต์และในทางกลับกัน หากแอปพลิเคชันปลายทางต้องการ IP ของลูกค้าสำหรับสถิติหรือการดำเนินการอื่น ๆ โดยปกติแล้ว IP จะถูกจัดเก็บไว้ในส่วนหัว X-Forwarded-for HTTP หากคุณใช้โปรโตคอลอื่น คุณควรตรวจสอบให้แน่ใจว่ามีการใช้ฟีเจอร์นี้แล้ว ในกรณีของเกตเวย์ TCP บาลานเซอร์สามารถจัดการการรับส่งข้อมูลในระดับ L4 (การขนส่ง) และแม้แต่ในระดับแอปพลิเคชัน (L7) เมื่อต้องการทำเช่นนี้ ระบบจะสร้างการเชื่อมต่อและดูภายในแพ็กเก็ต โดยทั่วไปแล้ว ไคลเอ็นต์และแอปพลิเคชันจะแลกเปลี่ยนข้อมูลผ่านบาลานเซอร์ แต่เมื่อเร็วๆ นี้ การกำหนดค่าเซิร์ฟเวอร์ที่มีการส่งคืนโดยตรง (DSR) ได้รับความนิยมมากขึ้น เมื่อการตอบสนองจากเซิร์ฟเวอร์ส่งไปยังไคลเอนต์โดยตรง และไม่ผ่านอุปกรณ์ปรับสมดุลโหลด การใช้ DSR จะช่วยลดภาระบนบาลานเซอร์ แต่ไม่อนุญาตให้ใช้คุกกี้และการถอดรหัส SSL วิธีนี้เป็นลำดับความสำคัญเร็วกว่าการใช้ NAT balancing และอนุญาตให้บริการต่างๆ ดูที่อยู่ IP ที่แท้จริงของไคลเอ็นต์ได้

นอกจากนี้คุณสามารถค้นหาในระบบได้ วิธีการที่แตกต่างกันสมดุล เรามาดูจุดประสงค์ของบางส่วนกัน ในการตั้งค่าผลิตภัณฑ์ อาจมีชื่อหรือคุณลักษณะการใช้งานที่แตกต่างกัน แต่บ่อยครั้งที่สาระสำคัญจะเหมือนกัน
วิธีที่ง่ายที่สุดคือ Round Robin DNS ซึ่งเป็นเซิร์ฟเวอร์ DNS พิเศษที่มีบันทึก A หลายรายการและน้ำหนัก (ไม่บังคับ) และออกที่อยู่ IP ที่แตกต่างกันเมื่อลูกค้าร้องขอ ข้อเสียที่เห็นได้ชัดเจน ไม่มีข้อมูลเกี่ยวกับการโหลดปัจจุบันและสถานะของแบ็กเอนด์ และไม่คำนึงถึงการเชื่อมต่อไคลเอนต์ก่อนหน้านี้ (แคช DNS ช่วยให้สถานการณ์ราบรื่นขึ้นเล็กน้อย)

มีอัลกอริทึมที่คล้ายกันในชื่อแต่ รับรู้โดยวิธีการตัวสร้างความสมดุล - Round Robin ไคลเอ็นต์ทั้งหมดมีการกระจายเท่าๆ กันทั่วทั้งแบ็กเอนด์ และโดยปกติแล้วจะไม่มีการคำนึงถึงพารามิเตอร์อื่นๆ อัลกอริธึม Round Robin Weighted จะพิจารณาพารามิเตอร์ Weight ที่ระบุสำหรับแต่ละเซิร์ฟเวอร์ ด้วยการกำหนดน้ำหนักให้กับเซิร์ฟเวอร์ที่มีประสิทธิภาพมากขึ้น เราจะสามารถนำลูกค้าไปยังเซิร์ฟเวอร์ได้มากขึ้น การกระจายลำดับความสำคัญทำงานแตกต่างออกไปบ้าง ในอัลกอริธึมนี้ เฉพาะเซิร์ฟเวอร์ที่มีลำดับความสำคัญสูงเท่านั้นที่จะเชื่อมต่อตามกฎ เฉพาะในกรณีที่ล้มเหลว ตัวเลือกนี้ช่วยให้คุณสร้างคลัสเตอร์ได้ โหนดที่ใช้งานอยู่ตัวอย่างเช่น เมื่อเซิร์ฟเวอร์ตัวที่สองทำหน้าที่อื่นและสำรองข้อมูลเฉพาะเซิร์ฟเวอร์แรกเท่านั้น อีกทางเลือกหนึ่งคือการเชื่อมต่อน้อยที่สุด (เซสชันน้อยที่สุด) - การเชื่อมต่อได้รับการยอมรับจากเซิร์ฟเวอร์ที่ให้บริการการเชื่อมต่อ (เซสชัน) จำนวนน้อยที่สุด แต่การเชื่อมต่ออาจแตกต่างกัน (ผู้ใช้ใช้งานอยู่หรือเฉยๆ) และดังนั้นจึงทำให้โหลดที่แตกต่างกัน เซิร์ฟเวอร์ แต่อัลกอริธึม Least Bandwidth จะคำนึงถึงโหลดเครือข่ายจริงด้วย

Hash Sticky Client - ไคลเอนต์ถูกผูกไว้กับเซิร์ฟเวอร์เดียว ด้วยเหตุนี้สตริงแฮชที่ระบุ IP จะถูกวางไว้ในตารางพิเศษ การเปลี่ยนแปลงเป็นไปได้ ไคลเอนต์ไปที่เซิร์ฟเวอร์เดียวเสมอ และหากออกไป การเชื่อมต่อจะเป็นไปไม่ได้ หรือเมื่อ "เนทิฟ" ไม่ตอบสนอง มันจะเชื่อมต่อกับระบบอื่น

ความพร้อมใช้งานของแบ็กเอนด์ถูกกำหนดโดยสอง: ใช้งานอยู่ (keepalives ตัวสร้างสมดุลจะสำรวจเซิร์ฟเวอร์เอง) และแบบพาสซีฟ (In-Band การเชื่อมต่อปัจจุบันและการตอบกลับของบริการจะได้รับการตรวจสอบ)

ยอดคงเหลือNG

โครงการอันดับหนึ่งในรายการ - BalanceNG คือการพัฒนา โอเพ่นซอร์สโซลูชันที่สมดุล แต่จะมีการเผยแพร่ภายใต้ใบอนุญาตซ้ำซ้อน (เชิงพาณิชย์และ ฟรีใบอนุญาตขั้นพื้นฐาน) ใน รุ่นฟรีคุณสามารถเชื่อมต่อเซิร์ฟเวอร์เสมือนหนึ่งเครื่องและสองโหนดซึ่งเมื่อพิจารณาถึงความสามารถแล้วก็เพียงพอที่จะรับมือกับค่าเฉลี่ยได้อย่างง่ายดายและบางครั้ง ภาระหนัก- เป็นโซลูชันการปรับสมดุลโหลด IP ที่รองรับ IPv6 และเสนอวิธีการควบคุมการเลือกแบ็กเอนด์หลายวิธี (Round Robin, Random, Weighted Random, Least Session, Least Bandwidth, Hash, Agent และ Randomized Agent)

ผลิตภัณฑ์ใช้เอ็นจิ้นดั้งเดิมที่ทำงานบนเลเยอร์ 2 (อีเธอร์เน็ต) การปรับสมดุลจะขึ้นอยู่กับที่อยู่ IP ของไคลเอนต์ และสามารถทำงานกับบริการใด ๆ โดยไม่ต้องเชื่อมโยงกับพอร์ต รองรับการกำหนดค่าเซิร์ฟเวอร์ DNS GSLB (Global Server Load-Balancing) และ Direct Server Return (DSR) โดยการตอบสนองจากเซิร์ฟเวอร์จะส่งตรงไปยังไคลเอนต์โดยตรง แทนที่จะผ่านโหลดบาลานเซอร์ ประกอบด้วยตัวแทนการตรวจสอบ UDP แบบกำหนดเอง รองรับ VRRP เพื่อติดตั้งการกำหนดค่าที่มีความพร้อมใช้งานสูงบนหลายโหนด กลไกในตัวช่วยให้คุณสามารถจับและบันทึกแพ็กเก็ตโดยใช้ pcap เพื่อตรวจสอบเพิ่มเติม มีหลายตัวเลือกสำหรับการตรวจสอบฟังก์ชันการทำงาน ระบบสิ้นสุด: ตัวแทน, ping, TCP Open, สคริปต์และเครื่องมืออื่น ๆ เช่น wget

เป็นไปได้ที่จะจองบาลานเซอร์ด้วยการจำลองสถานะ NAT ระหว่างโหนดหลักและโหนดสำรอง เมื่อทำการเชื่อมต่อใหม่ ไคลเอนต์จะเชื่อมต่อกับเซิร์ฟเวอร์เดียวกัน ในการบันทึกเซสชัน จะใช้ที่อยู่ IP และพอร์ตปลายทางของลูกค้า รองรับการเชื่อม Linux ตารางทั้งหมดถูกเก็บไว้ใน RAM แต่ข้อกำหนดมีขนาดเล็ก หน่วยความจำ 512 MB ก็เพียงพอสำหรับ 4 ล้านเซสชัน
สามารถทำงานบน Linux (โดยใช้ซ็อกเก็ต PF_PACKET API) และ SPARC/Intel Solaris (Streams/DLPI API) สำหรับการติดตั้ง จะมีการเสนอแพ็คเกจ rpm (Red Hat RHEL 6 / CentOS) และ deb (Debian/Ubuntu) และ tarball สำหรับการแจกแจงอื่นๆ มีรูปภาพสำเร็จรูปให้ด้วย เครื่องเสมือน(บน Ubuntu 8.04) ซึ่งช่วยให้คุณสามารถปรับใช้ฟังก์ชันการทำงานที่จำเป็นได้อย่างรวดเร็ว ในระหว่างการดาวน์โหลด รหัสผ่านเข้าสู่ระบบทั้งหมดจะแสดงขึ้น เอเจนต์ (bngagent) เป็นโอเพ่นซอร์สและรองรับ Linux, Solaris, OS X, HP-UX และอื่นๆ
ไม่มีอินเทอร์เฟซสำหรับการกำหนดค่า การตั้งค่าทั้งหมดทำโดยใช้ไฟล์การกำหนดค่า /etc/bng.conf โดยหลักการแล้วมันไม่สามารถเรียกว่าซับซ้อนได้ โดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่ามีมากกว่าหนึ่งโหลบนเว็บไซต์ของโครงการ ตัวอย่างสำเร็จรูปบ่อยครั้งที่คุณเพียงแค่ต้องเลือกสิ่งที่เหมาะสมที่สุดและแก้ไขด้วยตัวเอง


HAProxy

ใช้งานได้กับสถาปัตยกรรม x86, x86_64, Alpha, SPARC, MIPS, PARISC หลายตัว รองรับ Linux 2.6.32+ อย่างเป็นทางการ (แนะนำสำหรับ ประสิทธิภาพสูงสุด) และ 2.4, Solaris 8–10, FreeBSD, OpenBSD การติดตั้งและการกำหนดค่านั้นไม่สำคัญ แม้ว่าจะไม่มีแพ็คเกจอยู่ในที่เก็บก็ตาม ทางโครงการนำเสนอ ซอร์สโค้ดได้รับอนุญาตภายใต้ GPL v2 และไบนารีสำเร็จรูปสำหรับ Linux/x86 Glibc 2.2 และ Solaris8/Sparc


ปอนด์ - พร็อกซีและความสมดุลของ HTTP และ HTTPS

เป้าหมายเดิมของโปรเจ็กต์ Pound คือการกระจายโหลดไปยังเซิร์ฟเวอร์ Zope หลายเครื่อง ส่งผลให้เครื่องมือมีจุดมุ่งเน้นสูง นั่นคือพร็อกซีย้อนกลับและตัวโหลดบาลานซ์สำหรับ HTTP และ HTTPS

การปรับสมดุลจะขึ้นอยู่กับสถานะเซสชันและพารามิเตอร์อื่นๆ (URL, การตรวจสอบสิทธิ์, คุกกี้, ส่วนหัว HTTP) การสนับสนุนอย่างเต็มที่ WebDAV. ต่างจาก HAProxy ตรงที่มันรองรับ SSL พัฒนาโดยบริษัทไอทีที่เกี่ยวข้องกับความปลอดภัย ซึ่งส่งผลต่อความสามารถของผลิตภัณฑ์ด้วย คุณสมบัติพิเศษคือการมีพื้นฐาน ฟังก์ชั่นเว็บแอปพลิเคชันไฟร์วอลล์ Pound สามารถควบคุมความถูกต้องของส่วนหัว HTTP และ HTTPS โดยละทิ้งส่วนหัวที่ไม่ถูกต้อง ตามค่าเริ่มต้น คำขอทั้งหมดจะถูกละเว้น แต่คุณสามารถสร้างรูปแบบ URL และประเภทคำขอ (มาตรฐาน ขั้นสูง RPC และ WebDAV) ที่จะถูกตรวจสอบการจับคู่ ขึ้นอยู่กับผลลัพธ์ เซิร์ฟเวอร์สุดท้ายจะถูกเลือกหรือการเชื่อมต่อถูกบล็อก การออกแบบในตอนแรกจัดให้มีการรบกวนการรับส่งข้อมูลน้อยที่สุด (เช่น การฝังคุกกี้) แต่สามารถระบุ X-Forwarded-for เพื่อส่งที่อยู่ IP ของผู้ใช้ไปยังเซิร์ฟเวอร์แบ็กเอนด์

รองรับ IPv6 สามารถถ่ายโอนไคลเอนต์ IPv6 ไปยังเซิร์ฟเวอร์ IPv4 ข้อมูลเซสชันจะถูกจัดเก็บและไคลเอ็นต์จะเชื่อมต่อกับเซิร์ฟเวอร์ในภายหลัง

จากข้อมูลเฉพาะ ไม่เพียงแต่สามารถส่งการเชื่อมต่อไปยังแบ็กเอนด์เท่านั้น แต่ยังสามารถเปลี่ยนเส้นทางไปยัง URL อื่นได้อีกด้วย

Pound ไม่ต้องการทรัพยากรจำนวนมาก เป็นที่น่าสังเกตว่า daemon ไม่สามารถเข้าถึงฮาร์ดไดรฟ์ยกเว้นการอ่านใบรับรอง SSL สามารถรันใน chroot และใช้ setuid/setgid ไม่มีกลไกการยอมรับข้อผิดพลาดในตัว ฟังก์ชันแบ็กเอนด์จะถูกตรวจสอบผ่าน HTTP เสมอ

บนโปรเซสเซอร์ Pentium D-level สามารถรับการเชื่อมต่อ HTTP ประมาณ 600–800 และ 200–300 HTTPS ต่อวินาที ดังนั้นจุดแข็งของปอนด์คือโครงการขนาดเล็กที่เน้นการเข้าถึง ความปลอดภัย และ ควบคุมได้มากขึ้นเกินการจราจร สำหรับข้อมูลเพิ่มเติม โหลดสูงนักพัฒนาปอนด์เองก็แนะนำให้ใช้วิธีแก้ไขปัญหาอื่น

การติดตั้งและการกำหนดค่านั้นไม่ยากนัก แม้ว่าจะเสร็จสิ้นโดยใช้ไฟล์การกำหนดค่าก็ตาม (เอกสารประกอบมีรายละเอียดมาก) ทดสอบอย่างเป็นทางการบน Linux, Solaris และ OpenBSD โครงการนำเสนอเฉพาะซอร์สโค้ดเท่านั้น แพ็คเกจสำเร็จรูปสามารถพบได้ในที่เก็บ SUSE, Debian และ Ubuntu นอกจากนี้ไซต์ยังมีลิงก์สำหรับ Red Hat และการแจกจ่ายสำเร็จรูปที่สร้างบน FreeBSD