Thank you for reading this post, don't forget to subscribe!
Балансировка mysql запросов - важная вещь, если мы используете несколько mysql серверов. Если у Вас настроена master-slave репликация баз даных, то есть смысл распределить нагрузку на несколько серверов. Отправлять update, insert запросы на master сервер, а select запросы распределять между двумя, тремя и более серверами.
для этого можно воспользоваться утилитой mysql-proxy.
Скачиваем исходник и распаковываем его:
1 2 3 |
wget http://ftp.gnome.org/pub/gnome/sources/glib/2.42/glib-2.42.0.tar.xz <span class="nb">tar </span>xvf glib-2.42.0.tar.xz |
В случае проблем с распаковкой - усановите xz-utils
или просто пакет xz
и посторите операцию.
Следующие пакеты нужны будут для выполнения правильной сборки:
1 2 |
yum install lua lua-devel libevent libevent-devel glib2 glib2-devel pkg-config mysqlclient14-devel libffi mysql libffi-devel zlib zlib-devel gcc gettext-devel glibc glibc-devel |
Теперь переходим в папку glib
и устанавливаем его:
1 2 3 4 5 |
<span class="nb">cd </span>glib-2.42.0 ./configure make make install |
В ходе выполнения появится вот такое сообщение:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Libraries have been installed in: /usr/local/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to '/etc/ld.so.conf' |
[/codesyntax]
Соответсвенно библиотеки оказались в /usr/local/lib/
Для того что бы система их увидела, я сделал симлинки, создав резервные копии оригиальных файлов:
1 2 3 4 5 |
mv /usr/lib64/libglib-2.0.so.0 /usr/lib64/libglib-2.0.so.0.bak mv /usr/lib64/libglib-2.0.so /usr/lib64/libglib-2.0.so.bak ln <span class="nt">-s</span> /usr/local/lib/libglib-2.0.so.0.4200.0 /usr/lib64/libglib-2.0.so.0 ln <span class="nt">-s</span> /usr/local/lib/libglib-2.0.so.0.4200.0 /usr/lib64/libglib-2.0.so |
Теперь можно переходить к установке mysql-proxy
скачиваем готовый пакет и устанавливаем его:
1 2 3 |
wget ftp://195.220.108.108/linux/fedora/linux/releases/22/Everything/x86_64/os/Packages/m/mysql-proxy-0.8.5-1.fc22.x86_64.rpm rpm <span class="nt">-ihv</span> mysql-proxy-0.8.5-1.fc22.x86_64.rpm |
Также понадобится оригинальный пакет с исходниками из-за дополнительного скрипта. Скачиваем его и распаковываем:
1 2 3 |
wget http://dev.mysql.com/get/Downloads/MySQL-Proxy/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz <span class="nb">tar </span>xf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz |
Чудо скрипт, который будет разделять read
и write
запросы, нужно скопировать в папку к mysql-proxy
:
1 2 |
cp share/doc/mysql-proxy/rw-splitting.lua /usr/lib64/mysql-proxy/lua/proxy/ |
Узнаем расположение конфиг файла вот ткой командой:
1 2 |
rpm <span class="nt">-qc</span> mysql-proxy |
В моем случае это /etc/sysconfig/mysql-proxy
. В любимом редакторе открываем этот файл для редактирования и устанавливаем пароль для админа (ADMIN_PASSWORD
) - он не должен быть пустым.
PROXY_OPTIONS
приводим к следующему виду:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 |
PROXY_OPTIONS=`-log-level=info \ -proxy-address=:3306 \ -log-use-syslog \ -plugins=proxy \ -plugins=admin \ -proxy-backend-addresses=192.168.1.143:3306 \ -proxy-read-only-backend-addresses=192.168.1.132 \ -proxy-lua-script=/usr/lib64/mysql-proxy/lua/proxy/rw-splitting.lua` |
[/codesyntax]
proxy-backend-addresses
- адресmaster
сервера, на который будут отправлятьсяinsert
иupdate
запросы.proxy-read-only-backend-addresses
- адрес сервера, на который будут уходить толькоselect
запросы.proxy-address
- определяетip
адрес и порт, на котором будут обрабатываться входящие соединения. По умолчанию 4040
Создаем симлинки:
1 2 3 4 5 6 7 |
<span class="nb">cd</span> /usr/lib64 ln <span class="nt">-s</span> /opt/mysql-proxy/lib/libmysql-chassis.so.0.0.0 libmysql-chassis.so.0 ln <span class="nt">-s</span> /opt/mysql-proxy/lib/libmysql-proxy.so.0.0.0 libmysql-proxy.so.0 ln <span class="nt">-s</span> /opt/mysql-proxy/lib/libmysql-chassis-glibext.so.0.0.0 libmysql-chassis-glibext.so.0 ln <span class="nt">-s</span> /opt/mysql-proxy/lib/libevent-2.0.so.5.1.9 libevent-2.0.so.5 ln <span class="nt">-s</span> /opt/mysql-proxy/lib/libmysql-chassis-timing.so.0.0.0 libmysql-chassis-timing.so.0 |
Теперь можно запускать:
1 2 |
/etc/init.d/mysql-proxy start |
Для того что бы проверть состояние кластера подключитесь к админке:
1 2 |
mysql <span class="nt">-hlocalhost</span> <span class="nt">-P4041</span> <span class="nt">-uadmin</span> <span class="nt">-ppassword</span> |
Для отображения всех бэкэндов выполните следующий запрос:
1 2 |
SELECT <span class="k">*</span> FROM backends<span class="p">;</span> |
В результате получаем табличку:
[codesyntax lang="php"]
1 2 3 4 5 6 7 |
+-------------+--------------------+---------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+--------------------+---------+------+------+-------------------+ | 1 | 192.168.1.143:3306 | unknown | rw | NULL | 0 | | 2 | 192.168.1.132:3306 | unknown | ro | NULL | 0 | +-------------+--------------------+---------+------+------+-------------------+ |
[/codesyntax]