Как лучше всего хранить такой набор данных?

Здравствуйте, ищу ответа на свой вопрос так как не знаю как правильнее сделать в данной ситуации.
Имеется готовый проект где сотни активных пользователей которые грузят данные в формате
Строка 1
Строка 2
Строка 3 и тд

Объем данных которые грузятся ежедневно от 100 до 10000 строк. Эти строки являются определенным набором данных которые необходимо куда-то сохранить, сейчас организовано (ничего лучше не придумано прошлыми разработчиками) хранение в файлах. Суть в том, что эти строчки периодически извлекаются по 1-2шт, когда-то больше, а когда-то меньше, можно и всё сразу, не так важно.
Проблема заключается в том, что иногда (непонятно до сих пор из-за чего конкретно) извлечение происходит неудачно, то есть будто файл пустой с данными, но на самом деле данные там есть и по итогу происходит двойное "извлечение" данных, например было 100шт, извлечь надо было 4шт, оно извлечет 8шт, первые 4 будут утеряны. Не зависит от того какие операции сейчас на сервере происходят (выборка SQL), мб бэкап файлов или что-то еще, не играет роли (это уже исследовано за больше чем год, проблема есть и её не смогли решить).

Значит что необходимо сделать сейчас (хранить эти строчки, а их бывает очень много и они весят по 5-10МБ), необходимо каждый раз когда происходит увеличение или уменьшение делать подсчёт этих строчек для того чтобы на стороне проверяющего было понятно, цифра уменьшилась или увеличилась (чтобы в будущем админам понять, надо делать что-то с данными или нет).
Если использовать MySQL то в каком типе данных хранить это? Не поедет БД? Мб что-то есть лучшее для хранения такого формата данных?

Ах да, важно чтобы можно было в любой момент без долгих ожиданий выгрузить эти самые данные грубо говоря как это делает PHP file_get_contents

p.s. сейчас File_get_contents получает содержимое файла через ключи блокировки файла (создается очередь, чтобы параллельно другой процесс не смог ничего сделать). Буду рад выслушать предложения, задачка вроде легкая, но по коду всё ок, даже есть доп.проверки на взятие строк, но они не помогают в решении проблемы...
Дополню, сервер 8 ядер, 16 потоков, SSD (Raid 0 зеркалирование), оперативной памяти свободной много (100гб+)
  • Вопрос задан
  • 922 просмотра
Пригласить эксперта
Ответы на вопрос 4
@rPman
5-10МБ данные! не надо в базу данных, это плохо!

Настоятельно рекомендую, если это возможно, перенесите обработку строк на клиент, с вероятностью в 99% это не составит труда если вообще требуется (а судя по всему вы просто тупо читаете файл и отдаете его в теле запроса).

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

Получается вместо отдачи файлов бакэенд должен просто говорить клиентам, какие ссылки нужно открыть, чтобы получить эти файлы (например идентификаторы - они же имена файлов)
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
То есть у вас единственный затык - "исчезновение" данных из файлов? Которое по факту оказывается и не исчезновением, потому что данные на месте? Тогда не мучайтесь с адаптацией в БД, однако решайте вопрос с "ложным исчезновением" данных.

P.S. Хотя бы проверьте, что блокировка действительно блокирует.
Ответ написан
2ord
@2ord
Суть в том, что эти строчки периодически извлекаются по 1-2шт, когда-то больше, а когда-то меньше, можно и всё сразу, не так важно.
Нужно знать по какому принципу извлекают те самые строки.

Типа grep по строкам?
Если да, то поиск LIKE не особо эффективен.

Или там даты, timestamp?
Тогда лучше хранить в СУБД с колонкой datetime.

А может ключ-значение?
Тогда или две колонки в реляционной СУБД или же k/v хранилище.

Или же в них неструктурированные данные, просто текст? К примеру, журнал (log) может иметь некоторую структуру и парсингом расщепляется на составные части. Graylog, FluentD, ...

Исходя из описания проблемы чувствуется, что СУБД заменит весь этот огород, но нужно знать какие данные внутри и каким образом используются.

Я бы посоветовал расписать в вопросе больше о данных, если это возможно.
Ответ написан
@aleksmir
Системный администратор, программист
Пишите на MySQL. Самое верное дело. Там потерь не бывает. Движок InnoDB.
По структуре таблиц зависит от исходных данных.
Напишите сколько у вас примерно файлов сейчас. И какой прирост - т.е. в каком количестве они добавляются ежедневно. Тогда можно будет прикинуть структуру.
Второй вопрос - как нужно делать выборку этих строк? По текстовому поиску или ещё как-то? По заголовкам имен файлов или по всему тексту?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы