- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Приветствую!
Есть небольшое файловое хранилище. Условия стандартные - много запросов чтения и мало записи.
Есть таблица 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й вариант?
Приветствую!
Первый вроде наиболее логичный но напрягает количество запросов - не лучше ли реализовать 3й вариант?
Зависит конечно от задачи. Может вообще не "городить огород" со своим распределенным хранилищем а использовать что-то типа MongoDB GridFS ? А то есть вероятность получить ненужные грабли в том месте, где их уже давно нет... Хотя если речь идёт про БОЛЬШИЕ файлы, то лучше всё-таки своё и отдавать nginx'ом...
Вобщем если делать, то однозначно первый вариант. Только, как вариант, я бы подумал над тем, чтобы primary key был в виде MD5 (или SHA1) от загружаемого файла.
Ну и insert, во все таблицы можно делать одним запросом, вернее одним батчем :) Также, как вариант улучшения быстродействия, можно чтобы ссылки сразу включали в себя ID, чтобы не делать 2 запроса при чтении, а сразу выбирать из таблицы серверов.
будет дублирование всей технической информации о файле, это нельзя.
на этом уже остановились как на факте.
Сервер будет заниматься только тем что по запросу пользователя писать статистику и отдавать ему header(Location: .....) потому там будет десяток апачей с Keep-Alive. А сами сервера с контентом на которые редирект - nginx'ы.
понятия не имею о чем Вы, пошел курить мануалы. Но добавлений там не так много, можно и 2 запроса.
Меня больше волнует 2 запроса при чтении или 3й вариант с 1 запросом + explode + random(0,count($array))
Сохранять все на главном сервере + на остальных нгинксом проксировать и кешировать.
Меня больше волнует 2 запроса при чтении или 3й вариант с 1 запросом + explode + random(0,count($array))
Объясните чем Вас волнует 2 запроса (или 1 с join'ом) при чтении??? У Вас сколько чтений в секунду 100000 чтоль ????
А Вы уверены, что узким местом будет база данных?
да, база будет одна а апачи в режиме кипэлайв могут быстро обрабатывать запросы и отправлять клиенту редиректы. Трафф минимальный.
10 в секунду могут уже вызывать проблемы. Я считаю что чем меньше запросов тем лучше и быстрее. Одни только операции чтения разных файлов (таблиц) с диска