Soru Karşılaştırma yapmak için TCP trafiğini bir veya daha fazla uzak sunucuya kopyalamak nasıl?


Altyapı: Datacenter'daki sunucular, OS - Debian Squeeze, Web sunucusu - Apache 2.2.16


Durum:

Canlı sunucu her gün kuzenlerimiz tarafından kullanılıyor, bu da ayarlamaları ve geliştirmeleri test etmeyi imkansız kılıyor. Bu nedenle, canlı sunucudaki gelen HTTP trafiğini gerçek zamanlı olarak bir veya daha fazla uzak sunucuya kopyalamak istiyoruz. Trafik, yerel Web sunucusuna (bu durumda Apache) VE uzak sunucuya / sunuculara aktarılmalıdır. Böylece, konfigürasyonları ayarlayabilir ve kıyaslama yapmak ve mevcut canlı sunucu ile karşılaştırmak için uzak sunucularda farklı / güncellenmiş kodları kullanabiliriz. Şu anda web sunucusu yakl. Müşteri yapısı nedeniyle 80 ve 443'ün yanı sıra 60 ek bağlantı noktası.


Soru: Bir veya birden çok uzak sunucuya bu çoğaltma nasıl uygulanabilir?

Şimdiden denedik:

Burada seçenekler tükeniyor.

IPTABLES kullanılırken TEE işlevinin "yerel ağdaki sunucusunun" uygulanmasını devre dışı bırakmak için bir yöntem var mı?

Hedefimiz IPTABLES veya Rotaların farklı kullanımı ile sağlanabilir mi?

Bu amaç için test edilmiş ve bu özel durumlar için çalışan farklı bir araç biliyor musunuz?

Tee-proxy için farklı bir kaynak var mı (bizim gereksinimlerimizi mükemmel şekilde karşılayacaktır, AFAIK)?


Yanıtlarınız için şimdiden teşekkür ederiz.

----------

düzenleme: 05.02.2014

İşte ihtiyacımız olan şekilde işlev gören python betiği:

import socket  
import SimpleHTTPServer  
import SocketServer  
import sys, thread, time  

def main(config, errorlog):
    sys.stderr = file(errorlog, 'a')

    for settings in parse(config):
        thread.start_new_thread(server, settings)

    while True:
        time.sleep(60)

def parse(configline):
    settings = list()
    for line in file(configline):
        parts = line.split()
        settings.append((int(parts[0]), int(parts[1]), parts[2], int(parts[3])))
    return settings

def server(*settings):
    try:
        dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        dock_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        dock_socket.bind(('', settings[0]))

        dock_socket.listen(5)

        while True:
            client_socket = dock_socket.accept()[0]

            client_data = client_socket.recv(1024)
            sys.stderr.write("[OK] Data received:\n %s \n" % client_data)

            print "Forward data to local port: %s" % (settings[1])
            local_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            local_socket.connect(('', settings[1]))
            local_socket.sendall(client_data)

            print "Get response from local socket"
            client_response = local_socket.recv(1024)
            local_socket.close()

            print "Send response to client"
            client_socket.sendall(client_response)
            print "Close client socket"
            client_socket.close()

            print "Forward data to remote server: %s:%s" % (settings[2],settings[3])
            remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            remote_socket.connect((settings[2], settings[3]))
            remote_socket.sendall(client_data)       

            print "Close remote sockets"
            remote_socket.close()
    except:
        print "[ERROR]: ",
        print sys.exc_info()
        raise

if __name__ == '__main__':
    main('multiforwarder.config', 'error.log')

Bu komut dosyasını kullanacak yorumlar:
Bu betik, bir dizi yapılandırılmış yerel bağlantı noktasını başka bir yerel ve uzak soket sunucusuna iletir.

Yapılandırma:
Aşağıdaki gibi içerikli config dosyası port-forward.config satırlarına ekleyin:

Hata mesajları 'error.log' dosyasında saklanır.

Komut dosyası yapılandırma dosyasının parametrelerini ayırır:
Her bir yapılandırma çizgisini boşluklarla böl
0: dinlemek için yerel bağlantı noktası
1: yerel portu iletmek
2: hedef sunucunun uzak ip adresi
3: hedef sunucunun uzak bağlantı noktası
ve dönüş ayarları


26
2018-01-29 15:02


Menşei


Tüm trafik HTTP mi? - longneck
evet, trafiğin tamamı HTTP'dir. - Sise
Btw. teeproxy burada mevcuttur: github.com/chrislusf/teeproxy - Tombart
Bir başka olasılık: github.com/ebowman/splitter Scala / sayfa Yardım tabanlı. - Rich K.


Cevaplar:


Bu imkansız. TCP durum protokolüdür. Kullanıcı uç bilgisayarı, bağlantının her adımında yer alır ve iletişim kurmaya çalışan iki ayrı sunucuya asla yanıt vermez. Tek yapabildiğiniz web sunucusundaki veya bir proxy'deki tüm http isteklerini toplamak ve tekrar oynatmak. Ancak bu, canlı bir sunucunun tam eşzamanlılığını veya trafik koşullarını vermeyecektir.


10
2018-01-29 15:19



TCP'yi çoğaltmak imkansız-- Buna katılıyorum. Katman 7 trafiğini çoğaltmak değil. İstekleri istemciden yakalayabilir ve diğer sunuculara geri çalabilirsiniz. TCP oturumu oynatma başına basit 1 istek oldukça kolay olmalı. Kalıcı bağlantılar, müşterinin ek taleplerini nasıl karşıladığınıza dair bir düşünce gerektirecektir. - Evan Anderson
@Kazimieras Aliulis: iki ayrı sunucuyla iletişim kurmak için gerekli değildir. İstemci birincil sunucu = canlı sunucu ile iletişim kuruyor. Canlı sunucu, istemci isteklerini işliyor ve müşteriye cevap veriyor. İstemciyi işleme ve yanıtlamanın yanı sıra birincil sunucu, istekleri ikinci sunucuya = test sunucusuna kopyalar. ikinci sunucudan birincil sunucuya verilen yanıtlar birincil sunucuda atılacak / yoksayılacak ve istemciye iletilmeyecektir. - Sise
@Evan Anderson: HTTP seviyesinde çoğaltma bizim ilk fikrimizdi, ancak örn. apache proxy'si veya benzeri araçlar veya modüller, istekleri aynı anda yerel olarak işlemeye ve uzak bir ana bilgisayara kopyalamaya izin vermez. Başka bir fikriniz varsa, lütfen öneri edin! :) anında karşılaştırma sonuçları almak için kayıt ve tekrar oynatmayı tercih ediyoruz. - Sise
@Sise: trafiği iki sunucuya geçiren kendi http proxy'nizi yazmayı deneyebilirsiniz. Python Twisted framework ile yapmak oldukça kolay olmalı twistedmatrix.com. - Kazimieras Aliulis
@Kazimieras Aliulis: Bu kesinlikle bir alternatif! hiç duymadım. ama kontrol etmek, amacımıza tam olarak uyduğunu gösteriyor. Python'u daha önce düşünmedik, ancak şu anda Twisted framework ve genel python ile olasılıklara bakıyoruz. Başarırsak rapor edeceğim! - Sise


Tanımladığınız şeyden, GOR ihtiyaçlarınızı karşılayacak gibi görünüyor. https://github.com/buger/gor/ "HTTP trafiği gerçek zamanlı olarak yeniden oynatılıyor. Üretimden aşamalı ve dev ortamlara kadar trafiği yeniden izleyin." ?


20
2017-09-03 13:43



Bu kesinlikle aradığım şey, çok teşekkürler, bana tam olarak bunu yazmamı sağladım, Go! :-) - chmac


Teeproxy trafiği çoğaltmak için kullanılabilir. Kullanımı gerçekten çok basit:

./teeproxy -l :80 -a localhost:9000 -b localhost:9001
  • a üretim sunucusu
  • b test sunucusu

Bir HAproxy koyduğunuzda (ile roundrobin) web sunucunuzdan önce trafiğinizin% 50'sini test sitesine kolayca yönlendirebilirsiniz:

         /------------------> production
HAproxy /                 ^
        \                /
         \---- teeproxy -.....> test (responses ignored)

6
2018-02-16 08:44





Durum bilgisi olan bir iletişim kuralı olan TCP, KazimierasAliulis'in işaret ettiği gibi, başka bir bilgisayardaki paketlerin kopyalarını basitçe kopyalamak için uygun değildir.

Paketleri TCP sonlandırma katmanında toplama ve bunları yeni bir TCP akışı olarak aktarma makul. teksir aracı En iyi bahsinize benziyorsunuz. TCP durum makinesinin düzgün çalışmasına izin veren bir TCP proxy'si olarak çalışır. Test makinelerinizden gelen cevaplar atılacak. Tam olarak istediğin için faturaya uyuyor gibi geliyor.

Tekzavantaj aracını neden kabul edilemez olarak yazdığın açık değil. Sadece tek bir bağlantı noktasında dinlediğinden, aletin birden fazla örneğini çalıştırmanız gerekecek, ancak muhtemelen bu farklı dinleme bağlantı noktalarının her birini arka uç sistemdeki farklı bağlantı noktalarına aktarmak istiyorsunuz. Değilse, tüm dinleme bağlantı noktalarını tek tek kopyalama aracının tek bir dinleme kopyasına yönlendirmek için iptables DNAT kullanabilirsiniz.

Test ettiğiniz uygulamalar çok basit olmadıkça, zamanlama ve dahili uygulama durumuyla ilgili bu test metodolojisinde sorunlar yaşayacağınızı umuyorum. Ne yapmak istiyorsan aldatıcı bir şekilde basit sesler-- Bir sürü kenar vakası bulacağını umuyorum.


4
2018-01-29 17:52



evet, tamamen haklısınız, agnoster teksir aracı çok port durumu dışında bizim gereksinimlerimize uyacaktır. Ayrıca test makinesinin cevaplarının atılması da dolu dolu. Gerçek / canlı durumu mümkün olduğunca doğru bir şekilde simüle etme hedefimize ulaşmak için, canlı sunucudaki tüm bağlantı noktalarını test makinesinde tek bir bağlantı noktasına paketleyemeyiz. İstemci cihazları farklı müşterilere bölmek için farklı portlar kullanılır. Böylece, bu teksir aracının 60-70 oturumunu açmalıyız. Hayal edebileceğiniz gibi bu çok pratik değil. - Sise
@Sise - Bilgisayarlar sıkıcı şeyler yapmakta iyidir. Apache konfigürasyonlarınızı ayrıştırmak için bir komut dosyası yazabileceğinizi ve kopya aracının 60 - 70 örneğini çalıştırmak için gerekli komut satırlarını yazabileceğinizi düşünürdüm. Çoğaltıcı aracın çok yoğun bir kaynak olduğunu hayal edemiyorum, ancak bu olsa bile, bu 60 - 70 örneği başka bir makinede çalıştırabilir ve oradaki trafiği elde etmek için bazı ağ hileleri yapabilirsiniz. Benim için, en azından, bu tamamen pratik ve bununla başa çıkmak için oldukça basit bir yol gibi görünüyor. - Evan Anderson


Benzer bir şey yapmaya çalışıyorum, ancak eğer bir sunucuda yükü simüle etmeye çalışıyorsanız, bir yük testi çerçevesi gibi bir şeye bakacağım. Geçmişte locust.io kullandım ve bir sunucudaki bir yükü simüle etmek için çok iyi çalıştı. Bu, çok sayıda istemciyi simüle etmenize izin vermeli ve sunucunun başka bir sunucuya yöneltme ağrılı sürecinden geçmek zorunda kalmadan sunucunun yapılandırmasıyla oynamanıza izin vermelisiniz.


1
2017-07-30 21:37





"Canlı sunucudaki gelen HTTP trafiğini gerçek zamanlı olarak bir veya daha fazla uzak sunucuya çoğaltmak istiyoruz" ifadesine göre, yukarıda bahsi geçmemiş olan, bağlandığı anahtara bir ayna bağlantı noktası konfigüre eden bir yol var.

Cisco Catalyst anahtarları durumunda, buna SPAN denir (daha fazla bilgi İşte). Bir Cisco ortamında, farklı bir anahtarda yansıtılmış bağlantı noktasına sahip olabilirsiniz.

Fakat bunun amacı, trafik analizi için tek yönlü olacaktır - yukarıdaki birinci paragrafta alıntılanan metinde anahtar kelime: gelen. Limanın herhangi bir dönüş trafiğine izin vereceğini sanmıyorum ve eğer yapmışsa, çift dönüşlü trafik ile nasıl başa çıkardınız? Bu muhtemelen ağınızla hasara yol açacaktır.

Yani ... sadece listene bir olasılık eklemek istedim, ama uyarıyla tek yönlü bir trafik olacak. Belki de bu ayna bağlantı noktasına bir hub yerleştirebilir ve başlatılmış oturumları yanıtlayan ve yanıt veren bazı yerel istemci simülatörlerinin kopyaladığı yinelenen sunucu yanıtlarına sahip olabilirsiniz, ancak daha sonra yinelenen sunucunuza gelen trafiği çoğaltabilirsiniz. istemek.


0
2018-01-29 16:45



Bunu düşündük, SPAN kullanmanın alternatifini okudum. Ancak, sunucular bir üçüncü taraf sağlayıcının veri merkezinde yer aldığından, donanım değişiklikleri söz konusu olduğunda sınırlı olasılıklara sahibiz. Doğrudan ikinci bir bağlantıda 2 sunucu bağlamayı istedim. Bu işlem sadece bu 2 sunucu için yerel bir ağ ile birleştiğinde IPTABLES'i TEE ile kullanmamı sağladı. Ancak bu alternatife gitmek için, sunucuların harici IP'lerini değiştirmemiz gerekirdi, bu da bir NoGo'dur. Çünkü istemci aygıtları ayarlanmış IP'ye bağlanacak şekilde yapılandırılmıştır. - Sise


Aynı zamanda Node.js ile benzer bir amaç için bir ters proxy / yük dengeleyici yazdım (sadece eğlence için değil, şu an üretim için hazır).

https://github.com/losnir/ampel

Bu çok görüşlü ve şu anda destekler:

  • GET Yuvarlak robin seçimi (1: 1)
  • POST İstek bölme kullanımı. "Ana" ve "gölge" kavramları yoktur - cevap veren ilk arka taraf müşteri isteğine hizmet edecek olan ve daha sonra diğer tüm cevaplar atılacak.

Birisi yararlı bulursa, daha esnek olmak için onu geliştirebilirim.


0
2017-07-23 10:06



Node.js, çok yüksek performans gerektiren bir uygulama için çok garip bir dil seçeneği. Bunun hiç üretime hazır olacağından emin değilim. - Michael Hampton♦
Kesinlikle haklısın. Bu, son derece performanslı olmak için tasarlanmamıştı - sadece yazması kolay (benim için). Gerekli yüke bağlı olduğunu düşünüyorum. Düşük uçlu bir makinede (2 çekirdekli) 1000rps üzerinde biraz başardım. - losnir


Çinli bir şirketten bir adam tarafından yaratılmış bir araç var ve belki de ihtiyacınız olan şey: https://github.com/session-replay-tools/tcpcopy


-1
2017-10-16 09:12



Merhaba ve serverfault'a hoş geldiniz. Lütfen daha ayrıntılı bir cevap verebilir misiniz? Program tam olarak ne yapar? C dilinde yazılmış mı? - bgtvfr