Cân bằng tải Thực tiễn tốt nhất cho sự bền bỉ


8

Chúng tôi chạy một ứng dụng web phục vụ API web cho số lượng khách hàng ngày càng tăng. Để bắt đầu, các khách hàng thường ở nhà, văn phòng hoặc các mạng không dây khác gửi các tệp tải lên http được chia nhỏ lên API của chúng tôi. Bây giờ chúng tôi đã phân nhánh để xử lý nhiều khách hàng di động hơn. Các tệp từ vài k đến vài hợp đồng biểu diễn, được chia thành các phần nhỏ hơn và được ghép lại trên API của chúng tôi.

Cân bằng tải hiện tại của chúng tôi được thực hiện ở hai lớp, đầu tiên chúng tôi sử dụng DNS vòng tròn để quảng cáo nhiều bản ghi A cho địa chỉ api.company.com của chúng tôi. Tại mỗi IP, chúng tôi lưu trữ Linux LVS: http://www.linuxvirtualserver.org/ , bộ cân bằng tải xem địa chỉ IP nguồn của yêu cầu để xác định máy chủ API nào sẽ kết nối. Các hộp LVS này được cấu hình với nhịp tim để tiếp quản các VIP bên ngoài và IP cổng bên trong từ nhau.

Gần đây, chúng tôi đã thấy hai điều kiện lỗi mới.

Lỗi đầu tiên là nơi khách hàng đang dao động hoặc di chuyển từ LVS này sang LVS khác, tải lên giữa. Điều này đến lượt nó làm cho các bộ cân bằng tải của chúng tôi mất dấu kết nối liên tục và gửi lưu lượng truy cập đến một máy chủ API mới, do đó phá vỡ tải lên chunk trên hai hoặc nhiều máy chủ. Mục đích của chúng tôi là dành cho giá trị DNS Round Robin DNS cho api.company.com của chúng tôi (mà chúng tôi đã đặt lúc 1 giờ) để được vinh danh bởi các máy chủ tên bộ đệm lưu trữ hạ lưu, các lớp bộ đệm của hệ điều hành và các lớp ứng dụng khách. Lỗi này xảy ra cho khoảng 15% số lượt tải lên của chúng tôi.

Lỗi thứ hai chúng tôi thấy ít phổ biến hơn. Một khách hàng sẽ bắt đầu lưu lượng truy cập vào hộp LVS và được chuyển đến máy chủ thực A phía sau nó. Sau đó, khách hàng sẽ đến thông qua một địa chỉ IP nguồn mới mà hộp LVS không nhận ra, do đó định tuyến lưu lượng truy cập liên tục đến máy chủ thực B cũng phía sau LVS đó.

Với kiến ​​trúc của chúng tôi như được mô tả trong phần trên, tôi muốn biết trải nghiệm của mọi người với cách tiếp cận tốt hơn sẽ cho phép chúng tôi xử lý từng trường hợp lỗi ở trên một cách duyên dáng hơn?

Chỉnh sửa 5/3/2010:

Điều này trông giống như những gì chúng ta cần. Băm GSLB có trọng số trên địa chỉ IP nguồn.

http://www.brocade.com/support/Sản phẩm_Quản lý / ServerIron_ADXGlobalServer_LoadBalANCEGuide / gslb.2.11.html # 271674


Câu hỏi của bạn không thực sự cụ thể cho điện thoại di động ngay bây giờ. Có lẽ bạn sẽ xem xét sửa đổi và đơn giản hóa nó?
Jesper M

Câu trả lời:


11

Giải pháp chính cho vấn đề này là không dựa vào địa chỉ IP của người dùng cuối mà thay vào đó sử dụng bộ cân bằng tải Lớp 7 (HTTP / HTTPS) với "Phiên dính" thông qua cookie.

Các phiên dính có nghĩa là bộ cân bằng tải sẽ luôn hướng một máy khách nhất định đến cùng một máy chủ phụ trợ. Thông qua cookie có nghĩa là bộ cân bằng tải (bản thân nó là một thiết bị HTTP có khả năng đầy đủ) chèn một cookie (mà bộ cân bằng tải tạo và quản lý tự động) để ghi nhớ nên sử dụng máy chủ phụ trợ nào mà kết nối HTTP đã cho.

Nhược điểm chính của các phiên dính là tải máy chủ vì có thể trở nên không đồng đều. Bộ cân bằng tải chỉ có thể phân phối tải một cách công bằng khi các kết nối mới được tạo, nhưng do các kết nối hiện có có thể tồn tại lâu trong kịch bản của bạn, sau đó trong một khoảng thời gian, tải sẽ không được phân phối hoàn toàn công bằng.

Chỉ cần mỗi bộ cân bằng tải lớp 7 sẽ có thể làm điều này. Trên Unix / Linux, một số ví dụ phổ biến là nginx, HAProxy, Apsis Pound, Apache 2.2 với mod_proxy và nhiều hơn nữa. Trên Windows 2008+ có Định tuyến Yêu cầu Ứng dụng Microsoft. Là các thiết bị, Coyote Point, loadbalancer.org, Kemp và Barracuda là phổ biến trong không gian cấp thấp; và F5, Citrix NetScaler và các sản phẩm cao cấp khác.

Willy Tarreau, tác giả của HAProxy, có một cái nhìn tổng quan đẹp về các kỹ thuật cân bằng tải ở đây .

Giới thiệu về Robin Round DNS:

Mục đích của chúng tôi là dành cho giá trị DNS Round Robin DNS cho api.company.com của chúng tôi (mà chúng tôi đã đặt lúc 1 giờ) để được vinh danh bởi các máy chủ tên bộ đệm lưu trữ hạ lưu, các lớp bộ đệm của hệ điều hành và các lớp ứng dụng khách.

Nó sẽ không được . Và Robin Round Robin không phù hợp để cân bằng tải . Và nếu không có gì khác thuyết phục bạn, hãy nhớ rằng các máy khách hiện đại có thể thích một máy chủ hơn tất cả các máy chủ khác do ghim tiền tố dài nhất , vì vậy nếu máy khách di động thay đổi địa chỉ IP, nó có thể chọn chuyển sang máy chủ RR khác.

Về cơ bản, bạn có thể sử dụng robin vòng DNS như một phân phối tải trọng thô, bằng cách trỏ 2 hoặc nhiều bản ghi RR vào các địa chỉ IP khả dụng cao, được xử lý bởi các bộ cân bằng tải thực trong HA hoạt động / thụ động hoặc chủ động / hoạt động. Và nếu đó là những gì bạn đang làm, thì bạn cũng có thể phục vụ các bản ghi DNS RR đó với các giá trị Thời gian sống lâu, vì các địa chỉ IP được liên kết đã có sẵn rất cao.


Cảm ơn. Chúng tôi đang ở chế độ Hoạt động / Hoạt động với LVS. Các IP rất khả dụng và chúng tôi có nhiều quyền kiểm soát khách hàng khi chúng tôi tự viết chúng và họ dựa vào máy chủ API của chúng tôi không hoàn toàn không trạng thái như mô tả ở trên. Tôi đã kiểm tra vấn đề bộ nhớ đệm cấp hệ điều hành trên hộp Linux của tôi tại nơi làm việc (nó không bật bộ nhớ đệm) cũng như máy tính xách tay Mac OSX của tôi ở nhà (nó lưu trữ ở lớp hệ điều hành, "ghim" IP với kết quả này hoặc kết quả khác ).
dmourati

Tôi đã kết thúc việc viết máy chủ DNS tùy chỉnh của riêng mình để khắc phục sự cố vòng tròn. Nó nhìn vào địa chỉ IP nguồn và sử dụng hàm băm để trả lời với một bản ghi nhất quán. Có vẻ như đang hoạt động và giảm vấn đề "chuyển đổi pop" của chúng tôi xuống 10 lần
dmourati

4

Để trả lời câu hỏi của bạn về các lựa chọn thay thế: Bạn có thể cân bằng tải lớp 7 thông qua HAProxy .

Theo như khắc phục các vấn đề về mối quan hệ LVS, tôi hơi khô khan với những ý tưởng vững chắc. Nó có thể đơn giản như thời gian chờ hoặc tràn. Một số máy khách di động sẽ chuyển đổi địa chỉ IP trong khi chúng được kết nối với mạng; có lẽ đây là nguồn gốc của tai ương của bạn? Tôi sẽ đề nghị, ít nhất, rằng bạn trải rộng độ chi tiết ái lực ra ít nhất là một lớp C.


HAProxy chắc chắn nằm trong tầm ngắm của tôi. Tôi đọc một bài viết khá thú vị về cân bằng tải L4 v L7. blog.loadbalancer.org/why-layer-7-sucks Tôi mất: Tôi muốn để cái này trong tay của ứng dụng. Bất kỳ "thông minh" bổ sung nào tôi thêm vào lớp LB sẽ chỉ cần được vá / cài đặt lại khi chúng tôi thay đổi ứng dụng của mình. Tự giải quyết vấn đề trong ứng dụng có nghĩa là chúng ta có thể tối ưu hóa và tinh chỉnh mọi thứ tại LB trong khi vẫn tự tin rằng ngay cả khi có lỗi LB, chúng ta vẫn sẽ nhận được dữ liệu.
dmourati

@dmourati: Xin lỗi, nhưng bài đăng trên blog đó chứa đầy những giả định không chính xác. Đừng mù quáng làm theo nó. Hoàn toàn đúng khi kiến ​​trúc "không chia sẻ gì" cho các máy chủ ứng dụng web là 'tốt nhất'. Trong trường hợp đó, bạn nên sử dụng Round Robin hoặc cân bằng tải ngẫu nhiên. Nhưng, miễn là bạn có tải lên HTTP nhiều GB, bạn có các cuộc hội thoại HTTP tồn tại lâu dài và bộ cân bằng tải HTTP chỉ có vị trí tốt hơn để hiểu được trao đổi HTTP dài này và hành động chính xác. Sử dụng bộ cân bằng HTTP không loại trừ việc làm cho mã ứng dụng phụ trợ của bạn 'thông minh hơn', bạn vẫn có thể tự do làm điều đó bất cứ lúc nào.
Jesper M
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.