環境
やりたいこと
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