Меня попросили установить сервер Memcached на двух серверах (по одному на каждом). Для записей я запускаю PHP 5.6.5. Вот моя установка:
memcached.ini:
extension=memcached.so
memcache.allow_failover=1
memcache.session_redundancy=3
php -i | grep memcached
memcached support => enabled
libmemcached version => 1.0.16
memcached.compression_factor => 1.3 => 1.3
memcached.compression_threshold => 2000 => 2000
memcached.compression_type => fastlz => fastlz
memcached.serializer => php => php
memcached.sess_binary => 0 => 0
memcached.sess_connect_timeout => 1000 => 1000
memcached.sess_consistent_hash => 0 => 0
memcached.sess_lock_expire => 0 => 0
memcached.sess_lock_max_wait => 0 => 0
memcached.sess_lock_wait => 150000 => 150000
memcached.sess_locking => 1 => 1
memcached.sess_number_of_replicas => 0 => 0
memcached.sess_prefix => memc.sess.key. => memc.sess.key.
memcached.sess_randomize_replica_read => 0 => 0
memcached.sess_remove_failed => 0 => 0
memcached.sess_sasl_password => no value => no value
memcached.sess_sasl_username => no value => no value
memcached.store_retry_count => 2 => 2
memcached.use_sasl => 0 => 0
Registered save handlers => files user memcache memcached
session.save_handler => memcached => memcached
php.ini
session.save_handler = memcached
session.save_path = 'tcp://10.109.6.122:11211,tcp://10.105.164.25:11211'
Однако, похоже, у меня проблема с избыточностью сервера. Чуть ниже у меня есть таблица тестов, которую я выбрал для тестирования. WAS
это сервер Apache, и MEMCACHE
- это запущенный сервер Memcached.
+---------+------------+---------+------------+
| WAS1 | MEMCACHED1 | WAS2 | MEMCACHED2 |
+---------+------------+---------+------------+
| Started | Started | Stopped | Stopped |
| Stopped | Stopped | Started | Started |
| Started | Stopped | Stopped | Started |
| Stopped | Started | Started | Stopped |
+---------+------------+---------+------------+
Ниже приведен код, который я использую для тестирования. Дело в том, что $session->id
должен увеличиваться без проблем.
<?php
require_once "cron_init.php";
$session = new Zend_Session_Namespace('lastCommande');
$session->type = 'test';
if (!isset($session->id)) {
$session->id = 1;
echo "Première visite par ici \n" ;
}
else {
echo "Nombre de visite pour l'instant : " . $session->id . "\n";
$session->id++;
}
print_r($_COOKIE);
Теоретически все работает нормально. Когда я "выключаю" один из серверов (оба Apache + Memcached с одного из серверов), я продолжаю получать увеличивающееся число, но в зависимости от того, какой сервер Memcached я останавливаю (в основном, Memcached1
) получаемое мной увеличивающееся число неверно.
Например, если я остановлюсь Memcached1
, Memcache2
будут свои данные. В данный момент, $session->id
18 лет для Memcached1
и 14 для Memcached2
в то время как им обоим должно быть по 14 или 18 лет.
Я пробовал оба memcache.session_redundancy=2
и memcache.session_redundancy=3
из-за этой известной ошибки PHP, но проблема сохраняется в любом случае.
Что еще я могу сделать?
заранее спасибо
Как вы, кажется, используете memcached
и нет memcache
, вам следует использовать вместо этого следующие настройки:
memcached.sess_number_of_replicas = 3
memcached.sess_binary_protocol = 1