Skala HAProxy untuk lebih dari 64 ribu soket web

8

Kami mencoba merancang arsitektur yang dapat menangani lebih dari 64 ribu soket web.

Kami pertama kali mencoba dengan Amazon ELB, tetapi desainnya tidak memungkinkan lonjakan traffic dan websocket yang tidak terduga. (Mode TCP mati secara tiba-tiba di websockets)

Dengan HAProxy, batasan itu tidak berlaku, tetapi kami akan dibatasi hingga ~ 64k soket web yang dikelola antara HA dan server back-end.

Berbagai solusi yang muncul di benak:

  • Beberapa instance HAProxy, memuat keseimbangan dengan DNS (Route53 memiliki opsi berbobot)
  • Dua instance HAProxy dengan Keepalived, beberapa alamat IP internal (tidak yakin apakah itu bisa dilakukan)

Apakah ada cara yang lebih baik untuk melakukan ini?

Bastien974
sumber
1
Mengapa batas 64k? Apakah ini sumber porta? Jika demikian, Anda dapat menambahkan lebih banyak 'server' ke backend yang terikat ke port yang berbeda ...
Kyle Brandt
@ Bastien974, cara paling mudah, adalah menggunakan sumber ip differents untuk backend, untuk skala ke koneksi 130K, saya menggunakan dua ips dan opsi tw_reuse sysctl
c4f4t0r

Jawaban:

7

Jika batas 64k Anda disebabkan oleh porta sumber, Anda dapat melakukan sesuatu seperti yang berikut ini (sedikit peretasan, tapi itu yang saat ini kami lakukan di SE untuk soket web (kami memiliki sekitar 0,5 juta bersamaan dengan HAProxy):

server ny-web01-1 10.0.0.1:8081 check
server ny-web01-2 10.0.0.1:8082 check
server ny-web01-3 10.0.0.1:8083 check

Juga beberapa contoh dapat dilakukan dengan terus hidup. Lakukan saja sesuatu seperti round robin DNS melalui beberapa IP. Pastikan saja bahwa IP selalu dijemput oleh penyeimbang beban aktif karena DNS itu sendiri tidak akan memberi Anda penyeimbangan beban (ada juga lebih banyak opsi di sini, yang ini sederhana).

Kyle Brandt
sumber
1
Jika saya mengerti dengan benar, karena koneksi TCP ditentukan oleh srcIP: srcPORT / destIP: destPORT, jika saya dapat mendengarkan di server back-end pada banyak port, itu berarti antara HAProxy dan server back-end saya akan dapat untuk memiliki beberapa koneksi dari 127.0.0.1:12345 yang sama -> 10.0.0.1:8081, 127.0.0.1:12345 -> 10.0.0.1:8082, dll? Apakah ini benar-benar berfungsi?
Bastien974
@ Bastien974: Anda mengerti benar - itu berfungsi.
Kyle Brandt
@ Bastien974: Anda dapat menggunakan source 0.0.0.0 usesrc clientkonfigurasi backend haproxy untuk transparansi sumber tproxy. Dengan cara ini srcIP: srcPORT akan menjadi IP / port klien aktual (bukan IP internal mesin haproxy) - rapi untuk logging juga.
wqw
0

Anda dapat mengatur beberapa sistem HAproxy yang berbagi IP yang sama menggunakan Anycast dan BGP atau protokol perutean perbatasan lainnya. Dengan cara ini semua sistem HAproxy aktif; jika ada yang turun Anda berhenti mengiklankan rute BGP pada sistem itu dan itu akan dalam ~ 30 detik berhenti menerima lalu lintas; yang akan didistribusikan kembali ke sistem lain yang tersedia yang mengiklankan rentang yang sama.

Misalnya, periksa url ini tentang cara mengatur tata letak tersebut

Hrvoje Špoljar
sumber
Saya tidak yakin ini akan bekerja di dalam infrastruktur AWS VPC karena saya perlu menggunakan IP Elastis yang terkait dengan setiap contoh. Solusi Anda akan sangat dekat dengan DNS, karena Amazon Route53 menawarkan opsi untuk menambahkan pemeriksaan kesehatan. Kekhawatiran saya adalah bahwa bahkan dengan TTL rendah, kami tidak dapat menunggu propagasi ke negara lain (kami memiliki klien di seluruh dunia) untuk berhenti mengirimkan lalu lintas ke instance HA "mati".
Bastien974