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 | Comments (8)
Приятно почитать
Согласен
Приятно почитать но чето мне все это сложно доется
Нечего тут сложного нет читай просто внимательней…
Здравствуйте.
Все описано вроде бы классно, но сижу уже 10 часов за компом.Пока не разберусь,не встану.
Спасибо.
состояние сервера я так понял круговорот клиента
Механизм работы предельно понятен, спасибо автору.
У меня проблема упирается в практическую реализацию балансировки транзакций между серверами. Про скрптинг на lua для прокси бы статейку по развернетее, была бы вообще vip-сауна.
Если найдутся альруисты готовые мне помочь, помогите. проблема актуальа.
долбитесь в мыло xshmdmgm@gmail.com