load balancing beberapa contoh drupal horisontal

8

Saya telah mengembangkan RAP WebAPI menggunakan modul Layanan. Ini bekerja dengan baik. Saya memiliki klien dari API itu dengan penggunaan yang diproyeksikan yang mengharuskan saya skala secara horizontal contoh Drupal saya. Perhatikan bahwa karena sifat API saya, yang membutuhkan sumber daya CPU dan GPU yang signifikan, saya tidak dapat menggunakan server cloud. Juga, karena sifat API saya, instance Drupal harus dijalankan pada OS Windows. (Aplikasi saya hanya memerlukan perangkat lunak yang tersedia di Win64.) Saya memiliki server yang cukup gemuk di lokasi bersama sekarang, dan untuk klien yang ambisius ini saya berencana untuk secara horizontal mengukur perangkat keras saya dengan cara berikut:

  • Satu server CentOS menjalankan HaProxy sebagai penyeimbang beban ujung depan,
  • Dua untuk memulai, dengan lebih banyak ditambahkan sesuai kebutuhan, server Windows Server 2008 R2 hosting Drupal,
  • Satu server basis data CentOS menyediakan basis data tunggal untuk beberapa instance Drupal,
  • Satu server database CentOS berjalan dalam mode replikasi jika server DB 1 mati.

Pertanyaan saya terkait dengan cara kerja penyeimbang beban HaProxy. Saya berasumsi bahwa sessionIds yang dibuat oleh instance Drupal akan menjadi unik satu sama lain. Apakah penyeimbang beban melihat sessionId dan merutekan semua permintaan ke server yang sama yang menghasilkan sessionId itu? Bagaimana cara komunikasi REST WebAPI bekerja jika load balancing menyebabkan setiap permintaan API untuk pergi ke server yang berbeda? Apakah ada dan semua data yang dirujuk oleh WebAPI harus disimpan dalam database karena saya tidak dapat memastikan bahwa beberapa permintaan API untuk sumber daya yang sama akan dialihkan ke instance Drupal yang sama?

Blake Senftner
sumber
Pertanyaan yang sangat menarik. Saya tidak dapat menahan perasaan bahwa ini lebih merupakan pertanyaan umum daripada hanya tentang Drupal (itu bisa berlaku untuk REST API berbasis PHP yang menggunakan otentikasi sesi jika saya membacanya dengan benar); jika itu masalahnya Anda mungkin mendapat manfaat dari penandaan untuk dimigrasi ke situs SO utama. Hanya berpikir :)
Clive
+1 untuk menemukan lebih banyak info di tempat lain. Anda dapat menggunakan sebagian besar saran untuk meningkatkan aplikasi PHP dengan Drupal. Karena komentar saya terlalu lama, saya memposting jawaban yang dapat membantu Anda menemukan yang Anda butuhkan.
rocketeerbkw
Terima kasih rocketeerbkw dan Berdir untuk wawasan Anda. Dalam penelitian saya yang sedang berlangsung ini, saya telah belajar bahwa HaProxy tidak menangani SSL dengan sesi lengket, dan saya perlu menggunakan sesuatu seperti stunnel untuk SSL, karena semua komunikasi API saya lebih dari SSL. Sepertinya diperlukan lebih banyak penelitian untuk memahami langkah saya selanjutnya di sini.
Blake Senftner
Dan penelitian lebih lanjut tampaknya menunjukkan konfigurasi saya perlu terlihat seperti tier1: server firewall & stunnel, tier2: load balancer, tier3: beberapa server web drupal, tier4: server database bersama, tier5: server database replikasi. Dan mungkin bersama dengan tier4 SAN untuk penyimpanan file bersama untuk beberapa contoh Drupal. Setiap wawasan, remah roti, atau artikel web yang menggambarkan orang yang menyiapkan sesuatu seperti ini, dipersilakan.
Blake Senftner

Jawaban:

12

Memiliki beberapa webserver di belakang load balancer / reverse proxy cukup umum untuk Drupal dan didukung dengan baik. Varnish biasanya digunakan di dunia Linux karena hal itu sangat cepat ketika benar-benar dapat menggunakannya, yang berarti pengunjung anonim. Yang jelas bukan itu yang terjadi pada situs Anda.

Sesi disimpan dalam database secara default, jadi itu bukan masalah. Satu-satunya hal lain yang perlu dibagikan di semua server adalah direktori file publik dan lainnya seperti file pribadi jika Anda menggunakan sesuatu seperti itu). Dalam kebanyakan kasus, sistem file bersama / didistribusikan seperti NFS digunakan untuk ini meskipun ada beberapa pendekatan yang lebih maju. Di satu situs di mana saya terlibat adalah sistem file yang disediakan oleh server lain yang merupakan NFS-mount pada server Drupal (jadi akses di sana lambat) dan didistribusikan di bawah domain yang berbeda oleh Lighthttpd. Tapi sekali lagi, itu mungkin tidak begitu relevan bagi Anda karena Anda tidak akan ke server banyak gambar dan file css, saya kira.

Seperti disebutkan oleh rocketeerbkw, ada backend cache untuk Memcache, Redis dan lainnya. Sejauh ini, Ive hanya menggunakan Memcache tetapi saya baru-baru ini mulai melihat ke dalam Redis dan itu terlihat sangat menjanjikan tetapi saya tidak yakin apakah itu tersedia untuk Windows. Namun, mungkin untuk mengatur server Linux terpisah untuk digunakan untuk cache. Drupal 7 sangat bergantung pada cache, bisa mengeluarkannya dari database sangat penting karena dua alasan:

  1. Alat-alat seperti Redis dan Memcache dirancang untuk pencarian berbasis kunci cepat dan mereka menyimpan data mereka selalu dalam memori untuk membuat pencarian secepat mungkin. Mereka juga memiliki dukungan bawaan untuk secara otomatis membersihkan data cache lama jika batas yang dikonfigurasi semakin dekat.

  2. Mungkin bahkan lebih penting, ini membantu untuk menurunkan basis data. Setelah Anda memiliki pengaturan dasar di tempat, menambahkan webservers tambahan mudah. Setelah Anda mulai mencapai batas server database tunggal, segalanya menjadi jauh lebih rumit dan Anda perlu melihat hal-hal seperti replikasi master / master (Drupal 7 tidak benar-benar mendapatkan banyak dari lingkungan master / slave).

Jadi, pada dasarnya hanya API Anda sendiri yang perlu Anda jaga. Jika memungkinkan, Anda perlu memastikan bahwa semuanya selalu tersedia dari semua server. Anda dapat menggunakan databse, sistem file atau yang lainnya (Drupal juga dapat menggunakan MongoDB untuk menyimpan data tertentu, misalnya bidang). Jika itu bukan opsi, maka Anda harus menggunakan sesi sticky sehingga pengguna selalu berakhir pada contoh yang sama. Namun Anda harus benar-benar mencoba untuk menghindarinya karena jika salah satu server gagal maka semua pengguna yang berada di server itu perlu terhubung kembali ke server lain, mungkin kehilangan data.

Berdir
sumber
0

Secara default, PHP menyimpan sesi pada disk. Jika pengguna masuk ke Server 1, maka tekan Server 2 mereka akan keluar. Ada beberapa opsi untuk memperbaikinya:

  1. Jangan menyimpan sesi pada disk
  2. Pastikan pengguna selalu menekan server yang sama
  3. Pasang sistem file bersama di semua server

Untuk menerapkan # 2 dan menjawab pertanyaan Anda tentang HAProxy; Dalam pengaturan paling dasar Anda dapat menjalankannya dalam Mode TCP dan menggunakan algoritma balancing "sumber" ( http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#4-balance ) untuk memastikan pengguna menekan server yang sama. Anda harus membaca dokumen untuk menentukan apakah ada kerugian untuk Anda menggunakan pendekatan itu.

Untuk # 1 Anda dapat menggunakan penyimpanan kunci / nilai seperti Redis atau Memecached yang semua server Anda akan hubungkan dan mengambil sesi. Ini membuat sesi memuat / menyimpan dengan sangat cepat dan Anda bisa menggunakan baik sebagai cache Drupal bersama.

rocketeerbkw
sumber
6
Drupal secara default menyimpan sesi dalam database dan bukan di sistem file.
Berdir