Вот уже больше года мы активно используем Azure SQL для своих проектов.
Хотелось бы поедлиться опытом и подводными камнями на которые мы наткнулись за последний год.
Решил остановиться и описать один отдельный проект в общих чертах активно использующий azure SQL.
Суть проекта сводиться в обработке большого потока данных от удалённых мобильных клиентов.
На текущий момент база данных пополняется примерно 38-45 GB в месяц.
Наш выбор упал на Azure SQL поскольку:
1) Мы решили вывести весь проект-сервис в облако
2) Работа с MS SQL нашей комманде была уже очень знакома
3) Мы поверили в отказоустоичивость и стабильность работы базы данных
4) Есть возможность легко масштабировать производительность бд
На текущий момент в течении 24 часов мы обрабатываем примерно 100-000 подключений и сессий загрузки данных в БД в том числе примерно 1.2 GB текста каждых 24 часа.
Всё это работает в связке: Удалённый клиент -> Web сервис -> Azure SQL
По сути, удалённый клиент выгружает свои данные на веб сервис, который в свою очередь обрабатывает эти данные и загружает в базу данных.
Как видно на картинке, на момент написания статьй к базе данных подключено 903 обработчика а в пиковые моменты эта цифра доходит до 1800.
Собственно одна из проблем с которой мы столкнулись:
При пиковых нагрузках база данных не справлялась и просто зависала отклоняя все подключения таймайутом.
Обратившись в суппорт Майкрософта нам обьяснили что мы попросту слишком загружаем базу данных и она не способна обработать все наши запросы.
Как оказалось проблема скрывалась в следующем:
У каждой базы данных есть определённый размер лога транзакции и как только размер лога превышал допустимое значение база данных попросту зависала.
Обратившись в суппорт Майкрософта нам просто посоветовали наш sql запрос:
DELETE FROM [unknown_table] WHERE [date_time] < '12-01-2012' разбить на несколько поочерёдно запускаемых.
DELETE FROM [unknown_table] WHERE [date_time] < '01-01-2012'
DELETE FROM [unknown_table] WHERE [date_time] < '02-01-2012'
DELETE FROM [unknown_table] WHERE [date_time] < '03-01-2012'
и т.д.
По сути смешное решение, но эти тонкости пришлось учитывать в дальнейшем.
Данное замечание справедливо для любого SQL запроса буть до SELECT,DELETE, UPDATE.
В принципе нам пришлось практически переделать способ загрузки, очистки, выборки данных учитывая этот момент. Но об этом уже в следующей статье.
Автор: DenisIT