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
ZFS with MySQL PDF