Bisakah kumpulan daemon memcache digunakan untuk berbagi sesi dengan lebih efisien?

25

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.inifile ( 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_pathto point ke localhost:

session.save_path="tcp://localhost:11211"

dan pada server web slave saya atur session.save_pathke 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_pathssehingga 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.

Tom
sumber
1
Dokumentasi memcache tidak merekomendasikan menggunakan Memcache untuk penyimpanan sesi. Lihat code.google.com/p/memcached/wiki/… !

Jawaban:

37

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 ...

Abaikan yang berikut kecuali Anda memiliki aplikasi PHP:


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.inifile Anda :

session.save_handler = memcache

Di server web 1 (IP: 192.168.0.1):

session.save_path="tcp://192.168.0.1:11211"

Di server web 2 (IP: 192.168.0.2):

session.save_path="tcp://192.168.0.1:11211"

Kiat 2: Jika Anda ingin berbagi sesi di 2 server menggunakan memcache DAN memiliki dukungan failover:

Tambahkan yang berikut ke /etc/php.d/memcache.inifile Anda :

memcache.hash_strategy = consistent
memcache.allow_failover = 1

Di server web 1 (IP: 192.168.0.1):

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

Di server web 2 (IP: 192.168.0.2):

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

Catatan:

  • Ini menyoroti kesalahan lain yang saya buat dalam pertanyaan awal - saya tidak menggunakan yang sama session.save_pathpada semua server.
  • Dalam hal ini "failover" berarti bahwa jika satu daemon memcache gagal, klien memcache PHP akan mulai menggunakan yang lain. yaitu siapa pun yang memiliki sesi mereka di toko yang gagal akan keluar. Ini bukan failover transparan.

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.inifile Anda :

memcache.session_redundancy=2

Catatan:

  • Ini membuat klien memcache PHP menulis sesi ke 2 server. Anda mendapatkan redundansi (seperti RAID-1) sehingga penulisan dikirim ke n mirror, dan gagal get'sdiulang di mirror. Ini berarti bahwa pengguna tidak kehilangan sesi mereka dalam kasus kegagalan daemon memcache.
  • Mirrored dilakukan secara paralel (menggunakan non-blocking-IO) sehingga kinerja kecepatan tidak akan turun sebanyak jumlah mirror meningkat. Namun, lalu lintas jaringan akan meningkat jika mirror memcache Anda didistribusikan pada mesin yang berbeda. Misalnya, tidak ada lagi kemungkinan 50% untuk menggunakan localhost dan menghindari akses jaringan.
    • Tampaknya, keterlambatan dalam replikasi tulis dapat menyebabkan data lama diambil alih-alih cache miss. Pertanyaannya adalah apakah ini penting bagi aplikasi Anda? Seberapa sering Anda menulis data sesi?
  • memcache.session_redundancyadalah untuk redundansi sesi tetapi ada juga memcache.redundancyopsi ini yang dapat digunakan oleh kode aplikasi PHP Anda jika Anda ingin memiliki tingkat redundansi yang berbeda.
  • Anda memerlukan versi terbaru (masih dalam versi beta saat ini) dari klien memcache PHP - Versi 3.0.3 dari pecl bekerja untuk saya.
Tom
sumber
Bisakah Anda mengomentari "itu tidak skala serta menggunakan database bersama"? Saya tidak melihat perbedaannya dari pengaturan DB master-slave yang khas. Terima kasih!
Bocah Baukema
Ini adalah rincian yang sangat keren, meskipun ada rumor (alias laporan bug) bahwa ini tidak berfungsi seperti yang diharapkan ketika Anda menggunakan ext/memcacheversi 3.x. Kami juga bermain dengan opsi itu dan saya memutuskan untuk mengulang daftar server dan menulis sendiri.
Hingga
dalam hal tip 3: bagaimana jika satu host memcached turun dan kemudian muncul, maka host kedua turun. seperti yang saya mengerti - tidak ada data sesi akan dipulihkan dan beberapa akan hilang, kan?
GioMac
28

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+1untuk 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=2Akan gagal segera setelah saya mematikan server pertama di save_path, session_redundancy=3berfungsi dengan baik.)

Ini sepertinya ditangkap dalam laporan bug ini:

Michael Jackson
sumber
1
Tidak bisa upvote Anda cukup ..
fest
1
Saya senang saya menggulir ke bawah. Ini masalahnya.
Daren Schwenke
Tidak jelas bagi saya, apakah fitur ini hanya tersedia dalam seri PECL memcache 3.x? Semua itu terdaftar di perangkat lunak Beta di pecl.php.net/package/memcache , sedangkan pada 2.2.7 jika saya membunuh server yang saya lihat pemimpinnya, semuanya mati.
Joe
Sudah bertahun-tahun sejak saya melihat ini, jujur. Seingat saya, itu adalah fitur 3.x (icbw). Kami mengerahkan banyak sistem menggunakan versi "beta" dari plugin itu (beberapa di antaranya traffic yang cukup tinggi) dan tidak memiliki masalah yang sepertinya terkait dengan itu. YMMV, menguji hal-hal sebelum ditayangkan, dll. :) Saya belum bekerja di PHP selama beberapa tahun sekarang sehingga beberapa poin trivia yang lebih baik mulai memudar.
Michael Jackson
3

Seiring dengan pengaturan php.ini yang ditunjukkan di atas, pastikan hal-hal berikut juga diatur:

memcache.allow_failover = 1  
memcache.hash_strategy = 'consistent'

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.

Ian Lewis
sumber
Apakah menggunakan consistentstrategi hashing masuk akal mengingat bahwa session.save_pathberbeda pada setiap server web?
Tom
1

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.

merobek-
sumber
Akan berguna bagi saya jika Anda salah. :-) Ada sebuah artikel di phpslacker.com ( phpslacker.com/2009/03/02/php-session-clustering-with-memcache ) yang menyarankan memcached dapat bekerja seperti dijelaskan dalam pertanyaan. Mungkin itu tergantung bagaimana klien memcache mengimplementasikan strategi hashing?
Tom
1
memcache tidak berfungsi seperti itu, tetapi sepertinya php dapat bekerja seperti yang Anda inginkan. Anda harus mengubah php.ini atau mengubah aplikasi Anda seperti yang dijelaskan. Dari blog: Di mana pengelompokan yang Anda tanyakan Ya, sejujurnya tidak ada. Apa yang kita miliki sejauh ini adalah kumpulan memcache yang terdiri dari 2 server. PHP dikonfigurasi untuk menulis ke pool. PHP membaca / menulis ke kumpulan server dalam urutan yang ditentukan oleh "session.save_path" ini direktif. Untuk membaca PHP akan meminta objek cache dengan kunci dari kolam. Karena "failover" diaktifkan, PHP akan menanyakan kumpulan server memcache satu-per-satu hingga [...]
tore-
1

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.

symcbean
sumber
Terimakasih atas infonya. Itu bukan replikasi yang saya kejar. Ini lebih merupakan kasus ingin memuncak ke masing-masing memcached pada gilirannya sampai sesi ditemukan. yaitu memeriksa localhost terlebih dahulu karena ini tercepat dan kemudian memeriksa server lain selanjutnya.
Tom
1
Atas nama semua dewa MENGAPA ???? Ini adalah solusi yang benar-benar salah untuk ... baik tentang masalah yang dapat saya pikirkan. Selain menjadi sangat tidak efisien bahkan dengan kinerja hanya 2 server akan semakin memburuk dengan sangat cepat jika Anda menambahkan lebih banyak server. Dan itu tidak mempertimbangkan fakta bahwa solusi Anda membuat pemadaman dua kali lebih mungkin dibandingkan dengan server tunggal ketika dalam praktiknya menambahkan server ke sebuah cluster harus mengurangi kemungkinan pemadaman. (BTW jika Anda maksud round-robin berbasis DNS maka afinitas sesi tersirat!)
symcbean
Terima kasih atas umpan baliknya, ya, saya dengan bebas mengakui bahwa saya adalah noob di sesi sharing! :-) Namun, saya masih belum mengerti mengapa proposal saya sangat jelek. Saya pikir ini akan lebih efisien daripada menggunakan DB bersama dan saya juga berpikir itu akan membuat pemadaman lebih kecil.
Tom
Tidak, itu membuat mereka lebih mungkin. Mem-federasi data seperti ini masuk akal ketika Anda memiliki jumlah node yang sangat besar karena Anda mengurangi jumlah replikasi tetapi seseorang biasanya akan melakukan beberapa replikasi dengan jumlah kumpulan yang ditentukan untuk menjaga ketersediaan. Anda harus sangat pilih-pilih tentang kinerja untuk melihat perbedaan antara replikasi yang ditembolok ulang dan replikasi mysqld.
symcbean
Saya telah menguji dan mengonfirmasi bahwa selama saya menggunakan allow_failover = 1, beberapa mirror membuat pemadaman KURANG. Saya dapat mematikan satu cermin, memulai ulang dan mematikan yang lain, menyalakan kembali dan mematikan yang pertama lagi - semuanya tanpa keluar. Saya kira klien memcache PHP melakukan banyak tipu daya di belakang layar.
Tom