Принудительно memcached для записи на все серверы в пуле - PullRequest
4 голосов
/ 24 мая 2010

Я немного подумал, как убедиться, что конкретный ключ распространяется на ВСЕ серверы memcached в пуле.

Мое текущее, непроверенное решение - создать еще один экземпляр memcached, что-то вроде этого

$cluster[] = array('host' => '192.168.1.1', 'port' => '11211', 'weight' => 50);

$this->tempMemcached = new Memcached;
$this->tempMemcached->addServers($cluster);

foreach ($this->cluster() as $cluster) {    

    $this->tempMemcached->setByKey($cluster, $key, $value, $this->compress, $expireTime);

}

$this->tempMemcache->close();

Что делать в этом случае, когда для надежности необходимо хранить определенные ключи на ВСЕХ серверах?

Ответы [ 3 ]

6 голосов
/ 26 мая 2010

Я думаю, вы не используете memcached так, как это было задумано.Взгляните на FAQ : вы должны хранить только единственную копию вашего элемента, которая, согласно используемому алгоритму хеширования, поместит ваш элемент в определенный узел.*

Теперь, если вы хотите, чтобы элемент был доступен в всех узлах, единственный способ сделать это - выполнить итерацию, точно так же, как вы делаете сейчас.Я надеюсь, что ваш код обрабатывает случаи, когда этот элемент не найден в кеше.

4 голосов
/ 24 мая 2010

Я думаю, что вы упускаете смысл Memcached. Это не для надежного хранения данных. Это для ОЧЕНЬ быстрого доступа к кэшированным данным. Если вы хотите избыточности, попробуйте базу данных NOSQL, например MongoDB ...

Кроме того, создание нескольких соединений будет плохо сказываться на производительности и избыточности (чем больше соединений нужно сделать, тем больше вероятность, что что-то пойдет не так, и тем больше нужно будет делать для каждого запроса).

Упростите, не усложняйте ...

1 голос
/ 03 июня 2010

Нам пришлось «распределить» нагрузку по ключу, который ОЧЕНЬ часто попадает на серверы memcache. Мы делаем это, просто добавляя случайное число 0-N, где N кратно числу настроенных вами экземпляров. Если вы пропустили, вы идете к источнику (база данных, что угодно). Я говорю «несколько», поскольку memcache хэшируется против вашего ключа, вы можете столкнуться с конфликтом, не зная.

Это может привести к первоначальной стоимости большего числа операций чтения из источника (пропорционально вашему кратному N), но позволяет распределить нагрузку по одному ключу на все экземпляры, сохраняя эти поля довольными.

Но да, это не для резервирования, а для балансировки нагрузки.

...