2010-01-26 3 views
1

Predis заявляет, что имеет накладку на стороне клиента (поддержка согласованного хэширования ключей). http://github.com/nrk/predisPredis sharding (последовательное хеширование)

Я могу сделать осколки, используя соединение с массивом профилей (узлов), но это не согласованное хеширование. Когда я добавляю еще один узел в пул, некоторые из ключей не могут быть найдены. У кого-нибудь есть опыт?

Использование php 5.2 (и версия php 5.2 для redis).

ответ

7

Официальный сайт Redis говорит: «Redis поддерживает наложение клиентской стороны через последовательное хеширование. В настоящее время нет поддержки отказоустойчивости или добавления или удаления кластеров во время выполнения».

Из того, что я понимаю в настоящий момент, этот вид совместного использования не является отказоустойчивым, и все ключи, хранящиеся на неисправном узле, будут потеряны. Аналогично, если вы добавите новый узел, некоторая часть пространства ключа будет потеряна (поскольку ключи будут сохранены на неправильном узле). Обычно в последовательной системе хэширования, когда новый узел соединяется, он копирует все ключи, которые теперь сопоставляются с ним соседей. Для этого на сервере Redis нет поддержки.

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

ОБНОВЛЕНИЕ: Возможно реализовать реальный очертание через согласованную хеширующую библиотеку под названием ketama.

2

Решение заключается в использовании виртуального осколка. Я не знаю, как работает Predis framework, но я предсказываю, что он использует какой-то массив - вы, вероятно, заполняете его информацией о каждом осколке при запуске.

Предположим, что у вас будет максимум 10 черепов (этого числа вряд ли удастся достичь). Затем создайте осколочный массив, который указывает только на 3 реальных сервера. В будущем, когда вы добавите новые узлы, вы перенесете связанные данные в новый осколок и измените отображение. Этот подход сохраняет форму, изменяющую хэш-функцию.

Начальное отображение:

0 => 0 //node #0 
1 => 0 
2 => 0 
3 => 1 //node #1 
4 => 1 
5 => 1 
6 => 2 //node #2 
7 => 2 
8 => 2 
9 => 2 

Когда добавляет новый узел вы только изменить отображение:

0 => 0 
1 => 0 
2 => 3 // new node #3 
3 => 1 
4 => 1 
5 => 3 // new node #3 
7 => 2 
8 => 2 
9 => 3 // new node #3 

поэтому вы должны переместить данные с Н (х) = 9 или 5 или 2 к узлу # 3.