Đàm đạo về cân bằng tải (Load Balancer)

Đàm đạo về cân bằng tải (Load Balancer)

Tin ngắn hàng ngày dành cho bạn
  • Đây là bài viết thứ 366, có nghĩa là mình đã duy trì được việc mỗi ngày một bài trong chuyên mục Threads 1 năm rồi đấy mọi người. Tuy rằng không phải ngày nào cũng viết vì nhiều hôm mình bận, quên thì hôm sau là lên bài bù, mục đích là để cam kết với độc giả, ấy vậy mà quay đi quay lại đã một năm trôi qua rồi. Nhanh thật 😃

    À mai, kia, ngày kìa nữa mình đi du lịch nên chắc không lên bài cho mọi người được. Về rồi mình lên sau nhé 😅. Cảm ơn!

    » Xem thêm
  • Hơn 1 tuần nay mình không đăng bài, không phải không có gì để viết mà đang tìm cách để phân phối nội dung có giá trị hơn trong thời đại AI đang bùng nổ mạnh mẽ như thế này.

    Như từ hồi đầu năm đã chia sẻ, số lượng người truy cập vào trang blog của mình đang dần ít đi. Khi xem thống kê, lượng người dùng trong 6 tháng đầu năm 2025 đã giảm 30% so với cùng kì năm ngoái, 15% so với 6 tháng cuối năm 2024. Như vậy một sự thật là người dùng đang rời bỏ dần đi. Nguyên nhân do đâu?

    Mình nghĩ lý do lớn nhất là thói quen của người dùng đã thay đổi. Họ tìm thấy blog chủ yếu qua các công cụ tìm kiếm, trong đó lớn nhất là Google. Gần 1/2 số lượng người dùng quay trở lại blog mà không cần thông qua bước tìm kiếm. Đó là một tín hiệu đáng mừng nhưng vẫn không đủ để tăng lượng người dùng mới. Chưa kể giờ đây, Google đã ra mắt tính năng AI Search Labs - tức là AI hiển thị luôn nội dung tổng hợp khi người dùng tìm kiếm, điều đó càng khiến cho khả năng người dùng truy cập vào trang web thấp hơn. Một điều thú vị là khi Search Labs được giới thiệu, thì các bài viết bằng tiếng Anh đã soán ngôi trong bảng xếp hạng truy cập nhiều nhất.

    Một bài viết của mình thường rất dài, có khi lên đến cả 2000 chữ. Mà để viết ra được một bài như thế tốn nhiều thời gian. Nhiều bài viết ra chẳng có ai đọc là điều bình thường. Mình biết và chấp nhận vì không phải ai cũng gặp phải vấn đề đang nói đến. Viết đối với mình như một cách để rèn luyện sự kiên nhẫn và cả tư duy. Viết ra mà giúp được cả ai đó là một điều tuyệt vời.

    Vậy nên mình đang nghĩ sẽ tập trung vào nội dung ngắn và trung bình để viết được nhiều hơn. Nội dung dài chỉ khi muốn viết chi tiết hoặc đi sâu về một chủ đề nào đó. Nên là đang tìm cách thiết kế lại trang blog. Mọi người cùng chờ nha 😄

    » Xem thêm
  • CloudFlare đã giới thiệu tính năng pay per crawl để tính phí cho mỗi lần AI "cào" dữ liệu trên trang web của bạn. Là sao ta 🤔?

    Mục đích của SEO là giúp các công cụ tìm kiếm nhìn thấy trang web. Khi người dùng tìm kiếm nội dung mà có liên quan thì nó hiển thị trang web của bạn ra kết quả tìm kiếm. Điều này gần như là đôi bên cùng có lợi khi Google giúp nhiều người biết đến trang web hơn, còn Google thì được nhiều người dùng hơn.

    Bây giờ cuộc chơi với các AI Agents thì lại khác. AI Agents phải chủ động đi tìm kiếm nguồn thông tin và tiện thể "cào" luôn dữ liệu của bạn về, rồi xào nấu hay làm gì đó mà chúng ta cũng chẳng thể biết được. Vậy đây gần như là cuộc chơi chỉ mang lại lợi ích cho 1 bên 🤔!?

    Nước đi của CloudFlare là bắt AI Agents phải trả tiền cho mỗi lần lấy dữ liệu từ trang web của bạn. Nếu không trả tiền thì tôi không cho ông đọc dữ liệu của tôi. Kiểu vậy. Hãy chờ thêm một thời gian nữa xem sao 🤓.

    » Xem thêm

Vấn đề

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 đó.

Phương pháp cân bằng tải

Đầ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ụ cân bằng tải

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.

Đặt phương pháp và công cụ lại với nhau

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.

Ví dụ 1

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.

Ví dụ 2

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í dụ 3

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.

Ví dụ 4

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:

Ví dụ 5

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.

Tổng kết

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:

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...