(quote from GitHub: https://github.com/RJ/ketama) Мы создали ketama для замены метода, которым наши клиенты memcached отображали ключи на серверы. Ранее клиенты отображали ключи -> серверы следующим образом:
server = serverlist[hash(key) % serverlist.length];
Это означало, что каждый раз при добавлении или удалении серверов из пула все ключи начинали хэшироваться к другим серверам, что фактически очищало весь кеш.
Ketama решает эту проблему следующим образом:
-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 )