Как правильно сделать архитектуру для высоко нагруженного проекта и какую выбрать БД?
Задача сделать портал подобный пульсу цен - pulscen.ru
Что требуется:
- Основной сайт(test.ru) - авторизация/регистрация, создание под сайта, панель управлением, товары с под сайтов, фильтр
- Под сайты(.test.ru), которые создаются автоматический при создании на основном сайте
Я захожу на основной сайт(test.ru), регистрирую свою компанию и автоматически создается сайт d3.test.ru(3 - порядковый номер нового сайта ++) выдаются права на редактирования данного сайта
Я могу добавить товар, при добавлении товара на мой новый сайт(d3.test.ru) нужно чтобы он дублировался на основной сайт test.ru
На основном сайте показываются все товары, которые были добавлены на под сайтах(.test.ru) с указанием компании, адреса сайта на котором был добавлен товар
Как я это сделал:
За основу взят framework laravel и бд MySQL Решил сделать 2-е отдельные платформы 1 - для основного сайта портала test.ru 2 - для всех под сайтов *.test.ru Обе платформы подключены к одной базе
Немного о том как все устроено
1 - основной сайт test.ru В бд используются таблицы
categories - Общие категории для использования на под сайтах *.test.ru id | title | slug | description | photo | meta_title | meta_description | view
prods - Все товары с под сайтов *.test.ru id | title | slug | up_text | down_text | category_id | price | nalichie | dostavka | rating | meta_title | meta_description | view
sites - Все созданные сайты id | name | site_url | email | phone | city_id | rating | prefix | rating
2 - под сайты *.test.ru Для каждого под сайты используется свой фаил с конфигурацией .env в нем отличия только в префиксе для БД Для каждого под сайта используются свои таблицы, они отличаются префиксом d3_(3 - порядковый номер сайта)
d3_prods - Все товары сайта d3.test.ru id | prod_id | title | slug | up_text | down_text | category_id | price | nalichie | dostavka | rating | meta_title | meta_description | view - появился новый столбик prod_id в нем указан id товара расположенного на основном сайте То есть при добавлении товара на под сайт d3.test.ru товар сначала добавляется в таблицу d3_prods, затем пользователь выбирает публиковать/не публиковать на портале test.ru и если да, то это товар добавляется в таблицу prods - от сюда берем его id и обновляем поле prod_id в таблице d3_prods для этого товара (поле prod_id нужно, в случае редактирования товара на под сайте, чтобы по prod_id найти товар в таблице prods и в нем также изменить данные)
d3_settings - настройки для под сайта(название, описание, логотип, телефон, емаил, адрес) d3_seos - сео настройки для страниц(meta_title, meta_description) d3_pages - динамические страницы
И пока все шло не плохо, но когда уже было создано более 150 под сайтов и добавлено более 5мл товаров, все начало ужасно виснуть, в БД практически не реально зайти
При том, что используется на мой взгляд хороший сервер Процессор 26 X Intel(R) Xeon(R) Silver 4114 CPU @ 2.20GHz Оперативная память 6000 / 30249 MiB (в среднем используется / всего) Размер дискового пространства 4.19 TiB
Вопрос? Как правильно сделать структура БД для подобной задачи, какую БД выбрать?