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?
sumber
Jawaban:
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:
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.
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.
sumber
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:
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.
sumber