動かざることバグの如し

近づきたいよ 君の理想に

UbuntuでMariaDBを複数起動させる方法(systemd編)

環境

やりたいこと

1つのサーバーで複数のMariaDBを起動させたい。とはいえ全部のポートが3306だとコンフリクトしてしまうので

  • ポート番号
  • データ格納場所
  • プロセスファイル、ソケットファイル
  • ログパス

は別々にしたい

調べてみると色々記事は出てくるが、systemdを使用していない古い記事、mysqld_multiに依存している記事、CentOSとかArchLinuxとか仕様が違う記事等あって

Ubuntuかつモダンなsystemd版の記事がなかったのでメモ

MariaDBのインストール

ここではMariaDB公式のレポジトリを追加してインストールする

apt-get install apt-transport-https curl
curl -o /etc/apt/trusted.gpg.d/mariadb_release_signing_key.asc 'https://mariadb.org/mariadb_release_signing_key.asc'

cat > /etc/apt/sources.list.d/mariadb.list <<EOF
deb https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.8/ubuntu focal main
EOF
apt install -y mariadb-server

複数起動させる方法

実は複数起動させる方法は公式ドキュメントに記載されている。

Running Multiple MariaDB Server Processes - MariaDB Knowledge Base

が、残念なことにこの記事だけだとsystemdの説明が足りなさすぎて何もできない。実際に細かく書かれているのはsystemdの記事だったりする。下記

systemd - MariaDB Knowledge Base

Ubuntuの場合、 /lib/systemd/system/mariadb@.service に必要な設定ファイルが記載されている

こんな感じで%Iが変数化されており動的に入れることが出来る。

[Unit]
Description=MariaDB 10.8.3 database server (multi-instance %I)
Documentation=man:mariadbd(8)
Documentation=https://mariadb.com/kb/en/library/systemd/
After=network.target

Environment の設定で書かれているが、環境変数 MYSQLD_MULTI_INSTANCE--defaults-group-suffix= パラメータを追加するのが大事

これは別に自分が設定しなくてもsystemd側で動的に設定してくれる。 %I ってのがミソ

# Controlling how multiple instances are separated. See top of this file.
# Note: This service isn't User=mysql by default so we need to be explicit.
# It is as an option here as a user may want to use the MYSQLD_MULTI_INSTANCE
# to run multiple versions.
Environment='MYSQLD_MULTI_INSTANCE=--defaults-group-suffix=.%I'

後ポイントの設定は ConditionPathExists

## See Environment=MYSQLD_MULTI_INSTANCE below for current recommended options.
ConditionPathExists=!/etc/mysql/mariadb.conf.d/my%I.cnf

これ、自分も最初ミスリードしてしまったがsystemdのドキュメントいわく

ConditionPathExists
If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist.

とあり、今回みたいに!があると /etc/mysql/mariadb.conf.d/my%I.cnf の設定があると起動しない コメント見る感じ下位互換性のための設定らしい

手順

10000、20000ポート2つのサーバーを起動しようとする例

データ格納用のディレクトリを作成する

mkdir /var/lib/mysql_{10000,20000}
chown mysql: /var/lib/mysql_{10000,20000}
mysql_install_db --datadir=/var/lib/mysql_10000 --user=mysql
mysql_install_db --datadir=/var/lib/mysql_20000 --user=mysql

MariaDBだとデフォルトだと /etc/mysql/mariadb.conf.d/50-server.cnf がサーバーの設定ファイル

以下のように追記する。 defaults-group-suffix=.%I%Iがmysqld.10000の「10000」に該当するのを注意

何故か公式で「.」がついているので mysqld10000 で動かないので注意

[mysqld.10000]
port       = 10000
datadir    = /var/lib/mysql_10000
socket     = /run/mysqld/mysqld1.sock
pid-file   = /run/mysqld/mysqld1.pid
log-error  = /var/log/mysql/error1.log

[mysqld.20000]
port       = 20000
datadir    = /var/lib/mysql_20000
socket     = /run/mysqld/mysqld2.sock
pid-file   = /run/mysqld/mysqld2.pid
log-error  = /var/log/mysql/error2.log

いざ起動

systemctl restart mariadb@10000
systemctl restart mariadb@20000

ps aux| grep mysql で確認

mysql       2544  0.0  5.0 1344868 102304 ?      Ssl  18:07   0:00 /usr/sbin/mariadbd
mysql       4636  0.8  4.8 1352680 98544 ?       Ssl  18:19   0:00 /usr/sbin/mariadbd --defaults-group-suffix=.10000
mysql       4681  1.6  4.8 1278948 98320 ?       Ssl  18:19   0:00 /usr/sbin/mariadbd --defaults-group-suffix=.20000

デフォルトだとソケットログインが出来る

root@vagrant:/etc/mysql/mariadb.conf.d# mysql -S /run/mysqld/mysqld1.sock
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.8.3-MariaDB-1:10.8.3+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

mysql_secure_installation でMySQLの初期設定が出来るが、デフォルトだとポート3306を参照してしまう。ポート番号を指定することが何故かできないのでソケットファイルを指定する。

export MYSQL_UNIX_PORT=/run/mysqld/mysqld1.sock

これで初期設定が出来る

mysql_secure_installation

参考リンク