Cân bằng tải (Load Balancing) là một kỹ thuật quan trọng trong hệ thống phân tán nhằm đảm bảo hiệu suất, tính sẵn sàng và khả năng mở rộng của ứng dụng. Đây là một khái niệm mà bất kỳ lập trình viên nào cũng nên biết vì nó là phần không thể thiếu khi muốn nâng cao hiệu suất của ứng dụng phần mềm. Đảm bảo hệ thống hoạt động ổn định trước làn sóng truy cập đầy ngẫu hứng của người dùng. Ấy thế mà lúc mới bắt đầu tìm hiểu khái niệm này, nhiều điều cảm thấy thật bối rối.
Ví dụ đơn giản là về Nginx - một web server mà ai cũng biết. Ngoài ra Nginx còn đóng vai trò như một bộ cân bằng tải, tức là cấu hình để nó phân phối các yêu cầu đến các máy chủ hoặc dịch vụ (servies) khác nhau. Rồi bỗng Docker xuất hiện, Docker cũng có khái niệm về bộ cân bằng tải thông qua cơ chế swarm, tức là yêu cầu đến một dịch vụ thì được phân phối đến các container được nhân lên (scale) tương ứng. Chưa dừng lại ở đó, Kubernetes cũng làm được điều tương tự. Ồ tại sao vậy nhỉ? Cân bằng tải xuất hiện ở khắp mọi nơi, thiết lập như thế nào mới đúng, mới tối ưu nhất?
Cách đơn giản nhất để thiết lập chế độ cân bằng tải đó chính là dựng lên một máy chủ chỉ có nhiệm vụ phân phối các yêu cầu của người dùng. Nhưng chuyện gì xảy ra nếu máy chủ đó bị... quá tải hoặc lăn ra chết? Chắc chắn rồi, dịch vụ sẽ bị gián đoạn vì không có gì điều phối được yêu cầu của người dùng nữa. Thế thì thay vì dựng lên 1 thì hãy dựng lên một cụm máy chủ chỉ có nhiệm vụ cân bằng tải, cái này trục trặc thì cái kia thay thế, luân phiên nhau thì sẽ giảm thiểu được rủi ro. Hoàn toàn đồng ý! Nhưng còn cách nào khác nữa không?
Chúng ta đều biết kể cả phần cứng hay phần mềm đều có những giới hạn. Giới hạn của phần mềm thì thường phụ thuộc vào phần cứng. Phần mềm dù có tối ưu đến mấy mà chạy trên một phần cứng hạn hẹp thì cũng coi như bỏ. Ngược lại, nếu chế ra một phần cứng siêu mạnh, kết hợp với một phần mềm siêu tối ưu thì chuyện gì sẽ xảy ra?
Liệu còn điều gì về cân bằng tải mà chúng ta chưa được biết hay không? Chắc chắn là có, vì kiến thức là vô tận mà công nghệ thì thay đổi chóng mặt. Vì thế bài viết ngày hôm nay, tôi sẽ trình bày cách hiểu của mình về cân bằng tải. Đây là một bức tranh ghép lại từ những mảnh ghép thu thập lâu nay. Hy vọng cung cấp được cho mọi người một cái nhìn khách quan nhất. Nếu có thiếu hoặc sai sót chỗ nào, mong bạn đọc giúp tôi nhận ra điều đó.
Đầu tiên hãy nói về phương pháp hay cách cân bằng tải. Có 2 cách phổ biến là theo thuật toán và theo lớp mạng.
Phân phối theo thuật toán bao gồm Round Robin, Least Connections, hoặc IP Hash... Trong đó Round Robin là thuật toán kết nối xoay vòng, tức là dàn đều điểm đến theo vòng tròn. Least Connections sẽ lựa chọn ra máy chủ có kết nối ít nhất... Đặc điểm của phương pháp này là viết ra thuật toán để phân phối sao cho máy chủ nào cũng được tham gia xử lý một cách hiệu quả.
Phân phối theo lớp mạng tức là dựa vào Layer 4 và Layer 7 của tầng mạng (network). Chúng ta biết đến mô hình OSI 7 lớp. Để hai máy giao tiếp được với nhau cần lần lượt đi qua 7 lớp. Trong đó Layer 4 là Transport Layer còn Layer 7 là Application Layer. Layer 7 thường được biết đến qua các giao thức HTTP, SMTP, FTP, DNS... Trong khi Layer 4 ở mức sơ khai hơn rất nhiều.
Để cho dễ hình dung, một kết nối đi qua 7 lớp trước khi đến được điểm xử lý, trong đó lớp 4 và 7 đều có khả năng điều hướng yêu cầu sang hướng khác. Thông thường chúng ta hay điều hướng ở lớp 7, tức là nhận được giao thức GET, POST... rồi mới phân loại và chuyển, cách này tiêu tốn một số lượng tài nguyên tính toán nhất định. Bù lại có đầy đủ thông tin của yêu cầu hơn, dễ viết logic chuyển hướng hơn. Trong khi lớp 4 cho hiệu năng tốt hơn nhưng khả năng tiếp cận thông tin bị hạn chế nên chỉ phân loại được ở mức độ nào đó.
Công cụ là những thứ giúp triển khai phương pháp cân bằng tải. Công cụ được chia thành 2 loại là phần cứng và phần mềm.
Đầu tiên hãy nói về phần mềm. Đây là những phần mềm được tạo ra để phân phối các yêu cầu nhằm đảm bảo quá trình cân bằng tải. Nginx là một ví dụ, không chỉ là một máy chủ web, nginx cung cấp cả tính năng cân bằng tải ở cả lớp 4 và lớp 7. Tiếp theo là HAProxy, một phần mềm hỗ trợ cân bằng tải rất mạnh mẽ. Ngoài ra còn nhiều cái tên khác như là Apache, Traefik, Envoy... Thậm chí người ta còn tạo ra cả hệ điều hành (OS) để phục vụ cân bằng tải. Tại sao lại thế? Chẳng lẽ phần mềm là chưa đủ? Câu trả lời đơn giản thôi, đó là tuỳ nhu cầu sử dụng đơn giản hay phức tạp. Nếu phần mềm đáp ứng đủ, bạn không cần phải dùng đến OS. Ngược lại, OS được tạo ra chỉ tập trung vào chức năng cân bằng tải thì sẽ có hiệu năng lẫn tính năng vượt trội hơn so với phần mềm.
Tiếp theo là phần cứng. Đây là sản phẩm vật lý được tạo ra chỉ để cân bằng tải với hiệu suất tối đa. Mặc dù chưa được tiếp xúc trực tiếp nhưng bạn hoàn toàn có thể tìm thấy thông tin của chúng ở trên mạng Internet. Chúng thường là các cục router chuyên để điều hướng mạng, hay là một máy chủ được tối ưu hoá phần cứng để xử lý được hàng triệu kết nối cùng lúc.
Ngoài phần cứng và phần mềm ra, với sự "ảo hoá" của công nghệ đám mây (cloud) mà ngày nay chúng ta còn được hưởng lợi từ mạng lưới của các ông lớn. Từ đó sinh ra thêm công cụ cân bằng tải mới dựa trên đám mây. Khỏi phải nói chắc mọi người cũng biết AWS và Google Cloud rất mạnh về lĩnh vực này. Họ có hệ thống máy chủ ở nhiều nơi trên thế giới cùng với mạng lưới dày đặc. Lúc này chúng ta không cần quan tâm đến "điểm chịu lỗi duy nhất" nữa mà phải đặt câu hỏi xem có bao nhiêu máy chủ để nhập lên các ông lớn này.
Như vấn đề đã nêu ở đầu bài viết, tại sao đã có Nginx làm cân bằng tải rồi mà các công cụ khác như Docker còn tạo ra cân bằng tải tiếp? Liệu điều đó có là thừa thãi và khó khăn cho người sử dụng? Chắc chắn là không rồi! Điều đó hoàn toàn bình thường vì mục đích của cân bằng tải là nằm nâng cao hiệu suất của ứng dụng. Nginx và Docker là những ứng dụng độc lập, không nhất thiết phải hoạt động cùng với nhau. Hãy thử nghĩ xem nếu bạn không dùng Nginx thì sao? Docker vẫn có thể cân bằng tải.
Trong phần này tôi sẽ trình bày cách kết hợp phần cứng và phần mềm lại với nhau để tạo thành một hệ thống cân bằng tải. Dĩ nhiên là còn rất nhiều cách kết hợp nữa nhưng hy vọng bạn đọc hình dung ra được điều tôi muốn truyền tải.
Trước tiên, hãy xem sơ đồ của một máy chủ đơn giản sử dụng Nginx để phân phối yêu cầu đến 3 dịch vụ đang chạy trong máy.
Request là yêu cầu của máy khách (client), khi đến máy chủ (server), Nginx đón nhận và phân phối đều cho cả 3 theo thuật toán nào đó như Round Robin.
Tiếp theo là sự có mặt của Docker hay các công cụ tương tự khác. Lúc này xuất hiện thêm cả cân bằng tải ở Nginx và Docker.
Chà, hệ thống khoẻ hơn rồi đấy! Nhưng mà tất cả đang nằm trên một máy chủ nên khả năng sử dụng tài nguyên chưa được tốt lắm. Hãy tách chúng ra.
Vậy là chúng ta đã dựng lên một máy chủ Nginx chuyên xử lý cân bằng tải, trong đó 2 máy chủ còn lại tiếp tục tiếp tục sử dụng Nginx và Docker để xử lý. Quá mạnh rồi đây! Nhưng lỡ máy chủ cân bằng tải lỗi thì sao? Hãy đến với một sơ đồ mới.
Lúc này có thêm sự xuất hiện của cả phần cứng và phần mềm. Router là rất mạnh, đứng ra phân chia yêu cầu đến các hệ điều hành mạng tương ứng, hệ điều hành lúc này mới phân phối đến các máy chủ nhỏ hơn. Chà điều gì xảy ra nếu router bị lỗi? Kết hợp nhiều router lại với nhau hoặc:
Tất cả những thành phần phức tạp đã biến mất và thay bằng Cloud. Công cụ cân bằng tải đám mây này sẽ thay thế hết phần cứng và phần mềm mạng phức tạp vì nó đã ảo hoá lớp này.
Như vậy có thể thấy cân bằng tải xuất hiện ở khắp mọi nơi. Từ phần cứng cho đến phần mềm, có cả thêm sự góp sức của dịch vụ đám mây. Trong đó phần cứng thường phức tạp, yêu cầu trình độ kỹ thuật cao hoặc phù hợp cho doanh nghiệp cần hiệu suất lớn. Trong khi phần mềm thì đa dạng hơn, từ hệ điều hành cho đến phần mềm cài vào máy tính đều có thể làm được.
Tham khảo:
Bí mật ngăn xếp của Blog
Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!
Đăng ký nhận thông báo bài viết mới
Bình luận (0)