Как использовать ProxySQL в качестве балансировщика нагрузки для MySQL в Ubuntu 16.04

Вступление

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

В этом руководстве вы настроите ProxySQL какload balancer для нескольких серверов MySQL с автоматическим переключением при отказе. В качестве примера, в этом руководстве используется кластер с тремя первичными копиями из трех серверов MySQL, но вы можете использовать аналогичный подход и с другими конфигурациями кластера.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

  • Один сервер Ubuntu 16.04, настроенный сthis initial Ubuntu 16.04 server setup tutorial, включая пользователя sudo без полномочий root и брандмауэр. Этот сервер станет вашим экземпляром ProxySQL.

  • Три сервера MySQL настроены для формирования группы с множественной первичной репликацией. Вы можете настроить это, следуяHow To Configure MySQL Group Replication on Ubuntu 16.04 tutorial. В разделеChoosing Single Primary or Multi-Primary следуйте инструкциям для группы репликацииmulti-primary.

[[step-1 -—- install-proxysql]] == Шаг 1 - Установка ProxySQL

Разработчики ProxySQL предоставляют официальные пакеты Ubuntu для всех выпусков ProxySQL наtheir GitHub releases page, поэтому мы скачаем оттуда последнюю версию пакета и установим ее.

Вы можете найти последний пакет наrelease list. Соглашение об именах -proxysql_version-distribution.deb, гдеversion - это строка типа1.4.4 для версии 1.4.4, аdistribution - строка типаubuntu16_amd64 для 64-битной версии. Ubuntu 16.04.

Загрузите последний официальный пакет, который на момент написания - 1.4.4, в каталог/tmp.

cd /tmp
curl -OL https://github.com/sysown/proxysql/releases/download/v1.4.4/proxysql_1.4.4-ubuntu16_amd64.deb

Установите пакет сdpkg, который используется дляmanage .deb software packages. Флаг-i указывает, что мы хотим выполнить установку из указанного файла.

sudo dpkg -i proxysql_*

На этом этапе вам больше не нужен файл.deb, поэтому вы можете его удалить.

rm proxysql_*

Далее нам потребуется клиентское приложение MySQL для подключения к экземпляру ProxySQL. Это связано с тем, что ProxySQL внутренне использует MySQL-совместимый интерфейс для административных задач. Мы будем использовать инструмент командной строкиmysql, который является частью пакетаmysql-client, доступного в репозиториях Ubuntu.

Обновите репозиторий пакетов, чтобы убедиться, что у вас установлена ​​последняя предустановленная версия, затем установите пакетmysql-client.

sudo apt-get update
sudo apt-get install mysql-client

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

sudo systemctl start proxysql

ProxySQL должен теперь работать с конфигурацией по умолчанию. Вы можете проверить с помощьюsystemctl.

systemctl status proxysql

Вывод будет выглядеть примерно так:

Output● proxysql.service - LSB: High Performance Advanced Proxy for MySQL
   Loaded: loaded (/etc/init.d/proxysql; bad; vendor preset: enabled)
   Active: active (running) since Thu 2017-12-21 19:19:20 UTC; 5s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 12350 ExecStart=/etc/init.d/proxysql start (code=exited, status=0/SUCCESS)
    Tasks: 23
   Memory: 30.9M
      CPU: 86ms
   CGroup: /system.slice/proxysql.service
           ├─12355 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
           └─12356 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql

Строкаactive (running) означает, что ProxySQL установлен и работает.

Далее мы повысим безопасность, установив пароль, используемый для доступа к административному интерфейсу ProxySQL.

[[step-2 -—- setting-the-proxysql-administrator-password]] == Шаг 2 - Установка пароля администратора ProxySQL

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

Чтобы установить пароль администратора в ProxySQL, мы подключимся к этой базе данных конфигурации и обновим соответствующие переменные.

Сначала зайдите в интерфейс администрирования. Вам будет предложено ввести пароль, который при установке по умолчанию -admin.

mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> '
  • -u указывает пользователя, от имени которого мы хотим подключиться, которым здесь являетсяadmin, пользователь по умолчанию для административных задач, таких как изменение параметров конфигурации.

  • -h 127.0.0.1 сообщаетmysql подключиться к локальному экземпляру ProxySQL. Нам нужно определить это явно, потому что ProxySQL не прослушивает файл сокета, которыйmysql принимает по умолчанию.

  • -P указывает порт для подключения. Интерфейс администратора ProxySQL прослушивает6032.

  • --prompt - это необязательный флаг, изменяющий приглашение по умолчанию, обычно этоmysql>. Здесь мы меняем его наProxySQLAdmin>, чтобы было ясно, что мы подключены к административному интерфейсу ProxySQL. Это поможет избежать путаницы позже, когда мы также будем подключаться к интерфейсам MySQL на реплицированных серверах баз данных.

После подключения вы увидите приглашениеProxySQLAdmin>:

ProxySQL administration console promptWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

ProxySQLAdmin>

Измените пароль учетной записи администратора, обновив (UPDATE) переменную конфигурацииadmin-admin_credentials в базе данныхglobal_variables. Не забудьте изменитьpassword в приведенной ниже команде на надежный пароль по вашему выбору.

UPDATE global_variables SET variable_value='admin:password' WHERE variable_name='admin-admin_credentials';
OutputQuery OK, 1 row affected (0.00 sec)

Это изменение не вступит в силу немедленно из-за того, как работает система конфигурации ProxySQL. Он состоит из трех отдельных слоев:

  • memory, который изменяется при внесении изменений из интерфейса командной строки.

  • runtime, который используется ProxySQL как эффективная конфигурация.

  • disk, который используется для сохранения конфигурации после перезапуска.

Прямо сейчас внесенное вами изменение находится вmemory. Чтобы изменения вступили в силу, вы должны скопировать настройкиmemory в областьruntime, а затем сохранить их вdisk, чтобы они сохранялись.

LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

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

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

[[step-3 -—- configuring-monitoring-in-mysql]] == Шаг 3 - Настройка мониторинга в MySQL

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

Здесь мы настроим нужного пользователя на узлах MySQL и установим дополнительные функции SQL, которые позволяют ProxySQL запрашивать состояние репликации группы.

Поскольку репликация группы MySQL уже запущена, следующие шаги должны выполняться только наa single member of the group.

Во втором терминале войдите на сервер с одним из узлов MySQL.

ssh sammy@your_mysql_server_ip_1

Загрузите файл SQL, содержащий некоторые необходимые функции для поддержки групповой репликации ProxySQL.

curl -OL https://gist.github.com/lefred/77ddbde301c72535381ae7af9f968322/raw/5e40b03333a3c148b78aa348fd2cd5b5dbb36e4d/addition_to_sys.sql

[.Примечание]##

Note: этот файл предоставлен авторами ProxySQL, но произвольным образом: этоgist в личном репозитории GitHub, что означает, что он может быть перемещен или устарел. В будущем он может быть добавлен в виде версионного файла в официальном репозитории ProxySQL.

Вы можете узнать больше о контексте и содержании этого файла в записи блога автора оnative ProxySQL support for MySQL group replication.

Вы можете просмотреть содержимое файла, используяless addition_to_sys.sql.

Когда вы будете готовы, выполните команды в файле. Вам будет предложено ввести пароль администратора MySQL.

mysql -u root -p < addition_to_sys.sql

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

Далее нам нужно создать выделенного пользователя, который будет использоваться ProxySQL для мониторинга работоспособности экземпляров.

Откройте интерактивную подсказку MySQL, которая снова предложит вам ввести парольroot.

mysql -u root -p

Затем создайте выделенного пользователя, которого мы здесь назвалиmonitor. Обязательно смените пароль на надежный.

CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitorpassword';

Предоставьте пользователю права запрашивать состояние сервера MySQL пользователюmonitor.

GRANT SELECT on sys.* to 'monitor'@'%';

Наконец, примените изменения.

FLUSH PRIVILEGES;

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

Затем нам нужно обновить ProxySQL информацией для этого пользователя, чтобы он мог обращаться к узлам MySQL.

[[step-4 -—- configuring-monitoring-in-proxysql]] == Шаг 4 - Настройка мониторинга в ProxySQL

Чтобы настроить ProxySQL для использования новой учетной записи пользователя при мониторинге узлов, мы добавимUPDATE соответствующую переменную конфигурации. Это очень похоже на способ установки пароля администратора из шага 2.

Вернувшись в интерфейс администратора ProxySQL, обновите переменнуюmysql-monitor_username до имени пользователя новой учетной записи.

UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';

Как и раньше, конфигурация не применяется автоматически, поэтому перенесите ее вruntime и сохраните вdisk. На этот раз обратите внимание, что мы используемMYSQL вместоADMIN для обновления этих переменных, потому что мы изменяем переменные конфигурации MySQL.

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

Учетная запись мониторинга настроена на всех концах, и следующий шаг - сообщить ProxySQL о самих узлах.

[[step-5 -—- add-mysql-nodes-to-the-proxysql-server-pool]] == Шаг 5 - Добавление узлов MySQL в пул серверов ProxySQL

Чтобы ProxySQL узнал о трех наших узлах MySQL, нам нужно указать ProxySQL, как распределять их по егоhost groups, которые являются назначенными наборами узлов. Каждая группа хостов идентифицируется положительным числом, например1 или2. Группы хостов могут направлять разные запросы SQL на разные наборы хостов при использовании маршрутизации запросов ProxySQL.

В статических конфигурациях репликации группы хостов могут быть установлены произвольно. Однако поддержка групповой репликации ProxySQL автоматически делит все узлы в группе репликации на четыре логических состояния:

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

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

  • readers - это узлы MySQL, которые не могут принимать запросы, изменяющие данные, и должны использоваться как узлы только для чтения. ProxySQL размещает здесь только подчиненные узлы.

  • offline, который предназначен для узлов, которые плохо себя ведут из-за таких проблем, как отсутствие подключения или медленный трафик.

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

Собрав все это вместе, мы должны указать ProxySQL, какие идентификаторы следует использовать для каждого состояния. Здесь мы используем1 для группы хостовoffline,2 для группы хостовwriter,3 для группы хостовreader и 4 для группы хостовbackup writer.

Чтобы установить эти идентификаторы, создайте новую строку с этими переменными и значениями в таблице конфигурацииmysql_group_replication_hostgroups.

INSERT INTO mysql_group_replication_hostgroups (writer_hostgroup, backup_writer_hostgroup, reader_hostgroup, offline_hostgroup, active, max_writers, writer_is_also_reader, max_transactions_behind) VALUES (2, 4, 3, 1, 1, 3, 1, 100);

Это дополнительные переменные, установленные в этой строке, и то, что делает каждая из них:

  • active, установленный в1, позволяет ProxySQL контролировать эти группы хостов.

  • max_writers определяет, сколько узлов могут действовать как писатели. Здесь мы использовали3, потому что в конфигурации с несколькими первичными узлами все узлы могут рассматриваться одинаково, поэтому здесь мы использовали3 (общее количество узлов).

  • writer_is_also_reader, установленный в1, указывает ProxySQL рассматривать писателей как читателей.

  • max_transactions_behind устанавливает максимальное количество отложенных транзакций, прежде чем узел будет классифицирован какoffline.

[.Примечание]##

Note: Поскольку в нашем примере используется топология с несколькими основными источниками, в которой все узлы могут писать в базу данных, мы сбалансируем все запросы SQL по группе узловwriter. В других топологиях разделение междуwriter (первичными) узлами иreader (вторичными) узлами может направлять запросы только для чтения к другим узлам / группам узлов, чем запросы записи. ProxySQL не делает этого автоматически, но вы можетеset up query routing using rules.

Теперь, когда ProxySQL знает, как распределять узлы по группам узлов, мы можем добавить наши серверы MySQL в пул. Для этого нам нужноINSERT IP-адрес и начальную группу хостов каждого сервера в таблицуmysql_servers, которая содержит список серверов, с которыми ProxySQL может взаимодействовать.

Добавьте каждый из трех серверов MySQL, заменив приведенные в качестве примера IP-адреса в приведенных ниже командах.

INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.1', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.2', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '203.0.113.3', 3306);

Здесь значение2 устанавливает изначально все эти узлы как писатели, а3306 устанавливает порт MySQL по умолчанию.

Как и раньше, перенесите эти изменения вruntime и сохраните их вdisk, чтобы изменения вступили в силу.

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

ProxySQL теперь должен распределять наши узлы по группам хостов, как указано. Давайте проверим это, выполнив запросSELECT к таблицеruntim330e_mysql_servers, который показывает текущее состояние серверов, которые использует ProxySQL.

SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;
Output+--------------+-------------+--------+
| hostgroup_id | hostname    | status |
+--------------+-------------+--------+
| 2            | 203.0.113.1 | ONLINE |
| 2            | 203.0.113.2 | ONLINE |
| 2            | 203.0.113.3 | ONLINE |
| 3            | 203.0.113.1 | ONLINE |
| 3            | 203.0.113.2 | ONLINE |
| 3            | 203.0.113.3 | ONLINE |
+--------------+-------------+--------+
6 rows in set (0.01 sec)

В таблице результатов каждый сервер указан дважды: по одному для каждого идентификатора группы хостов2 и3, что указывает на то, что все три узла являются одновременно писателями и читателями. Все узлы отмеченыONLINE, что означает, что они готовы к использованию.

Однако прежде чем мы сможем их использовать, нам необходимо настроить учетные данные пользователя для доступа к базам данных MySQL на каждом узле.

[[step-6 -—- created-the-mysql-users]] == Шаг 6. Создание пользователей MySQL

ProxySQL действует как балансировщик нагрузки; конечные пользователи подключаются к ProxySQL, и ProxySQL по очереди передает соединение выбранному узлу MySQL. Чтобы подключиться к отдельному узлу, ProxySQL повторно использует учетные данные, к которым он был получен.

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

Как и в шаге 3, следующие шаги должны выполняться только наa single member of the group. Вы можете выбрать любого участника.

Создайте нового пользователя с именемplaygrounduser с паролемplaygroundpassword.

CREATE USER 'playgrounduser'@'%' IDENTIFIED BY 'playgroundpassword';

Дайте ему привилегии на полный доступ к тестовой базе данныхplayground изthe original group replication tutorial.

GRANT ALL PRIVILEGES on playground.* to 'playgrounduser'@'%';

Затем примените изменения и выйдите из командной строки.

FLUSH PRIVILEGES;
EXIT;

Вы можете проверить, что пользователь был правильно создан, попытавшись создать базу данных с вновь настроенными учетными данными непосредственно на узле.

Снова откройте интерфейс MySQL с новым пользователем, который предложит вам ввести пароль.

mysql -u playgrounduser -p

Когда вы вошли в систему, выполните тестовый запрос к базе данныхplayground.

SHOW TABLES FROM playground;
Output+----------------------+
| Tables_in_playground |
+----------------------+
| equipment            |
+----------------------+
1 row in set (0.00 sec)

Видимый список таблиц в базе данных, показывающий таблицуequipment, созданную в исходном руководстве по репликации, подтверждает, что пользователь был правильно создан на узлах.

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

EXIT;

Теперь нам нужно создать соответствующего пользователя на сервере ProxySQL.

[[step-7 -—- created-the-proxysql-user]] == Шаг 7 - Создание пользователя ProxySQL

Последний шаг настройки - разрешить подключения к ProxySQL с пользователемplaygrounduser и передать эти подключения узлам.

Для этого нам нужно установить переменные конфигурации в таблицеmysql_users, которая содержит информацию об учетных данных пользователя. В интерфейсе ProxySQL добавьте имя пользователя, пароль и группу хостов по умолчанию в базу данных конфигурации (это2 для группы хостовwriter)

INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('playgrounduser', 'playgroundpassword', 2);

Перенесите конфигурацию вruntime и сохраните вdisk, чтобы новая конфигурация вступила в силу.

LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

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

ssh sammy@your_proxysql_server_ip

ProxySQL прослушивает порт6033 на предмет входящих клиентских подключений, поэтому попробуйте подключиться к реальной базе данных (не к интерфейсу администрирования), используяplaygrounduser и порт6033. Вам будет предложено ввести пароль, который в нашем примере былplaygroundpassword.

mysql -u playgrounduser -p -h 127.0.0.1 -P 6033 --prompt='ProxySQLClient> '

Здесь мы устанавливаем приглашение наProxySQLClient>, чтобы мы могли отличить его от приглашения административного интерфейса. Мы будем использовать оба при тестировании окончательной конфигурации.

Подсказка должна открыться, означая, что учетные данные были приняты самим ProxySQL.

ProxySQL client promptWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

ProxySQLClient>

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

SELECT @@hostname;

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

Output+------------+
| @@hostname |
+------------+
| member1    |
+------------+
1 row in set (0.00 sec)

Это завершает настройку, позволяющую ProxySQL устанавливать балансировку нагрузки между тремя узлами MySQL.

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

[[step-8 -—- verifying-the-proxysql-configuration]] == Шаг 8 - Проверка конфигурации ProxySQL

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

Выполните операторSELECT в приглашении клиента ProxySQL, чтобы убедиться, что мы можем читать данные из базы данныхplayground.

SELECT * FROM playground.equipment;

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

Output+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  3 | slide  |     2 | blue   |
| 10 | swing  |    10 | yellow |
| 17 | seesaw |     3 | green  |
+----+--------+-------+--------+
3 rows in set (0.00 sec)

Затем попробуйте написать, вставив несколько новых данных в таблицу, представляющую 5 красных упражнений.

INSERT INTO playground.equipment (type, quant, color) VALUES ("drill", 5, "red");

Затем повторно выполните предыдущую командуSELECT, чтобы убедиться, что данные были вставлены.

SELECT * FROM playground.equipment;

Новая линия в выводе означает, что мы успешно записали данные в базу данных MySQL через ProxySQL.

Output+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  3 | slide  |     2 | blue   |
| 10 | swing  |    10 | yellow |
| 17 | seesaw |     3 | green  |
| 24 | drill  |     5 | red    |
+----+--------+-------+--------+
4 rows in set (0.00 sec)

Мы знаем, что ProxySQL теперь может полностью использовать базу данных, но что произойдет, если сервер выйдет из строя?

В командной строке одного из серверов MySQL остановите процесс MySQL для имитации сбоя.

systemctl stop mysql

После остановки базы данных попробуйте снова запросить данные из таблицыequipment из командной строки клиента ProxySQL.

SELECT * FROM playground.equipment;

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

Мы можем проверить это, запросив таблицуruntime_mysql_servers из командной строки ProxySQL, как на шаге 5.

SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;

Вывод будет выглядеть так:

Output+--------------+-------------+---------+
| hostgroup_id | hostname    | status  |
+--------------+-------------+---------+
| 1            | 203.0.113.1 | SHUNNED |
| 2            | 203.0.113.2 | ONLINE  |
| 2            | 203.0.113.3 | ONLINE  |
| 3            | 203.0.113.2 | ONLINE  |
| 3            | 203.0.113.3 | ONLINE  |
+--------------+-------------+---------+
6 rows in set (0.01 sec)

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

ProxySQL будет постоянно отслеживать состояние этого узла и либо вернуть его кonline, если он ведет себя нормально, либо пометить егоoffline, если он превышает порог тайм-аута, установленный на шаге 4.

Давайте проверим этот мониторинг. Вернитесь на сервер MySQL и верните узел в исходное состояние.

systemctl start mysql

Подождите, затем снова запросите таблицуruntime_mysql_servers из командной строки ProxySQL.

SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;

ProxySQL быстро заметит, что узел снова доступен и пометит его как онлайн:

Output+--------------+-------------+--------+
| hostgroup_id | hostname    | status |
+--------------+-------------+--------+
| 2            | 203.0.113.1 | ONLINE |
| 2            | 203.0.113.2 | ONLINE |
| 2            | 203.0.113.3 | ONLINE |
| 3            | 203.0.113.1 | ONLINE |
| 3            | 203.0.113.2 | ONLINE |
| 3            | 203.0.113.3 | ONLINE |
+--------------+-------------+--------+
6 rows in set (0.01 sec)

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

Заключение

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

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

Related