Để thực hiện một mô hình load balancing có thể nhiều người nghĩ tới việc chi phí lớn và tốn công config . Nhưng tôi mới có ý tưởng tạo một mô hình load balancing với VPS của digitalocean
Đầu tiên tôi chỉ để thử nghiệm . Tôi tạo 4 con VPS ram 512 tại digitalocean . vì digitalocean họ tính tiền theo giờ sử dụng do vậy tôi không ngại tạo VPS để thử , tạo 4 con mỗi ngày chỉ mất có 14 ngàn tiền việt 🙂
- VPS thứ nhất tôi cài đặt webserver nginx (chỉ nguyên nginx) để tạo cấu hình load balancing với module upstream mặc định có khi cài đặt link http://nginx.org/en/docs/http/ngx_http_upstream_module.html
- VPS thứ 2 và thứ 3 tôi cài đặt PHP-FPM và không cài webserver vì ỷ tưởng của tôi muốn 2 VPS này chỉ làm PHP server
- VPS thứ 4 tôi cài MYSQL server cũng ko cài webserver luôn vì tôi chỉ để làm database server
ảnh minh họa tôi vẽ tạm thế này cho các bạn dễ hình dung
Tôi đã chạy thử nghiệm site chính thức với lượng online tầm 1 ngàn user với forum xenforo và lượng viết bài trên forum khá nhanh .
- Kết quả ban đầu thấy ổn 🙂
VPS thứ nhất với vai trò là frontend nhưng chỉ chạy nginx thôi do vậy load nhẹ nhất . Các VPS còn lại CPU gói RAM 512 chỉ có 1 core nhưng chưa khi nào load quá 50% - Với mô hình load balancing nhỏ này nếu thành công thì tôi sẽ giảm được đến chi phí . trước đây tôi phải chạy trên VPS với giá tầm 70 USD thì mới chạy được cái site đó
Hiện tại tôi vẫn đang thử nghiệm nhưng chưa thấy gặp phiền phức nào .
Sơ qua về CẤU HÌNH CỦA TÔI
Đầu tiên tôi nghĩ các VPS của tôi chỉ có thể kết nối với nhau thông qua mạng internet và tôi thấy nếu vậy sẽ có độ trễ ngay cả các VPS này cùng trên một datacenter , hơn nữa là sẽ bị tính vào băng thông
May mắn thay với digitalocean chúng ta có thể kêt nối các VPS với nhau thông qua mạng nội bộ . và kết nối này không có internet nhé , như kết nối mạng LAN vậy
Khi tạo VPS mới phải nhớ tích vào Shared Private Networking
Chi tiết ở đây
Vậy là khỏi sợ vấn đề độ trễ và tính phí băng thông rồi nhé . chỉ tính phí BW cái VPS đầu tiên cài webserver nginx
- NGINX với upstream module
upstream backend {
server php-fpm1.example.com:9000;
server php-fpm2.example.com:9000;
}
server {
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
Cấu hình này có nghĩa là NGINX sẽ chia tải 50/50 cho 2 thằng PHP-FPM , Mỗi server sẽ nhận một lượng công việc bằng nhau , hai php-fpm này sẽ hoán đổi liên tục
Đầu tiên tôi gặp vấn đề với cookie liên tục bị out nick do sesion thay đổi liên tục qua 2 server PHP-FPM . sau đó tôi tìm hiểu và phải build thêm module nginx-sticky-module https://code.google.com/p/nginx-sticky-module/ lúc này thì đã ổn cấu hình như sau
upstream backend {
sticky;
server php-fpm1.example.com:9000;
server php-fpm2.example.com:9000;
}
server {
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
Vậy là đã ổn rồi - Tiếp theo tôi nghĩ phải nghĩ cần đồng bộ hai cái php-fpm lại với nhau vì khi thành viên đính kèm file và avatar mỗi lần sẽ ở một server khác nhau , sau đó tôi chọn giải pháp đồng bộ . Dùng btsync http://labs.bittorrent.com/experiments/sync.html thấy cũng rất ổn và độ trễ rất thấp
Nhưng sau đó tôi lại thấy việc đồng bộ file đính kèm và avatar này không hay bằng giải pháp chỉ lưu file đính kèm và avatar trên một server thôi
Và cuối cùng tôi cài thêm php-fpm trên VPS thứ nhất ( cái cài nginx ý ) vì việc upload avatar và đính kèm không thực hiện liên tục do vậy cũng không đáng ngại vấn đề load cao
và tôi chỉnh lại cấu hình như sau để chỉ đính kèm và avatar trên server php-fpm local
server {
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass backend;
if ($args ~ avatar-upload) {
fastcgi_pass 127.0.0.1:9000;
}
if ($args ~ attachments) {
fastcgi_pass 127.0.0.1:9000;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
Tôi thấy giải pháp này khá hay vì khỏi phải đồng bộ giữa 2 server php-fpm kia làm gì cho mệt .
- Cấu hình MYSQL
Điểm tôi thấy ngại nhất là cái VPS cuối cùng làm mysql server , nhưng khi chạy thử với site thật thì tôi rất ngạc nhiên , Bình thường tôi chạy ở server trước mysql lúc nào cũng chiếm RAM nhiều nhất và chiếm CPU nhiều thứ 2 sau PHP-FPM thì hiện tại chạy trên digitalocean tôi quan sát với RAM 512 là quá ổn với tôi , RAM chiếm 20% CPU chiếm 15% của VPS cuối này . có lẽ vấn đề chạy ít ram này là do server dùng SSD và trước đây vấn đề tôi gặp phải với database là load I/O cao thì cho tới thời điểm này tôi thấy cái databse của tôi tạm ổn . có lẽ do tôi thay đổi cấu hình mysql InnoDB với innodb_file_per_table sang kiểu ibdata1 lưu trữ database innoDB trên một file duy nhất đó mà lượng ram đã giảm đáng kể so với cấu hình trước đây . Chạy innoDB với innodb_file_per_table thì vấn đề về load I/O sẽ giảm hơn rất nhiều so với ibdata1 nhưng sẽ tốn RAM cực kỳ . Với SSD thì I/O không còn là vấn đề nữa do vậy tôi dùng cấu hình innoDB với ibdata1 sẽ là ổn , trước đây chạy trên server HDD thì sợ hãi cái ibdata1 luôn , rất hay bị ghẽn cổ chai .
Hiện tại tôi đang theo dõi các vấn đề phát sinh . nhưng nếu cứ ổn định như hiện tại thì theo tôi nghĩ mô hình load balancing nhỏ tiết kiệm chi phí này của tôi khá là hiệu quả
Tuy nhiên tôi sẽ chỉ thử nghiêm trong vài ngày cho đến khi hết mấy $ trong đó . nhưng cũng có thể tôi nạp thêm tiền và chạy luôn cái mô hình này nếu nó ổn định , Sẽ cập nhật sau
Trên là Vài kinh nghiêm chia sẻ cho các bạn hi vong có ích cho những ai đang cần và nếu quan tâm các bạn có thể đặt câu hỏi
À quên là tôi có tạo thêm swap cho mỗi con VPS để đề phòng hết ram vì dùng SSD do vậy swap cũng rất ngon . hướng dẫn WAP ở đây http://daivietpda.com/threads/186763/
ĐỌC THÊM
Hướng Dẫn Gộp 2 Mysql Server Với Mysql Master-master Replication