ผู้เขียนต้นฉบับ: อดัม ชาร์น็อค
ลิงก์ต้นฉบับ: คู่มือ Hitchhikers สำหรับ PHP Load Balancing
การแปล: Koda
เคยหมายถึงการใช้งานเว็บเซิร์ฟเวอร์ขนาดใหญ่เมื่อใช้งานเว็บแอปพลิเคชันขนาดใหญ่ เนื่องจากแอปพลิเคชันของคุณดึงดูดผู้ใช้จำนวนมาก คุณจะต้องเพิ่มหน่วยความจำและโปรเซสเซอร์เพิ่มเติมให้กับเซิร์ฟเวอร์ของคุณ
ทุกวันนี้ โมเดล 'เซิร์ฟเวอร์ขนาดใหญ่' หมดไปแล้ว และถูกแทนที่ด้วยเซิร์ฟเวอร์ขนาดเล็กจำนวนมาก โดยใช้เทคนิคการทำโหลดบาลานซ์ที่หลากหลาย นี่เป็นแนวทางที่เป็นไปได้มากกว่าซึ่งจะช่วยลดต้นทุนด้านฮาร์ดแวร์ให้ต่ำที่สุด
ข้อดีของ 'เซิร์ฟเวอร์ขนาดเล็กกว่า' เหนือโมเดล 'เซิร์ฟเวอร์ขนาดใหญ่' ที่ผ่านมาสะท้อนให้เห็นในสองแง่มุม:
หากเซิร์ฟเวอร์หยุดทำงาน ระบบปรับสมดุลโหลดจะหยุดส่งคำขอไปยังเซิร์ฟเวอร์ที่หยุดทำงาน และแทนที่จะกระจายโหลดไปยังเซิร์ฟเวอร์อื่นที่ทำงานตามปกติ . เหนือกว่า
ปรับขนาดเซิร์ฟเวอร์ของคุณได้ง่ายขึ้น สิ่งที่คุณต้องทำคือเพิ่มเซิร์ฟเวอร์ใหม่ให้กับระบบโหลดบาลานซ์ ไม่จำเป็นต้องขัดจังหวะการสมัครของคุณ
ดังนั้น ใช้ประโยชน์จากโอกาสนี้ :) แน่นอนว่าข้อเสียคือมันต้องการความซับซ้อนเพิ่มขึ้นเล็กน้อยในการพัฒนาแอปพลิเคชันของคุณ นั่นคือสิ่งที่บทความนี้จะครอบคลุม
ณ จุดนี้ คุณอาจจะพูดกับตัวเองว่า: 'แต่ฉันจะรู้ได้อย่างไรว่าฉันกำลังใช้การทำโหลดบาลานซ์อยู่? - คำตอบที่ตรงไปตรงมาที่สุด หากคุณถามคำถามนี้คือ คุณอาจไม่ได้ใช้ระบบจัดสรรภาระงาน และระบบของคุณไม่จำเป็นต้องพิจารณาเรื่องนี้ ในกรณีส่วนใหญ่ เมื่อแอปพลิเคชันมีขนาดใหญ่เพียงพอ จำเป็นต้องเสนอและตั้งค่าการปรับสมดุลโหลดอย่างชัดเจน อย่างไรก็ตาม บางครั้งฉันเห็นบริษัทเว็บโฮสติ้งทำการปรับสมดุลโหลดนี้สำหรับแอปพลิเคชันของลูกค้า หรือดำเนินการด้วยตนเองตามที่อธิบายไว้ด้านล่าง
ก่อนที่จะดำเนินการต่อด้านล่าง ฉันอยากจะชี้ให้เห็นว่าบทความนี้จะอธิบายเกี่ยวกับการปรับสมดุลโหลดใน PHP เป็นหลัก ฉันอาจจะเขียนเกี่ยวกับ Data Load Balancing ในอนาคต แต่ตอนนี้คุณจะต้องรอก่อน
โปรดทราบว่าฉันมักจะพูดถึง "แอปพลิเคชันเว็บ" มากกว่าเว็บไซต์ ทั้งนี้เพื่อแยกแยะว่า 'แอปพลิเคชันเว็บ' เป็นไซต์ที่ซับซ้อนซึ่งมักเกี่ยวข้องกับการเขียนโปรแกรมและฐานข้อมูลฝั่งเซิร์ฟเวอร์ มากกว่าเว็บไซต์ที่แสดงเฉพาะเนื้อหาคงที่แบบธรรมดา
1. ไฟล์ PHP คำถามแรกคือ หากคุณมีเซิร์ฟเวอร์ขนาดเล็กจำนวนมาก คุณจะอัพโหลดไฟล์ php ไปยังเซิร์ฟเวอร์ทั้งหมดได้อย่างไร มีวิธีอ้างอิงดังต่อไปนี้:
อัปโหลดไฟล์ทั้งหมดไปยังแต่ละเซิร์ฟเวอร์แยกกัน ปัญหาของวิธีนี้คือ ลองจินตนาการว่าคุณมีเซิร์ฟเวอร์ 20 เครื่อง ซึ่งจะทำให้เกิดข้อผิดพลาดได้ง่ายในระหว่างกระบวนการอัปโหลด และเวลาอัปเดตจะนานมาก รวดเร็ว เป็นไปได้ที่จะมีไฟล์เวอร์ชันที่แตกต่างกันบนเซิร์ฟเวอร์ที่แตกต่างกัน
ใช้ 'rsync' (หรือซอฟต์แวร์ที่คล้ายกัน) เครื่องมือดังกล่าวสามารถซิงโครไนซ์ไฟล์ในไดเร็กทอรีในเครื่องและไดเร็กทอรีบนโฮสต์ระยะไกลหลายเครื่อง
ใช้ซอฟต์แวร์ควบคุมเวอร์ชัน (เช่น การโค่นล้ม) นี่เป็นวิธีที่ฉันชอบ ช่วยให้ฉันรักษาโค้ดของฉันได้เป็นอย่างดี และเมื่อฉันเผยแพร่แอปพลิเคชัน ฉันสามารถเรียกใช้คำสั่ง svn update บนแต่ละเซิร์ฟเวอร์เพื่อซิงโครไนซ์ได้ วิธีนี้ยังช่วยให้สลับเซิร์ฟเวอร์เป็นโค้ดเวอร์ชันก่อนหน้าได้ง่ายขึ้น
ใช้ไฟล์เซิร์ฟเวอร์ (คุณอาจพบว่า NFS เหมาะสำหรับสิ่งนี้) วิธีการนี้คือการใช้ไฟล์เซิร์ฟเวอร์เพื่อโฮสต์เว็บแอปพลิเคชันของคุณ แน่นอนว่าหากไฟล์เซิร์ฟเวอร์ของคุณล่ม ไซต์ทั้งหมดของคุณจะไม่สามารถใช้งานได้ ในเวลานี้คุณจะต้องใช้เงินมากขึ้นเพื่อกู้คืน
วิธีที่คุณเลือกขึ้นอยู่กับความต้องการและทักษะของคุณ หากคุณใช้ระบบควบคุมเวอร์ชัน คุณอาจต้องการวางแผนวิธีอัปเดตโค้ดบนเซิร์ฟเวอร์ทั้งหมดโดยดำเนินการคำสั่งอัปเดตพร้อมกัน อย่างไรก็ตาม หากคุณใช้ไฟล์เซิร์ฟเวอร์ คุณจะต้องใช้กลไกการกู้คืนความล้มเหลวเพื่อป้องกันคำขอล้มเหลวในกรณีที่เซิร์ฟเวอร์ล่ม
2. การอัพโหลดไฟล์ เมื่อมีเซิร์ฟเวอร์เพียงเครื่องเดียว การอัพโหลดไฟล์จะไม่เป็นปัญหา แต่เมื่อเรามีหลายเซิร์ฟเวอร์ ไฟล์ที่อัพโหลดจะถูกจัดเก็บอย่างไร? ปัญหาในการอัพโหลดไฟล์จะคล้ายกับการจัดเก็บไฟล์ PHP ข้ามเซิร์ฟเวอร์ ต่อไปนี้เป็นวิธีแก้ไขปัญหาที่เป็นไปได้หลายประการ:
เก็บไฟล์ไว้ในฐานข้อมูล ข้อมูลส่วนใหญ่อนุญาตให้จัดเก็บข้อมูลไบนารี่ได้ เมื่อคุณขอดาวน์โหลดไฟล์ ข้อมูลการเข้าถึงจะส่งออกข้อมูลไบนารีและชื่อไฟล์และประเภทที่เกี่ยวข้องไปยังผู้ใช้ คุณควรพิจารณาว่าฐานข้อมูลจะจัดเก็บไฟล์ของคุณอย่างไรก่อนที่จะใช้โซลูชันนี้ ปัญหาของแนวทางนี้คือหากเซิร์ฟเวอร์ฐานข้อมูลล่ม จะทำให้ไฟล์ใช้งานไม่ได้
จัดเก็บไฟล์ที่อัพโหลดไว้บนไฟล์เซิร์ฟเวอร์ เช่นเดียวกับในบทนำก่อนหน้านี้ คุณต้องติดตั้งไฟล์เซิร์ฟเวอร์ที่จะแชร์โดยเว็บเซิร์ฟเวอร์ทั้งหมด อัปโหลดไฟล์ที่อัพโหลดทั้งหมดที่นี่ หลังจากอัพโหลดแล้ว เว็บเซิร์ฟเวอร์ทั้งหมดจะสามารถใช้งานได้ อย่างไรก็ตาม หากไฟล์เซิร์ฟเวอร์ล่ม การดาวน์โหลดไฟล์ภาพอาจหยุดชะงัก
ออกแบบกลไกการอัพโหลดของคุณเองเพื่อถ่ายโอนไฟล์ไปยังแต่ละเซิร์ฟเวอร์ วิธีการนี้ไม่มีข้อเสียเหมือนกับไฟล์เซิร์ฟเวอร์หรือโซลูชันฐานข้อมูลเดียว แต่จะเพิ่มความซับซ้อนของโค้ดของคุณ เช่น หากเซิร์ฟเวอร์ล่มระหว่างการอัพโหลดไปยังเซิร์ฟเวอร์หลายเครื่อง คุณจะทำอย่างไร?
การใช้ฐานข้อมูลเพื่อจัดเก็บไฟล์ที่อัพโหลด แต่การออกแบบกลไกการแคชไฟล์เป็นวิธีแก้ปัญหาที่ดี เมื่อเซิร์ฟเวอร์ได้รับคำขอดาวน์โหลดไฟล์ ก่อนอื่นจะตรวจสอบว่ามีไฟล์อยู่ในระบบแคชหรือไม่ หากพบ จะดาวน์โหลดจากระบบแคช มิฉะนั้น จะอ่านจากฐานข้อมูลและแคชไว้ในระบบไฟล์
3. เซสชัน
หากคุณคุ้นเคยกับการจัดการเซสชันของ PHP คุณจะรู้ว่าตามค่าเริ่มต้นแล้ว PHP จะจัดเก็บข้อมูลเซสชันไว้ในไฟล์ชั่วคราวบนเซิร์ฟเวอร์ นอกจากนี้ ไฟล์นี้อยู่บนเซิร์ฟเวอร์ที่คุณร้องขอเท่านั้น แต่คำขอในภายหลังอาจได้รับการประมวลผลโดยเซิร์ฟเวอร์อื่น ซึ่งจะสร้างเซสชันใหม่บนเซิร์ฟเวอร์อื่น ซึ่งทำให้ระบบไม่รู้จักเซสชันบ่อยครั้ง เช่น ผู้ใช้ที่เข้าสู่ระบบจะถูกขอให้เข้าสู่ระบบอีกครั้งเสมอ
วิธีแก้ปัญหาที่แนะนำของฉันคือสร้างกลไกการประมวลผลเซสชันในตัวของ PHP ขึ้นมาใหม่เพื่อจัดเก็บข้อมูลเซสชันไว้ในฐานข้อมูล หรือใช้กลไกของคุณเองเพื่อให้แน่ใจว่าคำขอของผู้ใช้ถูกส่งไปยังเซิร์ฟเวอร์เดียวกัน
4. การกำหนดค่า
แม้ว่าหัวข้อนี้ไม่เกี่ยวข้องกับ PHP โดยเฉพาะ แต่ฉันรู้สึกว่าจำเป็นต้องพูดถึงเรื่องนี้ เมื่อใช้งานเซิร์ฟเวอร์แบบคลัสเตอร์ เป็นความคิดที่ดีที่จะมีวิธีใดวิธีหนึ่งในการทำให้ไฟล์การกำหนดค่าซิงค์กันระหว่างเซิร์ฟเวอร์ หากไฟล์คอนฟิกูเรชันไม่สอดคล้องกัน อาจส่งผลให้เกิดการทำงานไม่สม่ำเสมอที่แปลกประหลาดซึ่งอาจเป็นเรื่องยากที่จะแก้ไขปัญหา
ฉันแนะนำให้จัดการทีละรายการโดยใช้ระบบควบคุมเวอร์ชัน วิธีนี้ทำให้คุณสามารถจัดเก็บไฟล์การกำหนดค่า php ที่แตกต่างกันสำหรับการติดตั้งโปรเจ็กต์ที่แตกต่างกัน และยังทำให้ไฟล์การกำหนดค่าเซิร์ฟเวอร์ทั้งหมดซิงค์กันอีกด้วย
5. การบันทึก
เช่นเดียวกับปัญหาการกำหนดค่า การบันทึกไม่ได้เกี่ยวข้องกับ PHP เท่านั้น แต่ยังคงเป็นสิ่งสำคัญมากที่จะต้องรักษาเซิร์ฟเวอร์ของคุณให้ทำงานได้ดี หากไม่มีระบบการบันทึกที่เหมาะสม คุณจะรู้ได้อย่างไรว่าโค้ด PHP ของคุณเริ่มสร้างข้อผิดพลาด (คุณจะปิดการตั้งค่า display_errors เสมอเมื่อระบบใช้งานได้ใช่ไหม)
มีสองสามวิธีที่คุณสามารถใช้การบันทึกได้:
เข้าสู่ระบบทุกครั้ง เซิร์ฟเวอร์ นี่เป็นวิธีที่ง่ายที่สุด แต่ละเครื่องจะบันทึกไฟล์เดียวเท่านั้น ข้อดีคือเรียบง่ายและอาจต้องใช้การกำหนดค่าน้อยมาก อย่างไรก็ตาม เมื่อจำนวนเซิร์ฟเวอร์เพิ่มขึ้น การตรวจสอบไฟล์บันทึกในแต่ละเซิร์ฟเวอร์จึงกลายเป็นเรื่องยากมาก
การบันทึกเพื่อแชร์ วิธีการนี้ยังคงมีไฟล์บันทึกอยู่บนเซิร์ฟเวอร์แต่ละเครื่อง แต่ไฟล์เหล่านั้นจะถูกจัดเก็บไว้ในเซิร์ฟเวอร์ไฟล์กลางผ่านกลไกการแชร์ ซึ่งทำให้การตรวจสอบบันทึกทำได้ง่ายขึ้น ปัญหาในการแก้ปัญหานี้คือ หากเซิร์ฟเวอร์ไฟล์ไม่พร้อมใช้งาน ปัญหาการเขียนบันทึกแบบธรรมดาจะทำให้แอปพลิเคชันทั้งหมดเสียหายในที่สุด
การบันทึกไปยังเซิร์ฟเวอร์การบันทึก คุณสามารถใช้ซอฟต์แวร์การบันทึก เช่น syslog เพื่อเขียนบันทึกทั้งหมดไปยังเซิร์ฟเวอร์กลาง แม้ว่าวิธีนี้ต้องการการกำหนดค่าเพิ่มเติม แต่ก็ยังให้โซลูชันที่แข็งแกร่งที่สุดอีกด้วย
เพิ่ม phpv: อีกจุดสำคัญคือการจัดการฐานข้อมูลซึ่งอาจเกี่ยวข้องกับเนื้อหาจำนวนมาก ดังนั้นผู้เขียนจึงไม่ได้เขียนออกมา