RSS
 

Выносим 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, так и на другие интерфейсы.

 

Leave a Reply

You must be logged in to post a comment.

  1. ГостЪ

    июля 29, 2010 at 00:59

    MySQL Proxy, к сожалению зарекомендовал себя как далеко не стабильный софт.

    Для таких целей намного проще использовать unix2tcp и проброс tcp порта, если нужно

    Если кол-во запросов более чем 300-400 в сек то использование промежуточного софта создаст проблемы

     
    • Дмитрий

      июля 29, 2010 at 09:36

      точно, unix2tcp: http://www.hilik.org.ua/%D1%83%D1%82%D0%B8%D0%BB%

      Помню, как-то рассматривал эту утилитку. За мнение по mysql-proxy огромное спасибо, планирую стрессово потестировать. Пока работает, хотя нагрузка сравнительно небольшая.

       
  2. ksp

    декабря 16, 2011 at 10:42

    Две копии не нужны. Можно использовать scocat для проброса с сокета mysql на TCP.