Производительность Riak - неожиданные результаты - PullRequest
16 голосов
/ 15 мая 2011

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

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

Карта Уменьшить

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

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

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

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

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

Вставить

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

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

Вопрос

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

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

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

Ответы [ 3 ]

31 голосов
/ 02 октября 2011

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

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

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

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

4 голосов
/ 23 февраля 2012

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

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

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

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

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

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

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

Для сравнения: Cassandra на одном узле (6 ядер, 6 ГБ) может выполнять 20 000 отдельных операций вставки в секунду.

...