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 поддерживает язык lua. Это маленький встраиваемый и очень удобный язык. На mysql.com есть репозиторий скриптов для MySQL Proxy

На рисунке изображены состояния работы сервера с клиентом
mysql-proto-state.png

При помощи 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 мы рекомендуем статью Getting started with MySQL Proxy (Перевод)

Оригинал: http://forge.mysql.com/wiki/MySQL_Proxy


 

Comments: 1

  1. Ira September 8th, 2008 at 11:53 pm

    Приятно почитать

Add a Comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>