Làm thế nào để chơi lưu lượng truy cập vào một mạng bóng?


12

Xin lỗi nếu đây là một câu hỏi mới ...

Tôi đã nghe những câu chuyện về Netflix và Twitter có thể sao chép lưu lượng truy cập web giữa hai cơ sở hạ tầng riêng biệt: một là cơ sở có thẩm quyền / đáng tin cậy quay trở lại với người dùng; và cái còn lại là một "cái bóng" hoặc cơ sở hạ tầng thử nghiệm nghĩ rằng nó sẽ quay trở lại với người dùng nhưng không. Vấn đề là kiểm tra cơ sở hạ tầng thứ cấp ở mức tải và thời gian thực.

Tôi khá chắc chắn có một từ để mô tả điều này, nhưng 'cây cầu' dường như không phải là từ đúng, cũng không phải 'phát lại'.

Bất cứ ai có thể giúp tôi với những gì kỹ thuật này được gọi và / hoặc những công cụ nào có thể được sử dụng để thực hiện điều này?

Tôi đoán rằng tôi nên nói thêm rằng tôi đã nghe về các kỹ thuật "phát lại nhật ký" một cách hiệu quả, nhưng điều đó thực sự khó khăn để đạt được tốc độ / phân phối thực sự.

Và, chúng tôi không cố gắng xác minh 'tính chính xác' của đầu ra, nhưng chỉ cần đảm bảo rằng chúng tôi không thấy lỗi / stacktraces / vv trong cơ sở hạ tầng mới.


Cách rõ ràng để làm điều này (sử dụng một công tắc có cổng nhân bản để sao chép lưu lượng truy cập vào) có vẻ như sẽ gây ra sự cố khi các máy chủ "bóng" đó cố gắng trả lời. Bây giờ bạn đã khiến tôi quan tâm theo cách không thể tin được.
DerfK

@DerfK: Phát lại các ảnh chụp lớp 2 hoặc 3 đơn giản sẽ gặp vấn đề nếu bạn không viết mã để mô phỏng ngăn xếp TCP / IP của máy khách từ xa. Nắm bắt ở lớp 7 là cách tốt hơn trừ khi bạn muốn viết nhiều mã.
Evan Anderson

Tôi không nghĩ rằng thật khó để thực hiện nó ở cấp độ gói. Vui lòng tham khảo tcpcopy ( github.com/wangbin579/tcpcopy )

Câu trả lời:


7

Cá nhân tôi gọi nó là "kiểm tra tải thông qua phát lại phiên". Tôi không biết bất kỳ thuật ngữ bắt tất cả đơn giản nào cho loại kỹ thuật kiểm tra này.

Chiến lược cơ bản mà tôi đã thấy được áp dụng cho loại thử nghiệm tải này là nhập các tệp nhật ký từ hệ thống sản xuất và phát lại chúng trên hệ thống thử nghiệm.

Bạn có thể sử dụng các công cụ như JMeter hoặc Apache Bench để phát lại các yêu cầu từ các tệp nhật ký. Nếu bạn đang xem phát lại các tương tác máy khách / máy chủ rất phức tạp (với các chi tiết thời gian cụ thể dựa trên luồng nhật ký ban đầu) với hy vọng thực sự thực hiện các phần bên trong ứng dụng của bạn (tìm kiếm điều kiện chủng tộc, lỗi liên quan đến thời gian, v.v.), bạn có thể nhìn vào việc viết các công cụ kiểm tra dành riêng cho ứng dụng mô phỏng khách hàng theo tỷ lệ.

Bạn sẽ không thể chỉ đơn giản là nắm bắt được khối lượng lưu lượng truy cập mạng thô và "phát lại" nó với bất kỳ giao thức dựa trên TCP hoặc IP nào. Số thứ tự TCP sẽ không khớp với lưu lượng truy cập ban đầu và nó sẽ không hoạt động. Việc chụp lớp IP sẽ gặp vấn đề vì các máy khách được mô phỏng của bạn sẽ cần trả lời cho địa chỉ IP của người gửi bị bắt. Bạn nên nắm bắt lưu lượng truy cập gần hơn với lớp 7 và sử dụng điều đó để phát lại các phiên vì nếu không, bạn cũng đang xem việc viết một trình giả lập TCP. (Tôi có thể tưởng tượng việc sử dụng thứ gì đó như tsharkđể lấy dữ liệu và thời gian của lớp 7 từ luồng TCP và phát lại, chẳng hạn.)

Đơn giản chỉ cần phát lại lưu lượng mạng mô phỏng tải nhưng không nhất thiết phải ghi lại lỗi. Máy khách mô phỏng của bạn sẽ cần nhận được phản hồi từ máy chủ thử nghiệm và phân tích chúng cho chính xác nếu bạn muốn kiểm tra tải bất kỳ thử nghiệm nào mà ứng dụng đang phản hồi đúng. Vì ứng dụng của bạn sẽ tạo dữ liệu phản hồi động nên khách hàng mô phỏng của bạn không thể so sánh phản hồi của máy chủ thử nghiệm với phản hồi đã ghi từ máy chủ sản xuất. Đây là nơi bạn sẽ bắt đầu viết một bài kiểm tra cụ thể cho ứng dụng của bạn và đầu ra của nó.


1

Bạn sử dụng một dịch vụ như BrowserMob , mô phỏng rất nhiều người đồng thời truy cập trang web của bạn. Các dịch vụ này không phát lại lưu lượng truy cập đã đăng nhập, vì sau đó bạn sẽ thiếu phía khách hàng của cuộc trò chuyện. Ví dụ: máy chủ của bạn sẽ cố gửi các gói đến các máy tính trên Internet mà không mong muốn nhận được chúng. Nhưng những gì các công ty này làm là nghiên cứu nhật ký (thường ở cấp độ ứng dụng, không phải cấp độ gói) và sử dụng thông tin đó để tìm ra những trang nào mọi người đang nhấp vào, tần suất và theo trình tự nào. Dữ liệu này được sử dụng để viết các tập lệnh / macro mà BrowserMob sau đó lặp lại.

ApacheBench, như được đề cập bởi một người dùng khác, thực sự không được sử dụng nhiều trong những ngày này. Nó hữu ích hơn 10 năm trước khi bạn chỉ cần tìm ra một tài liệu HTML tĩnh hoặc JPEG có thể được phục vụ nhanh như thế nào trong một tải nặng. Nó không khác nhiều so với một nhóm người nhấp vào tải lại, tải lại, tải lại nhiều lần trên trình duyệt web của họ. Bạn cần một cái gì đó thông minh hơn một chút khi thử nghiệm một ứng dụng web có quy trình làm việc phức tạp hơn.


1

Tôi không nghĩ rằng bạn có thể làm điều này ở một lớp mạng, mặc dù bạn có thể có được một hạt nhân chuyên dụng cho bộ cân bằng tải phần cứng để xử lý máy chủ thứ hai. Về cơ bản lưu lượng truy cập web (TCP) sẽ yêu cầu xác nhận từng gói được gửi / nhận. Vì vậy, nếu người dùng gửi một gói đến mạng của bạn, nó sẽ bị trùng lặp với cả mạng prod và mạng bóng của bạn. Các máy chủ trong mỗi mạng trả lời và gói của máy chủ prod được chuyển tiếp trở lại máy của bạn để quay lại một xác nhận và họ vui vẻ tiếp tục cuộc trò chuyện của mình. Tuy nhiên, nếu bạn thả gói máy chủ bóng của mình, nó sẽ không nhìn thấy xác nhận. Vì vậy, nó sẽ thử gửi lại nó, đồng thời làm chậm tốc độ truyền của nó cho tất cả các hoạt động mạng (điều này được gọi là cửa sổ). Nó sẽ tiếp tục thử lại để gửi cho đến khi nó hết thời gian, và phiên bị phá bỏ. Thành thật mà nói, bạn thậm chí sẽ không thể hoàn thành một cái bắt tay để thiết lập kết nối ở nơi đầu tiên.

Về gần nhất bạn có thể đến đây sẽ chuyển tiếp gói đồng bộ hóa ban đầu đến máy chủ bóng của bạn và sau đó đặt cổng mặc định cho các hộp đó là một vị trí không tồn tại. Sau đó, bất cứ lúc nào người dùng sẽ cố gắng thiết lập kết nối, họ sẽ nhận được một máy chủ thực trên mạng prod của bạn và ít nhất bạn sẽ gửi một gói đồng bộ đến mạng bóng. Chết tiệt, bây giờ bạn có tôi tự hỏi làm thế nào bạn có thể làm cho công việc này quá :)


1

Tôi đã có thể hỏi @adrianco về điều này tại cuộc họp của Netflix.

Câu trả lời là họ đã viết công cụ của riêng họ, về cơ bản là một ServletFilter (xin lỗi, thuật ngữ dành riêng cho Java) để tạo lại yêu cầu hiện tại và thực hiện một lệnh gọi quên và không đồng bộ trên máy chủ đích.

Những lợi ích là:

  • Mô hình giao thông 'Thế giới thực' đối với cơ sở hạ tầng thử nghiệm ("tối") của bạn
  • Không cần ghi lại rồi phát lại

Hạn chế:

  • Phải có các luồng / chu kỳ CPU để dự phòng trên các hộp sản xuất của bạn
  • Độ trễ trên cơ sở hạ tầng thử nghiệm của bạn có thể sao lưu và ảnh hưởng đến các hộp sản xuất của bạn
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.