1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zeal-ketama

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Ketama


О Ketama

(quote from GitHub: https://github.com/RJ/ketama) Мы создали ketama для замены метода, которым наши клиенты memcached отображали ключи на серверы. Ранее клиенты отображали ключи -> серверы следующим образом:

server = serverlist[hash(key) % serverlist.length];

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

Ketama решает эту проблему следующим образом:

  • Берите ваш список серверов (например: 1.2.3.4:11211, 5.6.7.8:11211, 9.8.7.6:11211)
  • Хэшируйте каждую строку сервера в несколько (100-200) беззнаковых целых чисел
  • Концептуально эти числа располагаются на окружности, называемой континуумом. (вообразите циферблат, который идет от 0 до 232)
  • Каждое число связано со своим сервером, поэтому серверы появляются в нескольких местах на континууме, через каждое число, которое они хэшировали.
  • Чтобы отобразить ключ -> сервер, хэшируйте свой ключ в одно беззнаковое целое число, и найдите ближайшее большее число на континууме. Сервер, связанный с этим числом, является правильным сервером для этого ключа.
  • Если вы хэшируете свой ключ к значению около 232 и нет точек на континууме больше вашего хэша, верните первый сервер в континуум.### О данном библиотечном модуле ketama Можно динамически устанавливать вес узлов и копии узлов, а также сохранять текущие опции в stash, и восстановить ваши опции в любое время, а также выполнить тест балансировки, чтобы убедиться, что вес узлов приближен к реальной ситуации.#### Кольцо
-record(ring_opt, {
          name                     :: atom(),
          node_copies     = 40     :: integer(),
          expand_node     = true   :: boolean(),
          match_operator  = '=>'   :: '>='| '>',
          concat_char     = ":"    :: char(),
          copies_gen_type = weight :: weight | specific}
).

name: Имя вашего кольца node_copies: работает только тогда, когда copies_gen_type равно weight, множитель узлов. expand_node: значение хэша md5(key) группируется по 16 байтам, и каждый четырёхбайтовый блок является ключом хэша узла, если мы хотим использовать только первые 4 байта, просто отключите этот вариант. match_operator: оператор для ets match_spec. concat_char: если ваш hashseed имеет вид "ip:port", то copies hashseed будет иметь вид ip:port + concat_char + copy_id. copies_gen_type: вес: авто вычисляет количество копий
специфика: вручную задаётся количество копий, но если expand_node = true, то количество копий будет увеличено в четыре раза

Пример использования:

RingTest = #ring_opt{name = test, node_copies=80}.
#ring_opt{name = test,node_copies = 80,expand_node = true,
          match_operator = '>=',concat_char = ":",
          copies_gen_type = weight}
(ketama@ZhengXujin-PC)6> ketama:add_ring(RingTest).
ok
(ketama@ZhengXujin-PC)12> ketama:list_rings().
[#ring_opt{name = test,node_copies = 80,expand_node = true,
           match_operator = '>=',concat_char = ":",
           copies_gen_type = weight}]
(ketama@ZhengXujin-PC)13> ketama:get_ring_summary(test).
[#node_summary{id = 1,weight = 10,percentage = 0.2,
               copies_num = 64},
 #node_summary{id = 2,weight = 40,percentage = 0.8,
               copies_num = 256}]
```### Узел
```erlang
-record(node, {id             :: integer(),
               hash_seed      :: string(),
               weight         :: integer(),
               copies_num     :: integer(),
               object         :: any()}).

id:
идентификатор узла

hash_seed:
например: "127.0.0.1:8080".

weight:
работает только при copies_gen_type = weight.

copies_num:
работает только при copies_gen_type = weight.

object:
ваши пользовательские данные, функция ketama:get_object(ringname, key) вернет {ok, {NodeId, Object}}, после чего вы сможете хранить свои собственные данные.### Бэкап конфигураций

Что такое бэкап?

При проведении тестирования A/B запросов вы можете уменьшить вес и добавить узел, чтобы небольшие запросы направлялись на сервер тестирования. Однако вам также может потребоваться восстановление текущих настроек после завершения тестирования с помощью бэкапа.

-record(stash, { id    :: atom(),
                 ring  :: atom(),
                 name  :: atom(),
                 nodes :: list(),
                 time = erlang:localtime()}).

Пример использования:

ketama:stash(test, t1).

Баланс тест

Что такое баланс тест?

При установке веса узла вы можете задаться вопросом, работает ли этот вес корректно? Давайте проведём баланс тест!

Использование:

ketama:balance_test(имя_кольца, количество_тестовых_ключей).

Лучше всего установите большое значение количество_тестовых_ключей, например: 1000000. В этом случае функция вернёт реальный отчёт о количестве попаданий узлов в виде:

(ketama@ZhengXujin-PC)11> ketama:get_ring_summary(test).
[#node_summary{id = 1, weight = 10, percentage = 0.2,
                copies_num = 64},
 #node_summary{id = 2, weight = 40, percentage = 0.8,
                copies_num = 256}]
(ketama@ZhengXujin-PC)10> ketama:balance_test(test, 1000).
{ok, [{2, {781, 0.781}}, {1, {219, 0.219}}]}
```Это значит, что узел 1 был выбран 219 раз, а его процентное соотношение составляет 21,9%. Узел 2 был выбран 781 раз, а его процентное соотношение составляет 78,1%.

Таким образом, сравним конфигурацию (`ketama:get_ring_summary`), и результаты будут очень схожими.

**Примечание:** если вы заметили, что результаты не совпадают с вашей конфигурацией, вам следует увеличить количество копий узла (в режиме веса) или количество копий (в специальном режиме).

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Универсальный алгоритм согласованного хеширования, этот фреймворк можно использовать во многих областях, таких как распределённые базы данных в памяти, распределение трафика A/B-тестирования и других. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zeal-ketama.git
git@api.gitlife.ru:oschina-mirror/zeal-ketama.git
oschina-mirror
zeal-ketama
zeal-ketama
master