サービスを利用したMariaDB複数起動

ふと機会があり、ブログサーバーを移行したんですが、気がつけば4年くらい放置してたんですねぇ。 時が経つのは、早いもんですね、小堤です。

最近は、すっかりPythonとMariaDBと、機械学習ばかりやっている気がします。 そこで、今後MariaDBの別記事を書こうかなと思っていた一部を先に書いてしまおうと思ったこの投稿です。

MariaDBの複数起動

MySQLも一緒なんですが、MariaDBをインストールした初期状態は、ポート3306で起動し、シングルインスタンスとして起動します。 場合によっては、同じサーバー内で複数のMariaDBを起動したいシーンがあります。

レプリケーション環境のテストとか、MariaDB Galera Cluster(Galera Cluster)の設定とか。 検証のみであれば、今は、VagrantやDockerでいいじゃんっていうのも正直あるんですが、諸問題で直接入れたい場合もあります。 今回は言及しませんが、Linuxのファイルデスクリプター設定をDockerでやる場合、できるんですけど、普通に素でインストールされていたほうがわかりやすいと思います。

触れる場所が多すぎるので、切り出して複数起動に絞りました。

MariaDBの複数起動方法は、いくつかあります。

  • dbdeployerを利用した起動
  • mysqld_safeを利用した起動
  • dockerを利用した起動(コンテナ内部で別々に動いてるんでちょっと違いますけど)
  • サービスを利用した起動

dbdeployerは、phpenvやpython venvみたく複数のバージョンを起動、管理できる便利なツールです。 MySQL Sandboxって名前だったんですかね、最近まで知りませんでした。

mysqld_safeは、mysqldを起動するスクリプトです。 コマンド叩いて起動できるんですが、自動起動設定など頑張ってスクリプト用意しないといけないので手間です。

そして、本日のサービスを利用した複数起動ですね。 これが一番簡単です、しかし、いろんなブログやドキュメント、書き込みなど漁ってみたんですが、全然うごかーねーのね、こいつ。

んで、なんでかなぁ…って数日悩んでたんですが、

/etc/systemd/system/mariadb@.service

にバッチリコメントでいろいろ書かれてました。 よくあるやつですね、ちゃんと嫁。

そしてOS環境は CentOS …. ではなく、Alma Linux 8.4です。 去年末のドタバタから、CentOS Stream 8をしばらく使ってたんですが、 アップストリームに変わることでカーネルのバージョンはガンガン上がるし、

「Fedoraかよ…」って思いつつも、CentOSっぽい動き(いままでのノウハウ通り)動いてくれてたんで、正直Oracle Linuxとか、なんなら本家買おうか、ん〜ってなってたところに、先日、Alma Linuxがでてきました。すごいですね、4ヶ月後にガチギレ(したのか知らないですけど)した人たちがあっと今にクローン作りあげるんですから。 このあとも、Rocky LinuxなどCent OS Cloneは、まだ出てくるみたいで、どれがスタンダードになるかわかりませんが、現在Rocky LinuxがRCだったので、GAで出てるAlma Linuxを選択しました。 入ってしまえば、Cent OSって感じで、今の所いろんなミドルウェアのインストールなど検証してみましたが問題ありません。そして、これって一回決めちゃうと、検証時間も含めて移動したくなくなるんですよねぇ。

MariaDBのインストール

前置きが長くなりましたが、何はともあれ、MariaDBのインストールです。 パッケージマネージャー用のリポジトリを追加して、dnf でインストール、以上。 今回は起動させるだけなんで、backupや他のstorage engineはインストールしていません。

# MariaDBリポジトリ追加
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

# MariaDBインストール
dnf -y install 
  MariaDB-server 
  MariaDB-client 
  ;

通常は、このあと

systemctl start mariadb

# または

systemctl enable --now mariadb

として起動、自動起動設定行うのですが、複数起動の場合は、次の手順が必要です。

複数起動サービス設定

systemctl を利用して制御するのは、変わりません。 何気にコレでかいです。自動起動とか、いろいろなんもしなくていいんですからね。

ポイントは、以下です。

  • 起動するMariaDBごとにデータディレクトリは別(当たり前
  • それぞれのMariaDBデータディレクトリは、/data/mysqlに配置する(変えてもいいよ
  • ポート番号は、3307から順に利用して起動する
  • それぞれの設定は、/etc/my.[ノードの名前].cnfに記載する
  • /etc/systemd/system/mariadb@.service.d ディレクトリを作成する
  • /etc/systemd/system/mariadb@.service.d/multi.conf ファイルを作成する
  • systemctl daemon-reload を呼び出す

手作業もなんなので、簡単にスクリプトにしました。

nodes の配列を追加すればノード増えます。
(node1, node2, node3…)

#!/bin/bash

# 複数データルートディレクトリ指定
DATA_ROOT="/data/mysql"

# 設定開始ボート
PORT=3306

# 作成ノードリスト
nodes=(
  "node1"
  "node2"
  "node3"
  "node4"
)

for node in "${nodes[@]}" ; do

  # データディレクトリ作成
  mkdir -p "$DATA_ROOT/mysql_$node"
  chown mysql: "$DATA_ROOT/mysql_$node"
  
  # 設定ファイル生成
cat << EOF > /etc/my.$node.cnf
[mysqld]
datadir=$DATA_ROOT/mysql_$node
socket=$DATA_ROOT/mysql_$node/mysql.sock
port=$PORT
log-error=$DATA_ROOT/mysql_$node.log
EOF
  
  # ポート番号インクリメント
  PORT=$(expr $PORT + 1)
  
done

# サービス定義作成
mkdir -p /etc/systemd/system/mariadb@.service.d;
cat << EOF> /etc/systemd/system/mariadb@.service.d/multi.conf
[Unit]
ConditionPathExists=/etc/my.%I.cnf

[Service]
Environment=MYSQLD_MULTI_INSTANCE=--defaults-file=/etc/my.%I.cnf
EOF

# 設定反映
systemctl daemon-reload

2021/07/30追記

起動は

systemctl enable --now mariadb@node3

それぞれのmariadbに接続するには、ソケットを指定して接続する。


mariadb -S /data/mysql/mysql_node4/mysql.sock

おわりに

書いてみると、「コレだけかよ… 」ってことなのに、結構悩みましたねぇ。

/etc/systemd/system/mariadb@.service.d/multi.conf

を自分で書くなんて思ってなかったんだもん。 @つけてやれば、すぐ使えるのかと思ってました(もしかして使えたりするんですかね

結構便利だな!ってみんな思うと思うのですが、実際やってみると「動かねぇじゃん…」ってなりがちなのかな?他のブログとか見てると。

ちゃちゃっとコピペして動かせるので、レプリケーション検証、クラスター検証などするときに、利用してみてください。間もなく、MariaDB 10.6 がGAになるみたいなのですが、【XAトランザクションのCluster対応】【InnoDBの性能向上】とかが興味あるのもの、MyRocksか、Spiderか、合わせるかみたいな、ほんといつからDBAになったんですかね、僕は。そういった検証にも1台とりあえず起動して、マルチインスタンスで、さくっと試してみるのも有りかと思います。

開発用には、docker compose でいいじゃん、は変わらんのですが。

気力が持てば、また別記事書きますが、本来これは、上記のレプリケーション、クラスターを構築したくてやってたわけじゃないんですよねぇ(遠い目)

次はいつ投稿するんだろ、4年後かな笑

最新の更新を
プッシュ通知で購読しよう