mengapa tidak ada contoh penyeimbang beban perangkat lunak skalabel yang dapat diukur secara horizontal ssl?

9

Saya punya banyak pertanyaan sehubungan dengan ssl, sesi lokal, dan load balancing yang tampaknya saling berhubungan, jadi saya minta maaf sebelumnya untuk panjang pertanyaan ini.

Saya memiliki situs web yang menggunakan sesi berbasis file. Sifat situs ini adalah sebagian besar adalah http, tetapi beberapa bagian adalah ssl. Saat ini, karena sesi berbasis file, perlu untuk setiap permintaan ssl untuk menekan server yang sama dengan permintaan http sebelumnya.

Karena keterbatasan waktu, saya ingin melakukan hal termudah untuk memuat keseimbangan peningkatan traffic http dan ssl.

Tampaknya ada 2 opsi untuk algoritma balancing lengket:

  • berbasis ip
  • berbasis cookie

Solusi berbasis ip mungkin akan berfungsi, tetapi algoritma hashing akan berpotensi mengubah server yang dikunjungi pengguna saat server turun atau ditambahkan yang tidak diinginkan dengan pengaturan sesi berbasis file saat ini. Saya juga mengira bahwa secara teknis memungkinkan bagi pengguna untuk secara sah mengubah ips saat menjelajah situs web.

Algoritma berbasis cookie tampaknya lebih baik, tetapi ketidakmampuan untuk memeriksa cookie ketika dienkripsi oleh ssl tampaknya menghadirkan masalah sendiri.

Saya telah googling untuk contoh tentang cara memuat keseimbangan ssl, dan saya tidak bisa menemukan contoh eksplisit pengaturan yang dapat melakukan penyeimbangan beban berbasis cookie DAN yang dapat menangani peningkatan beban ssl dengan menambahkan decoder ssl lain.

Sebagian besar contoh eksplisit yang saya lihat memiliki decoder ssl (biasanya perangkat keras, apache_mod_ssl, atau nginx) duduk di antara klien browser dan penyeimbang beban. Contoh-contoh biasanya memiliki sesuatu seperti ini (dimodifikasi dari http://haproxy.1wt.eu/download/1.3/doc/architecture.txt ):

      192.168.1.1 192.168.1.11-192.168.1.14
 ------- + ----------- + ----- + ----- + ----- +
        | | | | |       
     + - + - + + - + - + + - + - + + - + - + - - +    
     | LB1 | | A | | B | | C | | D |    
     + ----- + + --- + + --- + + --- + + --- +    
     apache 4 server web murah
     mod_ssl
     haproxy 

Bagian decoding ssl dalam contoh di atas tampaknya menjadi hambatan potensial yang tidak dapat diskalakan secara horizontal.

Saya telah melihat haproxy, dan tampaknya memiliki opsi 'mode tcp' yang memungkinkan sesuatu seperti ini, yang memungkinkan Anda untuk memiliki beberapa decoder ssl:

              haproxy
                 |
            -------------
            | |
ssl-decoder-1 ssl-decoder2
            | |
        -------------------
        | | |  
      web1 web2 web3

Namun, dalam pengaturan seperti itu, tampaknya Anda akan kehilangan ip klien karena haproxy tidak men-decoding ssl: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -untuk

Saya juga telah melihat nginx, dan saya juga tidak melihat contoh eksplisit dari ssl-decoder yang dapat diskalakan secara horizontal. Tampaknya ada banyak contoh orang yang memiliki nginx sebagai hambatan potensial. Dan setidaknya tautan ini tampaknya menunjukkan bahwa nginx bahkan tidak memiliki opsi pengaturan seperti-haproxy di mana Anda akan kehilangan ip dengan mengatakan bahwa nginx "tidak mendukung melewatkan koneksi TCP secara transparan ke backend" Bagaimana cara melewati Apache Lalu lintas SSL melalui proxy nginx? .

Pertanyaan:

  • Mengapa sepertinya tidak ada lebih banyak contoh pengaturan yang menambahkan lebih banyak decoder ssl untuk menangani peningkatan lalu lintas?
  • Apakah karena langkah decoding ssl hanya merupakan hambatan teoretis, dan secara praktis, satu decoder pada dasarnya akan cukup kecuali untuk situs dengan lalu lintas konyol?
  • Solusi lain yang mungkin terlintas dalam pikiran adalah mungkin siapa pun dengan kebutuhan ssl yang meningkat seperti itu juga memiliki sesi store yang terpusat, jadi tidak masalah server web mana yang dikunjungi klien pada permintaan berurutan. Kemudian Anda dapat mengaktifkan mod_ssl atau yang setara di setiap server web.
  • Solusi haproxy yang dikutip di atas tampaknya bekerja (selain masalah IP klien), tetapi apakah ada yang menemukan solusi penyeimbang beban perangkat lunak berbasis sticky cookie yang akan bekerja dengan meningkatkan jumlah decoder sambil menjaga IP klien, atau mungkin yang secara teknis tidak mungkin (karena Anda harus men-decode permintaan untuk mendapatkan IP klien, dalam hal ini, kami memiliki hambatan dekoder).

Dengan asumsi bahwa semua yang saya katakan adalah benar, ini tampaknya menjadi pilihan saya:

  • menggunakan ip hashing (buruk untuk pengguna yang berpotensi mengubah ips, dan untuk skenario skenario penambahan dan pelepasan server)
  • gunakan nginx atau mod_ssl sebagai program pertama menyentuh permintaan ssl, ini akan menjadi potensi ssl decoding bottleneck
  • gunakan haproxy sebagai program pertama menyentuh permintaan ssl, mendapatkan skalabilitas ssl horizontal, tetapi hidup tanpa ips yang dicatat di tingkat server web untuk permintaan ssl (mungkin sementara ok)
  • dalam jangka panjang, bergerak menuju toko sesi seluler atau terpusat, membuat sesi lengket tidak diperlukan
di mana
sumber
Saya pikir womble pada dasarnya benar bahwa hal yang paling sederhana adalah pindah ke toko sesi terpusat. Mungkin saya akan menandai jawabannya sebagai benar, meskipun saya masih tertarik pada pemikiran acak lainnya.
wherestheph

Jawaban:

8

"Hal paling sederhana", dalam semua keseriusan, adalah pindah ke toko sesi terpusat. Anda harus mengatur semua pipa ledeng ini dengan load balancers, haproxy, SSL, dan yang lainnya, ketika setiap bit kode penanganan sesi yang pernah saya lihat membuatnya hampir sepele untuk menyambungkan mesin penyimpanan yang berbeda, jadi sedikit kode dan kompleksitas ekstra sangat, sangat sedikit menyelesaikan semua masalah Anda.

womble
sumber
8

womble benar tentang sesi store bersama yang membuat segalanya lebih mudah di sekitar. Selain jawabannya, saya dapat sedikit memperluas bagian penyeimbangan beban dari pertanyaan:

Mengapa sepertinya tidak ada lebih banyak contoh pengaturan yang menambahkan lebih banyak decoder ssl untuk menangani peningkatan lalu lintas?

PC multi-core modern dapat melakukan beberapa ribu transaksi SSL per detik. Dan jika itu menjadi hambatan maka alat khusus dari F5 , Citrix, Cisco atau sejenisnya bisa lebih cepat. Jadi, sebagian besar situs tidak pernah melebihi solusi SSL & load balancing satu perangkat yang baik.

Dengan asumsi bahwa semua yang saya katakan adalah benar, ini tampaknya menjadi pilihan saya:

Ada opsi untuk mengubah dekripsi SSL secara horizontal, jika Anda memerlukannya.

Pendekatan umum adalah menggunakan DNS Round Robin untuk pasangan akselerator SSL yang sangat tersedia, yaitu menerbitkan beberapa alamat IP untuk domain, setiap alamat IP menunjuk ke sepasang akselerator SSL.

Dalam hal ini Anda bisa khawatir tentang waktu DNS TTL yang keluar di tengah sesi pengguna, menabrak pengguna ke server aplikasi lain. Itu seharusnya tidak menjadi kejadian umum, tetapi itu bisa terjadi. Toko sesi bersama adalah solusi umum, tetapi dapat ditangani dengan cara lain.

Sebagai salah satu contoh, Anda dapat memisahkan dekripsi SSL dari penyeimbang server aplikasi. Penanganan SSL lebih intensif dari CPU daripada load balancing dasar, sehingga penyeimbang beban tunggal harus dapat menjenuhkan beberapa akselerator SSL. Seperti ini:

Internet --> DNS round robin to multiple SSL accelerators --> plain HTTP to a single HTTP load balancer --> plain HTTP to multiple application servers

Seperti yang disebutkan di awal, toko sesi bersama menyederhanakan banyak hal, dan hampir pasti merupakan solusi jangka panjang yang lebih baik daripada menempatkan banyak kompleksitas ke lapisan SSL / load balancing Anda.

Jesper M
sumber
+1 untuk DNS round robin. Sebagai contoh, inilah yang digunakan penyeimbang beban elastis AWS.
Alex
3

Sangat menyenangkan untuk menjawab pertanyaan lama 2 tahun seperti ini ketika produk telah berevolusi. Saat ini haproxy mendukung protokol PROXY, yang memungkinkannya meneruskan IP klien ke hop berikutnya bahkan dalam mode TCP murni. Ini juga mendukung SSL asli, serta kekakuan SSL jika Anda ingin menggunakannya sebagai lapisan pertama di depan ladang SSL (mungkin dibuat dari server haproxy). Jadi sepertinya permintaan Anda sedikit lebih awal dan implementasi telah menyusul :-)

Willy Tarreau
sumber
1

Saya setuju dengan womble dan Jesper di sini. Rute termudah / terbaik adalah memperbaiki kode. Tentu saja sebagai sysadmin kita sering tidak memiliki opsi itu, tetapi bahkan dalam kasus itu ada cukup trik yang dapat Anda tarik untuk mendapatkan perangkat keras modern yang relatif murah untuk skala cukup jauh meskipun tidak benar-benar horizontal.

Saya hanya ingin memposting komentar di mana Anda khawatir kehilangan ip-klien. Dalam salah satu solusi L7 / proxy utama Anda dapat memasukkan header X-Forwarded-For (atau apa pun yang Anda inginkan) dalam permintaan. Kemudian pada server web backend menerima permintaan Anda dapat mengubah format logfile untuk mencatat nilai itu di ruang yang sama dalam file yang digunakan untuk login ip klien layer3. Dengan cara itu, setiap perangkat lunak parsing log tidak melihat perbedaannya (begitu juga Anda saat tailing).

Ada pengorbanan untuk semuanya dan kami belum cukup mendengar tentang pengaturan Anda untuk diketahui, tetapi dengan trio ha-proxy, nginx, dan pernis di luar sana yang salah, mungkin merupakan ide bagus untuk memindahkan penyeimbang beban Anda ke alat proxy-layer. Itu akan menyelesaikan masalah ssl Anda dan memberi Anda sejumlah opsi baru seperti caching, pengalihan konten, dan manipulasi header.

cagenut
sumber
1

Beberapa pemikiran acak;)

Pertama, tembak orang yang memutuskan untuk menggunakan data sesi berbasis file. Tidak ada cara membaca / menulis data dari sistem file akan lebih cepat daripada hanya kembali ke sumber untuk menarik data yang Anda butuhkan. Ini tentang cara terburuk untuk melakukannya.

Saya pribadi belum pernah melihat situasi di mana menyimpan data dalam suatu sesi lebih baik daripada hanya menariknya langsung dari database sebagaimana diperlukan. Yang mengatakan, saya telah melihat di mana menggunakan memcache atau strategi caching serupa dapat membantu skala situs untuk jutaan pengguna, tapi itu bahkan tidak di ball park yang sama dengan menggunakan sesi.

Kedua, Anda baru saja menemukan alasan nomor satu untuk tidak menggunakan sesi sama sekali: load balancing. FYI - Sticky bukan berarti Terjebak. Bahkan dengan sesi Sticky dihidupkan Anda menjalankan kemungkinan yang sangat nyata dari pengguna yang pindah ke server lain di tengah menggunakan aplikasi Anda. Ini akan terjadi pada waktu yang paling tidak tepat. Sticky hanya berarti penyeimbang beban akan mencoba mendorong pengguna kembali ke server mereka mulai, tetapi itu sama sekali bukan jaminan.

Poin ini biasanya mengarahkan orang untuk menyimpan sesi kembali ke dalam basis data ... Yang saya yakini adalah kegagalan total . Agar sesi berfungsi, harus dimuat dan ditulis pada setiap permintaan halaman. Ketika disimpan dalam database (diperlukan untuk memuat server seimbang) ini membutuhkan dua permintaan server: yang pertama untuk mendapatkan data, yang kedua untuk menulis pembaruan apa pun.

Bagian yang gagal adalah bahwa orang biasanya menggunakan sesi sehingga mereka tidak harus kembali ke database untuk menarik hal-hal seperti nama pengguna ... Tetapi jika halaman harus meminta database untuk memuat sesi maka ... yah, Anda harus dapat melihat masalah logika di sini.

Hanya saja lebih buruk dengan sesi ... karena mereka prosesor halaman harus menulis data sesi kembali ke database pada akhir siklus hidup .. jika ada sesuatu yang berubah. Yang berarti alih-alih satu kueri untuk menarik nama pengguna itu, Anda berakhir dengan dua. Untuk setiap pemuatan satu halaman. Selanjutnya itu berarti membuat serial dan deserializing data yang memiliki dampak kinerja itu sendiri.

Maksud saya adalah: sesi itu jahat dan Anda biasanya lebih baik tanpanya. Situs dengan lalu lintas rendah yang hanya berjalan di satu server web tidak memerlukan peningkatan kinerja yang dapat terjadi; dan situs dengan lalu lintas tinggi yang berjalan di web farm terbatas dalam penskalaan karenanya.

Bukan saya
sumber
0

Daripada menggunakan Haproxy di bagian depan, Anda dapat menggunakan round robin DNS untuk melakukan penyeimbangan kasar antara beberapa dekoder SSL lalu meneruskannya ke haproxy untuk penyeimbangan beban yang tepat.

JamesRyan
sumber