วิธี 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"

วิธี config และใช้ nginx + php-fpm + fast-cgi เบื้องต้นให้ใช้งานกับ Codeigniter by

31
Dec
2

เนื่องด้วยทั่วๆ ไปแล้ว web server มาตรฐานทั่วๆ ไปที่ใช้งานกันคือ Apache แต่ว่า Apache นั้นบริโภค Memory อย่างไม่ไยดี และถ้าเว็บเรามีการใช้งาน static file จำพวกรูปภาพหรือ css, js มากๆ ก็จะกิน Memory หนักขึ้นไปอีก หลักการของ nginx จึงเปรียบเสมือนการเป็นป้ายบอกทางว่าถ้าเป็น static file ให้เรียกไฟล์นั้นๆ ขึ้นมาตรงๆ เลยไม่ต้องผ่าน apache หรือตัวกลางอื่นๆ แต่ถ้าเป็น Dynamic file เช่น PHP ก็ให้ส่งไปยัง Fast-cgi แทน ซึ่ง Fast-cgi จะทำหน้าที่อ่าน PHP เพียงอย่างเดียว ไม่ต้องเผื่อรองรับ static file จึงกิน Memory น้อยกว่านั่นเอง สุดท้ายจึงทำให้สามารถรองรับการใช้งานเว็บไซต์ที่มี traffic หนักๆ ได้อย่างสบายๆ กว่า apache มากหลายเท่าตัว

อันที่จริงแล้ว Apache ก็ไม่ได้มีแต่ข้อเสียขนาดนั้น ข้อดีของ Apache คือเหมือนเป็น All-in-one machine ติดตั้งตัวเดียว ทำงานได้ทุกอย่าง ถ้ามีคนใช้งานไม่มาก เราจะแทบไม่ต้องไปยุ่งกับการปรับ config เลยด้วยซ้ำไป เพียงแต่ว่าเมื่อเราต้องการให้รองรับการใช้งานหนักๆ ได้ เราจึงจำเป็นต้องใช้ “ผู้เชี่ยวชาญเฉพาะด้าน” ซึ่งในที่นี้คือ fast-cgi นั่นเอง และจะมี php-fpm คอยควบคุมสั่งการอีกทอดหนึ่งซึ่งแน่นอนว่าการ config เพื่อใช้งานจึงยุ่งยากกว่า แต่ก็แลกมากับประสิทธิภาพที่น่าพอใจ

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน