danielnewman
@danielnewman
Front-end

Как вынести большую таблицу из базы и сделать её общей?

В нашем туристическом проекте есть БД размером в ~7Gb. И дампы базы превращаются в настоящий многочасовой ад. К моем большому удивлению (я с базой едва знаком) на непосредственно бизнес-данные приходится до 100Mb, а все остальное место занимают таблицы логов и таблицы, формирующиеся по запросам системы к внешним поставщикам:

system_logs 4.4Gb
hotel_ostrovok_images 1.6Gb
hotel_ostrovok 0.7Gb
hotel_ostrovok_amenities 0.2Gb

Таких БД - под каждого разработчик - 6 штук.

Мало того, что мы с каждым новым разработчиком теряем по 6Gb однотипных таблиц, так это выжирает время и лочит, в процессе дампа, всю базу.

Есть красивая теория на percona, но мы ищем практику. Кто это и как делал, что приобрел и что потерял?
  • Вопрос задан
  • 425 просмотров
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Imho:
1) БД 7 гигов как бы не много. Оно должно дампиться за несколько минут.
2)
- Зачем каждому разработчику актуальный дамп продакшена?
- Зачем это все хостить на боевом сервере?
3) Идея писать логи в основную БД весьма порочна. Поднимите под неё какую нибудь монгу, ну или хотя бы отдельный sql сервер.
4) Идея хранить картинки в базе конечно имеет право на жизнь, но для этого нужны веские аргументы.
Мне кажется вполне можно вынести работу с картинками в отдельный сервис (единый для всех) и хранить это все дело в файловой системе.
Ответ написан
landergate
@landergate
IT-шный jack-of-all-trades
Если самоцель такого выноса - прекратить влияние дампов на доступность чтения с БД, то, при условии, что ваши таблицы в InnoDB и у вас включён binlog, вы можете снимать копии БД с помощью xtrabackup (innobackupex), не останавливая службу и не прерывая доступ к таблицам.
Изменения, произошедшие с момента старта бекапа, "доедут" из бинлога на завершении процесса.
Снимать копии можно как на тот же сервер, так и стримить их (без использования локального диска) на другой.

Если таблицы в MyISAM, можно настроить SLAVE-сервер и снимать дампы с него, не влияя на доступность основного.

Это практика.

Правда из контекста не совсем ясно - это некие регулярные дампы данных для резервирования, или это ручные дампы для разработчиков, которые они могут спонтанно снять в любое время через phpmyadmin?
Если второе, то это не исправить изменением архитектуры. Для чего dev'ы дампят базу с логами? Почему они не могут задампить только нужные мелковесящие таблицы, или даже ограничиться их структурой, чтобы не задевать другие таблицы?
Если для разработки необходим весь снэпшот базы, я бы сделал его снятие регулярным с xtrabackup и публиковал разработчикам для скачивания по сети из одного конкретного места, чтобы никто больше не подключался к продакшену и не делал никаких дампов с продакшена.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы