Seberapa baik nginx dan memcached bekerja bersama?

14

Kami memiliki aplikasi web berbasis Java EE yang berjalan di cluster server aplikasi Glassfish . Lalu lintas yang masuk sebagian besar adalah permintaan TENANG untuk representasi berbasis XML dari sumber daya aplikasi kami, tapi mungkin 5% dari lalu lintas mungkin untuk representasi berbasis JSON atau XHTML / CSS.

Kami sekarang sedang menyelidiki solusi penyeimbangan beban untuk mendistribusikan lalu lintas masuk di seluruh instance Glassfish di cluster. Kami juga mencari cara untuk melepas cluster menggunakan memcached, peta hash terdistribusi dalam-memori yang kuncinya adalah nama sumber daya REST (mis. "/ User / bob", "/ group / jazzlovers") dan yang nilainya representasi XML yang sesuai.

Salah satu pendekatan yang kedengarannya menjanjikan adalah membunuh kedua burung dengan satu batu dan menggunakan server HTTP / nginx HTTP yang ringan dan cepat . Nginx akan menangani setiap permintaan masuk dengan terlebih dahulu mencari URI-nya di memcached untuk melihat apakah sudah ada representasi XML yang belum kadaluwarsa di sana. Jika tidak, nginx mengirimkan permintaan ke salah satu instance Glassfish. Modul nginx memcached dijelaskan dalam artikel singkat ini .

Apa kesan Anda secara keseluruhan dengan nginx dan memcached menggunakan cara ini, seberapa senang Anda dengan mereka? Sumber apa yang menurut Anda paling membantu untuk mempelajarinya? Jika Anda mencobanya dan tidak sesuai dengan tujuan Anda, mengapa tidak, dan apa yang Anda gunakan?

Catatan: inilah pertanyaan terkait . Sebelum saya tahu tentang ServerFault saya menanyakan ini di StackOverflow .

Sunting: Semua jawaban di sini sejauh ini cukup membantu, meskipun tidak ada pengalaman langsung. Jawaban ini akhirnya muncul di StackOverflow, dan itu cukup bullish pada pengaturan nginx / memcached.

Jim Ferrans
sumber
Keren, akan lakukan. Kami mungkin akan bereksperimen dengan itu di bulan depan atau lebih
Jim Ferrans

Jawaban:

6

Anda benar-benar harus menggunakan server cache di depan server web Anda. Saya merekomendasikan Varnish-cache. Kami menggunakannya di tempat kerja dengan situs web terbesar dan tersibuk di scandinavia. Kami mengganti 13 kotak Squid yang sangat dimuat dengan 1 kotak Varnish, dan 1 untuk cadangan.

Saya membuat tolok ukur aplikasi sederhana di situs web pribadi saya, dan itu berubah dari 9 permintaan per detik menjadi lebih dari 2000.

Anda memutuskan berapa lama hal itu disimpan dalam memori, Anda dapat melakukan sampai akhir waktu dan kemudian hanya mengirim permintaan pembersihan http ke server cache ketika data berubah.

Trausti Thor
sumber
1
Tapi cache nginx jelas lebih cepat dari Varnish .
VBart
4

Pendapat pribadi saya, dari pengalaman, adalah bahwa jika Anda menggunakan penyeimbang beban, Anda ingin membatasi kotak itu sepenuhnya untuk memuat fungsi penyeimbang. Memiliki penyeimbang beban Anda menyajikan konten, bahkan dari cache, menurunkan fungsionalitas penyeimbangan beban dalam situasi beban tinggi (lebih banyak koneksi tetap aktif lebih lama, mengurangi kapasitas dan throughput keseluruhan).

Saya menyarankan agar aplikasi itu sendiri melakukan pencarian dan menyajikan konten yang di-cache dan membiarkan load balancer melakukan tugasnya. Karena itu, nginx tidak sempurna dalam hal load balancing - ia hanya menawarkan algoritma round-robin yang sangat mendasar. Saya akan merekomendasikan haproxy sebagai gantinya. Jika Anda memerlukan layanan dekripsi SSL di depan, nginx berfungsi dengan baik di depan haproxy, menurut pengalaman saya.

Chris
sumber
1

Saya pikir Anda akan menemui jalan buntu jika Anda perlu hal-hal seperti load balancing, ketersediaan tinggi, dll.

Juga, pertimbangkan situasi seperti itu: ketika halaman authed pengguna terlihat berbeda, dengan fitur tambahan yang tersedia dan disesuaikan untuk masing-masing pengguna. URL sama untuk kenyamanan penautan dan sebagainya. Misalnya, situs di mana pengguna yang diotorisasi tidak perlu memasukkan namanya / captcha untuk komentar atau situs menampilkan nama pengguna Anda di atas, ketika Anda masuk (Seperti serverfault). Dalam kasus seperti itu, nginx tidak dapat digunakan, karena Anda tidak dapat membedakan pengguna yang diauthasi dengan yang tidak authed.

Jika Anda tidak memerlukan SSL, saya sarankan Anda menjalankan Varnish. Ini telah dirancang sebagai HTTP Accelerator, bukan sebagai server web atau proxy. Jika Anda memerlukan SSL, jalankan nginx di atas sebagai akselerator SSL dan pernis sebagai akselerator HTTP biasa, karena Varnish tidak dapat menangani SSL.

Saya pikir pilihan server caching adalah khusus aplikasi dan Anda tidak dapat membuat komentar umum tentang hal itu tanpa analisis aplikasi yang mendalam.

Kristaps
sumber
1

pilihan saya adalah haproxy. Proksi balik sangat kecil dan sangat cepat, tetapi bukan proxy cache! Saya menggunakan untuk sistem cache saya "Squid Web Proxy"

CACHE /squid/ -> Load-balancing /Haproxy/ -> WEB I /lighttpd/
                                          -> WEB II /lighttpd/
                                          -> WEB III /lighttpd/

Ini berfungsi sempurna untuk sistem web saya

Yordan
sumber