Проектирование кластера XtraDB

У нас есть приложение, состоящее из микросервисов, подключенных к одному и тому же экземпляру Percona DB. В настоящее время это только один экземпляр с 16 ядрами/32 ГБ памяти без репликации. Одна из наших проблем заключается в том, что иногда один из наших микросервисов вызывает такую ​​высокую нагрузку на базу данных (даже просто чтение), что делает все микросервисы непригодными для использования.

Думаем над созданием кластера Percona из трех нод с выбором нод для каждого микросервиса. Службы, которые в основном «пишут», будут подключаться к одному экземпляру, а остальные — к двум другим экземплярам. Таким образом, если какой-то микросервис вызывает высокую нагрузку при чтении, он не должен полностью перегружать нашу инфраструктуру.

Мои вопросы:

  1. Это вообще хорошая идея? Не лучше ли позволить ProxySQL разделять трафик? ProxySQL, возможно, означает отсутствие изоляции.
  2. Должны ли мы предпочесть иметь больше экземпляров с меньшим количеством ЦП или, скорее, меньше экземпляров с большим ЦП? Наличие большего количества экземпляров означало бы большую изоляцию для запуска микросервисов в случае высокой нагрузки.
  3. Это хорошая идея иметь узлы с разными процессорами? Например, пусть «пишущий экземпляр» имеет больше ЦП по сравнению с «читающим экземпляром».
  4. Если мы направляем микросервисы на «их экземпляр Percona», можем ли мы по-прежнему иметь какую-то HA, когда их экземпляр полностью умирает?

Примечание. Мы, вероятно, будем использовать Percona XtraDB для развертывания по щелчку в GCE: https://console.cloud.google.com/marketplace/details/click-to-deploy-images/percona?project=goout.-cloud&folder&organizationId=74390800864


person Vojtěch    schedule 23.07.2018    source источник
comment
Какой у вас запрос? Неужели нельзя оптимизировать?   -  person Constantin Galbenu    schedule 23.07.2018
comment
У нас есть тысячи запросов, и иногда есть один, который не оптимизирован. Иногда у нас бывают пики посетителей - из 500 онлайн мы можем получить десятки тысяч. Тогда этот единственный запрос убивает всю базу данных. Конечно, мы идентифицируем этот запрос и оптимизируем его, но я ищу что-то, чтобы предотвратить эти несчастные случаи.   -  person Vojtěch    schedule 24.07.2018
comment
У вас есть учетная запись на dba.stackexchange.com Почему бы вам не опубликовать вопрос там? Этот сайт для программистов.   -  person fancyPants    schedule 26.07.2018
comment
Кроме того, вы уверены, что в определенное время у вас больше посетителей, или просто количество потоков растет, потому что ваш зловещий запрос удерживает некоторые блокировки? Вы исследовали журнал медленных запросов в такие времена? Вы видели вывод show engine innodb status\G, когда запрос убивает сервер? На мой взгляд, вашим приоритетом должен быть поиск запроса и его оптимизация, а не думать о кластерах (пока).   -  person fancyPants    schedule 26.07.2018
comment
Мы продаем билеты на мероприятия, и когда начинается какая-то распродажа, мы можем получить тысячи посетителей одновременно, тогда как обычно у нас около 500 человек онлайн. Так что да, у нас есть эти вершины.   -  person Vojtěch    schedule 26.07.2018
comment
@fancyPants В stackoverflow есть 529 430 вопросов только для MySQL. Этот сайт предназначен не только для программистов.   -  person utdrmac    schedule 29.07.2018
comment
@utdrmac Есть разница между вопросами, касающимися sql (и конкретных функций mysql и т. д.), которые используют программисты, и администрированием базы данных. Этот вопрос явно адресован не программистам, а администраторам. Когда вы приводите некоторые факты, пожалуйста, делайте это правильно.   -  person fancyPants    schedule 29.07.2018
comment
Сложность выделения узлов для конкретных задач, вероятно, будет безумием.   -  person Rick James    schedule 17.08.2018


Ответы (2)


  1. Да, это хорошая идея. Использование ProxySQL с PXC также является хорошей идеей. Используя ProxySQL, вы можете: А) реализовать «записывающую» HA, поместив два узла в одну и ту же группу хостов, один со сверхвысоким весом (10000000), а другой с низким (10). Если узел с большим весом отключается, ProxySQL без проблем начнет отправлять трафик на другой узел. B) поместите все узлы в отдельную группу хостов «читатель» с одинаковыми весами, таким образом распределяя нагрузку на трафик записи. C) При желании создайте 3-ю группу хостов только с 1 узлом и создайте правило запроса для сопоставления шаблона по схеме, пользователю или шаблону запроса для вашего запроса «высокой нагрузки» и прямого выполнения на этом конкретном узле. ProxySQL также позволит вам кэшировать некоторые из этих тяжелых запросов.

  2. Лично я бы выбрал меньше экземпляров с более высоким процессором, если вы не знаете, что ваша сеть надежна. В PXC все узлы должны синхронно подтверждать все транзакции. Чем больше у вас узлов, тем дольше эти операции могут выполняться с задержкой. Самое быстрое, что вы можете зафиксировать, — это время между двумя самыми медленными узлами. Пожалуйста, убедитесь, что у вас всегда нечетное количество узлов, если только вы не продвинулись с настройкой pc.weight (но это очень сложно сделать правильно).

  3. В общем случае с MySQL все узлы должны иметь одинаковую конфигурацию. Если ваш мастер более мощный, чем рабы, вообще говоря, рабы не смогут идти в ногу с объемом. При использовании PXC это означает, что вы будете чаще сталкиваться с событиями управления потоком, что может привести к остановке приложения. Если node2 не может писать так же быстро, как node1, node2 отправляет сообщения управления потоком (кричит о помощи), прося другие узлы замедлить работу, пока он догоняет.

  4. Да, используя ProxySQL, как описано в #1.

Примечание: оптимизация запросов — это способ №1 «ускорить работу». Не всегда бросайте аппаратное обеспечение на проблему. Стоит потратить время на изучение журнала медленных запросов и попытаться улучшить запросы. Иногда один индекс может иметь значение день/ночь.

Отказ от ответственности: я являюсь старшим инструктором Percona и провел множество полнодневных интенсивных учебных занятий по PXC и ProxySQL.

person utdrmac    schedule 28.07.2018
comment
Спасибо за подробный ответ, это очень полезно. Еще один вопрос: если у нас высокая нагрузка на запись на одном из серверов, будет ли синхронизация потреблять такую ​​же нагрузку на других мастерах или она будет оптимизирована, чтобы меньше потреблять процессор? - person Vojtěch; 30.07.2018
comment
@Vojtěch Высокая нагрузка по записи на узле 1 == высокая нагрузка по записи на всех узлах. (Боковой узел, это не ограничение MySQL; это повлияет на все RBMS.) Если вы вставите 1000 строк на node1, все другие подчиненные/резервные узлы также должны вставить 1000 строк, чтобы оставаться в синхронизации. В асинхронной репликации вы можете несколько оптимизировать, используя репликацию на основе строк, а не на основе операторов; вы можете использовать «минимальный» размер события binlog, но конечный результат останется прежним. Это распространенное заблуждение, что количество доступных модулей записи в кластере/группе равно увеличению емкости записи. - person utdrmac; 30.07.2018
comment
Нечетное количество узлов для Galera (он же PXC) не является обязательным; это миф. - person Rick James; 17.08.2018
comment
Имейте в виду, что вам может понадобиться обратиться к сценарию критического чтения через wsrep_sync_wait. - person Rick James; 17.08.2018

Похоже, проблема в ваших шипах. И вам нужно как можно быстрее обрабатывать флуд, так как пользователи ожидают получить эти горячие билеты.

Добавление очереди только усложняет и замедляет обработку, когда действия выполняются быстро. Итак, «Не ставьте в очередь, просто сделайте это». Кроме того, обратите внимание, что очередь будет временно реплицирована на другие узлы, что сделает постановку/удаление из очереди, возможно, медленнее, чем просто действие по запросу!

Соединение — сделайте что-нибудь — отключение требует времени. Большая часть времени на самом деле не связана с «чем-то», а скорее над этим. Я обнаружил, что если активно менее 10 подключений, все работает гладко. Но если запустить удается больше 10, то InnoDB начинает спотыкаться сам о себя.

Вы когда-нибудь были в переполненном магазине? Допустим, есть место на 200 человек и тележки во всех проходах. Но если вы пытаетесь привлечь 210 покупателей, все замедляются, просто пытаясь побороться за позицию. Пропускная способность снижается, возможно, до такой степени, что люди хотят отказаться от своей тележки и уйти. Вы когда-нибудь видели магазин с очередью перед входом? Они решили проблему, не допуская более 200 покупателей одновременно!

Таким образом, решение вашей проблемы может быть вне MySQL. Если у вас есть веб-страница с выходом на MySQL, уменьшите количество используемых «потоков». У Apache, например, есть такие, плюс «бэклог» для постановки в очередь на уровне подключения к Apache. В MySQL есть max_connections и backlog, которые, возможно, работают одинаково, но значение по умолчанию для max_connections (151) слишком высокое. 151 студент, столпившийся вокруг автомата с газировкой в ​​магазине, может быть лучшей аналогией.

Больше узлов/больше ЦП может а может и не быть частью ответа; это зависит от того, какие замки вынимает "что-то".

Монитор Threads_running; если оно вырастет до нескольких десятков, то я подозреваю, что мои комментарии применимы. Если программа монитора не может подключиться для проверки этого GLOBAL STATUS, то я знаю, что это применимо.

person Rick James    schedule 17.08.2018