2008-10-18 19 views
7

Làm cách nào để các trang web lớn không thể hoàn toàn không quốc tịch đạt được khả năng mở rộng cực cao ở cấp web?Sharding (sic!) Tầng web để ngăn chặn tắc nghẽn cân bằng tải?

Có các trang web như eBay và Amazon, không thể hoàn toàn vô quốc tịch vì chúng có giỏ hàng hoặc thứ gì đó tương tự. Không thể mã hóa mọi mục trong giỏ hàng vào URL, cũng không khả thi để mã hóa mọi mục vào cookie và gửi nó ở mọi kết nối. Vì vậy, Amazon chỉ lưu trữ session-id vào cookie đang được gửi. Vì vậy, tôi hiểu rằng khả năng mở rộng của tầng web của eBay và Amazon sẽ khó khăn hơn nhiều so với khả năng mở rộng của công cụ tìm kiếm google, nơi mọi thứ có thể được mã hóa một cách an toàn vào URL.

Mặt khác, cả eBay cũng như Amazon đều có quy mô lớn. Tin đồn là có khoảng 15000 máy chủ ứng dụng J2EE tại eBay.

Làm cách nào để các trang web này xử lý cả hai: khả năng mở rộng và trạng thái cực đoan? Vì trang web là trạng thái, nên không thể thực hiện một DNS-Balancing đơn giản. Vì vậy, người ta sẽ giả định rằng các công ty này có một cân bằng tải dựa trên phần cứng như BigIP, Netscaler hoặc một cái gì đó như thế, đó là thiết bị duy nhất đằng sau địa chỉ IP duy nhất của trang web đó. Bộ cân bằng tải này sẽ giải mã SSL (nếu được mã hóa), kiểm tra cookie và quyết định tùy thuộc vào id phiên của cookie mà máy chủ ứng dụng giữ phiên của khách hàng đó.

Nhưng điều này chỉ có thể không thể làm việc như không có cân bằng tải duy nhất có thể có thể xử lý tải của hàng ngàn máy chủ ứng dụng? Tôi sẽ tưởng tượng rằng ngay cả những cân bằng tải phần cứng không quy mô đến mức như vậy.

Ngoài ra, cân bằng tải đang được thực hiện một cách minh bạch cho người dùng, tức là người dùng không được chuyển tiếp đến các địa chỉ khác nhau, nhưng tất cả vẫn ở lại www.amazon.com toàn bộ thời gian. Vì vậy, câu hỏi của tôi là: Có một số thủ thuật đặc biệt mà người ta có thể đạt được một cái gì đó như minh bạch sharding của tầng web (không phải là tầng cơ sở dữ liệu được thực hiện phổ biến)? Miễn là cookie không được kiểm tra thì không có cách nào để biết máy chủ ứng dụng nào đang nắm giữ phiên này.

Chỉnh sửa: Tôi nhận thấy rằng chỉ có nhu cầu minh bạch, nếu có nhu cầu cho trang web được spidered và đánh dấu. Ví dụ. nếu trang web chỉ là một ứng dụng web, giống như hệ thống đặt vé máy bay hoặc vé tàu, thì sẽ không có vấn đề gì khi chỉ chuyển hướng người dùng đến các cụm máy chủ web cụ thể theo các url khác nhau, ví dụ: a17.ticketreservation.com. Trong trường hợp cụ thể này, nó sẽ là khả thi khi chỉ sử dụng nhiều cụm máy chủ ứng dụng, mỗi cụm phía sau cân bằng tải của riêng mình. Thật thú vị, tôi không tìm thấy một trang web sử dụng loại khái niệm này. Chỉnh sửa: Tôi đã tìm thấy khái niệm này discussed tại highscalability.com, trong đó cuộc thảo luận đề cập đến một bài viết của Lei Zhu có tên "Client Side Load Balancing for Web 2.0 Applications". Lei Zhu sử dụng kịch bản chéo để làm cân bằng tải phía khách hàng này một cách minh bạch.

Thậm chí nếu có những hạn chế, như đánh dấu trang, xss, v.v, tôi nghĩ rằng điều này nghe như một ý tưởng cực kỳ tốt cho một số tình huống đặc biệt, cụ thể là hầu hết các ứng dụng web không có nội dung. (ví dụ: hệ thống đặt vé hoặc thứ gì đó tương tự). Sau đó, không cần phải cân bằng tải một cách minh bạch.

Có thể có chuyển hướng đơn giản từ trang web chính đến máy chủ, ví dụ: chuyển hướng từ www.ticketreservation.com đến a17.ticketreservation.com. Từ đó, người dùng ở lại máy chủ a17. a17 không phải là một máy chủ, mà là một cụm chính nó, do đó dự phòng có thể đạt được.

Máy chủ chuyển hướng ban đầu có thể là cụm phía sau trình cân bằng tải. Bằng cách này, một khả năng mở rộng thực sự cao có thể đạt được, như cân bằng tải chính sau www chỉ được nhấn một lần vào đầu mỗi phiên.

Tất nhiên, chuyển hướng đến các url khác nhau trông cực kỳ khó chịu, nhưng với các ứng dụng web đơn thuần (không cần phải được liên kết sâu hoặc được đánh dấu sâu), thì đây chỉ là vấn đề quang học cho người dùng ?

Cụm chuyển hướng có thể thăm dò ý kiến ​​tải trọng của cụm ứng dụng và điều chỉnh chuyển hướng phù hợp, do đó đạt được cân bằng và không chỉ phân phối tải.

Trả lời

1

Ea sy. Các máy chủ web, không trạng thái, được cân bằng tải. Các máy chủ ứng dụng (tầng giữa), lưu giữ dữ liệu phiên, thì không. Các máy chủ web có thể sử dụng cookie id phiên của bạn để xác định máy chủ ứng dụng nào sẽ liên hệ.

Vận tốc của Microsoft và Memcached là những sản phẩm giải quyết nhu cầu chính xác này.

Chỉnh sửa: Máy chủ web biết máy chủ ứng dụng liên hệ với ai? Điều này được nhúng vào băm id phiên, và có thể được thực hiện một cách tổng quát theo cách bạn muốn. Nó có thể đơn giản như id phiên của bạn là máy chủ: guid. Tuy nhiên, Memcached sẽ loại bỏ nó.

Điểm quan trọng là khách hàng phải có khả năng tìm ra máy chủ ứng dụng nào cần liên hệ theo cách không quốc tịch. Cách dễ nhất để làm điều đó là nhúng nó vào khóa, mặc dù một đăng ký (có lẽ trên tầng riêng của nó) sẽ làm việc tốt và có thể cung cấp một số dung sai lỗi.

Chỉnh sửa2: Quay lại some Ebay interviews, tôi có thể đã nhận được thông tin cụ thể về việc triển khai của họ một chút sai. Họ không làm bộ nhớ đệm, và họ không làm nhà nước ở tầng giữa. Những gì họ làm, là có một tầng trung bình cân bằng tải (máy chủ ứng dụng) được phân đoạn theo chức năng. Vì vậy, họ sẽ có một nhóm các máy chủ cho, ví dụ như, xem các mục. Và sau đó một hồ bơi khác để bán các mặt hàng.

Các máy chủ ứng dụng này có DAL "thông minh" định tuyến đến cơ sở dữ liệu bị phân đoạn (được phân đoạn theo chức năng và dữ liệu, do đó Người dùng A-L trên Database1, Người dùng M-Z trên Database2, Mục 1-10000 trên Items1, v.v.).

Họ không có trạng thái ở tầng giữa vì chúng được phân đoạn theo chức năng. Vì vậy, trải nghiệm người dùng thông thường sẽ liên quan đến hơn 1 máy chủ ứng dụng. Giả sử bạn xem một mục (ViewAppServerPool), sau đó đi đến giá thầu trên một mục (BidAppServerPool). Tất cả các máy chủ ứng dụng đó sẽ phải đồng bộ hóa, sau đó yêu cầu bộ nhớ cache được phân phối để quản lý mọi thứ. Tuy nhiên, quy mô của họ quá lớn đến mức không có bộ nhớ cache được phân phối nào có thể quản lý hiệu quả nó, cũng như không thể một máy chủ cơ sở dữ liệu duy nhất. Điều này có nghĩa là họ phải phân chia tầng dữ liệu và mọi triển khai bộ nhớ cache sẽ phải được phân chia trên cùng một ranh giới.

Đây là tương tự với nội dung tôi đã đăng ở trên, chỉ cần di chuyển xuống một lớp. Thay vì yêu cầu máy chủ web xác định máy chủ ứng dụng nào sẽ liên hệ, máy chủ ứng dụng sẽ xác định cơ sở dữ liệu nào cần liên hệ. Chỉ trong trường hợp của Ebay, nó thực sự có thể tấn công hơn 20 máy chủ cơ sở dữ liệu vì chiến lược phân vùng của họ. Nhưng, một lần nữa, tầng không trạng thái có một số loại quy tắc mà nó sử dụng để liên lạc với cấp trạng thái. Tuy nhiên, các quy tắc của Ebay phức tạp hơn một chút so với quy tắc "User1 trên Server10" đơn giản mà tôi đã giải thích ở trên.

+0

Máy chủ web không trạng thái tìm máy chủ ứng dụng chính xác như thế nào? Mỗi máy chủ web có biết về mỗi phiên mà bất kỳ máy chủ ứng dụng nào nắm giữ không? Sẽ không phải là chi phí truyền thông khủng khiếp này? – SAL9000

+0

Cân bằng tải sử dụng id phiên của bạn hoặc có thể địa chỉ IP của bạn làm đầu vào để chọn máy chủ ứng dụng. Nếu mỗi bộ cân bằng tải có cùng một thuật toán để chọn máy chủ ứng dụng, điều đó không quan trọng đối với việc bạn tải về trình tải trọng nào, bạn sẽ luôn được gửi đến cùng một máy chủ ứng dụng. Không có thông tin liên lạc giữa máy chủ ứng dụng và cân bằng tải liên quan. –

2

Bạn có lẽ sẽ phải được trên đội ngũ kỹ thuật tại một trong những nơi này để biết chắc chắn nhưng có những người đã thực hiện ước đoán từ các cuộc đàm phán và các thông tin khác mà đã đi ra của cả hai nơi:

Ebay ArchitectureAmazon Architecture

Chỉ một bộ cân bằng tải đơn trong thế giới ngày nay là loại tương đương với vòng tròn DNS của năm trước. Hôm nay bạn có những thứ như anycast cho phép bạn chơi tất cả các loại thủ thuật. Bạn có thể khá chắc chắn rằng thích của ebay và amazon sử dụng cân bằng tải và họ sử dụng rất nhiều trong số họ.

Bạn có thể muốn đun sôi thêm một chút khi bạn nghĩ về cách nó có thể hoạt động vì rất nhiều lưu lượng truy cập là không trạng thái. Trong một yêu cầu duy nhất cho một trang có khả năng rất nhiều đối tượng mà không cần phải biết về nhà nước. Đưa các đối tượng đó ra khỏi hình ảnh bằng cách phục vụ chúng từ một hệ thống không trạng thái (đây là nơi mà anycast xuất hiện) và số lượng yêu cầu giảm đi đáng kể.

Nếu điều đó không đưa bạn đến mức một cân bằng tải có thể xử lý tải thì bước tiếp theo là phá vỡ các giao dịch bằng cách sử dụng định tuyến IP và/hoặc geo-DNS. Các trang web lớn như ebay và amazon sẽ nằm trong một số trung tâm dữ liệu khác nhau với một số lượng lớn các kết nối internet tại mỗi trang. Bạn lấy mọi thứ từ internet pop quest-west và gửi nó đến các máy chủ "quest" của trung tâm dữ liệu bờ biển phía tây, bất cứ thứ gì từ phía tây được gửi tới máy chủ "att" ở miền tây bờ biển, bất kỳ thứ gì từ quest-east và Mỗi hệ thống có thể là một hòn đảo một cân bằng tải duy nhất có thể xử lý tải, một số cân bằng tải ra có thể xử lý hàng trăm ngàn giao dịch một giây thậm chí SSL được mã hóa. Ở mặt sau, bạn sao chép hàng loạt vào mỗi trung tâm dữ liệu liên tục nhưng nó có thể không đồng bộ.

+0

Có, tôi đã đọc cả hai bài báo tại highscalability.com. Tôi đã đăng câu hỏi này vì tôi không thể tìm thấy bất cứ điều gì về tải cân bằng ở đó. Anycast chắc chắn là tiên tiến hơn nhiều so với vòng robin, nhưng cũng không cung cấp cân bằng tải trạng thái, như tôi hiểu nó. – SAL9000

2

Bạn có thể tìm thấy hữu ích các giấy tờ sau đây, trong đó trình bày việc thiết kế và thực hiện một hệ thống lưu trữ giá trị khóa cao có sẵn mà một số sử dụng dịch vụ cốt lõi của Amazon để cung cấp một “luôn luôn-on” kinh nghiệm:

Giuseppe DeCandia, Deniz Hastorun, Madan Jampani, Gunavardhan Kakulapati, Avinash Lakshman, Alex Pilchin, Swami Sivasubramanian, Peter Vosshall và Werner Vogels, “Dynamo: Amazon's Highly Available Key-Value Store”, trong Kỷ yếu Hội thảo ACM lần thứ 21 về Nguyên tắc Hệ điều hành, Stevenson, WA, Tháng 10 năm 2007.

2

Tôi không biết làm thế nào họ làm điều đó, nhưng đây là một số gợi ý:

  • Để tránh quá tải một loạt cân bằng tải bản thân, sử dụng DNS round-robin HOẶC
  • Chuyển khách hàng khác nhau để khác nhau địa chỉ cụm dựa trên tải, cài đặt, định vị, vv

Để phân phối tải tầng giữa,

  • Nhúng ID của máy chủ phiên tầng giữa bên trong cookie ID phiên - như những người khác đã đề xuất. Bằng cách đó, hộp front-end bạn nhấn là không liên quan, chúng có thể được thêm/xóa mà không có bất kỳ tác động nào.
  • Nếu nó đủ quan trọng, có cơ chế chuyển hướng khách hàng đến một máy chủ tầng giữa thay thế trong một phiên để có thể gỡ xuống để bảo trì vv
  • Khách hàng bắt đầu sử dụng một máy chủ tầng giữa mới được ủy quyền khi họ bắt đầu một phiên làm việc mới

Để phân phối lại tải cơ sở dữ liệu cuối

  • "truyền thống" sharding của "thời gian thực" cho mỗi tài khoản hoặc mỗi -user data
  • Sao chép không đồng bộ dữ liệu thay đổi chậm hoặc tương đối tĩnh; người dùng có thể thấy nó lỗi thời (nhưng không phải phần lớn thời gian). Máy chủ trung cấp và máy chủ web kết nối với cơ sở dữ liệu cục bộ với vị trí riêng của chúng
Các vấn đề liên quan