MariaDB (MySQL )を ZFSに最適化

ファイルシステムZFS で データベースMariaDB MySQLを最適化する設定とそのメリットを考察してみました.
zfs_mariadb

MariaDB を ファイルシステム ZFS で最適化してパフォーマンスアップ

MriaDB MySQL などファイルシステム ZFS でデーターベースを扱う場合、ファイルシステムのブロックサイズや圧縮などの設定をMariaDB に最適化することでパフォーマンスが向上するらしい.

MariaDB 10 の設定

MariaDB の設定ファイルの中の ZFS 関連の意味

/usr/local/etc/mysql/conf.d/server.cnf

には、ZFS のためのコメントアウト ( # ) された設定が記されています.

/usr/local/etc/mysql/conf.d/server.cnf の内容の一部

# [mysqld] configuration for ZFS
# From https://www.percona.com/resources/technical-presentations/zfs-mysql-percona-technical-webinar
# Create separate datasets for data and logs, eg
# zroot/mysql      compression=on recordsize=128k atime=off
# zroot/mysql/data recordsize=16k
# zroot/mysql/logs
# datadir                       = /var/db/mysql/data
# innodb_log_group_home_dir     = /var/db/mysql/log
# audit_log_file                = /var/db/mysql/log/audit.log
# general_log_file              = /var/db/mysql/log/general.log
# log_bin                       = /var/db/mysql/log/mysql-bin
# relay_log                     = /var/db/mysql/log/relay-log
# slow_query_log_file           = /var/db/mysql/log/slow.log
# innodb_doublewrite            = 0
# innodb_flush_method           = O_DSYNC

https://www と始まる URL https://www.percona.com/resources/technical-presentations/zfs-mysql-percona-technical-webinarを見て、PDF の P25 あたりから具体的な方法が書かれていました.

# Create separate datasets for data and logs, eg
データとログ用に別々のデータセットを作成します。例:

zroot プールに zroot/mysql zroot/mysql/data zroot/mysql/logs の3つの ZFS ファイルシステムを作成するということだろう.
3つに分けるのは、 recordsize ( ブロックサイズ ) をそれぞれ 128k , 16k にするためのようです.
compression ( 圧縮 ) = on , atime = off にする必要があります.

MariaDB を ZFS に最適化

MariaDB の停止

# service mysql-server stop

FreeBSDの構成に従ってデータセットを作成

ZFS を使って FreeBSD をインストールすると zroot というプールにつながるようにファイルシステムが構築されます.
データーセットを作成する前に zfs list で現在のプールの状態を確認してみました.

 # zfs list

NAME                              USED  AVAIL  REFER  MOUNTPOINT
zroot                            1.83G  3.51T    96K  /zroot
zroot/ROOT                       1.83G  3.51T    96K  none
zroot/ROOT/12.3-RELEASE           8K  3.51T  1.03G  /
zroot/ROOT/default               1.83G  3.51T  1.77G  /
zroot/tmp                          96K  3.51T    96K  /tmp
zroot/usr                         428K  3.51T    96K  /usr
zroot/usr/home                    140K  3.51T   140K  /usr/home
zroot/usr/ports                    96K  3.51T    96K  /usr/ports
zroot/usr/src                      96K  3.51T    96K  /usr/src
zroot/var                         788K  3.51T    96K  /var
zroot/var/audit                    96K  3.51T    96K  /var/audit
zroot/var/crash                    96K  3.51T    96K  /var/crash
zroot/var/log                     256K  3.51T   256K  /var/log
zroot/var/mail                    132K  3.51T   132K  /var/mail
zroot/var/tmp                     112K  3.51T   112K  /var/tmp

/usr/local/etc/mysql/conf.d/server.cnf に書かれていた zroot に mysql のファイルシステムを作成すれば良いと考え、それぞれ3つのデータセットを作って設定を行います.

MariaDB 用のデータセットを作成する

zfs create で作成し、zfs set で設定し、zfs get で確認します.

zroot/mysql 128k

# zfs create zroot/mysql
# zfs set compression=gzip zroot/mysql
# zfs set recordsize=128k zroot/mysql
# zfs set atime=off zroot/mysql
# zfs get compression,recordsize,atime zroot/mysql
NAME         PROPERTY     VALUE     SOURCE
zroot/mysql  compression  gzip      local
zroot/mysql  recordsize   128K      local
zroot/mysql  atime        off       local

zroot/muysql/data 16k

# zfs create zroot/mysql/data
# zfs set recordsize=16k zroot/mysql/data
# zfs set primarycache=all zroot/mysql/data
# zfs set logbias=latency zroot/mysql/data
# zfs get compression,recordsize,atime zroot/mysql/data
NAME                  PROPERTY     VALUE
NAME              PROPERTY     VALUE     SOURCE
zroot/mysql/data  compression  gzip      inherited from zroot/mysql
zroot/mysql/data  recordsize   16K       local
zroot/mysql/data  atime        off       inherited from zroot/mysql

zroot/mysql/logs 128k

# zfs create zroot/mysql/logs
# zfs get compression,recordsize,atime zroot/mysql/logs
NAME              PROPERTY     VALUE     SOURCE
zroot/mysql/logs  compression  gzip      inherited from zroot/mysql
zroot/mysql/logs  recordsize   128K      inherited from zroot/mysql
zroot/mysql/logs  atime        off       inherited from zroot/mysql

いずれも、gzip on , atime off です.

現在の CUP の処理能力ならば、圧縮 gzip on の方が転送スピードが上がるそうです.

データセットの確認

zfs list でデータセットの確認をしてみると、最初の、/usr/local/etc/mysql/conf.d/server.cnfの設定ファイルのディレクトリとは異なっているので、MOUNTPOINT を実際の運用に変更する必要があります.

# zfs list

部分抜粋してあります.
NAME                USED  AVAIL  REFER  MOUNTPOINT
zroot/mysql         288K  3.51T    96K  /zroot/mysql
zroot/mysql/data     96K  3.51T    96K  /zroot/mysql/data
zroot/mysql/logs     96K  3.51T    96K  /zroot/mysql/logs

元のMySQL のファイルを ZFS に移動 ( 未検証 )

注意)もしも大切なデーターが残っている場合は、データーのバックアップは必須です.

実際に、消去されたくないデーターがある場合は、/var/db/mysql を他にコピーしてから次の操作を行なってくださいね.
と書かれていました.
あと、MySQL MariaDB が完全に停止していることを確認してください.

—– 旧ファイルの移動は未検証なので悪しからず———-

mv ファイルの移動を新たに作ったデータセットに

# mv /var/db/mysql/ib_logfile* /zroot/mysql/logs/
# mv /var/db/mysql/* /zroot/mysql/data/

これで、元の /var/db/mysql/ の中は空っぽになった筈です.

————————————————————

マウントポイントを FreeBSD 用に修正

作成した zroot/mysql を実際のマウントポイントに設定ファイルに書かれているように変更します.

# zfs set mountpoint=/var/db/mysql/data zroot/mysql/data
# zfs set mountpoint=/var/db/mysql/log zroot/mysql/logs
# chown mysql:mysql /var/db/mysql /var/db/mysql/log

マウントポイントの確認をします

# zfs list

一部抜粋
NAME                      USED  AVAIL  REFER  MOUNTPOINT
zroot/mysql              1.53M  3.51T    96K  /zroot/mysql
zroot/mysql/data         1.32M  3.51T  1.32M  /var/db/mysql/data
zroot/mysql/logs          120K  3.51T   120K  /var/db/mysql/log

MariaDB の設定ファイルの修正

MariaDB10 の usr/local/etc/mysql/conf.d/server.cnf の修正をします.

設定ファイルの中の # を外すだけですが、datadir は、2箇所あるので、先の # datadir = /var/db/mysql をコメントアウトする必要があります.

# vi usr/local/etc/mysql/conf.d/server.cnf 

[mysqld]

#datadir = /var/db/mysql 

datadir                       = /var/db/mysql/data
innodb_log_group_home_dir     = /var/db/mysql/log
audit_log_file                = /var/db/mysql/log/audit.log
general_log_file              = /var/db/mysql/log/general.log
log_bin                       = /var/db/mysql/log/mysql-bin
relay_log                     = /var/db/mysql/log/relay-log
slow_query_log_file           = /var/db/mysql/log/slow.log
innodb_doublewrite            = 0
innodb_flush_method           = O_DSYNC

MariaDB の初期化

mysq_install_dbコマンドでDBを初期化  

# mysql_install_db --user=mysql --basedir=/usr/local --datadir=/var/db/mysql/data

/etc/rc.conf に追加

mysql_enable="YES"
mysql_dbdir="/var/db/mysql/data/"

MariaDB の起動

MariaDB の起動

# service mysql-server start

セキュリティ設定

mysql_secure_installation
# mysql_secure_installation

Enter current password for root (enter for none):  エンターキー
Set root password? [Y/n] Y
New password: password
Re-enter new password: password
Remove anonymous users? [Y/n]Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

結果

他のサイトに書かれていることを参考にしながら、MariaDB と ZFS の最適化を行なってみたが、データーの移行には、この方法を使用するのは、危険な感じがします.

新規にMariaDB や MySQL をインストールして新しいデーターベースを作るときに、ZFS を作るのであれば問題は少なそうですが、

今回は、運用しているサーバーではなく、新しいサーバーに移行した時、実験的に設定してみました.

参考リンク

Hands-On Look at ZFS with MySQL

Cognitive Overhead

MariadbとZFS

ZFS with MySQL PDF

FreeBSD 11にMariaDB 10.3をインストール – クソゲ~製作所

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

もくじ