пятница, 27 января 2023 г.

Как запустить второй сервер mysql в Debian и не умереть, пытаясь

В инете достаточно мануалов, где вручную поднимают второй инстанс mysql: копируют папки с данными БД, скрипты в /etc/init.d/, дергают mysql_install_db и т.д. При этом не всегда опишут, как сделать, чтобы второй инстанс можно было так же, как и первый, удобно запускать и тормозить через systemctl.

Ковыряясь с последней задачей, я закопался в скриптах /lib/lsb/init-functions, /usr/share/mysql/mysql-helpers и в системе systemd.

Короче выяснилось, что инстанс можно запустить с закрытыми глазами одной рукой за минуту.

есть такая штука
# ls -l /lib/systemd/system/my*
-rw-r--r-- 1 root root 1652 Dec 10  2020 /lib/systemd/system/mysql.service
-rw-r--r-- 1 root root 1780 Jan 27 17:19 /lib/systemd/system/mysql@.service
вот этот mysql, который с собакой, позволяет запустить сколько угодно новых инстансов командой
systemctl enable mysql@2

а чтобы каждый инстанс имел свой pid, sock и datadir, достаточно добавить в /etc/mysql/conf.d небольшой конфиг для него (расширение .cnf обязательно)

[mysqld@2]
socket = /var/run/mysqld/mysqld2.sock
datadir = /var/lib/mysql2
log-error = /var/lib/mysql2/error.log
port = 3308
server-id = 4
папку datadir требуется предварительно создать и дать права пользователю mysql:mysql.

фокус в следующем

новый инстанс запускается с параметром --defaults-group-suffix=@2, как прописано в /lib/systemd/system/mysql@.service, mysql при этом подгружает опции из my.cnf помимо основной секции [mysqld] также из [mysqld<defaults-group-suffix>], которые переопределяют ранее считанные опции из [mysqld].

Т.е. в [mysqld] пишем все основные настройки, а для нового инстанса в [mysqld@2] прописываем особые пути к сокету, pid, datadir, server-id и все, что еще потребуется.

Осталось запустить. Но сначала рекомендуется немного подправить новый сервис командой 

systemctl edit mysql@2

В редакторе надо вписать
[Service]
RuntimeDirectoryPreserve=1
сохранить и выйти. Это нужно, чтобы при остановке инстанса папка /var/run/mysqld не удалялась вместе с pid/sock-файлами остальных инстансов.

Теперь запуск

$ systemctl start mysql@2
Первый запуск может затянуться из-за инициализации сервера БД

Доступ в консоль возможен без пароля, если подключаться из-под рута и по сокету
$ mysql -S /var/run/mysqld/mysqld2.sock

Таким образом можно быстро развернуть новый сервер из копии папки имеющегося, но нужно предварительно удалить из нее файл auto.cnf, там прописан server-uuid, файл создастся сам при запуске нового сервера.

Бонус

Такой же финт можно провернуть и с другими сервисами. Например, для мемкеша файла с собакой не было. Берем .service-файл от основного и копируем его с собакой.
Файл основного сервиса memcached можно узнать из вывода systemctl status memcached из строки "Loaded".
Копируем
cp /lib/systemd/system/memcached.service /lib/systemd/system/memcached@.service

Правим, добавляя %i ко всем важным параметрам, типа pid, sock, conf.
Например, команда запуска становится такой

ExecStart=/usr/share/memcached/scripts/systemd-memcached-wrapper /etc/memcached/memcached-%i.conf
Дальше все, как для mysql: systemctl enable, systemctl start.

Комментариев нет:

Отправить комментарий