Một phương pháp điển hình để mở rộng một bộ cân bằng tải phần mềm là gì?


22

Tôi thường thấy các kiến ​​trúc ứng dụng web với SLB / proxy ngược trước một loạt các máy chủ ứng dụng.

Điều gì xảy ra khi số lượng kết nối đến SLB yêu cầu quá nhiều tài nguyên cho một SLB duy nhất để xử lý hiệu quả? Đối với một ví dụ cụ thể nhưng vượt trội, hãy xem xét 2 triệu kết nối HTTP liên tục. Rõ ràng một SLB duy nhất không thể xử lý này.

Cấu hình đề nghị cho mở rộng quy mô là gì ngoài một SLB?

Có phải là điển hình để tạo một nhóm / cụm LB? Nếu vậy, tải khách hàng trải ra như thế nào giữa nhóm LB?


z8000, bạn có thể nói bạn đang sử dụng phần mềm cân bằng tải nào không? Ngoài ra, nếu có thể, nó sử dụng thuật toán / giao thức nào để cân bằng tải.
Martin

Tôi không có sở thích. Tôi cập nhật câu hỏi để rõ ràng hơn.
z8000

Tôi không rõ tại sao một bộ cân bằng tải về bản chất không thể xử lý 2 triệu kết nối HTTP liên tục.
womble

Câu trả lời:


10

Bộ cân bằng tải không thể dễ dàng được thu nhỏ bởi các bộ cân bằng tải khác vì vốn dĩ sẽ có một bộ cân bằng tải duy nhất trên chuỗi ở đâu đó duy trì các kết nối. Điều đó nói rằng, các bộ cân bằng như LVS hoặc HAProxy có dung lượng vô lý trong phạm vi Gbps. Khi bạn vượt qua khả năng của một bộ cân bằng tải đơn (phần mềm, phần cứng, bất cứ thứ gì), thì bạn sẽ cần chuyển sang các kỹ thuật khác như DNS vòng tròn.


Đúng! Có LB duy nhất là "vấn đề". Tôi đồng ý rằng thông lượng sẽ không phải là một vấn đề nói chung. Nhưng tôi lo ngại về các tài nguyên khác như RAM, trong trường hợp của tôi bị hạn chế. Chỉ có rất nhiều kết nối có thể được lưu trữ trên một SLB trước khi hết RAM.
z8000

HAProxy có thể xử lý khoảng 20k-60k phiên hoạt động cho mỗi GB RAM. Tôi tin rằng LVS có thể làm được nhiều hơn thế, vì dữ liệu phiên được giữ lại nhỏ hơn. Nếu bạn hết RAM, hãy nâng cấp nó hoặc xây dựng một bộ cân bằng tải khác phía trước bởi hệ thống DNS vòng tròn.
Hyppy

1
"Bộ cân bằng tải không thể dễ dàng được thu nhỏ bởi các bộ cân bằng tải khác" - thực tế, một bộ cân bằng tải L4 dựa trên ASIC thường có thể được đặt trước một vài bộ cân bằng tải dựa trên L7 HTTP với kết quả tuyệt vời. Nguyên tắc cơ bản tương tự áp dụng cho các triển khai chỉ dành cho phần mềm, ví dụ Linux LVS trước nignx.
Jesper M

19

OK, đã có một câu trả lời được chấp nhận, nhưng có một cái gì đó để thêm .. Các cách phổ biến nhất 'cổ điển' để mở rộng tầng cân bằng tải là (không theo thứ tự cụ thể):

  • DNS Round Robin để công khai nhiều địa chỉ IP cho tên miền. Đối với mỗi địa chỉ IP, hãy triển khai một cặp máy chủ khả dụng cao (2 máy chủ hợp tác để giữ một địa chỉ IP hoạt động mọi lúc.) Mỗi ​​IP tương ứng với một cụm cân bằng tải, sử dụng các thiết bị hoặc máy chủ có phần mềm cân bằng tải. Chia tỷ lệ theo chiều ngang bằng cách thêm nhiều cặp cân bằng tải nếu cần.

  • Định tuyến hoặc chỉnh sửa tường lửa để phân tán tải cho nhiều bộ cân bằng tải. Có bộ định tuyến trước hoặc tường lửa phía trước trải rộng các kết nối đến một số địa chỉ IP (mỗi địa chỉ đại diện cho một cặp cân bằng tải) bằng cách băm địa chỉ IP nguồn , có nhiều tuyến có chi phí bằng nhau cho các bộ cân bằng tải hoặc tương tự.

  • Một lớp cân bằng tải cấp IP ở phía trước một lớp cân bằng tải cấp HTTP . Cân bằng tải lớp IP có thể được thực hiện trong ASIC / silicon và có thể được xử lý nhanh đối với một số thứ. Do đó, một cặp cân bằng tải IP duy nhất thường có thể 'theo kịp' với một số bộ cân bằng tải mức HTTP / HTTPS và cung cấp các mức hiệu suất đa gigabit trong khi giữ cho kiến ​​trúc đẹp và đơn giản.

Đi sâu hoàn toàn vào các cách khác nhau để làm những điều trên sẽ đòi hỏi một câu trả lời rất dài. Nhưng nói chung, không khó để mở rộng tầng cân bằng tải , việc mở rộng tầng máy chủ ứng dụng và đặc biệt là tầng cơ sở dữ liệu không khó hơn nhiều.

Cho dù bạn chọn một yếu tố hình thức thiết bị (F5, Cisco, A10) hay máy chủ chung (phần mềm Windows / Linux +) đều ít vấn đề. Các cân nhắc chính khi nhân rộng lớp cân bằng tải là:

  • Nhà nước đầy đủ so với không quốc tịch. Bạn có hoàn toàn cần phiên dính, hoặc bạn có thể sống mà không có? Không giữ trạng thái làm cho mọi thứ đơn giản hơn.
  • 'Phần cứng' (ASIC) so với 'phần mềm' (máy chủ mục đích chung) để cân bằng tải. Mỗi cái đều có ưu và nhược điểm, xem tài liệu tổng quan về HAProxy được liên kết ở trên.
  • Cân bằng tải L3 / 4 (IP / TCP / IP) so với cân bằng tải L7 (HTTP) . Một lần nữa, ưu và nhược điểm, tài liệu HAProxy cung cấp một cái nhìn tổng quan tốt.
  • Chấm dứt SSL , ở đâu, trên các webnodes hoặc trên bộ cân bằng tải.

Nói chung, bạn không cần phải lo lắng về điều này trước khi trang web của bạn trở nên rất lớn - một máy chủ hiện đại với fx nginx sẽ xử lý hàng chục ngàn yêu cầu HTTP đơn giản mỗi giây. Vì vậy, đừng tối ưu hóa sớm, đừng giải quyết vấn đề này trước khi bạn phải làm.


Bạn thực sự không cần mỗi địa chỉ IP để có tính khả dụng cao khi sử dụng DNS RR. Nói chung, các trình duyệt sẽ quay trở lại IP khác nếu có sẵn khi chúng không thể kết nối. Nhưng nếu bạn có các dịch vụ web công cộng, bạn sẽ cần HA cho từng địa chỉ IP, vì nhiều thư viện dịch vụ web sẽ không tự động xử lý các IP khác.
rmalayter

9

Chìa khóa để mở rộng lớp cân bằng tải HTTP là trước tiên thêm một lớp cân bằng tải cấp thấp hơn (IP hoặc TCP). Lớp này có thể được xây dựng hoàn toàn bằng phần mềm nguồn mở, mặc dù bạn sẽ có kết quả tốt hơn nếu bạn có bộ định tuyến hiện đại.

Các luồng (phiên TCP) phải được băm bằng cách sử dụng các tiêu đề như cổng nguồn / IP đích và cổng TCP để quyết định giao diện nào chúng đi đến. Bạn cũng cần một cơ chế để đảm bảo rằng khi một frontend chết, nó sẽ ngừng sử dụng.

Có nhiều chiến lược khác nhau, tôi sẽ phác thảo một cặp đôi mà tôi đã sử dụng trong sản xuất trên các trang web phục vụ hàng triệu người dùng, để bạn có thể có ý tưởng. Sẽ là quá dài để giải thích mọi thứ chi tiết nhưng tôi hy vọng câu trả lời này sẽ cung cấp cho bạn đủ thông tin / gợi ý để bắt đầu. Để thực hiện các giải pháp này, bạn sẽ cần một người thực sự am hiểu về mạng.

Phải thừa nhận rằng những gì tôi mô tả ở đây khó thực hiện hơn nhiều so với những gì được mô tả trong các câu trả lời khác, nhưng đây thực sự là công nghệ tiên tiến nếu bạn có một trang web bị buôn bán cao với các vấn đề về khả năng mở rộng lớn và yêu cầu về tính khả dụng trên 99,9% . Với điều kiện bạn đã có một anh chàng kỹ sư mạng trên tàu, chi phí thiết lập và chạy (cả trong capex và opex) ít hơn so với các thiết bị cân bằng tải, và nó có thể được thu nhỏ hơn mà không phải trả thêm chi phí (so với mua mới, thậm chí nhiều hơn thiết bị đắt tiền khi bạn vượt xa mô hình hiện tại của bạn).

Chiến lược đầu tiên: với tường lửa

Có lẽ bạn có một vài bộ định tuyến mà trên đó các đường lên ISP của bạn được kết nối. ISP của bạn cung cấp 2 liên kết (chủ động / thụ động, sử dụng VRRP). Trên các bộ định tuyến của bạn, bạn cũng sử dụng VRRP và bạn định tuyến lưu lượng truy cập đến mạng công cộng của mình đến tường lửa. Tường lửa ( FW 1FW 2bên dưới) cũng hoạt động / thụ động và sẽ lọc lưu lượng và gửi từng luồng đến một máy chủ lối vào lành mạnh (bộ cân bằng tải HTTP của bạn FE 1FE 2bên dưới).

      + -------------- + + -------------- +
      | Bộ định tuyến ISP A | | Bộ định tuyến ISP B |
      + -------------- + + -------------- +
             | |
           == # ====================== # == (mạng công cộng)
             | |
      + --------------- + + --------------- +
      | Bộ định tuyến của bạn A | | Bộ định tuyến của bạn B |
      + --------------- + + --------------- +
             | |
           == # ===== # ========== # ===== # == (Mạng riêng RFC 1918)
             | | | |
       + ------ + + ------ + + ------ + + ------ +
       | FW 1 | | FE 1 | | FE 2 | | FW 2 |
       + ------ + + ------ + + ------ + + ------ +

Mục tiêu là để có một dòng chảy như thế này:

  1. ISP định tuyến lưu lượng truy cập đến IP của bạn đến bộ định tuyến hoạt động của bạn.
  2. Bộ định tuyến của bạn định tuyến lưu lượng đến VIP sử dụng địa chỉ RFC 1918 . VIP này được sở hữu bởi tường lửa hoạt động, giống như VRRP. Nếu bạn sử dụng OpenBSD cho nhu cầu tường lửa của mình, thì bạn có thể sử dụng CARP , một giải pháp thay thế không có bằng sáng chế cho VRRP / HSRP.
  3. Tường lửa của bạn áp dụng bộ lọc (ví dụ: "chỉ cho phép 80 / tcp và 443 / tcp đi đến địa chỉ IP cụ thể này").
  4. Tường lửa của bạn cũng hoạt động như một bộ định tuyến và chuyển tiếp các gói đến một lối vào lành mạnh.
  5. Giao diện của bạn chấm dứt kết nối TCP.

Bây giờ phép màu xảy ra ở bước 4 và 5, vì vậy hãy xem chi tiết hơn những gì họ làm.

Tường lửa của bạn biết danh sách các frontend ( FE 1FE 2) và nó sẽ chọn một trong số chúng dựa trên một khía cạnh cụ thể của luồng (ví dụ: bằng cách băm IP và cổng nguồn, trong số các tiêu đề khác). Nhưng nó cũng cần đảm bảo rằng nó chuyển tiếp lưu lượng truy cập đến một lối vào lành mạnh, nếu không bạn sẽ bị tắc nghẽn giao thông. Nếu bạn sử dụng OpenBSD, ví dụ, bạn có thể sử dụng relayd. Gìrelaydthật đơn giản: nó kiểm tra sức khỏe tất cả các frontend của bạn (ví dụ bằng cách gửi cho chúng một yêu cầu HTTP thăm dò) và bất cứ khi nào frontend khỏe mạnh, nó sẽ thêm nó vào một bảng mà tường lửa sử dụng để chọn bước nhảy tiếp theo của các gói của một luồng nhất định . Nếu một frontend không kiểm tra sức khỏe, nó sẽ bị xóa khỏi bảng và không có gói nào được gửi đến nó nữa. Khi chuyển tiếp một gói đến một giao diện, tất cả các tường lửa thực hiện là hoán đổi địa chỉ MAC đích của gói thành địa chỉ của giao diện được chọn.

Trong bước 5, các gói từ người dùng được nhận bởi bộ cân bằng tải của bạn (có thể là Varnish, nginx hoặc bất cứ thứ gì). Tại thời điểm này, gói tin vẫn được chuyển đến địa chỉ IP công cộng của bạn, do đó bạn cần đặt bí danh cho VIP của mình trên giao diện loopback. Đây được gọi là DSR (Direct Server Return), bởi vì các giao diện của bạn chấm dứt kết nối TCP và tường lửa ở giữa chỉ nhìn thấy lưu lượng đơn giản (chỉ các gói đến). Bộ định tuyến của bạn sẽ định tuyến các gói đi trực tiếp trở lại bộ định tuyến của ISP. Điều này đặc biệt tốt cho lưu lượng HTTP vì các yêu cầu có xu hướng nhỏ hơn phản hồi, đôi khi đáng kể là như vậy. Nói rõ hơn: đây không phải là một điều cụ thể của OpenBSD và được sử dụng rộng rãi trong các trang web buôn bán cao.

Gotchas:

  • Người dùng cuối sẽ kết nối trực tiếp với máy chủ lối vào của bạn vì bạn sử dụng DSR. Có thể đó là trường hợp đã xảy ra, nhưng nếu không, bạn cần đảm bảo rằng chúng được bảo mật đầy đủ.
  • Nếu bạn sử dụng OpenBSD, hãy cẩn thận rằng hạt nhân là một luồng để hiệu suất của lõi CPU đơn sẽ hạn chế thông lượng của tường lửa. Nó có thể là một vấn đề tùy thuộc vào loại NIC của bạn và tốc độ gói bạn đang thấy. Có nhiều cách để giải quyết vấn đề này (nhiều hơn về điều này dưới đây).

Chiến lược thứ hai: không có tường lửa

Chiến lược này hiệu quả hơn nhưng khó thiết lập hơn vì nó phụ thuộc nhiều hơn vào chi tiết cụ thể của các bộ định tuyến bạn có. Ý tưởng là vượt qua tường lửa ở trên và để các bộ định tuyến thực hiện tất cả công việc mà tường lửa đang làm.

Bạn sẽ cần các bộ định tuyến hỗ trợ các LL / L4 ACL trên mỗi cổng, BGPECMPĐịnh tuyến dựa trên chính sách (PBR). Chỉ các bộ định tuyến cao cấp mới hỗ trợ các tính năng này và chúng thường có thêm phí cấp phép để sử dụng BGP. Điều này thường vẫn rẻ hơn so với cân bằng tải phần cứng, và cũng dễ dàng hơn để mở rộng quy mô. Điểm hay của các bộ định tuyến cao cấp này là chúng có xu hướng tốc độ đường truyền (ví dụ: chúng luôn có thể tối đa hóa liên kết, ngay cả trên các giao diện 10GbE, bởi vì tất cả các quyết định mà chúng đưa ra đều được thực hiện trong phần cứng bởi ASIC).

Trên các cổng mà bạn có đường dẫn ISP của mình, hãy áp dụng ACL đã từng có trên tường lửa (ví dụ: "chỉ cho phép 80 / tcp và 443 / tcp đi đến địa chỉ IP cụ thể này"). Sau đó, mỗi một trong các frontend của bạn duy trì một phiên BGP với bộ định tuyến của bạn. Bạn có thể sử dụng OpenBGPD tuyệt vời (nếu tiền tuyến của bạn là trên OpenBSD) hoặc Quagga . Bộ định tuyến của bạn sẽ ECMP lưu lượng truy cập đến các tiền tuyến khỏe mạnh (vì họ đang duy trì các phiên BGP của họ). Bộ định tuyến cũng sẽ định tuyến lưu lượng ra một cách thích hợp bằng PBR.

Sàng lọc

  • Với giải pháp cặp tường lửa, thật tuyệt nếu bạn có thể đồng bộ hóa các trạng thái TCP trên tường lửa, để khi một tường lửa bị lỗi, mọi thứ sẽ không hoạt động trơn tru với trạng thái khác. Bạn có thể đạt được điều này với pfsync.
    • Hãy nhớ rằng pfsyncthông thường sẽ tăng gấp đôi tốc độ gói trên tường lửa của bạn.
    • HTTP là một giao thức không trạng thái, vì vậy nó không phải là kết thúc của thế giới nếu bạn đặt lại tất cả các kết nối trong khi chuyển đổi tường lửa vì bạn không sử dụng pfsync.
  • Nếu bạn vượt qua một tường lửa, bạn có thể sử dụng ECMP trên bộ định tuyến của mình để định tuyến lưu lượng truy cập của bạn đến nhiều hơn một cặp tường lửa.
  • Nếu bạn sử dụng nhiều hơn một cặp tường lửa, bạn cũng có thể làm cho tất cả chúng hoạt động / hoạt động. Bạn có thể đạt được điều này bằng cách yêu cầu tường lửa duy trì phiên BGP với các bộ định tuyến, giống như các mặt trận cần duy trì một trong thiết kế thứ 2 mà không cần tường lửa.

relaydCấu hình mẫu

Xem thêm HOWTO tại https://calomel.org/relayd.html

vip = "1.2.3.4" # Địa chỉ IP công cộng của bạn
               # (bạn có thể có nhiều hơn một, nhưng không cần)
phong1 = "10.1.2.101"
phong2 = "10.1.2.102"
phong3 = "10.1.2.103"
fe4 = "10.1.2.104" # Bạn có thể có bất kỳ số lượng giao diện nào.
int_if = "em0"
bảng <fe> {$ fe1 thử lại 2, $ fe2 thử lại 2, $ fe3 thử lại 2, $ fe4 thử lại 2}
bảng <dự phòng> {127.0.0.1}

chuyển hướng webtraffic {
        nghe trên cổng $ vip 80
        thời gian chờ phiên 60
        tuyến đường đến <fe> kiểm tra http "/healthcheck.html" digest "(sha1sum của Healthcheck.html)" giao diện $ int_if
}

2

Cá nhân tôi đi đến các bộ cân bằng tải phần cứng đơn giản hơn, ít cấu hình hơn vào thời điểm đó - những thứ như ACE / ASAs của Cisco, Foundry ServerIrons, thậm chí có thể là Zeus ZXTM (một SW LB được thiết kế để tải rất nặng).


Nói cách khác là tăng quy mô ? LB như vậy vẫn sẽ được tối đa hóa ở một số kết nối (vv). Sau đó thì sao? Đó thực sự là câu hỏi của tôi. Cảm ơn!
z8000

1
Các trang web thực sự lớn chỉ cần sử dụng rất nhiều LB nặng nề chạy dưới một số dạng vòng tròn DNS - nó đủ tốt cho thời điểm này và có thể xử lý hàng trăm triệu kết nối. Điều đó nói rằng có câu hỏi tại sao rất nhiều kết nối cần phải mở tất nhiên ...
Chopper3

Đó có phải là RRDNS nội bộ của bạn không? Không, tôi không nghĩ về điều đó. Re: mở kết nối ... Tôi đang khám phá các tùy chọn cho một ứng dụng yêu cầu gửi cập nhật cho khách hàng được kết nối theo thời gian vì các sự kiện xảy ra ở đâu đó trên phụ trợ. Tôi bị giằng xé giữa một máy chủ TCP tùy chỉnh hoặc nhiều kết nối HTTP mở phía sau SLB. Cảm ơn bạn đã bình luận của bạn.
z8000

Tôi nghĩ rằng nó sẽ phải là RRDNS bên ngoài. Chẳng hạn, Twitter.com sẽ sử dụng RRDNS để giải quyết và phân phối các yêu cầu đến một trong nhiều LB lớn, sau đó sẽ phân phối tải cho các máy chủ.
Robert

Có Robert, bạn nói đúng, ví dụ, chúng tôi sử dụng các hộp Cisco GSS để thực hiện RR theo từng trang web.
Chopper3

1

Có lẽ thay vì liên tục giữ quá nhiều kết nối mở để gửi trả lời, hãy mã hóa ứng dụng của bạn theo cách để khách hàng sẽ thăm dò định kỳ máy chủ của bạn thường xuyên khi cần thiết?

Là bất cứ điều gì bạn đang làm thực sự đòi hỏi một phản hồi rất mili giây này hoặc khách hàng có thể đợi 15/20 giây cho đến giai đoạn bỏ phiếu tiếp theo không?


0

Một cách tiếp cận thông thường sẽ là tạo ra một cụm đủ lớn để xử lý tải yêu cầu và sử dụng SLB có thể thực hiện cân bằng tải xác định (đối với trường hợp kết nối liên tục).

Một cái gì đó như CARP sử dụng hàm băm của IP yêu cầu để xác định máy chủ web phụ trợ nào sẽ xử lý yêu cầu, điều này sẽ mang tính quyết định nhưng không hữu ích nếu có tường lửa hoặc NAT trước bộ cân bằng tải của bạn.
Bạn cũng có thể thấy một cái gì đó như IPVS hữu ích nếu bạn đang chạy trên Linux.


Những gì bạn tuyên bố về cá chép là rất xa so với cách nó hoạt động, tôi sẽ không biết bắt đầu từ đâu! + -0 khi đề cập đến IPVS.
3molo

@ 3molo ... hả? xem net.inet.carp.arpbalance tại linux.com/archive/feed35482 " . "
Paul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.