MySQL Proxy
MySQL proxy - это небольшая программа, которая располагается между клиентом и сервером (серверами) MySQL и может наблюдать или вмешиваться в процесс коммуникации между ними. Ее гибкость и настраиваемость позволяют делать многие удобные вещи: простое наблюдение за соединением, балансировку нагрузки, реализацию механизма failover, анализ запросов, фильтрацию и модификацию запросов, а также много другое
Получение
На вы найдете бинарную версию для всех поддерживаемых MySQL Enterprise платформ, исходный код для самостоятельной компиляции, RPM-пакеты (включая экспериментальные версии из SVN) для различных дистрибутивов Linux. deb-пакет доступен в официальном репозитории Debian.
MySQL Proxy распросраняется под лицензией GPL
Синтаксис командной строки
$ mysql-proxy --help-all Использование: mysql-proxy [OPTION...] - MySQL Proxy Опции справки: -?, --help Показать краткую справку --help-all Показать все пункты справки --help-admin Показать ключи для модуля admin --help-proxy Показать ключи для модуля proxy Модуль admin --admin-address=<host:port> Слушать заданный адрес:порт для внутреннего модуля администрирования (по умолчанию: :4041) Модуль proxy --proxy-address=<host:port> Адрес:порт прокси-сервера (по умолчанию: :4040) --proxy-read-only-backend-addresses=<host:port> Адрес:порт удаленного дополнительного сервера (по умолчанию: не задан) --proxy-backend-addresses=<host:port> Адрес:порт удаленных backend-серверов (по умолчанию: 127.0.0.1:3306) --proxy-skip-profiling отключить профилирование запросов (по умолчанию: включено) --proxy-fix-bug-25371 исправить ошибку #25371 (mysqld > 5.1.12) для старых версий libmysql --proxy-lua-script=<file> имя lua-скрипта (по умолчанию: не задано) --no-proxy Не стартовать прокси-сервер Опции приложения: -V, --version Показать версию --daemon Запускаться в режиме демона --pid-file=<file> PID-файл (в случае запуска в режиме демона)
Соединение
В качестве простого примера запустите mysql-proxy и попробуйте присоединиться к ней с помощью клиента:
$ mysql-proxy &
$ mysql –host=127.0.0.1 –port=4040 –user=… –password
Подключение будет проксировано на адрес 127.0.0.1 и порт 3306
ВАЖНО: сервер MySQL должен иметь версию 5.0.x и выше. Работа с версиями 4.1 официально не поддерживается, но если вы решите использовать эту связку, то не забудьте отослать репорты об ошибках
Модуль Proxy
Модуль Proxy состоит из двух частей:
- Ядро, написанное на C
- Интерфейс на lua
Ядро обрабатывает пересылку пакетов на низком уровне и пытается работать настолько быстро, насколько это возможно, оно обрабатывает более тысячи параллельных соединений одновременно. Ядро состоит из:
- обработчика конфиг-файла
- шифровщика протокола mysql
- обработчика сокетов
- балансировщика нагрузки
- реализации механизма failover
$ mysql-proxy –help-proxy Использование: mysql-proxy [OPTION…] - MySQL Proxy proxy-module –proxy-address=<ip:port> слушать адрес:порт прокси-сервера (по умолчанию: :4040) –proxy-read-only-address=<ip:port> Слушать адрес:порт для соединений только для чтения (по умолчанию: :4042) –proxy-backend-addresses=<ip:port> Адрес:порт для удаленных backend-серверов (по умолчанию: не задан) –proxy-profiling включить профилирование запросов –proxy-fix-bug-25371 исправить ошибку #25371 (mysqld > 5.1.12) для старых версий libmysql –proxy-lua-script=<file> расположение lua-скрипта (по умолчанию: не задан)
–proxy-address - это адрес и порт сервера, который транслирует запросы к одному из backend-серверов.
Backend-сервер, объявленный при помощи –proxy-backend-addresses по умолчанию имеет значение 127.0.0.1:3306. Вы можете использовать эту опцию несколько раз и задать нужное количество серверов.
Admin server
Сервер администрирования реализует основные возможности протокола mysql и может отвечать на некоторые базовые запросы. В нем реализованы:
- Обработка сокетов
- Жизненный цикл соединения
- mysql wire-протокол
- len-encoding (?) некоторых полей
- Типы полей
- Результирующие наборы данных
Дизайн основывается на идеях, заимствованных из lighttpd и использует неблокирующий сетевой ввод/вывод, сетевой протокол основан на информации, доступной во внутренних документах с dev.mysql.com
В admin server реализованы 2 базовых запроса, которые доступны из командной строки mysql-клиента:
select @@version_comment LIMIT 1;
select USER();
Используя admin server, вы можете реализовать необходимую функциональность, чтобы любой mysql-клиент (php, jdbc, odbc, perl, …) мог использовать его.
Мы используем его для экспорта текущей конфигурации и отслеживания открытых соединений.
> select * from proxy_connections; +——+——–+——-+——-+ | id | type | state | db | +——+——–+——-+——-+ | 2 | proxy | 8 | world | | 3 | server | 8 | | +——+——–+——-+——-+
> select * from proxy_config; +———————————+—————-+ | option | value | +———————————+—————-+ | admin.address | :4041 | | proxy.address | :4040 | | proxy.backend_addresses[0] | 127.0.0.1:3306 | | proxy.backend_addresses[1] | 127.0.0.1:3307 | | proxy.fix_bug_25371 | 0 | | repclient.master_address | | +———————————+—————-+
Балансировка нагрузки и failover
$ mysql-proxy \
–proxy-backend-addresses=10.0.1.2:3306 \
–proxy-backend-addresses=10.0.1.3:3306 &
Запустите тестовые соединения, остановите один из backend-серверов и вы увидите, как весь трафик будет передан второму, который продолжает работать.
Расширение lua
MySQL Proxy поддерживает . Это маленький встраиваемый и очень удобный язык. На mysql.com есть
На рисунке изображены состояния работы сервера с клиентом

При помощи lua-скриптов вы можете “вклиниться” в три стадии:
- connect_server
- read_query
- read_query_result
Если вы хотите написать балансировщик нагрузки, то вы можете “вклиниться” в connect_server, который вызывается перед соединением с backend-сервером. Балансировщик может выбрать backend из списка, который был задан при запуске прокси.
read_query - это стадия между передачей запроса от клиента серверу. На этой стадии вы можете решить что делать с запросом: передать клиенту “как есть”, изменить его, добавить еще запросов или напрямую ответить клиенту без передачи запроса на сервер.
Например, вы можете “дампить” все данные, передаваемые между клиентом и сервером (после авторизации):
(sqf) taking 127.0.0.1:3306, clients: 0 .— mysql result packet | query.len = 13 | query.packet = 03 73 68 6f 77 20 65 6e 67 69 6e 65 73 | .— query | | command = COM_QUERY | | query = “show engines” | ‘— | | result.len = 1 | result.packet = 06 | .— | | command = COM_QUERY | | num-cols = 6 | | field[0] = { type = 253, name = Engine } | | field[1] = { type = 253, name = Support } | | field[2] = { type = 253, name = Comment } | | field[3] = { type = 253, name = Transactions } | | field[4] = { type = 253, name = XA } | | field[5] = { type = 253, name = Savepoints } | | row[0] = { ndbcluster, DISABLED, Clustered, fault-tolerant tables, YES, NO, NO } | | row[1] = { MRG_MYISAM, YES, Collection of identical MyISAM tables, NO, NO, NO } | | row[2] = { BLACKHOLE, YES, /dev/null storage engine (anything you write to it disappears), NO, NO, NO } | | row[3] = { CSV, YES, CSV storage engine, NO, NO, NO } | | row[4] = { MEMORY, YES, Hash based, stored in memory, useful for temporary tables, NO, NO, NO } | | row[5] = { FEDERATED, YES, Federated MySQL storage engine, YES, NO, NO } | | row[6] = { ARCHIVE, YES, Archive storage engine, NO, NO, NO } | | row[7] = { InnoDB, YES, Supports transactions, row-level locking, and foreign keys, YES, YES, YES } | | row[8] = { MyISAM, DEFAULT, Default engine as of MySQL 3.23 with great performance, NO, NO, NO } | ‘— ‘—
Для более глубокого изучения работы MySQL Proxy мы рекомендуем статью (Перевод)
Оригинал:
27.08.08 | MySQL articles |
Приятно почитать