Рубрики
Uncategorized

MySQL – масштабируемая балансировка нагрузки 3: ослепительный

Автор оригинала: David Wong.

Основная идея балансировки нагрузки проста:

Максимально возможная средняя нагрузка в кластере серверов.

Основываясь на этой идее, мы обычно устанавливаем Балансировщик нагрузки 。 Роль балансировщика нагрузки заключается в том, чтобы перенаправить запрошенное соединение на наиболее простаивающий доступный сервер. На рисунке 1 показана настройка балансировки нагрузки большого веб-сайта. Один отвечает за HTTP-трафик, а другой-за доступ к MySQL.

Балансировка нагрузки имеет пять общих целей:

  1. Расширяемость 。 Балансировка нагрузки очень полезна для некоторых расширений, таких как чтение данных из резервной базы данных, когда чтение и запись разделены.
  2. Высокая эффективность 。 Балансировка нагрузки помогает более эффективно использовать ресурсы, поскольку она может контролировать направление запросов.
  3. Удобство использования 。 Гибкая схема балансировки нагрузки может значительно повысить доступность услуг.
  4. Прозрачность 。 Клиенту не нужно знать, есть ли балансировщик нагрузки или сколько машин находится за балансировщиком нагрузки. То, что представлено клиенту, – это прозрачный сервер.
  5. Единообразие 。 Если приложение отслеживает состояние (транзакции базы данных, сеансы веб-сайта и т.д.), балансировщик нагрузки может направлять соответствующие запросы на тот же сервер, чтобы предотвратить потерю состояния.

Как правило, существует два способа реализации балансировки нагрузки: Прямое подключение и Представляем промежуточное программное обеспечение

1 прямое подключение

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

1.1 прочитайте разделение репликации на запись

Таким образом, вероятно, возникнет одна из самых больших проблем: Грязные данные 。 Типичный пример-когда пользователь просматривает сообщение в блоге и перезагружает страницу, не видя нового комментария.

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

Итак, для приложений с низкой устойчивостью к загрязненным данным, как отделить чтение от записи? Далее мы еще больше дифференцируем разделение чтения и письма. Я верю, что вы всегда можете найти подходящую вам стратегию.

1) разделение на основе запроса

Если только несколько данных в приложении не могут переносить грязные данные, мы можем назначить все операции чтения и записи, которые не могут переносить грязные данные, ведущему. Другие запросы на чтение назначаются ведомому устройству. Эту стратегию легко реализовать, но если существует несколько запросов, допускающих “грязные” данные, вполне вероятно, что резервная база данных не может быть эффективно использована.

2) на основе разделения грязных данных

Это небольшое улучшение стратегии разделения запросов. Необходимо выполнить некоторую дополнительную работу, например, позволить приложению проверить задержку репликации, чтобы определить, являются ли данные резервной базы данных актуальными. Многие приложения для отчетов могут использовать эту стратегию: им нужно только скопировать данные, загруженные ночью, в интерфейс резервной базы данных, и им все равно, будут ли они соответствовать основной базе данных.

3) на основе разделения сеансов

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

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

Эта стратегия представляет собой хороший компромисс между простотой и эффективностью и является более рекомендуемой стратегией.

Конечно, если у вас достаточно идей, вы можете объединить стратегию разделения на основе сеансов со стратегией мониторинга задержки репликации. Если пользователь обновил данные 10 секунд назад, а все резервные базы данных задерживаются в течение 5 секунд, пользователь может смело считывать данные из резервной базы данных. Следует отметить, что вы должны выбрать одну и ту же резервную базу данных для всего сеанса. В противном случае, если задержка нескольких резервных баз данных является несогласованной , пользователи будут обеспокоены.

4) на основе разделения глобальной версии/сеанса

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

На самом деле, многие стратегии разделения чтения и записи требуют Отслеживать задержку репликации Чтобы определить распределение запросов на чтение. Следует, однако, отметить, что значения секунд? Сзади? Главный столбец, полученный с помощью статуса show slave, не точно отражает задержку. Мы можем использовать инструмент PT heartbeat в percona toolkit, чтобы лучше отслеживать задержки.

1.2 изменение DNS-имени

Для некоторых простых приложений DNS может быть создан для различных целей. Самый простой способ-для сервера, доступного только для чтения, иметь DNS-имя (читать. mysql -db.com) и другое DNS-имя (write.mysql-db.com) для сервера, ответственного за операцию записи. Если база данных-получатель может поддерживать связь с базой данных-источником, DNS-имя, доступное только для чтения, будет указано на базу данных-получатель. В противном случае он будет направлен в базу данных-источник.

Эту стратегию очень легко реализовать, но есть большая проблема: DNS нельзя полностью контролировать.

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

Эта стратегия более опасна, даже если вы можете изменить файл/etc/hosts, чтобы избежать проблемы, которую DNS не может полностью контролировать, но все равно это идеальная стратегия.

1.3 передача IP-адреса

Балансировка нагрузки осуществляется путем передачи виртуальных адресов между серверами. Похоже ли это на модификацию DNS? Но это совершенно другое дело. Передача IP-адреса позволяет DNS-имени оставаться неизменным. Мы можем принудительно уведомить локальную сеть об изменении IP-адреса быстро и атомарно с помощью команды ARP (не знаю ARP, см. Здесь).

Более удобной технологией является назначение фиксированного IP – адреса каждому физическому серверу. IP – адрес зафиксирован на сервере и не будет изменен. Затем вы можете использовать виртуальный IP-адрес для каждой логической “службы” (которую можно понимать как контейнер).

Таким образом, IP-адрес может быть легко передан между серверами без необходимости перенастройки приложения, а реализация упрощается.

2. Внедрение промежуточного программного обеспечения

Все вышеперечисленные стратегии предполагают, что приложение подключено к серверу MySQL, но многие балансировщики нагрузки будут использовать промежуточное программное обеспечение в качестве агента сетевой связи. Он получает все сообщения одновременно, распределяет запросы на назначенный сервер и отправляет результаты выполнения обратно на запрашивающую машину. На рисунке 2 показана эта архитектура.

2.1 балансировщик нагрузки

Сейчас существует множество аппаратного и программного обеспечения для балансировки нагрузки, но лишь немногие из них специально разработаны для сервера MySQL. Веб-серверам обычно требуется больше балансировки нагрузки, поэтому многие многоцелевые устройства балансировки нагрузки будут поддерживать HTTP, в то время как для других целей существует лишь несколько основных функций.

Соединение с MySQL-это только обычное соединение TCP/IP, поэтому вы можете использовать многоцелевой балансировщик нагрузки на MySQL. Однако из-за отсутствия специфических функций MySQL существует множество ограничений:

  • Распределение запросов может быть недостаточно сбалансированным.
  • Недостаточная поддержка сеанса MySQL. Возможно, вы не знаете, как “исправить” все запросы на подключение, отправленные из одного сеанса HTTP на сервер MySQL.
  • Объединение в пул соединений и длительные соединения могут помешать балансировщику нагрузки распределять запросы на подключение.
  • Не стоит проверять работоспособность и загрузку сервера MySQL.

2.2 алгоритм балансировки нагрузки

Существует множество алгоритмов для определения того, какой сервер принимает следующее соединение. У каждого производителя есть свой собственный алгоритм. Существуют следующие распространенные методы:

  1. Случайное распределение 。 Случайным образом выберите сервер из доступных пулов серверов для обработки запроса.
  2. опрос 。 Отправляйте запросы на сервер в циклическом порядке, например: A, B, C, a, B, C.
  3. Хэш 。 Хэшируйте исходный IP-адрес соединения и сопоставьте его с тем же сервером в пуле.
  4. Самый быстрый ответ 。 Назначьте подключения серверам, которые могут обрабатывать запросы быстрее всего.
  5. Минимальное количество подключений 。 Назначьте подключения серверам с наименее активными подключениями.
  6. вес 。 В зависимости от производительности машины и других условий разные машины настраиваются с разным весом, чтобы высокопроизводительная машина могла обрабатывать больше соединений.

Ни один из вышеперечисленных методов не является лучшим, только наиболее подходящим, в зависимости от конкретной рабочей нагрузки.

Кроме того, мы описываем только алгоритм обработки в реальном времени. Но иногда алгоритмы организации очередей могут быть более эффективными. Например, алгоритм может поддерживать только заданное количество одновременных серверов баз данных и разрешать не более n активных транзакций одновременно. Если активных транзакций слишком много, поместите новый запрос в очередь и позвольте списку доступных серверов обработать его.

2.3 балансировка нагрузки между одним ведущим и несколькими резервными

Наиболее распространенной структурой репликации является Одна основная база данных плюс несколько резервных баз данных 。 Масштабируемость этой архитектуры оставляет желать лучшего, но мы можем получить лучшие результаты, объединив некоторые методы с балансировкой нагрузки.

  • Функциональное зонирование 。 Для функций производителя, включая отчеты, анализ, хранилище данных и полнотекстовый индекс, настройте одну или группу библиотек резервных копий, чтобы расширить возможности одной функции.
  • Убедитесь, что резервная база данных не отстает от основной базы данных 。 Проблема резервной базы данных-это грязные данные. Для этого мы можем использовать функцию master? ПОЗ? Подождите (), чтобы заблокировать работу основной базы данных до тех пор, пока резервная база данных не догонит заданную точку синхронизации основной базы данных. Кроме того, мы можем использовать дублированное сердцебиение для проверки задержки.

Мы не можем и не должны думать о создании архитектуры, подобной Alibaba, в начале приложения. Лучший способ-это Осознайте, какие приложения в настоящее время необходимы, и заранее планируйте возможный быстрый рост

Кроме того, разработайте Цифровую цель Это имеет смысл, так же как мы установили точную цель для производительности, чтобы соответствовать параллелизму 10 или 100 тыс. Таким образом, мы можем избежать затрат на сериализацию или взаимодействие в нашем приложении с помощью соответствующих теорий.

В аспекте стратегии расширения MySQL, когда типичное приложение достигает очень больших масштабов, оно обычно сначала переходит с одного сервера на расширенную архитектуру с резервной базой данных, а затем на фрагментацию данных или функциональный раздел. Здесь следует отметить, что мы не поддерживаем такие предложения, как “нарежьте как можно раньше, нарежьте как можно больше”. На самом деле фрагментация сложна и дорогостояща, и главное, что многие приложения могут вообще не понадобиться. Вместо того, чтобы тратить много денег на сегментирование, лучше сначала посмотреть, какие изменения произошли в новом оборудовании и новой версии MySQL. Может быть, эти новые изменения вас удивят.

резюме

  • Существуют ограничения в эквалайзере и алгоритме.
  • Это количественный показатель масштабируемости.

Оригинал: “https://developpaper.com/mysql-scalable-3-load-balancing-dazzling/”