Cách tốt nhất để tải cân bằng trên nhiều máy chủ tệp tĩnh để phân phối băng thông?


12

Trước hết, tôi sẽ giải thích tình huống của tôi cho bạn. Tôi đang điều hành một trang web khá phổ biến như một dự án phụ, vì vậy tôi thực sự không thể đầu tư rất nhiều tiền vào nó. Tôi hiện chỉ có một máy chủ có HAProxy ở phía trước gửi các yêu cầu bình thường tới Apache và tất cả các yêu cầu tệp tĩnh tới Lighttpd. Điều này đang hoạt động rất tốt vì tất cả các yêu cầu php và bài đăng đều được xử lý bởi Apache, trong khi tất cả các hình ảnh được gửi đến Lighttpd nhanh hơn (trang web chủ yếu là hình ảnh, vì vậy điều này thực sự quan trọng). Sẽ thật tuyệt nếu không phải thiết lập một tên miền phụ để phục vụ hình ảnh, bởi vì các URL ngắn cũng thực sự quan trọng, vì vậy lý do tôi sử dụng HAProxy.

Tôi đã tìm thấy một nhà cung cấp dịch vụ lưu trữ cung cấp băng thông chưa được đáp ứng khá rẻ mà tôi đang sử dụng, vấn đề xảy ra khi tôi bắt đầu sử dụng nhiều băng thông như card mạng 100mbs có thể xử lý, do đó cần một máy chủ thứ hai.

Tôi đã suy nghĩ rất nhiều về các lựa chọn của mình, vì vậy tôi sẽ giải thích từng vấn đề cho bạn. Hy vọng rằng bạn có thể cung cấp một số cái nhìn sâu sắc về cái nào là lựa chọn tốt nhất cho tôi, hoặc có thể có một lựa chọn khác ngoài đó mà tôi chưa nghĩ đến.

Yêu cầu:

  • Ngay cả phân phối băng thông là phải. Tôi có một máy chủ khá mạnh, vì vậy việc mở rộng không phải là một lựa chọn. Tôi cần mở rộng ra để đạt được nhiều băng thông hơn.

  • URL ngắn. Tôi thực sự không muốn thiết lập một tên miền phụ, như img.example.com, để phục vụ hình ảnh của mình. example.com/image.jpg là như thế nào bây giờ và làm thế nào tôi thực sự muốn nó ở lại. Nhưng nếu không còn cách nào khác, thì tôi hiểu.

  • Máy chủ clostest xử lý yêu cầu sẽ thực sự tốt, nhưng không bắt buộc. Một cái gì đó để giữ trong tâm trí.

HAProxy để cân bằng tải:

  • Nó sẽ thực sự dễ dàng vì dù sao tôi cũng đã sử dụng HAProxy. Tuy nhiên, tôi nghĩ vấn đề xuất hiện khi phân phối băng thông. Tôi có thể sai về điều này, nhưng HAProxy không gửi yêu cầu đến máy chủ nơi máy chủ xử lý nó và sau đó gửi lại thông qua HAProxy cho khách hàng? Do đó, tất cả lưu lượng truy cập trở lại thông qua bộ cân bằng tải khiến nó sử dụng nhiều băng thông như tất cả các máy chủ kết hợp.

Robin vòng DNS:

  • Đây có thể là lựa chọn tốt nhất của tôi. Chỉ cần sao chép trang web trên nhiều máy chủ và làm những gì tôi đang làm bây giờ. Nhược điểm là nếu một máy chủ ngừng hoạt động, máy khách vẫn được gửi đến nó. Tôi cũng sẽ cần sao chép trang web trên nhiều máy chủ. Tôi đã hy vọng rằng tôi có thể có một máy chủ chính xử lý mọi thứ trừ các tệp tĩnh và sau đó có một vài máy chủ tệp tĩnh. Tôi cũng đọc được rằng đây là loại 'cân bằng tải của người nghèo', và thật tuyệt khi có thứ gì đó tinh vi hơn một chút.

Trả lại máy chủ trực tiếp:

  • Nó có vẻ thực sự phức tạp, nhưng có thể là một lựa chọn tốt. Tôi vẫn có thể gửi một số URL nhất định đến một số máy chủ nhất định chứ? Giống như ngay bây giờ với HAProxy, mọi URL kết thúc trong phần mở rộng tệp bên phải được gửi tới Lighttpd, trong khi các phần mở rộng khác được gửi tới Apache. Vì vậy, tôi sẽ cần một cái gì đó tương tự. Giống như, tất cả các yêu cầu php được xử lý bởi cùng một máy chủ đang chạy phần mềm cân bằng, trong khi tất cả các yêu cầu jpg được gửi đến nhiều máy chủ.

Lý tưởng nhất là nếu HAProxy hỗ trợ Direct Server Return, thì vấn đề của tôi sẽ được giải quyết. Tôi cũng không muốn sử dụng CDN, vì chúng thực sự đắt tiền và đây chỉ là một dự án phụ.

Bạn có hiểu vấn đề của tôi không? Hãy cho tôi biết nếu tôi không giải thích điều gì đó đúng hoặc nếu bạn cần thêm thông tin.


1
Đây là Imgur và gần đây đã huy động được 40 triệu đô la. : O
L1th1um

Câu trả lời:


3

Vẽ một bức tranh về chu kỳ yêu cầu / phản hồi của bạn cho ứng dụng và cách ly nút cổ chai. Bạn đã đúng rằng một proxy phân phối tải cho nhiều máy chủ ứng dụng sẽ yêu cầu băng thông tổng hợp của tất cả các máy chủ ứng dụng. Giải pháp cổ điển là RR DNS. Google, Yahoo và Amazon đều sử dụng kỹ thuật này với một đoạn ngắn. Tôi đã làm một số điều tra một thời gian trở lại và ghi lại những phát hiện của tôi .

Một giải pháp khác là sử dụng giải pháp cân bằng tải doanh nghiệp ưa thích sử dụng địa chỉ IP ảo để cân bằng các yêu cầu giữa nhiều máy chủ ứng dụng với địa chỉ IP thực. Tôi đã làm việc với các sản phẩm của Netscaler và Stonesoft. Cả hai đều hoạt động tốt nhưng có những đặc điểm riêng khủng khiếp và khá phức tạp.


Cảm ơn rât nhiều. Kết quả khảo sát của bạn rất hữu ích. Tôi nghĩ rằng đây là giải pháp cuối cùng tôi sẽ đến. Tuy nhiên, "Giống như bất kỳ nhà nghiên cứu giỏi nào, tôi không hành động cho đến khi tôi có đủ dữ liệu." :)
Alan

Cảm ơn sự sáng suốt của bạn. Thật không may, một liên kết trớ trêu đến những phát hiện của bạn dường như không hoạt động, bạn có thể sửa nó không?
TCB13

3

Một vài câu trả lời:

  • Có, tất cả lưu lượng truy cập thông qua HAProxy, vì nó hoạt động như một proxy cấp HTTP. Điều này sẽ giống nhau ngay cả khi HAProxy được cài đặt trên một máy chủ riêng có tải cân bằng nhiều máy chủ đầu cuối. Do đó, nếu nhà cung cấp dịch vụ lưu trữ của bạn chỉ cung cấp các cổng mạng 100MBit và bạn đã đẩy 100MBit, thì bạn đã gặp vấn đề.
  • Về tên miền, điều tối ưu sẽ là phân phát hình ảnh từ một tên miền khác với ứng dụng web của bạn - không phải tên miền phụ, tên miền khác, để cookie không được gửi cùng với yêu cầu hình ảnh. Xem tác phẩm gốc của Steve Souder hoặc triển khai tại đây trên Stack Overflow . Nếu các URL ngắn rất quan trọng đối với bạn, có lẽ điều tốt nhất sẽ là chuyển webapp khỏi URL chính, tức là chuyển ứng dụng quản lý tệp sang login.sitename.com?

Bạn có cần xác thực trên các yêu cầu hình ảnh? Nếu không, làm thế nào về việc sử dụng một cái gì đó như Amazon S3? Nó có khả năng mở rộng ồ ạt, và chi phí truyền dữ liệu khá rẻ. Trong trường hợp này, tôi sẽ sử dụng một số thứ như i.sitename.com làm DNS CNAME cho tên máy chủ nhóm Amazon S3, xem tài liệu Amazons . AFAIK bạn không thể có tên miền gốc (sitename.com) dưới dạng CNAME, vì vậy bạn phải sử dụng tên miền phụ như i.sitename.com cho việc này.

Bạn cũng có thể băm hình ảnh của bạn trên nhiều máy chủ. Tức là bạn tạo một cấu trúc DNS như login.sitename.com và a.sitename.com; b.sitename.com; c.sitename.com et cetera. "A." và B." vv các máy chủ chỉ chứa một hệ thống tệp có hình ảnh và máy chủ HTTP nhẹ (bạn đang sử dụng Lighttpd, vì vậy hãy tiếp tục sử dụng. Đối với dự án trong tương lai, tôi sẽ đề xuất xem nginx như một sự thay thế tốt hơn.) Khi người dùng tải lên một hình ảnh, bạn tạo một hàm băm của một mã định danh duy nhất, có thể là tên người dùng của anh ấy, có thể là tên tệp hoặc kết hợp của nhiều mã định danh . Từ hàm băm này, bạn xác định máy chủ nào sẽ lưu trữ hình ảnh trên đó.

Chỉnh sửa Tôi nên thấy rằng băm đã được thảo luận. Về cơ bản, điều tôi đề xuất ở đây chỉ là sử dụng băm trên tên máy chủ, để phân bổ lưu lượng mạng đồng đều trên nhiều máy chủ.

Tôi không biết bạn cần thứ này rẻ đến mức nào - nhưng khi bạn đang đẩy 100 MBit lưu lượng truy cập mạng thì "giá rẻ và tốt" nhanh chóng trở thành ảo ảnh. Có lẽ bạn nên xem xét để có được một mô hình kinh doanh tốt trước tiên, một cái gì đó cung cấp doanh thu định kỳ và sau đó thực hiện công nghệ thích hợp sau đó?


1

Tôi giả sử HAProxy ở trên cùng một máy chủ với các ứng dụng khác của bạn? Bạn có thể ngắt HAProxy ra một hệ thống khác để chạy các yêu cầu thông qua và yêu cầu nó gửi các yêu cầu bình thường đến một máy chủ và yêu cầu hình ảnh đến một máy chủ khác. Vấn đề này là tất cả các yêu cầu vẫn đang đi đến một hộp và nếu bạn đang bão hòa băng thông của nó thì điều đó có thể không giúp bạn nhiều.

Bạn nói rằng các URL ngắn rất quan trọng. Tại sao? Có thực sự là một thỏa thuận lớn để chuyển đổi hình ảnh từ "example.com" sang "i.example.com" không? Bạn có thể đặt "i" thành IP của chính nó trên máy chủ của riêng mình với Lighttpd và bỏ qua HAProxy hoàn toàn, giải quyết vấn đề thông lượng của bạn. Bạn cũng sẽ nhận được lợi ích của trình duyệt web cho phép mở nhiều yêu cầu hơn cùng một lúc vì nó sẽ coi chúng là các tên miền khác nhau và có thể mở các kết nối đồng thời hơn. Nếu máy chủ "i" duy nhất đã bão hòa, bạn có thể sử dụng vòng tròn DNS để thêm một máy chủ khác. Hy vọng đến lúc đó bạn đang tạo ra đủ doanh thu để thực hiện một giải pháp tốt hơn.


Có, HAProxy ở trên cùng một máy chủ - cho đến nay tôi chỉ có một. Ngay cả khi tôi chia nó ra một máy chủ khác, liệu tất cả dữ liệu vẫn truyền qua máy chủ bằng HAProxy, như tôi đã giải thích ở trên? Các URL ngắn rất quan trọng vì đó là mục đích của trang web. Đó là sự giao thoa giữa ImageShack và TinyPic. URL càng dài, trang web của tôi càng ít điểm. Nhưng như tôi đã nói, nếu tùy chọn khả thi duy nhất là thiết lập một tên miền phụ, thì tôi chỉ phải làm điều đó. Tôi thực sự không muốn mặc dù.
Alan

1

Nhà cung cấp dịch vụ lưu trữ của bạn có cung cấp dịch vụ cân bằng tải không? Tôi nghĩ là giải pháp tốt nhất.

Một cách khác để làm điều đó, nhưng nó cần phải được kiểm tra, là viết lại (trong nhẹ hoặc apache) các yêu cầu. Ví dụ: example.com/file.html ở lại apache và example.com/image.jpg chuyển hướng đến i.example.com/image.jpg. Tất cả các yêu cầu sẽ được quản lý thông qua apache nhưng repons (băng thông ngược dòng) sẽ đến máy chủ lighttpd. Tên miền là minh bạch cho người dùng. Tuy nhiên, bạn cần phải kiểm tra xem apache có thể xử lý tất cả các yêu cầu hay có thể để lighttpd thực hiện công việc này.

Bạn đúng tất cả dữ liệu truyền qua HAProxy để bạn không thể (theo như tôi biết) thực hiện trả lại máy chủ trực tiếp với nó.

CẬP NHẬT

Nhìn vào tài liệu HAproxy tôi thấy thông số "chuyển hướng". Tôi không biết nếu nó có thể hoạt động như viết lại apache nhưng nó có thể hữu ích. Các tài liệu nói:

Việc sử dụng chính bao gồm tăng băng thông cho các máy chủ tĩnh bằng cách cho các máy khách kết nối trực tiếp với chúng.

Có lẽ nó hoạt động cho trường hợp của bạn.


Bạn ơi, cảm ơn đã phản hồi. Tôi thực sự đã thử điều này rồi, và nó không hoạt động tốt trong thực tế như trên lý thuyết. Lý do là Apache xử lý tất cả các yêu cầu, vì vậy mỗi khi người dùng chạm vào một hình ảnh, Apache được sinh ra, nhìn vào url, sau đó gửi nó cho nó một cách nhẹ nhàng. Không có gì khác biệt khi chỉ cần Apache xử lý hình ảnh ở vị trí đầu tiên. Tôi đồng ý rằng một bộ cân bằng tải được cung cấp bởi máy chủ của tôi là lựa chọn tốt nhất, nhưng nó cũng là một trong những thứ đắt nhất. Họ tính phí cho mỗi kết nối đồng thời, và tôi nhận được hàng trăm trong số họ.
Alan

Khác biệt ở chỗ máy chủ nhẹ nhàng sẽ gửi phản hồi trực tiếp đến máy khách tiêu thụ băng thông của chính mình. Vấn đề là máy chủ Apache sẽ xử lý rất nhiều yêu cầu. Kiểm tra cập nhật cho câu trả lời của tôi, tôi tìm thấy một giải pháp khác.
hdanniel

1

Tôi giả sử rằng với bất kỳ tập hợp hình ảnh khá lớn nào, bạn sẽ không lưu trữ hình ảnh dựa trên tên tệp gốc của chúng vì bạn sẽ gặp phải xung đột tên khá nhanh.

Rất nhiều ứng dụng xử lý các loại vấn đề này sử dụng hàm băm của tệp và cấu trúc thư mục dựa trên hàm băm đó. Cấu trúc thư mục trông giống như sau trong đó đường dẫn thư mục là hai ký tự đầu tiên của hàm băm sau đó thư mục cấp 2 là hai ký tự tiếp theo trong hàm băm.

/image root/AA/AA/images  
/image root/AA/AB/images

Lợi ích ở đây là băm giữ cho việc phân phối các tệp khá đồng đều và nó cung cấp cho bạn một không gian tên dễ dàng phân chia trên nhiều máy chủ. Về cơ bản, bạn phục vụ các phần của không gian băm từ các máy chủ khác nhau và khi bạn chia tỷ lệ, bạn có thể chia nhỏ phần này theo yêu cầu.

Nhược điểm là băm không hoàn hảo và có thể có va chạm. Tôi không chắc làm thế nào điều này được giải quyết. Vì vậy, có thể mất một chút nghiên cứu về phần của bạn. Tôi tưởng tượng rằng một quy tắc viết lại trong proxy sẽ có thể lấy một hàm băm nói là A3A8BBC83261.jpg và viết lại nó thành http://img3.domain.com/A3/A8/BBC83261.jpg . Bạn có thể không coi đó là một url ngắn mặc dù.


Vâng, đó chính xác là cách tôi lưu trữ hình ảnh. Tuy nhiên, vấn đề không nằm ở bộ nhớ, đó là vấn đề phân phối băng thông.
Alan

Nhưng nếu bạn lưu trữ AA đến 33 trên một máy chủ và 34 đến 99 trên một máy chủ khác, bạn sẽ không chỉ cân bằng được vấn đề lưu trữ mà còn cả việc phân phối băng thông.
3dinfluence

0

Trong bài đăng của bạn, bạn đã đề cập rằng bạn cảm thấy robbin vòng DNS có thể là lựa chọn tốt nhất của bạn nhưng bạn lo ngại về một máy chủ bị lỗi ...

Nếu đó là trường hợp, hãy xem Chuyển đổi dự phòng đơn giản từ Phần mềm JH. Tôi đã sử dụng nó trong quá khứ và nó hoạt động rất tốt.

http://www.simplefailover.com

Về cơ bản, nó giám sát các máy chủ của bạn và khi thấy nó đi xuống, nó sẽ nhanh chóng viết lại DNS để kéo máy chủ chết ra khỏi vòng quay.

Đây là một đoạn từ trang web của họ:

Chuyển đổi dự phòng đơn giản liên tục theo dõi các máy chủ của bạn để tìm ra cái nào lên và xuống, và sau đó nó tự động cập nhật các bản ghi DNS của bạn để tên miền của bạn luôn trỏ đến một máy chủ chức năng.

Nó hoạt động với máy chủ web (HTTP), máy chủ thư (SMTP, IMAP, POP3), máy chủ FTP và thực tế là bất kỳ loại máy chủ dựa trên TCP / IP nào khác.

Như đã đề cập trước đây, tôi đã sử dụng nó trong quá khứ cho cả trang web và máy chủ thư. Nó thực hiện khá tốt. Chuyển đổi dự phòng khá nhanh trong hầu hết các trường hợp (đoán từ 2-5 phút) và tôi nói rằng hầu hết mọi người đều thất bại trong vòng chưa đầy 15 phút.

Không nhất thiết phải HOÀN HẢO ... nhưng chắc chắn nhanh chóng và dễ dàng.

LƯU Ý: Đây là một sản phẩm windows. Tôi không chắc họ có phiên bản linux hay không nhưng bạn có thể thất bại với bất kỳ máy chủ nào bạn muốn kể từ khi có DNS.

Trong trường hợp của chúng tôi, chúng tôi chỉ cần ném nó vào máy XP, bảo máy khởi động lại mỗi đêm một lần và nó chạy tốt trong nhiều nă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.