วิธี scale PHP ไปยัง server หลายตัว by

31
Mar
0

หากเว็บไซต์ของคุณรับโหลดมาก คนเข้าเยอะฝุดๆ จน CPU หรือ Memory ล้นจนเกินไปแล้ว เปิด APC แล้วก็ยังไม่ช่วย และมั่นใจว่าปัญหาไม่ได้เกิดจาก database ช้าแน่ๆ หรือขยาย cloud แบบ vertical (up CPU up Ram) ไปจนสุดก็รับไม่ไหวแล้ว ก็ถึงเวลาที่จะต้องขยายของด้านข้าง (Horizontal Scale) แล้วละครับ วิธีการก็คือเราต้องมี Load Balancer มาคอยช่วยกระจายโหลดออกไป

Load Balance

จากรูปจะเห็นว่า Load Balancer เป็นเหมือนตัวกลางที่คอยรับส่งข้อมูลแทนระหว่าง Client กับ Server โดยที่การประมวลผลจริงๆ จะยังอยู่ที่ฝั่ง Server ซึ่งเราสามารถติดตั้ง Load Balancer ที่เครื่องแยกออกมาต่างหากหรือจะติดตั้งรวมกับ Server ตัวใดตัวหนึ่งก็ได้(เนื่องจากตัว Load Balance ไม่ได้กิน Resource เครื่องมากนัก) โดยหลักการแล้วจะมี public IP ยิงเข้า Load Balance เพื่อรับข้อมูลจาก Client ทุกคน และแอบส่งข้อมูลต่อไปยัง Server ผ่านทาง Private IP แล้วจึงตอบกลับไปยัง Client ซึ่งสุดท้าย Client จะรู้แค่ว่าต้องติดต่อกับ Load Balancer เท่านั้น ไม่จำเป็นต้องรู้เลยว่าจริงๆ แล้วเขากำลังคุยกับ Server ตัวไหนอยู่ และไม่สามารถรู้ได้ด้วยว่าจริงๆ แล้วมี Server ให้บริการทั้งหมดกี่เครื่อง

ตัว Load Balancer จะแบ่งออกเป็น 2 ประเภทคือชนิด Hardware (เป็นเครื่องที่ออกแบบมาให้ทำหน้าที่นี้โดยเฉพาะ) และชนิด Software (เราลงโปรแกรมที่ server ตัวใดตัวหนึ่งให้มันทำงานเป็น Load Balancer) ซึ่งส่วนใหญ่แล้วเพื่อประหยัดงบเรามักจะใช้ Load Balancer ชนิด Software ซึ่งแค่นี้ก็เพียงพอสำหรับการรองรับคนเข้าวันละแสนคนได้สบายๆ อยู่แล้ว

สำหรับ Software ยอดนิยมก็จะมี Nginx และ Haproxy ซึ่งผมแนะนำให้ใช้ Nginx เนื่องจากเอาไว้ Serv พวก Static File เช่นรูปภาพได้ด้วย load ที่ต่ำมาก ควบคู่ไปกับการแบ่ง load ซึ่งทำได้ในตัวเดียวเลย ซึ่งตัวอย่างการใช้งาน Nginx ให้ทำตัวเป็น Load Balancer ให้ใส่ config ดังตัวอย่างด้านล่าง


http {
upstream backend_php {
server 127.0.0.1:9000 weight=14;
server 192.168.0.1:9000 weight=13;
server 192.168.0.2:9000 weight=13;
}
}

จาก code ด้านบนคือส่ง load เข้าเครื่องแรกเป็นเครื่องตัวเอง เครื่องที่สองและสามเป็น ip 192.168.0.1 และ 192.168.0.2 port 9000 (เป็น Default port ของ Fast-CGI) แล้ว restart nginx แค่นี้ก็เรียบร้อย :)

ปัญหาสุดท้ายหลังจากใช้งาน Load Balancer คือ PHP Session จะไม่ได้สามารถใช้ได้เพราะปกติ Session จะเก็บลงไฟล์ที่เครื่อง server ที่ติดต่อ พอ user เข้าเครื่องไหนก็ได้ Session ก็จะไม่ตามไปยังอีกเครื่องด้วย ปัญหานี้แก้ด้วยการใช้ Redis เข้ามาช่วยเก็บข้อมูล Session PHP แทนครับ โดยต้อง Install Redis และ phpredis (Extension PHP เอาไว้คุยกับ Redis) ให้เรียบร้อยก่อน จากนั้น แก้ไขไฟล์ php.ini ตามด้านล่าง แก้ไข ip เป็นเครื่องที่ติดตั้ง redis ไว้ (server ทุกตัวต้องใช้ redis ตัวเดียวกัน) ก็เป็นอันเรียบร้อย ขอให้โชคดีกับการ scale server นะครับ :)


session.save_handler = redis
session.save_path = "tcp://localhost:6379"

Enjoy this article?

Consider subscribing to our RSS feed!

ไม่มีความเห็น

ยังไม่มีความเห็น

ใส่ความเห็น

RSS feed for comments on this post