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-мя датасорсами.
Но как знать, может быть оно спасет ваш продакшн. :) :)