БД файлового хранилища подскажите структуру

Metal Messiah
На сайте с 01.08.2010
Offline
163
933

Приветствую!

Есть небольшое файловое хранилище. Условия стандартные - много запросов чтения и мало записи.

Есть таблица files, в которой хранятся имена и другая информация о файле.

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

Подскажите как лучше организовать структуру БД - что будет быстрее работать?

Вариант 1. Таблица файлов (primary id и индекс - текстовое имя) и таблица связей файл-сервер (2 числовые колонки id_f id_s, id_f простой индекс). Соответственно при заливе файла в хранилище идет 4 запроса (1 в таблицу файлов и 3 в таблицу связей = 3 сервера), при чтении 2 запроса (инфа о файле + получение списка серверов).

Вариант 2. простейший. Таблица файлов имеет колонки server1 server2 server3 int(2) unsigned и в случае ненулевых значений - файл там есть. По 1 запросу на чтение и запись. Если надо будет сделать возможность залива на 4й и более сервера прийдется добавлять колонку.

Вариант 3. Таблица файлов имеет поле servers = '1,3,5' (в строку через запятую, обрабатываются explode / implode. 1 запрос как на чтение так и на запись.

Первый вроде наиболее логичный но напрягает количество запросов - не лучше ли реализовать 3й вариант?

anonymous, думай что говоришь и не забывай подписать отзыв :)
babnicks
На сайте с 23.10.2009
Offline
47
#1
Metal_Messiah:
Приветствую!
Первый вроде наиболее логичный но напрягает количество запросов - не лучше ли реализовать 3й вариант?

Зависит конечно от задачи. Может вообще не "городить огород" со своим распределенным хранилищем а использовать что-то типа MongoDB GridFS ? А то есть вероятность получить ненужные грабли в том месте, где их уже давно нет... Хотя если речь идёт про БОЛЬШИЕ файлы, то лучше всё-таки своё и отдавать nginx'ом...

Вобщем если делать, то однозначно первый вариант. Только, как вариант, я бы подумал над тем, чтобы primary key был в виде MD5 (или SHA1) от загружаемого файла.

Ну и insert, во все таблицы можно делать одним запросом, вернее одним батчем :) Также, как вариант улучшения быстродействия, можно чтобы ссылки сразу включали в себя ID, чтобы не делать 2 запроса при чтении, а сразу выбирать из таблицы серверов.

100% защита от спам-ботов (https://www.keycaptcha.com)
Metal Messiah
На сайте с 01.08.2010
Offline
163
#2
а сразу выбирать из таблицы серверов.

будет дублирование всей технической информации о файле, это нельзя.

отдавать nginx'ом

на этом уже остановились как на факте.

Сервер будет заниматься только тем что по запросу пользователя писать статистику и отдавать ему header(Location: .....) потому там будет десяток апачей с Keep-Alive. А сами сервера с контентом на которые редирект - nginx'ы.

вернее одним батчем

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

Меня больше волнует 2 запроса при чтении или 3й вариант с 1 запросом + explode + random(0,count($array))

Mik Foxi
На сайте с 02.03.2011
Offline
1215
#3

Сохранять все на главном сервере + на остальных нгинксом проксировать и кешировать.

Антибот, антиспам, веб фаервол, защита от накрутки поведенческих: https://antibot.cloud/ (Зеркало: https://антибот.рф/ ) Форум на замену серчу: https://foxi.biz/
babnicks
На сайте с 23.10.2009
Offline
47
#4
Metal_Messiah:

Меня больше волнует 2 запроса при чтении или 3й вариант с 1 запросом + explode + random(0,count($array))

Объясните чем Вас волнует 2 запроса (или 1 с join'ом) при чтении??? У Вас сколько чтений в секунду 100000 чтоль ????

P
На сайте с 08.03.2007
Offline
250
#5

А Вы уверены, что узким местом будет база данных?

Metal Messiah
На сайте с 01.08.2010
Offline
163
#6
А Вы уверены, что узким местом будет база данных?

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

Объясните чем Вас волнует 2 запроса (или 1 с join'ом) при чтении??? У Вас сколько чтений в секунду 100000 чтоль ????

10 в секунду могут уже вызывать проблемы. Я считаю что чем меньше запросов тем лучше и быстрее. Одни только операции чтения разных файлов (таблиц) с диска

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий