Kami pindah dari pengaturan 1 server web ke dua pengaturan server web dan saya harus mulai berbagi sesi PHP antara dua mesin load seimbang. Kami telah menginstal memcached ( dan mulai ) dan jadi saya senang bahwa saya bisa menyelesaikan sesi berbagi antara server baru dengan mengubah hanya 3 baris dalam php.ini
file ( session.save_handler dan session.save_path ):
Saya menggantikan:
session.save_handler = files
dengan:
session.save_handler = memcache
Kemudian pada server web master saya mengatur session.save_path
to point ke localhost:
session.save_path="tcp://localhost:11211"
dan pada server web slave saya atur session.save_path
ke point ke master:
session.save_path="tcp://192.168.0.1:11211"
Pekerjaan selesai, saya mengujinya dan berhasil. Tapi...
Jelas menggunakan memcache berarti sesi-sesi dalam RAM dan akan hilang jika mesin reboot atau daemon memcache crash - Saya sedikit khawatir dengan ini tetapi saya sedikit lebih khawatir tentang lalu lintas jaringan antara dua webservers (terutama karena kami meningkatkan) karena setiap kali seseorang dimuat seimbang ke server web budak sesi mereka akan diambil di seluruh jaringan dari server web master. Saya bertanya-tanya apakah saya dapat mendefinisikan dua save_paths
sehingga mesin melihat di sesi penyimpanan mereka sendiri sebelum menggunakan jaringan. Sebagai contoh:
Menguasai:
session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"
Budak:
session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"
Apakah ini berhasil berbagi sesi di seluruh server DAN membantu kinerja? yaitu menghemat lalu lintas jaringan 50% dari waktu. Atau apakah teknik ini hanya untuk failover (mis. Ketika satu daemon memcache tidak dapat dijangkau)?
Catatan : Saya tidak benar-benar bertanya secara spesifik tentang replikasi memcache - lebih lanjut tentang apakah klien memcache PHP dapat memuncak di dalam setiap daemon memcache di pool, mengembalikan sesi jika menemukan satu dan hanya membuat sesi baru jika tidak menemukan satu. di semua toko. Saat saya menulis ini, saya berpikir saya meminta sedikit dari PHP, lol ...
Asumsikan : tidak ada sesi lengket, penyeimbangan muatan round-robin, server LAMP.
Jawaban:
Penafian: Anda akan gila mendengarkan saya tanpa melakukan banyak pengujian DAN mendapatkan pendapat kedua dari seseorang yang berkualifikasi - Saya baru dalam permainan ini .
Gagasan peningkatan efisiensi yang diajukan dalam pertanyaan ini tidak akan berhasil. Kesalahan utama yang saya buat adalah berpikir bahwa urutan toko memcached didefinisikan di kolam menentukan jenis prioritas. Ini bukan masalahnya . Saat Anda mendefinisikan kumpulan daemon memached (misalnya menggunakan
session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"
), Anda tidak bisa tahu toko mana yang akan digunakan. Data didistribusikan secara merata, artinya item mungkin disimpan di tempat pertama, atau bisa juga yang terakhir (atau bisa juga keduanya jika klien memcache dikonfigurasi untuk menggandakan - perhatikan bahwa itu adalah klien yang menangani replikasi, server memcached tidak tidak melakukannya sendiri). Apa pun cara itu berarti menggunakan localhost sebagai yang pertama di pool tidak akan meningkatkan kinerja - ada kemungkinan 50% mengenai salah satu toko.Setelah melakukan sedikit pengujian dan penelitian, saya telah menyimpulkan bahwa Anda BISA berbagi sesi di server menggunakan memcache TAPI Anda mungkin tidak mau - itu tampaknya tidak populer karena tidak skala serta menggunakan shared Database itu tidak kuat. Saya akan menghargai umpan balik tentang ini sehingga saya dapat mempelajari lebih lanjut ...
Kiat 1: Jika Anda ingin berbagi sesi di 2 server menggunakan memcache:
Pastikan Anda menjawab Ya untuk " Mengaktifkan dukungan penangan sesi memcache? " Ketika Anda menginstal klien memcache PHP dan menambahkan yang berikut dalam
/etc/php.d/memcache.ini
file Anda :Di server web 1 (IP: 192.168.0.1):
Di server web 2 (IP: 192.168.0.2):
Kiat 2: Jika Anda ingin berbagi sesi di 2 server menggunakan memcache DAN memiliki dukungan failover:
Tambahkan yang berikut ke
/etc/php.d/memcache.ini
file Anda :Di server web 1 (IP: 192.168.0.1):
Di server web 2 (IP: 192.168.0.2):
Catatan:
session.save_path
pada semua server.Tip 3: Jika Anda ingin berbagi sesi menggunakan memcache DAN memiliki dukungan failover transparan:
Sama seperti tip 2 kecuali Anda perlu menambahkan yang berikut ke
/etc/php.d/memcache.ini
file Anda :Catatan:
get's
diulang di mirror. Ini berarti bahwa pengguna tidak kehilangan sesi mereka dalam kasus kegagalan daemon memcache.memcache.session_redundancy
adalah untuk redundansi sesi tetapi ada jugamemcache.redundancy
opsi ini yang dapat digunakan oleh kode aplikasi PHP Anda jika Anda ingin memiliki tingkat redundansi yang berbeda.sumber
ext/memcache
versi 3.x. Kami juga bermain dengan opsi itu dan saya memutuskan untuk mengulang daftar server dan menulis sendiri.Re: Tip 3 di atas (untuk siapa pun yang kebetulan menemukan ini melalui google), tampaknya setidaknya saat ini agar berfungsi, Anda harus menggunakan
memcache.session_redundancy = N+1
untuk server N di pool Anda , setidaknya itu tampaknya merupakan ambang batas minimum nilai yang berhasil. (Diuji dengan php 5.3.3 pada debian stable, pecl memcache 3.0.6, dua server memcached.session_redundancy=2
Akan gagal segera setelah saya mematikan server pertama disave_path
,session_redundancy=3
berfungsi dengan baik.)Ini sepertinya ditangkap dalam laporan bug ini:
sumber
Seiring dengan pengaturan php.ini yang ditunjukkan di atas, pastikan hal-hal berikut juga diatur:
Kemudian Anda akan mendapatkan failover penuh dan redundansi sisi klien. Peringatan dengan pendekatan ini adalah bahwa jika memcached di localhost akan selalu ada read miss sebelum klien memcache php mencoba server berikutnya dalam kumpulan yang ditentukan dalam session.save_path
Ingatlah bahwa ini memengaruhi pengaturan global untuk klien memcache php yang berjalan di server web Anda.
sumber
consistent
strategi hashing masuk akal mengingat bahwasession.save_path
berbeda pada setiap server web?memcached tidak berfungsi seperti itu (tolong perbaiki saya jika saya salah!)
Jika Anda ingin aplikasi Anda memiliki penyimpanan sesi yang berlebihan, Anda harus membuat sesuatu yang mengubah / menambah / menghapus entri ke kedua instance memcached. memcached tidak menangani ini, satu-satunya hal yang disediakannya adalah penyimpanan hash kunci. Jadi tidak ada replikasi, sinkronisasi, tidak ada, nada.
Saya harap saya tidak salah tentang masalah ini, tetapi ini adalah apa yang saya ketahui tentang memcached, sudah beberapa tahun sejak saya menyentuhnya.
sumber
memcached tidak mereplikasi di luar kotak, tetapi repcached (memcached tambalan) tidak. Namun jika Anda sudah menggunakan mysql maka mengapa tidak hanya menggunakan fungsionalitas replikasinya dengan replikasi master-master dan dapatkan manfaat dari replikasi data lengkap.
C.
sumber