Предисловие шардинга (последовательное хеширование) - PullRequest
1 голос
/ 26 января 2010

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

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

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

Ответы [ 2 ]

7 голосов
/ 30 марта 2010

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

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

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

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

2 голосов
/ 26 мая 2011

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

Предположим, что у вас будет максимум 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

, поэтому вам нужно переместить данные с h (x) = 9, 5 или 2 в узел № 3.

...