Справочная информация :
я создал веб-приложение, которое я хотел бы иметь возможность достаточно хорошо масштабировать. Я знаю, что я не Google или Twitter, но мое приложение использует довольно большой объем данных для каждого пользователя и, следовательно, предъявляет довольно высокие требования к данным. Я хочу быть готовым достаточно хорошо масштабироваться, не перестраивая все позже.
Я считаю себя разработчиком программного обеспечения, а не экспертом по базам данных. Вот почему я публикую здесь. Надеюсь, кто-то с большим опытом работы с базами данных может дать мне совет.
С относительно большим количеством пользователей, но не похожими на номера Facebook, я ожидаю, что у меня будет БД, которая выглядит следующим образом:
Один "Большой стол":
- 250 миллионов записей
- 20 столбцов
- Примерно 100 ГБ данных
- Имеет индексированный внешний ключ bigint (20)
- Имеет индексированный столбец varchar (500) string_id
- Имеет int (11) столбец «значение»
4 другие таблицы:
- 10 миллионов записей каждая
- Примерно 2 - 4 ГБ данных каждый
- каждая из этих таблиц имеет 4 - 8 столбцов
- один столбец является datetime date_created
- один столбец является столбцом varchar (500) string_id
- один или два столбца из каждой из этих таблиц будут выбраны в объединении
Одна из этих таблиц используется для хранения средних значений: ее схема - bigint (20) id, varchar (20) string_id, datetime date_created, float average_value
Что я хочу сделать - два относительно дорогих запроса:
Рассчитать новые средние значения:
- Используя внешний ключ, выберите до нескольких миллионов отдельных записей из большой таблицы.
- Вычислите новое среднее, группируя по string_id.
- Вставьте результаты в таблицу средних значений.
- В настоящее время этот запрос использует два соединения.
Создайте ненормализованные записи только для чтения для обслуживающих пользователей:
- Используйте внешний ключ, чтобы выбрать от 1 000 до 40 000 записей из большой таблицы.
- Присоединитесь к каждой из четырех других таблиц в самой новой записи с помощью столбца идентификатора строки.
- Вставьте результаты в ненормализованную таблицу.
- Эти записи предназначены для внешнего интерфейса для отображения информации пользователям.
- В настоящее время этот запрос использует четыре объединения.
Я планирую запускать каждый из этих дорогих запросов в пакетной серверной базе данных, которая отправит свои результаты на внешний сервер БД в режиме реального времени, который обрабатывает запросы от пользователей. Эти запросы будут выполняться через равные промежутки времени. Я не решил, как часто. Средний запрос может быть сделан, возможно, один раз в день. Запрос на нормализацию должен выполняться чаще - возможно, каждые несколько минут.
Каждый из этих запросов в настоящее время выполняется в MySQL за несколько секунд на очень низкоуровневой машине с набором данных со 100K записями в «большой таблице». Я обеспокоен как своей способностью к масштабированию, так и стоимостью масштабирования.
Вопросы :
- Этот подход кажется правильным? Что-то явно не так с точки зрения общей картины?
- Является ли СУБД подходящим инструментом или я должен смотреть на другие решения для «больших данных», как что-то из семейства Hadoop? Я склонен использовать RDBMS, потому что данные структурированы и хорошо вписываются в реляционную модель. Однако в определенный момент я понимаю, что я больше не смогу использовать СУБД. Это правда? Когда будет необходим этот переключатель?
- Это будет работать? Могут ли эти запросы выполняться в разумные сроки? Я могу подождать, возможно, несколько часов для запроса № 1, но запрос № 2 должен завершиться через несколько минут.
- Что я должен рассмотреть с точки зрения аппаратного обеспечения? Какие могут быть узкие места в моей оперативной памяти и процессоре? Я предполагаю, что хранение индексов в оперативной памяти важно. Есть ли что-то еще, что я должен рассмотреть?
- В какой-то момент мне, вероятно, придется разделить мои данные и использовать несколько серверов. Похоже, мой вариант использования уже относится к этой категории, или я смогу какое-то время масштабировать одну машину по вертикали? Будет ли это работать с 10x данными? 100x?