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

HAProxy ทำให้เว็บลื่นและเสถียรขึ้นได้อย่างไร
เบื้องหลังเว็บไซต์ที่เปิดใช้งานได้ลื่นไหล ไม่ได้มีเพียงแค่เซิร์ฟเวอร์ที่มีประสิทธิภาพสูงเท่านั้น แต่ยังมีระบบที่ช่วยจัดการทราฟฟิกและรับมือกับความผิดปกติของเครื่องปลายทางอย่างมีประสิทธิภาพ หนึ่งในเครื่องมือสำคัญที่หลายระบบโปรดักชันเลือกใช้ก็คือ HAProxy
แม้การตั้งค่าแบบพื้นฐานจะช่วยกระจายโหลดได้ในระดับหนึ่ง แต่หากมีการใช้งาน Health Check และเลือกวิธี Load Balancing ให้เหมาะสม ระบบจะมีความนิ่งและเสถียรมากขึ้นอย่างชัดเจน
Health Check คืออะไร และสำคัญอย่างไร
Health Check คือกลไกที่ช่วยตรวจสอบว่า backend แต่ละเครื่องยังพร้อมรับงานอยู่หรือไม่ หากไม่มีการตรวจสอบนี้ HAProxy อาจยังคงส่งคำขอไปยังเครื่องที่แอปล่มหรือทำงานผิดปกติอยู่ ส่งผลให้ผู้ใช้บางส่วนเจออาการเว็บค้างหรือเข้าใช้งานไม่ได้ แม้ว่าเครื่องอื่นในระบบยังทำงานตามปกติก็ตาม
เมื่อเปิดใช้งาน Health Check เครื่องที่ตอบสนองผิดปกติจะถูกนำออกจากรอบการรับงานชั่วคราวโดยอัตโนมัติ และเมื่อเครื่องนั้นกลับมาตอบสนองได้ตามเงื่อนไขที่กำหนด ระบบก็สามารถนำกลับเข้ามาใช้งานได้เองโดยไม่ต้องอาศัยการจัดการด้วยมือ
ตัวอย่างโครงสร้าง backend แบบง่าย
สมมุติว่าระบบมี backend อยู่ 3 เครื่อง ได้แก่
- web1 10.0.0.11:80
- web2 10.0.0.12:80
- web3 10.0.0.13:80
โดยทั่วไป หากต้องการตรวจสอบว่าเว็บยังพร้อมใช้งาน มักเริ่มจากการเช็ก HTTP path เช่น /health หรือ /status ซึ่งฝั่งแอปพลิเคชันควรมี endpoint ที่เบาและตอบสนองเร็ว ไม่ควรดึงข้อมูลจากฐานข้อมูลหนัก ๆ หรือมีขั้นตอนประมวลผลซับซ้อน เพราะหน้าที่หลักของ endpoint นี้คือบอกว่าแอปยังทำงานอยู่ได้ตามปกติ
แนวทางการตั้งค่าเบื้องต้นใน HAProxy
แนวคิดพื้นฐานของ HAProxy มักแบ่งออกเป็น 2 ส่วนหลักคือ
- frontend ทำหน้าที่รับทราฟฟิกจากผู้ใช้
- backend ทำหน้าที่เป็นกลุ่มเซิร์ฟเวอร์ปลายทางที่รับงานต่อ
ในฝั่ง backend สามารถเปิดใช้งาน httpchk เพื่อให้ HAProxy ส่งคำขอไปตรวจสอบสถานะของแต่ละเครื่องได้ และกำหนด check ให้กับ server แต่ละตัวเพื่อเฝ้าดูสถานะอย่างต่อเนื่อง
แนวทางนี้ช่วยให้ระบบตัดสินใจได้ดีขึ้นว่าเครื่องใดควรรับงาน และเครื่องใดควรถูกพักออกจากระบบชั่วคราว
สิ่งที่มือใหม่มักพลาดในการทำ Health Check
ข้อผิดพลาดที่พบบ่อยคือการใช้หน้าแรกของเว็บไซต์เป็น health check โดยตรง แม้ว่าวิธีนี้จะดูง่าย แต่ในความเป็นจริงหน้าแรกมักมี dependency หลายอย่าง เช่น การเรียกฐานข้อมูล การโหลดข้อมูลเพิ่มเติม หรือการประมวลผลบางส่วน หากส่วนประกอบใดส่วนหนึ่งช้าลง ระบบอาจตีความผิดว่าเครื่องนั้นเสีย ทั้งที่จริงเพียงแค่ตอบสนองช้าชั่วคราว
ดังนั้นแนวทางที่ดีกว่าคือสร้าง endpoint สำหรับ health check โดยเฉพาะ ให้มีความเรียบง่าย ตอบเร็ว และมีภาระน้อยที่สุด
วิธี Load Balancing ที่ควรรู้
หลายคนอาจคุ้นกับการกระจายโหลดแบบ round robin ซึ่งเป็นการแจกงานวนไปทีละเครื่อง วิธีนี้เข้าใจง่าย เหมาะสำหรับการเริ่มต้น และใช้ได้ดีกับเว็บทั่วไป
อย่างไรก็ตาม HAProxy ยังรองรับวิธีอื่นที่อาจเหมาะกับลักษณะงานมากกว่า เช่น
1. Round Robin
แจกคำขอวนไปทีละเครื่องตามลำดับ เหมาะกับระบบที่ backend แต่ละเครื่องมีความสามารถใกล้เคียงกัน และ request ส่วนใหญ่ใช้ทรัพยากรไม่ต่างกันมาก
2. Leastconn
ส่งงานไปยังเครื่องที่มีจำนวน connection น้อยกว่า เหมาะกับงานที่แต่ละ request ใช้เวลาประมวลผลไม่เท่ากัน เช่น ระบบดาวน์โหลดไฟล์ งาน streaming หรือ API ที่บางคำขอใช้ทรัพยากรสูงกว่าปกติ
3. Source
พยายามส่งผู้ใช้จาก IP เดิมไปยังเครื่องเดิม เหมาะกับบางระบบที่ยังต้องพึ่ง session แบบผูกกับเครื่องปลายทาง
หากเป็นเว็บทั่วไป การเริ่มจาก round robin ถือว่าเป็นตัวเลือกที่ปลอดภัยและดูแลได้ง่าย แต่ถ้าระบบมีลักษณะงานไม่สม่ำเสมอ leastconn มักให้ผลลัพธ์ที่ดีกว่า
ค่า rise และ fall ช่วยให้ระบบนิ่งขึ้น
อีกหนึ่งเทคนิคสำคัญที่ไม่ค่อยถูกพูดถึงมากนักคือการกำหนดค่า rise และ fall
- fall คือจำนวนครั้งที่ health check ต้องล้มเหลวติดต่อกัน ก่อนจะตัดสินว่าเครื่องมีปัญหาและนำออกจากระบบ
- rise คือจำนวนครั้งที่ health check ต้องผ่านติดต่อกัน ก่อนจะอนุญาตให้นำเครื่องกลับเข้ามารับงานอีกครั้ง
ตัวอย่างเช่น หากกำหนด fall 3 และ rise 2 จะหมายความว่าเครื่องต้องตอบล้มเหลว 3 รอบติดกันก่อนจึงจะถูกนำออก และต้องตอบผ่าน 2 รอบติดกันก่อนจึงจะกลับเข้ามาได้
ประโยชน์ของการตั้งค่าแบบนี้คือช่วยลดอาการ backend เด้งเข้าเด้งออกจากระบบบ่อย ๆ เมื่อระบบมีอาการแกว่งหรือสะดุดเป็นพัก ๆ ทำให้ HAProxy ไม่ตื่นตูมกับความผิดพลาดเพียงครั้งเดียว
การใช้ Backup Server และ Weight
HAProxy ยังมีฟีเจอร์ที่ช่วยให้บริหารทรัพยากรได้ยืดหยุ่นขึ้น เช่น backup server ซึ่งจะยังไม่รับงานจนกว่าเครื่องหลักบางส่วนหรือทั้งหมดจะมีปัญหา วิธีนี้เหมาะกับระบบที่ต้องการประหยัดทรัพยากร หรือมีเครื่องสำรองไว้ใช้งานเฉพาะในสถานการณ์ฉุกเฉิน
นอกจากนี้ยังสามารถใช้ weight เพื่อกำหนดสัดส่วนการรับทราฟฟิกของแต่ละเครื่องได้ เช่น หากเพิ่ง deploy เวอร์ชันใหม่ อาจให้เครื่องใหม่รับทราฟฟิกเพียง 10% ก่อน เมื่อมั่นใจว่าเสถียรแล้วจึงค่อยเพิ่มน้ำหนักภายหลัง วิธีนี้ช่วยลดความเสี่ยงจากการปล่อยระบบใหม่แบบเต็มรูปแบบทันที
แนวทางเริ่มต้นสำหรับมือใหม่
หากเพิ่งเริ่มใช้งาน HAProxy และต้องการเห็นผลลัพธ์ที่ชัดเจน ควรเริ่มจาก 3 เรื่องสำคัญดังนี้
- สร้าง endpoint
/healthที่เบาและตอบสนองเร็ว - เลือก load balancing algorithm ให้เหมาะกับลักษณะของระบบ
- ตั้งค่า
riseและfallให้สมดุล เพื่อลดความผันผวนของ backend
เมื่อทำทั้ง 3 ข้อนี้ได้ดี ระบบจะสามารถรับมือกับความผิดปกติได้อย่างชาญฉลาดขึ้น และผู้ใช้ปลายทางก็จะรู้สึกได้ว่าเว็บไซต์มีความเสถียรมากขึ้น แม้จะไม่รู้เลยว่ามีอะไรทำงานอยู่เบื้องหลัง
สรุป
HAProxy ไม่ได้เป็นเพียงเครื่องมือสำหรับกระจายโหลดเท่านั้น แต่ยังเป็นกลไกสำคัญที่ช่วยให้ระบบโปรดักชันรับมือกับความผิดปกติได้ดีขึ้น Health Check ช่วยหลีกเลี่ยงการส่งงานไปยังเครื่องที่มีปัญหา ขณะที่ Load Balancing ช่วยกระจายทราฟฟิกให้เหมาะกับลักษณะงานของระบบ
ยิ่งตั้งค่าได้เหมาะสมมากเท่าไร เว็บไซต์ก็ยิ่งเสถียรและลื่นไหลมากขึ้นเท่านั้น และนั่นคือเบื้องหลังสำคัญของประสบการณ์ใช้งานที่ดีที่ผู้ใช้สัมผัสได้ในทุกวัน