Jak odtwarzać ruch w sieci typu shadow?

12

Przepraszam, jeśli to nowe pytanie ...

Słyszałem historie o tym, że Netflix i Twitter mogą powielać ruch internetowy pomiędzy dwiema oddzielnymi infrastrukturami: jedna to autorytatywna / zaufana, która wraca do użytkownika; a druga to „cień” lub testowa infrastruktura, która myśli, że wraca do użytkownika, ale tego nie robi. Chodzi o to, aby przetestować infrastrukturę pomocniczą przy rzeczywistym obciążeniu i czasie.

Jestem pewien, że jest na to słowo, ale „most” wydaje się być niewłaściwy, podobnie jak „powtórka”.

Czy ktoś może mi pomóc, jak nazywa się ta technika i / lub jakich narzędzi można użyć do tego?

Wydaje mi się, że powinienem dodać, że słyszałem o technikach, które skutecznie „odtwarzają logi”, ale naprawdę trudno jest uzyskać rzeczywiste prędkości / rozkłady.

I nie próbujemy weryfikować „poprawności” danych wyjściowych, ale tylko upewnij się, że nie widzimy błędów / stacktraces / etc w nowej infrastrukturze.

Nelz
źródło
Oczywisty sposób na zrobienie tego (użycie przełącznika z portem lustrzanym do zduplikowania ruchu przychodzącego) wydaje się powodować problemy, gdy serwery „cienia” próbują odpowiedzieć. Teraz zainteresowałeś mnie nieoczywistym sposobem.
DerfK
@DerfK: Odtwarzanie przechwyconych prostych warstw 2 lub 3 byłoby problematyczne, jeśli nie zamierzasz pisać kodu symulującego stos TCP / IP zdalnego klienta. Przechwytywanie w warstwie 7 jest bardziej odpowiednie, chyba że chcesz napisać dużo kodu.
Evan Anderson
Nie sądzę, że trudno jest wdrożyć go na poziomie pakietu. Proszę odnieść się do tcpcopy ( github.com/wangbin579/tcpcopy )

Odpowiedzi:

7

Osobiście nazwałbym to „testowaniem obciążenia poprzez odtwarzanie sesji”. Nie znam żadnego prostego terminu dla tego rodzaju techniki testowania.

Podstawową strategią, jaką widziałem przy tego rodzaju testach obciążenia, jest pobieranie plików dziennika z systemu produkcyjnego i odtwarzanie ich w systemie testowym.

Za pomocą narzędzi takich jak JMeter lub Apache Bench można odtwarzać żądania z plików dziennika. Jeśli chcesz odtworzyć bardzo złożone interakcje klient / serwer (z konkretnymi szczegółami czasowymi opartymi na oryginalnym strumieniu dziennika) w nadziei, że naprawdę sprawdzisz wnętrze swojej aplikacji (szukasz warunków wyścigu, błędów związanych z czasem itp.), Możesz przyjrzyj się pisaniu narzędzi testujących specyficznych dla aplikacji, które symulują klientów na dużą skalę.

Nie będziesz w stanie po prostu przechwycić dużej ilości surowego ruchu sieciowego i „odtworzyć” go za pomocą dowolnego protokołu opartego na TCP lub IP. Numery sekwencji TCP nie będą pasować do pierwotnie przechwyconego ruchu i nie zadziała. Przechwytywanie warstwy IP będzie problematyczne, ponieważ symulowani klienci będą musieli odpowiedzieć na adres IP przechwyconego nadawcy. Lepiej byłoby przechwytywać ruch bliżej warstwy 7 i używać go do odtwarzania sesji, ponieważ w przeciwnym razie chcesz też napisać symulator TCP. (Mógłbym sobie wyobrazić użycie czegoś takiego jak tsharkwyeliminowanie danych warstwy 7 i czasu ze strumienia TCP i odtworzenie tego, na przykład.)

Samo odtworzenie ruchu sieciowego symuluje obciążenie, ale niekoniecznie wychwytuje wady. Symulowany klient musiałby odbierać odpowiedzi z serwera testowego i analizować je pod kątem poprawności, jeśli chcesz przetestować obciążenie dowolnego testu, na który aplikacja reaguje poprawnie. Ponieważ twoja aplikacja będzie generować dynamiczne dane odpowiedzi, jest mało prawdopodobne, że symulowany klient może po prostu porównać odpowiedź serwera testowego z zarejestrowaną odpowiedzią z serwera produkcyjnego. Tutaj zaczniesz pisać uprząż testową specyficzną dla twojej aplikacji i jej wyników.

Evan Anderson
źródło
1

Korzystasz z usługi takiej jak BrowserMob, która symuluje wiele osób jednocześnie uzyskujących dostęp do Twojej witryny. Usługi te nie odtwarzają zarejestrowanego ruchu, ponieważ wtedy brakowało by strony klienta po rozmowie. Na przykład twoje serwery będą próbowały wysyłać pakiety do komputerów w Internecie, które nie oczekują ich otrzymania. Ale firmy te badają dzienniki (ogólnie na poziomie aplikacji, a nie na poziomie pakietu) i wykorzystują te informacje, aby dowiedzieć się, które strony klikają użytkownicy, jak często i w jakiej kolejności. Te dane służą do pisania skryptów / makr, które następnie BrowserMob powtarza.

Jak wspomniał inny użytkownik, ApacheBench nie jest obecnie tak często używany. Przydało się to 10 lat temu, gdy trzeba było dowiedzieć się, jak szybko można załadować statyczny dokument HTML lub JPEG przy dużym obciążeniu. Nie różni się niczym od grupy ludzi, którzy klikają przycisk Załaduj ponownie, Załaduj ponownie, Załaduj ponownie w swojej przeglądarce internetowej. Potrzebujesz czegoś mądrzejszego podczas testowania aplikacji internetowej o bardziej złożonym przepływie pracy.

jamieb
źródło
1

Nie sądzę, że można to zrobić w warstwie sieciowej, chociaż można uzyskać specjalne jądro dla sprzętowego modułu równoważenia obciążenia do obsługi drugiego serwera. Zasadniczo ruch internetowy (TCP) wymaga potwierdzenia każdego wysłanego / odebranego pakietu. Więc jeśli użytkownik wyśle ​​pakiet do twojej sieci, zostanie on zduplikowany zarówno do twojej sieci prod, jak i twojej sieci shadow. Serwery w każdej odpowiedzi sieciowej, a pakiet serwera prod jest przesyłany z powrotem do komputera, który odbiera potwierdzenie i wesoło kontynuuje rozmowę. Jeśli jednak upuścisz pakiet serwera w tle, nie zobaczy on potwierdzenia. Spróbuje więc wysłać go ponownie, a jednocześnie spowolni prędkość transmisji dla całej aktywności sieci (nazywa się to okienkowaniem). Będzie próbował ponownie wysłać, dopóki nie przekroczy limitu czasu, i sesja jest zburzona. Szczerze mówiąc, nie byłbyś nawet w stanie ukończyć uścisku dłoni, aby nawiązać połączenie.

Najbliżej tego można byłoby przekazać oryginalny pakiet synchronizacji na serwer w tle, a następnie ustawić domyślną bramę dla tych skrzynek jako jakąś nieistniejącą lokalizację. Wtedy za każdym razem, gdy użytkownik spróbuje nawiązać połączenie, uzyska prawdziwy serwer w Twojej sieci produkcyjnej, a przynajmniej wyślesz pakiet syn do sieci w tle. Cholera, teraz zastanawiam się, jak możesz sprawić, by to zadziałało :)

Mateusz
źródło
1

Mogłem zapytać o to @adrianco na spotkaniu Netflix.

Odpowiedzią było to, że napisali własne narzędzie, które jest w zasadzie ServletFilter (przepraszam, terminologia specyficzna dla języka Java), które odtwarza bieżące żądanie i wykonuje asynchroniczne wywołanie typu „odpal i zapomnij” na serwerze docelowym.

Korzyści to:

  • Wzorce ruchu w „rzeczywistym świecie” względem testowej („ciemnej”) infrastruktury
  • Nie trzeba nagrywać, a następnie odtwarzać

Wada:

  • Muszę mieć wątki / cykle procesora do zaoszczędzenia na twoich skrzynkach produkcyjnych
  • Opóźnienia w infrastrukturze testowej mogą tworzyć kopie zapasowe i wpływać na skrzynki produkcyjne
Nelz
źródło