30 миллионов записей в день, SQL Server не может идти в ногу, нужна другая система баз данных?

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

Дизайн базы данных довольно прост, содержащий одну таблицу, с foreignId (200 000 различных идентификаторов), поле datetime, actionId (30 разных идентификаторов) и еще два поля, содержащие некоторую метаинформацию (только малые значения). Для других таблиц нет ограничений. Кроме того, у нас есть два индекса, каждый из которых содержит 4 поля, которые нельзя отбрасывать, поскольку пользователи получают тайм-ауты, когда у нас есть меньшие индексы. ForeignId является самым важным полем, так как каждый запрос содержит это поле.

Мы решили использовать SQL-сервер, но после реализации реляционная база данных не выглядит идеально подходящей, поскольку мы не можем вставлять 30 миллионов записей в день (она вставляет только, мы не делаем никаких обновлений), когда также делаем много случайных чтений в базе данных; потому что индексы не могут быть быстро обновлены. Эрго: у нас огромная проблема:-) Мы временно решили проблему, но

реляционная база данных, похоже, не подходит для этой проблемы!

Будет ли лучше база данных, например BigTable, и почему? Или существуют другие, более эффективные решения при решении таких проблем?

NB. На этом этапе мы используем одну 8-ядерную систему Xeon с памятью 4 ГБ и 32-разрядную версию Win 2003. Насколько я знаю, RAID10 SCSI. Размер индекса составляет около 1.5x размер таблицы.

Ответ 1

Вы говорите, что ваша система способна вставлять 3000 записей в секунду без индексов, но только около 100 с двумя дополнительными некластеризованными индексами. Если 3k/s - максимальная пропускная способность ваших разрешений ввода-вывода, добавление двух индексов должно теоретически уменьшать пропускную способность около 1000-1500/сек. Вместо этого вы видите ухудшение в 10 раз хуже. Правильное решение и ответ - это "Зависимости", и потребуется серьезное устранение неполадок и идентификация узких мест. Имея это в виду, если бы я рискнул предположить, я бы дал двух возможных виновников:

а. Дополнительные некластеризованные индексы распределяют записи грязных страниц в более области выделения. Решение было бы поместить кластеризованный индекс и каждый некластеризованный индекс в свою собственную файловую группу и поместить три группы файлов на отдельные LUN ​​на RAID.

В. Низкая избирательность некластеризованных индексов создает высокую конкуренцию между чтением и записью (конфликты ключей, а также % блокировки% конфликтов), что приводит к длительной блокировке время ожидания для обеих вставок и выбора. Возможные решения заключались в использовании SNAPSHOT с прочитанным режимом моментального снимка, но я должен предупредить об опасности добавления большого количества ввода-вывода в хранилище версий (т.е. в tempdb) в системе, которая может уже находиться под высоким напряжением IO. Второе решение использует моментальные снимки базы данных для отчетности, они вызывают более низкое напряжение ввода-вывода, и их можно контролировать лучше (нет хранилища версий tempdb), но отчет больше не поступает в режиме реального времени.

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

'RAID10' не очень точное описание.

  • Сколько веретен в части RAID 0? Являются ли они короткими полосами?
  • Сколько LUN?
  • Где находится журнал базы данных?
  • Где находится база данных?
  • Сколько разделов?
  • Где находится tempdb?

Как и на вопрос, подходят ли реляционные базы данных для чего-то подобного, да, абсолютно. Есть много факторов, которые необходимо учитывать, возможность восстановления, доступность, набор инструментов, знания ноу-хау, простота разработки, простота развертывания, простота управления и т.д. И т.д. Реляционные базы данных могут легко обрабатывать вашу рабочую нагрузку, они просто нуждаются в правильной настройке. 30 миллионов вставок в день, 350 в секунду, это небольшое изменение для сервера базы данных. Но 32-битная операционная система объемом 4 ГБ вряд ли является сервером базы данных, независимо от количества процессоров.

Ответ 2

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

Рассматривали ли вы что-то вроде индексированных представлений в SQL Server? Это хороший способ удалить индексирование из основной таблицы и переместить его в материализованное представление.

Ответ 3

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

Ответ 4

Вы не предоставляете достаточно информации; Я не уверен, почему вы говорите, что реляционная база данных выглядит плохой, кроме того, что сейчас у вас проблемы с производительностью. Какая машина работает на РСУБД? Учитывая, что у вас есть иностранные идентификаторы, кажется, что реляционная база данных - именно то, что требуется здесь. SQL Server должен иметь возможность обрабатывать 30 миллионов вставок в день, предполагая, что он работает на достаточном оборудовании.

Ответ 5

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

Перейдите с одним индексом, а не с двумя индексами. Скопированный индекс, вероятно, будет лучшим выбором, чем некластеризованный. Меньше, более широкие индексы обычно будут лучше, чем более узкие индексы. И, как вы говорите, это индексирование, которое убивает ваше приложение.

Вы не говорите, что используете для идентификаторов, но если вы используете GUID, вы можете изменить свои ключи на bigints. Поскольку идентификаторы GUID являются случайными, они ставят тяжелую нагрузку на индексы, как в построении индексов, так и при их использовании. Используя столбец идентификатора bigint, индекс будет работать очень много хронологически, и если вам действительно интересен доступ к запросам в реальном времени для ваших последних данных, ваш шаблон доступа намного лучше подходит для монотонно увеличивающих ключей.

Ответ 6

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

Тем не менее, мне интересно, хотите ли вы сохранить все 30-миллиметровые записи? Не лучше ли хранить некоторые предварительно агрегированные данные?

Ответ 7

Не уверен насчет SQL-сервера, но в другой системе баз данных, которую я использовал давно, идеальным методом для этого типа было сохранение обновлений, а затем, когда пакет выключил индексы, добавил новые записи, а затем повторно проиндексировал. Мы делали это один раз в сутки. Я не уверен, что ваши потребности в отчетах будут соответствовать этому типу решения или даже если это можно сделать в MS SQL, но я думаю, что это возможно.

Ответ 8

Вы не говорите, как управляются вставки. Собираются ли они или каждая статистика написана отдельно? Поскольку вставка одной тысячи строк в одну операцию, вероятно, будет более эффективной, чем вставка одной строки в тысячу отдельных операций. Вы все равно можете вставлять достаточно часто, чтобы предлагать более или менее отчетность в реальном времени;)