В рамках статьи рассмотрено подключение к удаленному MySQL серверу и настройки, которые нужно выполнить чтобы была возможна двусторонняя связь.
Необходимость в создании подобной конфигурации может возникнуть при выносе MySQL на отдельный сервер, что является распространенным решением при оптимизации высоконагруженных веб-проектов — сайтов, размещающихся на выделенных серверах и виртуальных серверах.
Настройка производится на двух VDS, использующих операционную систему Debian, при использовании CenOS и других дистрибутивов команды могут отличаться, но принципы настройки аналогичны.
Прежде всего, авторизуемся на сервере, который будет служить сервером баз данных и устанавливаем MySQL
apt-get install mysql-server
Производим изначальную конфигурацию в автоматическом режиме
mysql_secure_installation
При этом разрешаем удаленное подключение от имени пользователя root (необходимо только при удаленном подключении от имени пользователя root)
Disallow root login remotely? no
Также потребуется внести коррективы в основной конфигурационный файл MySQL /etc/mysql/my.cnf
Параметр bind следует закомментировать. Если необходимо ограничить доступ к MySQL извне — использовать iptables
#bind-address = 127.0.0.1
Чтобы конфигурационный файл считался — перезапускаем сервис
systemctl restart mysql
Авторизуемся в MySQL
mysql -u root -p
Подключение к удаленному серверу MySQL предполагает наличие пользователя, в качестве хоста указывается адрес сервера, с которого будет выполняться подключение создаем его
GRANT ALL ON *.* TO testuser@'123.123.123.124' IDENTIFIED BY 'secretpassword';
FLUSH PRIVILEGES;
Здесь указываем ip адрес основного сервера, с которого работает веб-проект. Если подключение производится с нескольких серверов — команду можно повторять несколько раз.
systemctl restart mysql
Проверяем наличие существующих баз данных и пользователей MySQL (должны увидеть данные пользователя testuser)
SHOW DATABASES;
SELECT user FROM mysql.user;
Настройки на основном сервере проекта
Авторизуемся на основном сервере
Создаем локального пользователя
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'secretpassword';
Выполняем команду nmap, убеждаемся в том, что порт на сервере баз данных открыт
nmap 123.123.123.123
Авторизуемся с реквизитами пользователя testuser в MySQL удаленно указывая IP адрес сервера баз данных
mysql -u testuser -h 123.123.123.123 -p
Если никаких ошибок при авторизации не появляется — все сделано верно, пробуем пробуем создать базу данных.
CREATE DATABASE table;
Возможные проблемы с подключением к удаленному MySQL серверу и их решение
В случае если имеют место какие-либо трудности при подключении — проверяем iptables на предмет наличия запрещающих правил:
iptables-save
Если запрещающие правила обнаружены — их следует удалить.
Также можно добавить разрешающее правило — на основном сервере синтаксис команды будет следующим:
/sbin/iptables -A INPUT -i eth0 -p tcp
--
destination-port 3306 -j ACCEPT
Из соображений безопасности можно не предоставлять все права пользователю удаленного сервера выдать только права на SELECT,INSERT,UPDATE или DELETE. В примере пользователю выдали права на все базы данных, без каких либо трудностей права можно выдать на конкретную БД или таблицу БД.
Читайте также про отказоустойчивые кластеры Master-Slave MySQL и Galera Cluster