Arsitektur load balancing server, Bagian 1: Teknik load balancing tingkat transportasi

Ladang server mencapai skalabilitas tinggi dan ketersediaan tinggi melalui penyeimbangan beban server, teknik yang membuat kumpulan server tampak bagi klien sebagai satu server. Dalam artikel dua bagian ini, Gregor Roth membahas arsitektur load balancing server, dengan fokus pada solusi open source. Bagian 1 mencakup dasar-dasar penyeimbangan beban server dan membahas pro dan kontra penyeimbangan beban server tingkat transportasi. Bagian 2 mencakup arsitektur load balancing server tingkat aplikasi, yang membahas beberapa batasan arsitektur yang dibahas di Bagian 1.

Hambatan masuk bagi banyak perusahaan Internet rendah. Siapapun dengan ide yang bagus dapat mengembangkan aplikasi kecil, membeli nama domain, dan mengatur beberapa server berbasis PC untuk menangani lalu lintas masuk. Investasi awal kecil, jadi risiko awal minimal. Tetapi infrastruktur berbiaya rendah yang berhasil dapat menjadi masalah serius dengan cepat. Satu server yang menangani semua permintaan yang masuk mungkin tidak memiliki kapasitas untuk menangani volume lalu lintas yang tinggi setelah bisnis menjadi populer. Dalam situasi seperti ini, perusahaan sering kali mulai meningkatkan : mereka meningkatkan infrastruktur yang ada dengan membeli kotak yang lebih besar dengan lebih banyak prosesor atau menambahkan lebih banyak memori untuk menjalankan aplikasi.

Namun, peningkatan skala hanyalah solusi jangka pendek. Dan ini adalah pendekatan yang terbatas karena biaya peningkatan secara tidak proporsional relatif tinggi terhadap peningkatan kemampuan server. Karena alasan ini, sebagian besar perusahaan Internet yang sukses mengikuti pendekatan skala keluar . Komponen aplikasi diproses sebagai beberapa contoh di server farm, yang didasarkan pada perangkat keras dan sistem operasi berbiaya rendah. Saat lalu lintas meningkat, server ditambahkan.

Pendekatan server-farm memiliki tuntutan uniknya sendiri. Di sisi perangkat lunak, Anda harus mendesain aplikasi agar dapat dijalankan sebagai beberapa contoh di server yang berbeda. Anda melakukan ini dengan membagi aplikasi menjadi komponen yang lebih kecil yang dapat diterapkan secara independen. Ini sepele jika komponen aplikasi tidak memiliki kewarganegaraan. Karena komponen tidak mempertahankan status transaksional apa pun, salah satu dari mereka dapat menangani permintaan yang sama secara setara. Jika lebih banyak daya pemrosesan diperlukan, Anda tinggal menambahkan lebih banyak server dan menginstal komponen aplikasi.

Masalah yang lebih menantang muncul saat komponen aplikasi stateful. Misalnya, jika komponen aplikasi menyimpan data keranjang belanja, permintaan masuk harus diarahkan ke instance komponen aplikasi yang menyimpan data keranjang belanja pemohon. Nanti di artikel ini, saya akan membahas cara menangani data sesi aplikasi seperti itu di lingkungan terdistribusi. Namun, untuk mengurangi kompleksitas, sebagian besar sistem aplikasi berbasis Internet yang berhasil mencoba menghindari komponen aplikasi berstatus jika memungkinkan.

Di sisi infrastruktur, beban pemrosesan harus didistribusikan di antara grup server. Ini dikenal sebagai load balancing server. Teknologi load balancing juga berkaitan dengan domain lain, misalnya menyebarkan pekerjaan di antara komponen seperti tautan jaringan, CPU, atau hard drive. Artikel ini berfokus pada load balancing server.

Ketersediaan dan skalabilitas

Penyeimbangan beban server mendistribusikan permintaan layanan di seluruh grup server nyata dan membuat server tersebut terlihat seperti satu server besar bagi klien. Seringkali lusinan server nyata berada di belakang URL yang mengimplementasikan layanan virtual tunggal.

Bagaimana cara kerjanya? Dalam arsitektur load balancing server yang banyak digunakan, permintaan masuk diarahkan ke penyeimbang beban server khusus yang transparan untuk klien. Berdasarkan parameter seperti ketersediaan atau beban server saat ini, penyeimbang beban memutuskan server mana yang harus menangani permintaan dan meneruskannya ke server yang dipilih. Untuk menyediakan algoritme teknik penyeimbang beban dengan data masukan yang diperlukan, penyeimbang beban juga mengambil informasi tentang kesehatan server dan memuat untuk memverifikasi bahwa mereka dapat menanggapi lalu lintas. Gambar 1 mengilustrasikan arsitektur load balancer klasik ini.

Arsitektur load-dispatcher yang diilustrasikan pada Gambar 1 hanyalah salah satu dari beberapa pendekatan. Untuk memutuskan solusi load balancing mana yang terbaik untuk infrastruktur Anda, Anda perlu mempertimbangkan ketersediaan dan skalabilitas .

Ketersediaan ditentukan oleh waktu aktif - waktu antara kegagalan. (Waktu Henti adalah waktu untuk mendeteksi kegagalan, memperbaikinya, melakukan pemulihan yang diperlukan, dan memulai kembali tugas.) Selama waktu aktif, sistem harus menanggapi setiap permintaan dalam waktu yang telah ditentukan dengan baik. Jika waktu ini terlampaui, klien melihat ini sebagai kerusakan server. Ketersediaan tinggi, pada dasarnya, adalah redundansi dalam sistem: jika satu server gagal, yang lain mengambil alih beban server yang gagal secara transparan. Kegagalan server individu tidak terlihat oleh klien.

Skalabilitas berarti bahwa sistem dapat melayani satu klien, serta ribuan klien secara bersamaan, dengan memenuhi persyaratan kualitas layanan seperti waktu respons. Di bawah beban yang meningkat, sistem berskala tinggi dapat meningkatkan throughput hampir secara linier sebanding dengan kekuatan sumber daya perangkat keras tambahan.

Dalam skenario di Gambar 1, skalabilitas tinggi dicapai dengan mendistribusikan permintaan masuk melalui server. Jika beban meningkat, server tambahan dapat ditambahkan, selama penyeimbang beban tidak menjadi penghambat. Untuk mencapai ketersediaan tinggi, penyeimbang beban harus memantau server untuk menghindari permintaan penerusan ke server yang kelebihan beban atau mati. Selain itu, penyeimbang beban itu sendiri juga harus redundan. Saya akan membahas poin ini nanti di artikel ini.

Teknik load balancing server

Secara umum, solusi load balancing server terdiri dari dua jenis utama:

  • Teknik load balancing tingkat transport - seperti pendekatan berbasis DNS atau load balancing tingkat TCP / IP - bertindak secara independen dari payload aplikasi.
  • Teknik load balancing tingkat aplikasi menggunakan payload aplikasi untuk membuat keputusan teknik load balancing.

Solusi load balancing dapat diklasifikasikan lebih lanjut menjadi penyeimbang beban berbasis perangkat lunak dan penyeimbang beban berbasis perangkat keras. Penyeimbang beban berbasis perangkat keras adalah kotak perangkat keras khusus yang mencakup sirkuit terintegrasi khusus aplikasi (ASIC) yang disesuaikan untuk penggunaan tertentu. ASIC memungkinkan penerusan lalu lintas jaringan berkecepatan tinggi tanpa overhead sistem operasi tujuan umum. Penyeimbang beban berbasis perangkat keras sering digunakan untuk penyeimbangan beban tingkat pengangkutan. Secara umum, penyeimbang beban berbasis perangkat keras lebih cepat daripada solusi berbasis perangkat lunak. Kelemahan mereka adalah biayanya.

Berbeda dengan penyeimbang beban perangkat keras, penyeimbang beban berbasis perangkat lunak berjalan pada sistem operasi standar dan komponen perangkat keras standar seperti PC. Solusi berbasis perangkat lunak berjalan baik dalam node perangkat keras penyeimbang beban khusus seperti pada Gambar 1, atau langsung di aplikasi.

Teknik load balancing berbasis DNS

Teknik penyeimbang beban berbasis DNS merupakan salah satu pendekatan penyeimbangan beban server awal. Sistem nama domain (DNS) Internet mengaitkan alamat IP dengan nama host. Jika Anda mengetik nama host (sebagai bagian dari URL) ke browser Anda, browser meminta server DNS untuk menentukan nama host ke alamat IP.

Pendekatan berbasis DNS didasarkan pada fakta bahwa DNS memungkinkan beberapa alamat IP (server nyata) untuk ditetapkan ke satu nama host, seperti yang ditunjukkan dalam contoh pencarian DNS di Daftar 1.

Daftar 1. Contoh pencarian DNS

>nslookup amazon.com Server: ns.box Address: 192.168.1.1 Name: amazon.com Addresses: 72.21.203.1, 72.21.210.11, 72.21.206.5

Jika server DNS menerapkan pendekatan round-robin, urutan alamat IP untuk host tertentu berubah setelah setiap respons DNS. Biasanya klien seperti browser mencoba menyambung ke alamat pertama yang dikembalikan dari kueri DNS. Hasilnya adalah tanggapan ke beberapa klien didistribusikan di antara server. Berbeda dengan arsitektur load balancing server pada Gambar 1, tidak diperlukan node hardware load balancer menengah.

DNS adalah solusi efisien untuk penyeimbangan beban server global, di mana beban harus didistribusikan antara pusat data di lokasi yang berbeda. Seringkali penyeimbangan beban server global berbasis DNS digabungkan dengan solusi penyeimbangan beban server lainnya untuk mendistribusikan beban dalam pusat data khusus.

Meskipun mudah diterapkan, pendekatan DNS memiliki kekurangan yang serius. Untuk mengurangi kueri DNS, klien cenderung menyimpan kueri DNS ke dalam cache. Jika server menjadi tidak tersedia, cache klien serta server DNS akan terus berisi alamat server yang mati. Karena alasan ini, pendekatan DNS tidak banyak menerapkan ketersediaan tinggi.

Load balancing server TCP / IP

Load balancer server TCP / IP beroperasi pada peralihan lapisan tingkat rendah. Penyeimbang beban server tingkat rendah berbasis perangkat lunak yang populer adalah Server Virtual Linux (LVS). Server yang sebenarnya muncul di dunia luar sebagai server "virtual" tunggal. Permintaan masuk pada koneksi TCP diteruskan ke server sebenarnya oleh penyeimbang beban, yang menjalankan kernel Linux yang ditambal untuk menyertakan kode IP Virtual Server (IPVS).

Untuk memastikan ketersediaan tinggi, dalam banyak kasus, sepasang node penyeimbang beban disiapkan, dengan satu node penyeimbang beban dalam mode pasif. Jika penyeimbang beban gagal, program detak jantung yang berjalan di kedua penyeimbang beban mengaktifkan node penyeimbang beban pasif dan memulai pengambilalihan alamat IP Virtual (VIP). Sementara heartbeat bertanggung jawab untuk mengelola failover antara penyeimbang beban, skrip kirim / ekspektasi sederhana digunakan untuk memantau kesehatan server sebenarnya.

Transparansi ke klien dicapai dengan menggunakan VIP yang ditetapkan ke penyeimbang beban. Jika klien mengeluarkan permintaan, pertama-tama nama host yang diminta diterjemahkan ke dalam VIP. Ketika menerima paket permintaan, penyeimbang beban memutuskan server nyata mana yang harus menangani paket permintaan. Alamat IP target dari paket permintaan ditulis ulang menjadi IP Asli (RIP) dari server sebenarnya. LVS mendukung beberapa algoritme penjadwalan untuk mendistribusikan permintaan ke server sebenarnya. Ini sering diatur untuk menggunakan penjadwalan round-robin, mirip dengan load balancing berbasis DNS. Dengan LVS, keputusan penyeimbangan beban dibuat pada tingkat TCP (Lapisan 4 Model Referensi OSI).

Setelah menerima paket permintaan, server sebenarnya menanganinya dan mengembalikan paket respons. Untuk memaksa paket respons dikembalikan melalui penyeimbang beban, server sebenarnya menggunakan VIP sebagai rute respons defaultnya. Jika penyeimbang beban menerima paket respons, IP sumber dari paket respons akan ditulis ulang dengan VIP (OSI Model Layer 3). Mode perutean LVS ini disebut perutean Terjemahan Alamat Jaringan (NAT). Gambar 2 menunjukkan implementasi LVS yang menggunakan perutean NAT.

LVS juga mendukung mode perutean lain seperti Direct Server Return. Dalam hal ini paket respon dikirim langsung ke klien oleh server sebenarnya. Untuk melakukan ini, VIP juga harus ditetapkan ke semua server nyata. Penting untuk membuat VIP server tidak dapat diselesaikan ke jaringan; jika tidak, penyeimbang beban menjadi tidak dapat dijangkau. Jika penyeimbang beban menerima paket permintaan, alamat MAC (OSI Model Layer 2) dari permintaan tersebut akan ditulis ulang, bukan alamat IP. Server sebenarnya menerima paket permintaan dan memprosesnya. Berdasarkan alamat IP sumber, paket respons dikirim ke klien secara langsung, melewati penyeimbang beban. Untuk lalu lintas web, pendekatan ini dapat mengurangi beban kerja penyeimbang secara dramatis. Biasanya, lebih banyak paket respons yang ditransfer daripada paket permintaan. Misalnya, jika Anda meminta halaman Web, seringkali hanya satu paket IP yang dikirim. Jika halaman Web yang lebih besar diminta,beberapa paket IP respons diperlukan untuk mentransfer halaman yang diminta.

Caching

Solusi penyeimbang beban server tingkat rendah seperti LVS mencapai batasnya jika penyimpanan cache tingkat aplikasi atau dukungan sesi aplikasi diperlukan. Caching adalah prinsip skalabilitas penting untuk menghindari operasi mahal yang mengambil data yang sama berulang kali. Cache adalah penyimpanan sementara yang menyimpan data redundan yang dihasilkan dari operasi pengambilan data sebelumnya. Nilai cache bergantung pada biaya untuk mengambil data versus rasio klik dan ukuran cache yang diperlukan.

Berdasarkan algoritma penjadwalan load balancer, permintaan sesi pengguna ditangani oleh server yang berbeda. Jika cache digunakan di sisi server, permintaan yang tersesat akan menjadi masalah. Salah satu pendekatan untuk menangani ini adalah dengan menempatkan cache di ruang global. memcached adalah solusi cache terdistribusi yang menyediakan cache besar di beberapa mesin. Ini adalah cache terpartisi dan terdistribusi yang menggunakan hashing yang konsisten untuk menentukan server cache (daemon) untuk entri cache tertentu. Berdasarkan kode hash kunci cache, pustaka klien selalu memetakan kode hash yang sama ke alamat server cache yang sama. Alamat ini kemudian digunakan untuk menyimpan entri cache. Gambar 3 mengilustrasikan pendekatan caching ini.

Kode 2 menggunakan spymemcached, memcachedklien yang ditulis dalam Java, untuk menyimpan HttpResponsepesan ke cache di beberapa mesin. The spymemcachedperpustakaan menerapkan logika klien diperlukan saya baru saja dijelaskan.

Daftar 2. cache HttpResponse berbasis memcache