RSS
 

Archive for июля 26, 2010

Выносим mysql на отдельный сервер

26 Jul

В ряде случаев, когда количество запросов к локальному mysql начинает превышать определенные рамки, возникает дилемма – добавить еще 2-4-8 гигабайт памяти или вынести mysql на отдельную выделенную машинку. Так и у нас – в связи с ростом запросов к нашей iptv middleware (которая, к тому-же, крутится в виртуальной машине) mysql начал расти и пухнуть.

Вместе с тем, банального переноса в виде mysqldump+scp+mysql недостаточно – нужно поправить софт, заменив в нем localhost на адрес нового mysql-сервера. И тут я решил поэкспериментировать – поставить mysql-proxy с таким прицелом, чтобы не трогать софт.

Итак, начнем. Ставим mysql-proxy:

# cd /usr/ports/databases/mysql-proxy/
# make install clean

Сразу забываем о /usr/local/etc/rc.d/mysql-proxy, и вот почему: как известно, если в приложении указать в виде хоста mysql слово localhost, то подключение к демону будет происходить не путем коннекта на 127.0.0.1:3306, как можно было бы предположить, а через сокет /tmp/mysqld.sock. К счастью, mysql-proxy позволяет создать аналогичный сокет и проксировать запросы на удаленный сервер. Запускаем mysql-proxy и планируем насладиться успехом:

# /usr/local/libexec/mysql-proxy --admin-address=127.0.0.1:4401 --proxy-address=/tmp/mysql.sock --proxy-backend-addresses=1.1.1.1:3306 --keepalive --daemon --pid-file=/var/run/mysql-proxy-socket.pid

Но не тут-то было. Оказывается, часть вспомогательного софта у нас пытается подключиться к 3306/tcp ! К сожалению, mysql-proxy не умеет “слушать” на различных сокетах/портах одновременно. Поэтому запускаем две копии, выставляя им различные admin-address и pid-file, и не забываем прибить на всякий случай /tmp/mysqld.sock, который не всегда удаляется (или никогда не удаляется?) при остановке mysql-proxy. Я сделал это по-быстрому в /etc/rc.local, хотя по-уму нужно было написать свой rc.d:

rm -f /tmp/mysql.sock
/usr/local/libexec/mysql-proxy --admin-address=127.0.0.1:4401 --proxy-address=/tmp/mysql.sock --proxy-backend-addresses=1.1.1.1:3306 --keepalive --daemon --pid-file=/var/run/mysql-proxy-socket.pid
/usr/local/libexec/mysql-proxy --admin-address=127.0.0.1:4402 --proxy-address=:3306 --proxy-backend-addresses=1.1.1.1:3306 --keepalive --daemon --pid-file=/var/run/mysql-proxy-3306.pid

Обратите внимание, что стоит поставить фильтры, закрыв от “мира” порт 3306 на сервере, так как mysql-proxy при подобном запуске принимать соединения отовсюду как на localhost, так и на другие интерфейсы.