Запустить несколько mysql серверов на одном сервере

Имеется возможность запустить несколько mysql серверов одного заинсталеного экземпляра mysql. Зачем? Это даст администратору возможность более тонкой настройки каждого сервера под тот круг задач, который он будет исполнять.

Например:

Новостной мультидоменный портал с информационной частью, форумом. Каждый поддомен такого портала использует в работе свою БД. На всём портале работает рекламный движок, который учитывает показы  и клики посетителей. Интенсивность операций insert/update этого движка значительно выше, чем других частей портала, где зачастую используется выборка, а значит select. Логично будет вынести БД рекламного движка на отдельный сервер и применить к нему другие настройки.

Еще пример:

администратор заметил, что портал стал медленно отдавать контент. После анализа выяснилось, что затык на стороне mysql. Теперь администратор желает знать, на какую именно БД приходится основная нагрузка. Если все БД портала находятся на одном сервере, то выснить это несколько затруднительно. Значительно проще вынести подозреваемую БД на другой сервер. В таком случае картина становится значительно яснее. А если еще и применить munin, то и нагляднее

Теперь, как это сделать практически

Рассмотрим на примере mysql55 и FreeBSD. Предполагается, что mysql установлен с нуля на удалённый сервер. Настроен удалённый доступ серверу mysql с рабочего места администратора при помощи phpMyAdmin. Сделать нужно три сервера на портах 3306, 3307, 3308. Настройка шифрованного подключения к серверам с рабочего места администратора в этой статье не рассматривается

Конфигурирование эталонной БД mysql

которую потом мы растиражируем на нужное количество серверов. В таблицу mysql.user вносим пользователя multi_admin, забиваем ему пароль и даём права shutdown и process. С правами этого пользователя сценарий mysqld_multi будет осуществлять стоп/старт серверов mysql. Пользователя mysqld_multi нужно завести в mysql.user каждого экземпляра запускаемого mysql-сервера и задаль пароль, который позже укажем в конфиге my.cnf

Подготовка окончена, останавливаем сервер mysql

service mysql stop

Описываем конфигурацию серверов в my.cnf

Его нужно положить в каталог /etc. В этом файле настройки каждого сервера описаны в параметрических группах mysql6, mysql7, mysql8. Индексы в названии групп нужно запомнить, так как они используются как параметр при стоп/старте конкретного сервера. В группе mysqld_multi конфигурационного файла указан пользователь multi_admin и его пароль для того, чтоб каждый раз не пришлось вводить его вручную при стоп/старте серверов mysql

[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = ******
[mysqld6]
datadir=/var/db/mysql/3306
pid-file=/var/db/mysql/3306/myserver.pid
port=3306
socket=/tmp/mysql.sock3306
...
[mysqld7]
datadir=/var/db/mysql/3307
pid-file=/var/db/mysql/3307/myserver.pid
port=3307
socket=/tmp/mysql.sock3307
...
[mysqld8]
datadir=/var/db/mysql/3308
pid-file=/var/db/mysql/3308/myserver.pid
port=3308
socket=/tmp/mysql.sock3308
...

Для каждого сервера создаём свои каталоги

cd /var/db/mysql
mkdir 3306 3307 3308
chown mysql:mysql 3306 3307 3308

Тиражирование

Всю структуру данных, которую мы получили после инсталяции в каталоге /var/db/mysql копируем в каталоги 3306, 3307, 3308 и пробуем запустить все сервера

mysqld_multi --no-log start 6,7,8

Опция —no-log выведет диагностическое сообщение на экран, а не в лог-файл. Если всё сделано правильно, то в процессах мы увидим все три сервера, которые висят на своих портах. Опцию mysql_enable=»YES» из rc.conf удаляем, она больше не понадобится. А чтобы все сервера стартовали после включения сервера нужно в рутовый crontab внести запись

@reboot mysqld_multi start

Всё

Александр Черных
системный администратор

Статьи по теме

1+