Лучшее хранилище данных для миллиардов строк

Мне нужно иметь возможность хранить небольшие биты данных (приблизительно 50-75 байт) для миллиардов записей (~ 3 миллиарда в месяц в год).

Единственное требование - быстрые вставки и быстрый поиск для всех записей с тем же идентификатором GUID и возможностью доступа к хранилищу данных из .net.

Я парень SQL-сервера, и я думаю, что SQL Server может это сделать, но со всеми разговорами о BigTable, CouchDB и других решениях nosql, это все больше похоже на альтернативу традиционным RDBS, для оптимизации распределенных запросов и масштабирования. Я попробовал cassandra, и библиотеки .net в настоящее время не компилируются или не подлежат изменению (вместе с самой кассандрой).

Я просмотрел множество доступных хранилищ данных nosql, но не могу найти тот, который отвечает моим потребностям, как надежная готовая к производству платформа.

Если вам нужно было хранить 36 миллиардов небольших плоских записей, чтобы они были доступны из .net, что бы выбрать и почему?

Ответ 1

Сохраняя ~ 3,5 ТБ данных и вставляя около 1 К/сек 24х7, а также запрашивая со скоростью, не указанной, возможно с SQL Server, но есть еще вопросы:

  • что у вас есть для этого? 99,999% времени безотказной работы или достаточно 95%?
  • какое требование надежности у вас есть? Не хватает ли вставки вам $1 млн?
  • какое требование восстановления требуется у вас? Если вы потеряете один день данных, имеет ли это значение?
  • какое требование согласованности у вас есть? Должна ли быть гарантирована заметность записи в следующем чтении?

Если вам нужны все эти требования, которые я выделил, нагрузка, которую вы предлагаете, будет стоить миллионам на аппаратном обеспечении и лицензировании в реляционной системе, любой системе, независимо от того, какие трюки вы пытаетесь (осколки, разбиение и т.д.). Система nosql по своему определению не соответствовала бы всем этим требованиям.

Таким образом, очевидно, что вы уже смягчили некоторые из этих требований. Существует хороший визуальный справочник, в котором сравниваются предложения nosql на основе парадигмы "выбрать 2 из 3" в Visual Guide для NoSQL Systems:

nosql comparisson

После обновления комментариев к ПК

С SQL Server это будет простой реализацией:

  • один кластерный ключ (GUID, время). Да, вы получите фрагментированный, но фрагментация влияет на чтение и продвижение вперед, необходимы только для значительного сканирования диапазона. Поскольку вы запрашиваете только определенный GUID и диапазон дат, фрагментация не имеет большого значения. Да, это широкий ключ, поэтому нелистовые страницы будут иметь плохую плотность. Да, это приведет к плохому коэффициенту заполнения. И да, могут произойти разбиения страниц. Несмотря на эти проблемы, учитывая требования, по-прежнему остается наилучшим выбором кластеризованного ключа.
  • разделяйте таблицу по времени, чтобы вы могли эффективно выполнять удаление устаревших записей, используя автоматическое скользящее окно. Увеличьте это с перестройкой разделов онлайн-индекса за последний месяц, чтобы устранить плохой фактор заполнения и фрагментацию, введенную кластеризацией GUID.
  • включить сжатие страницы. Поскольку кластерные группы ключей по GUID сначала, все записи GUID будут рядом друг с другом, предоставляя сжатие страницы хороший шанс развернуть сжатие словаря.
  • вам понадобится быстрый путь ввода-вывода для файла журнала. Вы заинтересованы в высокой пропускной способности, а не при низкой задержке для журнала, чтобы идти в ногу с 1K вставками/сек, поэтому SEND информация на задний план, используя локальное соединение/транзакцию в Express совместно с веб-сервером. Это дает гораздо большую доступность для решения.

    Так вот как я буду делать это в SQL Server. Хорошей новостью является то, что проблемы, с которыми вы столкнетесь, хорошо поняты и известны решения. это не обязательно означает, что это лучше, чем то, что вы могли бы достичь с помощью Cassandra, BigTable или Dynamo. Я позволю кому-то узнать больше о вещах no-sql-ish, чтобы аргументировать их случай.

    Обратите внимание, что я никогда не упоминал модель программирования, поддержку .NET и т.д. Я честно считаю, что они не имеют отношения к крупным развертываниям. Они имеют огромное значение в процессе разработки, но после развертывания не имеет значения, насколько быстро была разработка, если накладные расходы ORM убивают производительность:)

Ответ 2

Вопреки распространенному мнению, NoSQL не касается производительности или даже масштабируемости. В основном это сводит к минимуму так называемое несоответствие объектно-реляционного импеданса, но также относится к горизонтальной масштабируемости по сравнению с более типичной вертикальной масштабируемостью РСУБД.

Для простого требования вставки fasts и быстрого поиска, почти любой продукт базы данных будет делать. Если вы хотите добавить реляционные данные или присоединиться к ним или иметь сложную транзакционную логику или ограничения, которые необходимо выполнить, тогда вам нужна реляционная база данных. Нет продукта NoSQL можно сравнить.

Если вам нужны системные данные, вы должны пойти с документированной базой данных, такой как MongoDB или CouchDB. Свободная схема - главная черта этих; Мне лично нравится MongoDB и использовать его в нескольких настраиваемых системах отчетности. Я считаю это очень полезным, когда требования к данным постоянно меняются.

Другой основной параметр NoSQL - это распределенные хранилища Key-Value, такие как BigTable или Cassandra. Они особенно полезны, если вы хотите масштабировать свою базу данных на многих машинах, на которых работает товарное оборудование. Очевидно, что они отлично работают на серверах, но не используют преимущества высокопроизводительного оборудования, а также SQL Server или Oracle или других баз данных, предназначенных для вертикального масштабирования, и, очевидно, они не являются реляционными и не подходят для обеспечения нормализации или ограничения. Кроме того, как вы заметили, поддержка .NET в лучшем случае имеет тенденцию быть пятнистой.

Все продукты реляционной базы данных поддерживают разделение ограниченного типа. Они не так гибки, как BigTable или другие системы DKVS, они не разбиваются на сотни серверов, но на самом деле это не похоже на то, что вы ищете. Они неплохо подходят для учета количества записей в миллиардах, если вы правильно индексируете и нормализуете данные, запустите базу данных на мощном аппаратном обеспечении (особенно SSD, если вы можете себе это позволить), и разделите на 2 или 3 или 5 физических диска, если необходимо.

Если вы соответствуете вышеуказанным критериям, если вы работаете в корпоративной среде и имеете деньги, чтобы тратить на достойное оборудование и оптимизацию баз данных, я бы теперь придерживался SQL Server. Если вы зажимаете гроши и должны запускать это на низкоуровневом аппаратном обеспечении облачных вычислений Amazon EC2, скорее всего, вы захотите выбрать Cassandra или Voldemort (если вы можете работать либо с .NET).

Ответ 3

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

36 миллиардов, 3 миллиарда в месяц, то есть примерно 100 миллионов в день, 4,16 миллиона в час, ~ 70 тысяч строк в минуту, 1,1 тыс. строк в секунду, поступающих в систему, устойчивым образом в течение 12 месяцев, время.

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

С точки зрения сохранения/извлечения и довольно критического аспекта, о котором вы не упоминали, стареет старое удаление данных, не является бесплатным.

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

Я бы также предположил, что вам понадобится очень приличный бюджет аппаратного обеспечения, если это серьезное приложение со скоростью ответа типа OLTP, то есть некоторыми приблизительными догадками, предполагая очень мало индексирования служебных данных, около 2.7 ТБ данных.

В лагере SQL Server единственное, что вы, возможно, захотите посмотреть, это новое издание параболического хранилища данных (madison), которое больше предназначено для вывода данных и выполнения параллельных запросов против него, чтобы обеспечить высокую скорость работы с большими датамартами.

Ответ 4

"Мне нужно иметь возможность хранить небольшие биты данных (приблизительно 50-75 байт) для миллиардов записей (~ 3 миллиарда в месяц в год).

Единственное требование - быстрые вставки и быстрый поиск для всех записей с тем же идентификатором GUID и возможностью доступа к хранилищу данных из .net.

По опыту могу сказать, что это возможно в SQL Server, потому что я сделал это в начале 2009 года... и он по-прежнему работает по сей день и довольно быстро.

Таблица была разделена на 256 разделов, имейте в виду, что это была версия SQL 2005 года... и мы сделали именно то, что вы говорите, и это должно хранить бит информации по GUID и быстро получать GUID.

Когда я ушел, у нас было около 2-3 миллиардов записей, и извлечение данных по-прежнему было довольно хорошим (1-2 секунды, если получить интерфейс UI или меньше, если на RDBMS), хотя политика хранения данных должна была быть инстанцирована.

Итак, длинный рассказ, я взял восьмой char (то есть где-то в середине-иш) из строки GUID и SHA1 хэшировал его и отливал как крошечный int (0-255) и сохранялся в соответствующем разделе и использовал тот же вызов функции при возврате данных.

ping me, если вам нужна дополнительная информация...

Ответ 5

Существует необычный факт, который, как представляется, игнорируется.

" В основном после вставки 30-минутных строк за один день мне нужно получить все строки с тем же идентификатором GUID (возможно, 20 строк) и быть уверенным, что я верну их все

Требуется только 20 столбцов, некластеризованный индекс в GUID будет работать нормально. Вы можете сгруппировать в другой столбец для дисперсии данных по разделам.

У меня есть вопрос относительно вставки данных: как он вставлен?

  • Является ли это объемной вставкой по определенному графику (за минуту, час и т.д.)?
  • Из какого источника извлекаются данные (плоские файлы, OLTP и т.д.)?

Я думаю, что на них нужно ответить, чтобы помочь понять одну сторону уравнения.

Ответ 6

В следующей статье рассматривается импорт и использование таблицы строк 16 млрд. в Microsoft SQL. http://sqlmag.com/t-sql/adventures-big-data-how-import-16-billion-rows-single-table.

Из статьи:

Вот несколько моих дистиллированных советов:

  • Чем больше данных у вас есть в таблице с определенным кластеризованным индексом, тем медленнее становится импортировать в нее несортированные записи. Некоторые точка, она становится слишком медленной, чтобы быть практичной.
  • Если вы хотите экспортировать таблицу в наименьший возможный файл, сделайте его родным. Это лучше всего подходит для таблиц, содержащих в основном числовые столбцы, потому что они более компактно представлены в двоичных полях, чем символьные данные. Если все ваши данные alphanumeric, вы не выиграете, экспортируя его в собственном формате. Не допускать, чтобы нули в числовых полях могли данные. Если вы разрешаете значение поля NULL, поля двоичные представление будет содержать 1-байтовый префикс, указывающий, сколько байты данных будут следовать.
  • Вы не можете использовать BCP для более чем 2 147 483 647 записей, потому что переменная счетчика BCP представляет собой 4-байтовое целое число. Я не смог найти ссылка на это на MSDN или в Интернете. Если ваша таблица состоит из более 2 147 483 647 записей, вам придется экспортировать их в куски
    или написать собственную процедуру экспорта.
  • Определение кластерного индекса в предварительно заполненной таблице занимает много места на диске. В моем тесте мой журнал взорвался до 10 раз оригинального размер таблицы перед завершением.
  • При импорте большого количества записей с использованием оператора BULK INSERT, включите параметр BATCHSIZE и укажите, сколько записи для фиксации за раз. Если вы не включаете этот параметр,
    весь ваш файл импортируется как одна транзакция, которая требует большого объема журнала.
  • Самый быстрый способ получить данные в таблице с кластеризованным индексом - сначала перенести данные. Затем вы можете импортировать его с помощью BULK
    INSERT с параметром ORDER.

Ответ 7

Amazon Redshift - отличный сервис. Он был недоступен, когда вопрос был первоначально опубликован в 2010 году, но теперь он является крупным игроком в 2017 году. Это база данных на основе столбцов, разветвленная из Postgres, поэтому с ней будут работать стандартные библиотеки соединителей SQL и Postgres.

Он лучше всего используется для целей отчетности, особенно для агрегации. Данные из одной таблицы хранятся на разных серверах в облаке Amazon, распределенных по ключевым словам distkeys, поэтому вы полагаетесь на мощность распределенного процессора.

Таким образом, SELECT и особенно агрегированные SELECT являются молниеносно. Загрузка больших данных должна быть выполнена с помощью команды COPY из файлов CSV Amazon S3. Недостатки в том, что DELETE и UPDATE более медленны, чем обычно, но именно поэтому Redshift не является преимущественно транснациональной базой данных, а скорее платформой хранилища данных.

Ответ 8

Вы можете попробовать использовать Cassandra или HBase, хотя вам нужно будет прочитать, как создавать семейства столбцов в соответствии с вашим вариантом использования. Cassandra предоставляет свой собственный язык запросов, но вам нужно использовать Java API HBase для прямого доступа к данным. Если вам нужно использовать Hbase, я рекомендую запрашивать данные с помощью Apache Drill из Map-R, который является проектом с открытым исходным кодом. Язык запросов сверления является SQL-совместимым (ключевые слова в упражнении имеют то же значение, что и в SQL).

Ответ 9

Сохранять записи в простых двоичных файлах, по одному файлу в GUID, не будет быстрее.

Ответ 10

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

Остановка в MongoDb еще не готова.