2009-02-17 7 views
7

К верхним десяткам тысяч запросов в секунду Я хочу видеть 60 000 -> +90 000 запросов в секунду.(Как может/что должен) Я реализую базу данных, которая масштабируется до верхних десятков тысяч запросов в секунду?

My Setup состоит из следующих действий:

пользователя ---> Веб-приложение -> Очередь сообщений -> анализатор -> базы данных?

Следует отметить, что в настоящее время анализатор может анализировать/обрабатывать около 18750 записей в секунду с использованием COPY, поэтому мы ограничены в этом направлении, пока не начнем добавлять больше парсеров - сейчас это не вызывает большого беспокойства.

У меня есть система, которая требует возможности массовой загрузки так же быстро, как я могу, сколько записей. Эта же система (или она может быть разной в зависимости от того, как вы приближаетесь к нему) должен быть в состоянии реагировать на запросы аналитических типов, таких как это:

 
wonq = "select sum(amount) from actions where player = '@player' and " + 
     "(type = 'award' or type = 'return') and hand = hand_num" 
lostq = "select sum(amount) from actions where player = 'player' and " + 
     "type != 'award' and type != 'return' and hand = hand_num" 

..... 10-15 тысяч раз (PER USER), поскольку они привязаны к другой таблице. Излишне говорить, что мы сейчас разбиваем эти результаты на 10/страницу.

Я посмотрел на следующее: (. Рег заурядным РСУБД) (предполагается, что они находятся на том же сервере)

  • MySQL - смог попасть в 15-20 тыс. запросов/второй диапазон; в нынешних условиях, если мы попытаемся это масштабировать, нам нужен отдельный хост/база данных каждый раз, когда нам нужно масштабировать - это не выполнимо

  • couchdb (document oriented db) - не сломал 700 запросов/секунду; Я действительно надеялся, что это спасет нашу задницу - не случайность!

  • vertica (columnar oriented db) - ударил 60000 запрос/секунду, закрытый источник, очень дорогой; это все еще вариант, но мне лично это совсем не понравилось

  • tokyocabinet (hash based db) - в настоящее время весит 45 000 вставок в секунду и 66 000 выборок в секунду; вчера, когда я написал это, я использовал адаптор FFI, который выполнял около 5555 запросов в секунду; это на сегодняшний день самая быстрая самая удивительная база данных, которую я видел еще!

  • terracotta - (vm cluster) в настоящее время оценивает это вместе с jmaglev (не могу дождаться, пока сам маглев не выйдет) - это МЕДЛЕННО!

может быть, я просто приближаюсь эта проблема неправильно, но я всегда слышал, что RDBMS медленно, как весь ад - так где эти супер быстрые системы, которые я слышал о?

Условие тестирования ::

Просто так госзакупки знают мои спецификации на моем Dev окне:

 
dual 3.2ghz intel, 1 gig ram 

Mysql MySQL.CNF редактирует были:

 
key_buffer = 400M    # was 16M 
innodb_log_file_size = 100M  # non existent before 
innodb_buffer_pool_size = 200M # non existent before 

UPDATE ::

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

С другой стороны, я был очень рад видеть, что библиотека ruby-библиотеки tokyocabinet NON-FFI (что означает тиран/кабинет) является супер быстрой и прямо сейчас, что является первым местом.

+0

feydr - не могли бы вы рассказать о том, как вы протестировали терракоту? Хотелось бы узнать больше, почему вы считаете, что Терракота медленная. Большинство людей считают, что это очень быстро, поэтому, возможно, это плохой вариант использования - или может быть какая-то настройка? Хотелось бы узнать больше ... –

+0

Тейлор: по общему признанию, это проблема. плохой вариант использования; мы также все еще оцениваем его и, вероятно, будем на некоторое время, но в качестве первого теста простого обмена списком объектов на одном экземпляре server-client мы могли бы использовать только в наших objcs в ~ 50/секунду по сравнению с большинством других вариантов. ~ 600/сек. – eyberg

+0

Тейлор: только что заметил, что ваш блог говорит о 3500 ткс/сек. - предоставленная терракота будет значительно уменьшаться (что означает, что все еще проблема имеет место для нас), но я думаю, что скорость txn просто сравнительно дорога замедлить замену наших rdbms – eyberg

ответ

6

Для безумном-большой масштабируемости, вы хотите, чтобы сосредоточиться на двух вещах:

  • шардинге: Разделите набор данных на группы, которые не перекрывают друг друга. Простой и быстрый способ сопоставления с запросом на сервер. (Player, начинающийся с af, server 1; gq, server 2 ... и т. Д.)
  • Кэширование: используйте Memcache, чтобы запомнить вывод некоторых действительно распространенных запросов выбора, поэтому вам не нужно идти на диск как довольно часто.
1

Ну, большой игрок в игре - это Oracle, но это большие деньги.

Если вы хотите идти дешево, то вам придется заплатить цену в различных условиях:

  • по partioning БД в нескольких экземплярах и распределения нагрузки.
  • Потенциально кэширующие результаты, поэтому фактический доступ к БД уменьшается.
0

пользователь ---> веб-приложение -> очередь сообщений -> парсер -> база данных?

Для чего нужна очередь сообщений? Это большая проблема с производительностью.

+0

Хороший вопрос, однако очередь сообщений добавляет почти никакого заметного повышения производительности ... причина, по которой это происходит, потому что в конце концов мы хотим, чтобы у него было несколько парсеров, и я хочу, чтобы задания с веб-сервера НЕМЕДЛЕННО были брошены в очередь, так что веб-сервер может сделать это лучше – eyberg

0

Осколок и кеширование, как сказал ойрак.

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

Hypertable и т. Д. Дает лучшую производительность для некоторых моделей доступа к данным, но ваш звук очень подходит для типичных баз данных.

И да, CouchDB разочаровывает медленно.

+0

не имел понятия, CouchDB был настолько слаб! Я представил себе, что это было по крайней мере как 10k –

+0

, мы сделали сводные таблицы в прошлом, которые более или менее сработали, однако на данный момент я вернулся к голой кости «как быстро мы можем выбросить вещи и захватить их» – eyberg

0

Вы пробовали postgresql? он должен быть быстрее, чем mysql. но в любом случае вам нужно будет сбалансировать нагрузку на несколько серверов (сплит-база данных). вы можете иметь несколько баз данных (например, для каждого клиента), а затем один централизованный, который будет синхронизироваться с этими маленькими ...

+0

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

0

Вы пробовали redis? Они обещают скорость 110000 SETs/second, 81000 GET/секунду. Это расширенный ключ-значение db с поддержкой списков и наборов.

+0

действительно оценил redis и, похоже, довольно много - У меня есть несколько проблем с этим, однако для этой проблемы - главное, что вам нужно достаточно памяти, чтобы соответствовать тому, что вы хотите сохранить .... не будучи распространенным, это большая ошибка. – eyberg

+0

Да, по той же причине Redis doesn 't очень подходит для нашего проекта. В этом контексте проект LightCloud выглядит интересным, так как он создает распределенную базу данных по ключевым словам поверх Токио Тирана или Редиса. – AlexD

0

Я сомневаюсь, что любая система предоставит вам готовые результаты, которые вам нужны. Вероятно, вы начнете сталкиваться с жесткими ограничениями на машине, на которой вы находитесь (с почти любой интенсивной записью db вы быстро достигнете пределов ввода-вывода).Может потребоваться некоторый анализ, но диск почти всегда является узким местом. Больше оперативной памяти поможет, как и использование твердотельных дисков.

Однако вам, вероятно, понадобится кластеризация, независимо от того, какой фактический db вы используете. Вы можете очертить сами данные или MySQL, настройка чтения-ведомых будет распространять нагрузку на узлы и должна предоставить вам пропускную способность, которую вы ищете.

Также: MongoDB является удивительным. Возможно, стоит посмотреть.

+0

посмотрели на mongodb, и мне это нравится намного лучше, чем кушетка (оба являются doc-ориентированными dbs), поскольку это намного быстрее .. Я получал 8 000-10 000 запросов в секунду на моем ноутбуке Вы правы в отношении кластеризации ... на данный момент мы рассматриваем использование hdfs/hbase в стеке hadoop .. не так быстро, но он должен делать то, что нам нужно – eyberg

0

Типичный способ быстрого хранения данных на долгое время в приложении с записью - использовать журнал только для добавления. Если правильно развернуто s.t. файл журнала находится на своем собственном вращающемся диске, время поиска диска минимизируется для каждой операции записи/добавления.

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

Существует механизм хранения mysql, который делает это, вы хотите использовать mysql. Другой вариант - одна из новых баз данных nosql, таких как fleetdb.

Вы пробовали использовать SSD?

Существует множество вариантов решения этой проблемы, но они, вероятно, потребуют ручного труда.