はじめに
KUSANAGI では、データベースとしてMariaDBを使用しています。MariaDBはMySQLからフォークしたデータベースですが、MySQL 8以降とはデータ互換性がありません。
今回は、KUSANAGIでMySQL 8.x を使用する方法をご紹介します。
通常のMariaDBのアップグレード
KUSANAGI では、MariaDB 10.5、10.6、10.11 の各LTSをサポートしています。kusanagi upgrade
コマンドを使用することで、高いバージョンへアップグレードできます。逆にダウングレードはできません。 以下のコマンドで、MariaDB 10.5もしくは10.6 を使用している環境を、MariaDB 10.11 へアップグレードできます。
# アップグレード前のMariaDBのバージョンは 10.6
$ sudo kusanagi status | grep mariadb
*** (active) mariadb : mariadb10.6 ***
* mariadb.service - MariaDB 10.6.22 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled)
# MariaDB 10.11 へのアップグレード実施
$ sudo /opt/kusanagi/bin/kusanagi upgrade mariadb --use mariadb10.11
Did you check MariaDB upgrade instructions? [y/n] y
Is this server using Galera cluster? [y/n] y
(中略)
# アップグレード後のMariaDBのバージョンは 10.11
$ sudo kusanagi status | grep mariadb
*** (active) mariadb : mariadb10.11 ***
* mariadb.service - MariaDB 10.11.13 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled)
OS標準のMySQL 8.0への移行
KUSANAGIの元としているAlmaLinux 8/9では、OS標準のMySQL 8.0が用意されてるので、MySQL 8.0へ移行してみます。
データバックアップ
MySQLとMariaDBではデータ互換性がないため、データ領域を作り直すことになります。データ移行するためには、事前に mariadbdump
コマンドを使用したバックアップが必要です。
# DBの設定などを変数に格納する
$ eval $(sudo cat ~kusanagi/wordpress/.kusanagi.conf)
# DBの内容をバックアップ
$ mariadbdump -u${KUSANAGI_DBUSER} -p${KUSANAGI_DBPASS ${KUSANAGI_DBNAME} > ${KUSANAGI_DBUSER}.sql
MariaDBからMySQL 8.0への移行
最初に、MariaDBのパッケージを削除し、データ領域を削除します。
$ sudo dnf config-manager --disable mariadb10.11
$ sudo dnf remove -y MariaDB-server MariaDB-client MariaDB-devel MariaDB-shared MariaDB-common
# DB構造が非互換なので、一度データ領域を削除する
$ sudo rm -rf /var/lib/mysql/*
次に、MySQL 8.0 をインストールします。サーバ用の設定ファイルは削除されるのですが、MariaDBと同じものをコピーします。
$ sudo dnf install -y mysql-server
$ rpm -q mysql-server
mysql-server-8.0.41-2.el9_5.x86_64
$ sudo cp /etc/my.cnf.d/server.cnf.rpmsave /etc/my.cnf.d/server.cnf
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now mysqld
最後に、同一ユーザ・パスワード・DB名で、DBを作成します。その後、バックアップしたデータをリストアします。
# DBNAME/DBPASS/DBNAMEの設定手順がMariaDBと異なるので注意
$ cat <<EOF | mysql -uroot
> CREATE DATABASE IF NOT EXISTS \`${KUSANAGI_DBNAME}\`;
CREATE USER '${KUSANAGI_DBUSER}'@'localhost' IDENTIFIED BY '${KUSANAGI_DBPASS}';
GRANT ALL PRIVILEGES ON \`${KUSANAGI_DBNAME}\`.* TO '${KUSANAGI_DBUSER}'@'localhost';
FLUSH PRIVILEGES;
EOF
$ mysql -u$KUSANAGI_DBUSER -p$KUSANAGI_DBPASS $KUSANAGI_DBNAME < ${KUSANAGI_DBNAME}.sql
これで、MySQL 8.0への移行は完了です。
MySQL 8.4への移行
MySQLの最新である MySQL 8.4 のCommunity Editionは、Oracle社のリポジトリで提供されています。MySQL 8.0 と MySQL 8.4 はデータ互換性があるので、dnf upgrade
を使用するだけでデータ移行まで完了します。
$ sudo dnf install https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
$ sudo dnf upgrade -y
$ rpm -q mysql-community-server
mysql-community-server-8.4.5-1.el9.x86_64
$ sudo systemctl daemon-reload
$ sudo systemctl restart mysqld
(参考)MariaDBとMySQLの速度比
以下は、k6 を使用してWordPress のhttp request を測定した結果です。環境は 4 core/4GB のVMで、AlmaLinux9ベースのKUSANAGIを使用しています。

MariaDBに比べて、MySQL の req/s が遅くなっています。おそらく、MySQL 8系では十分なチューニングを行っていないという理由も含まれます。また、MySQL 8からクエリキャッシュが廃止されたことも原因と思われます。 以下は1リクエストあたりのレイテンシーですが、こちらも同様にMySQL8 のレイテンシーが高くなる、つまり遅くなります。

※参考:元データ
DB | http_reqs数 | req/s | 平均値(ms) | 最小値(ms) | 中央値(ms) | 最大値(ms) | 90パーセンタイル(ms) | 95パーセンタイル(ms) |
---|---|---|---|---|---|---|---|---|
MariaDB 10.6.22 | 4759 | 158.229266 | 189.38 | 26.96 | 198.89 | 348.93 | 241.28 | 256.1 |
MariaDB 10.11.3 | 4615 | 153.439225 | 195.33 | 24.18 | 204.34 | 338.83 | 249.2 | 262.93 |
MySQL 8.0.41 | 4151 | 137.870423 | 217.27 | 30.25 | 221.72 | 336.99 | 263.76 | 273.61 |
MySQL 8.4.5 | 4141 | 137.544438 | 217.88 | 27.88 | 232.91 | 382.98 | 282.49 | 294.27 |
終わりに
KUSANAGIで提供するWordPressでは、MySQLでも構築可能です。しかし、KUSANAGIではMySQLを使用する機能が含まれていません。そのため、kusanagi status
コマンドを使用したDBの状態確認などができません。KUSANAGIではMySQLを使用する際は、自己責任で構築してください。
MySQL 8 とMariaDBでは、JSON型の扱いの違い、スレッドプーリングの有無、使用できるストレージエンジンの違いなど複数あります。WordPressで使用するのならそれほど違いはありませんが、DBの特徴などによってMySQL 8とMariaDBを使い分けてください。