Подтвердить что ты не робот

Производительность Riak - неожиданные результаты

В последние дни я немного поиграл с риаком. Первоначальная настройка была проще, чем я думал. Теперь у меня есть кластер 3 node, все узлы, работающие на одном и том же vm для тестирования.

Я признаю, что аппаратные настройки моей виртуальной машины сильно понижены (1 процессор, 512 МБ ОЗУ), но все же я довольно удивлен медленной производительностью riak.

Уменьшить карту

Играя немного с уменьшением карты, у меня было около 2000 объектов в одном ковше, каждый размером около 1k - 2k, как json. Я использовал эту функцию карты:

function(value, keyData, arg) {
    var data = Riak.mapValuesJson(value)[0];

    if (data.displayname.indexOf("max") !== -1) return [data];
    return [];
}

И потребовалось более 2 секунд только для того, чтобы выполнить HTTP-запрос, возвращающий его результат, не считая того времени, которое потребовалось в моем клиентском коде, чтобы десериализовать результаты из json. Удаление 2-х из 3-х узлов, казалось, немного улучшило производительность чуть ниже 2 секунд, но это все еще кажется мне очень медленным.

Можно ли это ожидать? Объекты не были такими большими в байтах, а 2000 объектов в одном ковше тоже не так.

Вставить

Пакетная вставка около 60 000 объектов в том же размере, что и выше, занимала довольно много времени и фактически не работала.

My script, который вставил объекты в riak, умер около 40 000 или около того и сказал, что он больше не сможет подключиться к riak node. В журналах riak я обнаружил сообщение об ошибке, которое указывало на то, что node закончилось память и умер.

Вопрос

Это действительно мой первый выстрел в риаке, так что есть определенно шанс, что я что-то напортачил.

  • Можно ли настроить какие-либо настройки?
  • Слишком ограничены аппаратные настройки?
  • Возможно ли, что клиентская библиотека PHP, которую я использовал для взаимодействия с riak, является лимитирующим фактором здесь?
  • Запуск всех узлов на одной и той же физической машине довольно глупо, но если это проблема - как лучше проверить производительность riak?
  • Действительно ли карта снижается так медленно? Я прочитал о производительности, которую снижает количество карт в списке рассылки riak, но если Map Reduce медленнее, как вы должны выполнять "запросы" для данных, необходимых почти в реальном времени? Я знаю, что riak не так быстро, как redis.

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

4b9b3361

Ответ 1

Я спросил в списке рассылки riak, вы можете прочитать ответ Sean Cribbs здесь.

Ответ 2

Этот ответ немного запоздалый, но я хочу отметить, что реализация Riak mapreduce предназначена в первую очередь для работы со ссылками, а не с целыми ведрами.

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

Кстати, "ведра" по терминологии Riak, смутно и неутешительно, не реализованы так, как вы, вероятно, думаете. То, что Riak вызывает ведро, на самом деле является просто пространством имен. Внутри есть только одно ведро, а ключи хранятся с именем ведра в качестве префикса. Это означает, что независимо от того, насколько маленький или большой ваш ковш, перечисление ключей в одном ведре размера n займет m, где m - общее количество ключей во всех ковшиках.

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

Ответ 3

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

Вторичные индексы, доступные теперь в более новых версиях Riak, определенно подходят для этого. Поместите указатель на объекты, которые вы хотите найти (возможно, с именем "ismax_int" со значением 0 или 1). Вы можете отображать/уменьшать вторичный индекс с помощью сотен тысяч ключей в микросекундах, которые для проверки полного сканера потребовалось бы несколько секунд.

Ответ 4

У меня нет прямого опыта Riak, но немного работал с Cassandra, что похоже.

Во-первых, производительность, вероятно, будет зависеть от количества доступных ядер и памяти. Эти системы обычно сильно конвейерны и параллельны и извлекают выгоду из большого количества сердечников. 4+ ядра и 4 ГБ + ОЗУ были бы хорошей отправной точкой.

Во-вторых, MapReduce предназначен для пакетной обработки, а не для запросов в реальном времени.

Riak и все подобные хранилища Key-Value предназначены для высокой производительности записи, высокой производительности чтения для простого поиска, без сложных запросов.

Просто для сравнения, Cassandra на одном node (6 ядре, 6 ГБ) может делать 20000 отдельных вставок в секунду.