Upload
drupaltour
View
450
Download
0
Embed Size (px)
Citation preview
Борьба с нагрузкой на MySQL
Андрей Лещук
Особенности проекта и причины нагрузки
на MySQL
● Импорт и обработка большого количества товаров
(более 2 млн.)
● Проведение сервисных действий на сайте:
○ Модерация товаров
○ Сортировка товаров
○ Обновления наличия товаров
○ Генерация sitemap.xml
○ Рассылки пользователям
○ Многое другое
Проблемы которые пришлось решать
● Повышение производительности сервиса
● Нагрузка на MySQL при большом количестве
запросов
● Снижение общей нагрузки на сервер
Выбор решения
● Разбиение ресурсоемких процессов на
параллельные потоки
● Разделение сервиса на несколько серверов
Разделение сервиса на несколько
серверов
СЕРВИС
Сервер S1 Сервер S2
Техническая реализация
● Алгоритм распределения запросов между разными
серверами
● Разработка своего драйвера для работы с БД
Алгоритм распределения запросов
Сервер S2
Сервер S1
SELECT
INSERT/UPDATE/DELETE
RE
PL
ICA
TIO
N
Распределения запросов на разные
сервера
● hook_exit()
Запись времени последнего запроса
INSERT/UPDATE/DELETE
● hook_boot()
Определение target запросов (default или slave)
● При запросах проверяем target и направляем
запросы на нужный сервер
Драйвер для работы с MySQL
● Переопределение класса SelectQuery() для
определения target запросов (default или slave)
● Переопределение классов InsertQuery(),
UpdateQuery(), DeleteQuery(), MergeQuery() для
фиксации времени запросов
Распределение запросов в отдельные
таблицы
● Таблицы которые не хранят полезной информации
на сайте: watchdog, queue etc.
● Все запросы на них должны идти на другую
БД/Сервер
● Не нужно фиксировать время
INSERT/UPDATE/DELETE запросов
● Не нужно определять target для SELECT запросов
(target всегда один)
В итоге
● Снизили нагрузку на Сервере S1 для
пользователей
● Увеличили производительность Сервера S2 для
сервисных действий
● Обеспечили актуальность данных при отставании
или сбоях репликации
● Решили проблему масштабируемости системы
Спасибо за внимание!Рад выслушать вопросы.