Используя простой map-redund для перечисления всех ключей в корзине и bucket.get_keys ()? - PullRequest
0 голосов
/ 29 сентября 2011

Согласно документам Риака (с использованием привязок Python), get_keys () чрезвычайно дорог и не подходит для производства.У меня вопрос, подходит ли очень простой запрос к карте.Например, при использовании этапа карты только с функцией:

function(v) { return [v.key]; }

это будет работать лучше, чем get_keys ()?почему Riak не поставляется с этой реализацией вместо текущей версии get_keys ()?Есть ли лучший способ, чтобы я должен был перечислить ключи для ведра?

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Если вы используете серверную часть eleveldb (которая реализована с помощью библиотеки LevelDB ), ваши ключи хранятся в отсортированном порядке, поэтому вы можете сделать что-то вроде:

def get_bucket_keys(riak_client, bucket_name, start='0', stop='Z'):
    for record_key in riak_client.index(bucket_name, '$key', start, stop).run():
        yield record_key

for key in get_bucket_keys(riak.RiakClient(), 'mybucket'):
    print key

С помощью eleveldb riak сканирует все узлы только для указанного диапазона. Таким образом, если вы заполняете свои сегменты таким образом, чтобы управлять диапазонами клавиш, список ключей сегментов может быть очень производительным.

Компромисс в том, что вы не можете указать LIMIT для количества ключей, обрабатываемых на каждом узле. Вот почему вам НУЖНО управлять ключами для корзин, в которых вам нужен список ключей.

2 голосов
/ 01 октября 2011

Функция get_keys() вызывает list_keys в серверной части и считается дорогой операцией, поскольку выполняет полное сканирование пространства клавиш. В зависимости от вашего Riak-сервера это может также включать в себя полное сканирование данных, хранящихся на диске (вспоминается InnoStore). Бэкэнд по умолчанию (Bitcask) хранит все ваши ключи в памяти, поэтому производительность не должна быть такой большой проблемой.

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

Это стало проще с обновлением до Riak 1.0. Если вы используете серверную часть LevelDB, вы можете включить вторичные индексы в корзине и использовать индекс $key (автоматически предоставленный Riak), чтобы получить список всех ключей в корзине.

Что касается того, почему Riak не поставляется с лучшей реализацией чего-то подобного: спросите, для чего эта функциональность. В СУБД получение всех первичных ключей таблицы включает в себя полное сканирование таблицы. В Riak получение всех ключей из корзины требует сканирования всех данных в каждом узле, а затем отправки имен ключей обратно в исходный узел, объединения этих данных и последующей отправки их вызывающему клиенту. Из-за распределенного, неупорядоченного состояния Riak эта операция дорогая, независимо от того, как вы ее нарезаете. Как я уже говорил выше, есть способы сделать его лучше.

...