Xây dựng hệ thống load balancer cho web

trong danh mục PHP, Web Programming

load-balancer

Dạo này với xu hướng mọi người bắt đầu làm Tech startup ngày càng nhiều (cụ thể là web & app startup), tuy nhiên do chưa có kinh nghiệp triển khai kiến trúc server nên đôi khi các bạn đâu đó sẽ gặp tình huống khóc dỡ là web quá nhiều lượt truy cập (có thể do chạy campaign hoặc ngày ra mắt…) làm cho web bị treo vì không trở tay kịp.

Mình viết bài này với hy vọng các anh chị em tech startup hoặc anh chị em IT chịu trách nhiệm lo về phần scaling cho website có một chút thông tin về xây dựng hệ thống Load balancer phòng trường hợp server quá tải.

Vertical hay Horizontal Scaling?

vertical scaling

Scale theo chiều dọc – Vertical Scaling

Scale theo chiều dọc (Vertical) có nghĩa là tăng cường khả năng phục vụ của server bằng cách nâng cấp Memory, CPU, HDD. Cách này tiết kiệm rất nhiều thời gian và hầu như không thay đổi kiến trúc code cũng như mô hình mạng hiện tại bởi số lượng server không thay đổi. Tuy nhiên, scale theo cách này không phải theo hướng tịnh tiến thẳng (linear) mà có thể chi phí theo hàm mũ vì nâng cấp từ 128GB lên 256GB không phải lúc nào giá cũng gấp đôi, thậm chí khi lên tới ngưỡng hỗ trợ của máy thì chẳng khác gì sắm mấy con Super-computer cả và mà mấy con này thì số lượng không nhiều mà chi phí thì khủng.

Horizontal scaling

Scale theo chiều ngang – Horizontal Scaling

Do sự không thực dụng của verical scale, ngày nay các nhà kiến trúc hệ thống thường chọn cách scale theo chiều ngang (horizontal). Khác với cách trên, scale theo chiều ngang dựa vào việc bổ sung thêm máy tính vào mạng để tăng khả năng phục vụ của hệ thống. Scale bằng cách này không cần phải sở hữu những con server mạnh, quan trọng là giá cả phù hợp, ổn định và có thể mua nhiều server đồng dạng để giúp hệ thống đồng bộ phần cứng, tránh các rủi ro do trong một mạng có quá nhiều dòng thiết bị khác nhau.

Load Balancer là gì?

Load Balancer đơn giản là một hệ thống (phần mềm, thiết bị chuyên dụng…) hỗ trợ việc chia tải trong trường hợp bạn có nhiều server có vai trò ngang nhau (giữa các web server) hoặc vai trò khác nhau (giữa các web server và database server). Ví dụ hệ thống có 5 server và bạn muốn khi có người truy cập vào hệ thống thì load balancer tự động điều hướng xử lý đến các server đã được chỉ định này, giúp cho không có server nào bị quá tải hoặc không có server nào quá nhàn rỗi.

Ngoài ra, các hệ thống Load balancer còn có khả năng phát hiện các node (server) bị chết để cách ly không điều hướng truy vấn tới server này, và tự động điều hướng lại khi server này “sống” trở lại.

Hiện tại có 2 hướng tiếp cận chính là sử dụng phần mềm hoặc phần cứng. Cách sử dụng phần cứng là các thiết bị chuyên dụng, các mạch điều hướng trong thiết bị được thiết kế tối ưu cho việc điều hướng nên cách này có thể gọi là tốt nhất cho load balancer. Tuy nhiên, bạn cần phải mua các thiết bị này, và chi phí thường không nhỏ và khả năng tùy biến không lớn.

Cách thứ hai là sử dụng các phần mềm và cài đặt lên các server trong mạng và làm nhiệm vụ điều hướng tới các server được chỉ định trong mạng khi có truy vấn từ ngoài mạng. Cách này hiện được ưa chuộng hơn bởi không cần mua các thiết bị đắt đỏ và có thể tùy chỉnh hệ thống vì hầu hết là phần mềm nguồn mở.

Layer 4 hay Layer 7?

osi model

Mô hình 7 lớp OSI

Nếu các bạn có học qua môn mạng máy tính thì sẽ biết mô hình 7 lớp OSI, quy định các layer khác nhau trong quá trình truyền nhận dữ liệu (Xem thêm về OSI Model). Mỗi tầng trong mô hình OSI có các chức năng khác nhau giúp cho việc kết nối và trao đổi dữ liệu giữa các thiết bị được đảm bảo, an toàn và chính xác.

Tuy nhiệm vụ của Load balancer là giúp chia tải nhưng bạn cũng có thể chọn chia tải ở tầng nào trong 7 tầng mạng của mô hình OSI. Việc lựa chọn tầng hoạt động của load balancer sẽ giúp bạn cải thiện được tốc độ và khả năng tùy biến của load balancer. Load balancer thông thường hoạt động ở 2 tầng là tầng 4 (Transport) hoặc tầng 7 (Application).

Sự khác nhau của Load balancer giữa tầng 4 và 7 là gì?

Theo mô hình OSI, tầng 4 (Transport Layer) có được thông tin gói tin bao gồm địa chỉ IP và Port, cả 2 yếu tố này kết hợp lại gọi là socket. Do chỉ lấy được IP và Port của thiết bị nguồn (nơi gởi request) nên chỉ có thể load balancing dựa vào 2 yếu tố này.

Còn ở tầng 7 (Application Layer), ta có được nhiều thông tin hơn là địa chỉ IP và Port ở tầng 4. Ví dụ HTTP là 1 protocol hoạt động ở tầng 7, và ta có thêm được các thông tin như domain, cookie, http header…do ở tầng này có khá nhiều thông tin nên việc điều hướng được tùy biến cao.

Mặc dù load balancer ở tầng 7 có được nhiều thông tin như vậy nhưng không phải lúc nào cũng được sử dụng bởi theo mô hình trao đổi dữ liệu giữa 2 thiết bị trên mạng, để xử lý đến tới layer 7 đòi hỏi server phải dành nhiều thời gian và resource (cpu, memory…) hơn. Do đó, load balancer ở layer 4 sẽ có hiệu suất cao hơn ở layer 7, nhưng việc cài đặt và cấu hình cho Load balancer ở tầng 4 sẽ khó khăn và phức tạp hơn.

Hiện tại, một số phần mềm load balancer thông dụng nhất là HAProxy (Layer 7 – phổ biến, Layer 4), LVS – Linux Virtual Server (Layer 4)…

Stack của bạn là gì?

web stack

Trước khi bắt tay phân tích & triển khai load balancer cho hệ thống của bạn, bạn cần phải xác định các thành phần trong stack hoạt động của hệ thống. Ví dụ đối với web thì có thể có Linux, Apache, PHP, MySQL, HTML, CSS, Javascript, Image, Document…

Sau khi biết được các thành phần trong stack, bạn tiến hành triển khai load balancing cho các dịch vụ này để tăng khả năng phục vụ của hệ thống.

Web Server load balancer

web load balancer

Minh họa hệ thống Web Load balancer

Load balancer thông dụng nhất là dùng cho web server. HAProxy là một trong những công cụ tốt nhất để chia tải cho dịch vụ web (HTTP). HAProxy có thể hoạt động ở Layer 7 (HTTP) nên bạn có thể tùy chỉnh cấu hình của HAProxy để điều hướng cho toàn bộ hệ thống web.

Bạn có thể có nhiều web server hỗ trợ các dự án web khác nhau (Backend, Mobile, Web Service, Mobile Service, Staging, Test…) thông qua domain, sub domain, cookie, http header…

HAproxy cũng kèm theo công cụ theo dõi tình hình của các server được chia tải để nắm tình hình hệ thống server.

HAProxy Report Dashboard

HAProxy Report Dashboard

Database Server load balancer

mysql replication

Mysql Replication

Bạn cũng có thể sử dụng Haproxy để chia tải giữa các database server. Tuy nhiên, khi làm việc với database server thì phức tạp hơn vì database server cần đồng bộ dữ liệu.

Đối với Database, bạn cần có các chiến lược replicate database phù hợp, bao nhiêu master/slave (1 master/slave hay 1 farm master/slave và được chia tải nhờ load balancer). Hệ thống tự động nhận dạng db server dựa vào loại truy vấn (ví dụ INSERT, UPDATE, DELETE thì điều hướng vào Master Server hoặc Master Load balancer Server, còn câu truy vấn SELECT thì vào Slave Server hoặc Slave Load balancer Server…).

Có nên dùng cloud?

Amazon elastic load balancer

Hình minh họa hệ thống load balancer sử dụng amazon elastic load balancer (Amazon Web Service)

Hiện tại Amazon cũng có một dịch vụ giúp load balacing là Elastic Load Balancer (ELB) và dùng tốt cho môi trường của bạn sử dụng các dịch vụ của Amazon Web Service. ELB không mạnh mẽ như Haproxy, nhưng bạn vẫn có thể dùng 1 EC2 instance và cài Haproxy để làm 1 load balancer như thường mà không nhất thiết dùng dịch vụ ELB của Amazon.

Bạn có thể tham khảo thêm các dịch vụ của Amazon Web Service tại đây http://aws.amazon.com/products

Lời kết

Trên đây là những chia sẻ của mình trong quá trình nghiên cứu và triển khai cho các hệ thống của mình và khách hàng. Hy vọng những chia sẻ này sẽ giúp ích cho các bạn trên con đường chinh phục các hệ thống chịu tải lớn và có nhiều người truy cập.

10 bình luận

  1. Huy says:

    Neu chia nhieu server vay thi ban quan ly session the nao nhi?

    [Reply]

    admin Reply:

    @Huy, Bạn nghĩ session chỉ có thể lưu vào file trên server?

    [Reply]

    Huy Phan Reply:

    @Huy,
    bạn có thể dùng nguyên 1 Database server chỉ để triển khai session luôn cũng được

    [Reply]

    khoinx Reply:

    @Huy, dùng cơ chế single sign on(SSO)

    [Reply]

  2. Cảm ơn anh Tuấn về một bài viết bổ ích!
    Đề nghị anh thêm nút Like vào blog nhé 😀

    [Reply]

  3. trương ngọc says:

    bài viết rất hay , cảm ơn anh rất nhiều

    [Reply]

  4. Lê Đức Huy says:

    Bài viết hay lắm, cám ơn a Tuấn đã chia sẻ 🙂

    [Reply]

  5. Le Dung Ngoc says:

    bài viết rất tuyệt.

    [Reply]

  6. Đỗ Duy Hưng says:

    cách cân bằng tải này có thể chống ddos được không. Và có thể áp dụng trên sv game dc không bạn

    [Reply]

  7. tuấn anh says:

    đề nghị thêm nút like ở cuối bài 🙂

    [Reply]

Gởi bình luận