12
Борьба с нагрузкой на MySQL Андрей Лещук

DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Embed Size (px)

Citation preview

Page 1: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Борьба с нагрузкой на MySQL

Андрей Лещук

Page 2: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Особенности проекта и причины нагрузки

на MySQL

● Импорт и обработка большого количества товаров

(более 2 млн.)

● Проведение сервисных действий на сайте:

○ Модерация товаров

○ Сортировка товаров

○ Обновления наличия товаров

○ Генерация sitemap.xml

○ Рассылки пользователям

○ Многое другое

Page 3: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Проблемы которые пришлось решать

● Повышение производительности сервиса

● Нагрузка на MySQL при большом количестве

запросов

● Снижение общей нагрузки на сервер

Page 4: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Выбор решения

● Разбиение ресурсоемких процессов на

параллельные потоки

● Разделение сервиса на несколько серверов

Page 5: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Разделение сервиса на несколько

серверов

СЕРВИС

Сервер S1 Сервер S2

Page 6: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Техническая реализация

● Алгоритм распределения запросов между разными

серверами

● Разработка своего драйвера для работы с БД

Page 7: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Алгоритм распределения запросов

Сервер S2

Сервер S1

SELECT

INSERT/UPDATE/DELETE

RE

PL

ICA

TIO

N

Page 8: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Распределения запросов на разные

сервера

● hook_exit()

Запись времени последнего запроса

INSERT/UPDATE/DELETE

● hook_boot()

Определение target запросов (default или slave)

● При запросах проверяем target и направляем

запросы на нужный сервер

Page 9: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Драйвер для работы с MySQL

● Переопределение класса SelectQuery() для

определения target запросов (default или slave)

● Переопределение классов InsertQuery(),

UpdateQuery(), DeleteQuery(), MergeQuery() для

фиксации времени запросов

Page 10: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Распределение запросов в отдельные

таблицы

● Таблицы которые не хранят полезной информации

на сайте: watchdog, queue etc.

● Все запросы на них должны идти на другую

БД/Сервер

● Не нужно фиксировать время

INSERT/UPDATE/DELETE запросов

● Не нужно определять target для SELECT запросов

(target всегда один)

Page 11: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

В итоге

● Снизили нагрузку на Сервере S1 для

пользователей

● Увеличили производительность Сервера S2 для

сервисных действий

● Обеспечили актуальность данных при отставании

или сбоях репликации

● Решили проблему масштабируемости системы

Page 12: DrupalTour. Vinnytsia — Борьба с нагрузкой на MySQL (Andrey Leshchuk, LetyShops)

Спасибо за внимание!Рад выслушать вопросы.