KsI-wiki online documents

Mysqlproxy

Материал из Ksimute

Перейти к: навигация, поиск

Немного хинтов по использованию mysql-proxy.

Она в данный момент в стадии альфа тестирования. Достаточно нелинейна в использовании и плохо задокументирована


Конфигурационные файлы:

 root@ads1-1:~# cat /etc/default/mysql-proxy 
 ENABLED="true"
 OPTIONS="--proxy-address=127.0.0.1:3306 --proxy-read-only-backend-addresses=dbro:3306 --proxy-backend-addresses=dbrw:3306 --proxy-lua-    script=/usr/share/mysql-proxy/rw-splitting.lua --admin-username=root --admin-password=XXXXXXX --admin-lua-script=/usr/share/mysql-proxy/admin.lua"
 root@ads1-1:~# 

Стартуем:

service mysql-proxy start Консоль администрирования:

 :~# mysql --port=4041 -u USER -pXXXXXXXX -h 127.0.0.1
 mysql> SELECT * FROM backends ;
 +-------------+--------------------+-------+------+------+-------------------+
 | backend_ndx | address | state | type | uuid | connected_clients |
 +-------------+--------------------+-------+------+------+-------------------+
 | 1 | IP.IP.IP.IP:3306 | unknown | rw | NULL | 0 |
 | 2 | IP1.IP1.IP1.IP1:3306 | unknown | ro | NULL | 1 |
 +-------------+--------------------+-------+------+------+-------------------+
 2 rows in set (0.00 sec)

state после старту unknown. Надо создать пул соединений, иначе прокси не будет нормально разделять трафик а обращаться к мастеру по-умолчанию.

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

Запускаем много соединений, чтобы создался пул.

 for i in {1..20}; do mysql -u USER -pMEGASECUREPASSWORD -h 127.0.0.1 -e "use mydatabase;" ; done

Смотрим консоль администрирования

 mysql> SELECT * FROM backends ;
 +-------------+--------------------+-------+------+------+-------------------+
 | backend_ndx | address | state | type | uuid | connected_clients |
 +-------------+--------------------+-------+------+------+-------------------+
 | 1 | IP.IP.IP.IP:3306 | up | rw | NULL | 0 |
 | 2 | IP1.IP1.IP1.IP1:3306 | up | ro | NULL | 1 |
 +-------------+--------------------+-------+------+------+-------------------+
 2 rows in set (0.00 sec)
 mysql> 

После этого стартуем наше приложение, смотрим tcpdump, большая часть запросов падает на slave. (у нас приложение сильно много читало)

Соответственно смотрим логи.

Еще моменты - mysqlproxy прохо работает когда приложение отключает автокоммит. т.е. можете заиметь сильные проблемы в зависимости от приложения. Мы заимели с JDBC. В итоге отказались от mysql-proxy и переписали приложение, добавив работу с 2-мя датасорсами.

Но как знать, может быть оно спасет ваш продакшн. :) :)