Клиентская (Python) балансировка нагрузки сервера MySQL - PullRequest
0 голосов
/ 05 мая 2018

У меня есть интересная проблема, которую я хотел бы найти решение.

У меня есть сервер MySQL, работающий в Ubuntu (16.04). У меня также есть несколько серверов, которые хранят системную информацию, такую ​​как температура процессора, данные сетевого трафика и загрузки процессора, в базе данных на сервере MySQL. Для этого на каждом сервере запущено несколько программ на Python, которые собирают данные и отправляют их в базу данных.
На этих серверах у меня также есть несколько сценариев, которые периодически запрашивают у базы данных исторические данные, которые они затем отображают и представляют на веб-странице.

То, как я сейчас это настроил, приводит к тому, что все серверы стремятся сделать запрос к базе данных примерно в одно и то же время. Это вызывает высокую нагрузку на сервер MySQL, за которой следует длительный период практически без нагрузки.

Какие варианты есть для меня (предпочтительно Python на стороне клиента), которые могут помочь мне более равномерно распределить нагрузку на сервер SQL?

1 Ответ

0 голосов
/ 07 мая 2018

Это обычно известно как штамповка или проблема с громовым стадом . Внезапно тонна клиентов чего-то хочет, и тогда активность возвращается к нулю. Есть разные способы справиться с этим. Если у вас есть посредник между клиентом и сервером, например, балансировщик нагрузки, вы можете использовать его для распределения нагрузки и, возможно, даже для раскрутки новых экземпляров сервера по мере необходимости.

В случае прямого подключения клиент-MySQL это обычно не вариант. Возможно, вы можете переключиться на реплицированные подчиненные устройства только для чтения, которые могут легче поглощать воздействие (то есть масштабироваться горизонтально). Или вы получаете больший сервер, который имеет лучшую производительность при пиковой нагрузке. Конечно, если в 99% случаев нет никакой нагрузки, эти решения не очень рентабельны.

Дешевое решение состоит в том, чтобы избежать одновременного перехода всех клиентов на сервер. Либо сместите каждого клиента индивидуально (например, запланируйте его работу cron на 0 * * * *, 5 * * * *, 10 * * * * и т. Д.), Либо просто задерживайте каждого клиента на случайную величину каждый раз (sleep(randint(0, 360)) в Python, sleep $((RANDOM % 360)) && ... в bash ).

...