Назад | Перейти на главную страницу

Быстрая база данных для хранения 1 миллиарда записей

Я пишу код для хранения данных и хочу хранить от 1 до 10 миллиардов записей или даже больше. Наиболее важными для этого являются скорость (около 10000 - 20000 / записей в секунду), использование ПРОБЕЛ и защита от сбоев. Теперь я играл с MySQL MyISAM, и он работает довольно БЫСТРО и соответствует необходимой нам скорости. MyISAM также имеет оптимальное использование ПРОСТРАНСТВА, а файл базы данных в папке данных MySQL был почти равен количеству данных, которые я вставил, например. на 100000 записей по 30 символов в каждой ушло всего 3 МБ. Но единственная проблема в том, что это не ACID, и он может привести к потере данных при сбоях.

Поэтому я хотел узнать об альтернативах (я даже не возражаю против замены программного обеспечения базы данных на что-нибудь еще), которые могут помочь нам хранить так много данных и хранить их БЫСТРО.

Я уже пробовал MySQL INNODB, и его вставки очень медленные. Я смог достичь только 800 - 1000 записей в секунду. Также объем места для хранения данных в INNODB довольно велик. Для хранения тех же 100000 записей по 30 символов в каждой требуется почти 8 МБ.

Я также попробовал MongoDB в качестве альтернативы, но снова требуется СЛИШКОМ много места для хранения тех же данных.

Даже БД SQLITE3 ОЧЕНЬ МЕДЛЕННО записывает 100000 записей. Я пробовал это с PHP в цикле for. Он также пропустил около 20 записей и выдал ошибки недоступности базы данных.

Поэтому я хотел узнать о любом программном обеспечении для баз данных с открытым исходным кодом, которое может удовлетворить мои требования. Я слышал, что ARIA MariaDB соответствует требованиям ACID. Это правда ? Или PostgreSQL также является хорошим быстрым вариантом с оптимальным использованием пространства.

Я открыт для любого решения, которое является БЫСТРЫМ, использует оптимальное пространство, а также устойчиво к АВАРИЯМ. Жду ответов.

=== ОБНОВЛЕНИЕ MariaDB Aria === Это даже хуже, чем InnoDB, когда дело доходит до скорости вставки и пространства. Для вставки тех же данных потребовалось в 1,5 раза больше времени, чем InnoDB, и почти в 2,5 раза больше места, используемого MyISAM.

Это не то, что можно на 100% «прибить» за 5 минут, но если вы хотите достичь такого уровня производительности и функциональности последовательно тогда я сильно подозреваю, что вам придется потратить деньги.

Если у вас есть на это бюджет, я бы посмотрел на объединение движка Oracle TimesTen, возможно, с корпоративным SSD или PCIe Flash (например, FusionIO), и если вы зайдете так далеко, я бы порекомендовал использовать Intel Xeon E7-xxxx. series, поскольку они обладают фантастическими возможностями RRAS, чтобы ваш сервер работал как можно дольше в случае сбоев.

Если бы получение большего количества функций и лучшей производительности было просто вопросом использования другого программного обеспечения, тогда бы все это делали (по крайней мере, те немногие, кто все еще работает в ИТ;)

Если нужна поддержка ACID - тогда зачем пробовать mongoDB?

Вполне возможно получить желаемую пропускную способность с innodb (но myisam быстрее) - при условии, что вы потратите достаточно на оборудование и правильно настроите систему. Но то, что ваше первое ограничение - минимизировать использование пространства, это скорее означает, что у вас нет бюджета, чтобы пойти и купить набор SSD RAID.

может вызвать потерю данных при сбоях

Я видел потери данных при сбоях в Oracle и Sybase - но да, теоретически они должны быть более устойчивыми. Обычно я трачу некоторое время, усилия и деньги на то, чтобы в первую очередь избежать сбоя (выделенный сервер, использование оборудования приемлемого качества, ИБП, стабильное программное обеспечение).

Даже БД SQLITE3 ОЧЕНЬ МЕДЛЕННАЯ

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

Если бы это был я, я бы посмотрел на MariaDB - это форк mysql и включает улучшенный движок ISAM (Ария), который имеет некоторые преимущества в производительности и поддерживает транзакции. (работает на Linux, с использованием xfs без барьеров и планировщика крайнего срока).

Но вам нужно взглянуть на свое оборудование, чтобы оно действительно летало.

По моему опыту, InnoDB (при правильной настройке и использовании) лишь немного медленнее MyISAM (конечно, не на порядок). Мне приходит в голову несколько предложений по повышению производительности:

  • Вы должны использовать последние версии механизма хранения MySQL InnoDB.
  • Вы должны использовать большой буферный пул (~ 80% доступной оперативной памяти) и большой размер файла журнала.
  • Вы должны использовать транзакции и пакетные вставки, чтобы получить высокую пропускную способность. Размер партии - важный фактор производительности (не слишком маленький, но и не слишком большой).
  • Вы должны использовать идентификатор AUTOINCREMENT в качестве ПЕРВИЧНОГО КЛЮЧА. Любые индексы снизят вашу скорость вставки, особенно UNIQUE.
  • Вы должны использовать самый низкий уровень изоляции транзакции, который вам подходит.
  • Настройте innodb_flush_method для своей системы.
  • Если вам не требуются полные гарантии ACID, попробуйте изменить значение innodb_flush_logs_at_trx_commit
  • Используйте подходящее оборудование, настройте свою ОС / хранилище / файловую систему

Здесь вы найдете хорошие указатели:

очень-очень-очень быстрая БД: MemSQL

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

Взгляни на mysqltuner или мастер настройки sql от percona; Добавьте на него много оперативной памяти и быстрой io-подсистемы, и innodb может дать вам очень приличную производительность.

innodb позволяет сжатие данных на лету. Это не ускорит работу, но может сэкономить место для хранения.

независимо от выбранного движка БД:

  • попробуйте группировать свои вставки, если возможно, установите систему очередей между поставщиком данных и базой данных
  • подумайте о сегментировании ваших данных
  • подумайте о распараллеливании процесса вставки. это не поможет вам с myisam, но может повысить производительность с innodb на mysql и других серверах баз данных.