MySQL、NFS、シンボリックリンク

MySQL、NFS、シンボリックリンク

私は、Ubuntu で apache2 + mysql を実行している古いサーバーを、debian (wheezy) を実行している新しいサーバーに移行しています。データベースがローカルに保存されている間は (この場合は /srv/mysql)、移行は正常に機能しますが、NFS を実行している集中ストレージにデータベースを移動し、移動したファイルへのシンボリック リンクを作成しようとすると、mysql はデータベースをまったく見つけられないようです。mysql からエラーは表示されず、そのようなデータベースは存在しないと認識されるだけです。

これは /srv/mysql のレイアウトです (いくつかの例):

user@server:/srv/mysql# ls -al
total 135440
drwxr-xr-x 50 mysql mysql      4096 May 22 09:59 .
drwxr-xr-x  7 root  root       4096 May 22 09:59 ..
drwxrwx---  2 mysql mysql      4096 May 21 20:13 database_dir_1
drwx------  2 mysql mysql      4096 May 21 19:07 database_dir_2
drwxrwx---  2 mysql mysql      4096 May 21 20:15 database_dir_3
drwx------  2 mysql mysql      4096 May 21 20:15 database_dir_4
drwxrwx---  2 mysql mysql      4096 May 21 20:15 database_dir_5

シンボリックリンクを作成する方法:

mv /srv/mysql/database_dir_1 /mnt/centralstorage/customer1/db/database_dir_1
ln -s /mnt/centralstorage/customer1/db/database_dir_1 /srv/mysql/database_dir_1
ls -al /srv/mysql/
drwxrwx---  1 root root      28 May 21 20:13 database_dir_1 -> /mnt/centralstorage/customer1/db/database_dir_1

この後、mysql は database_dir_1 を参照できなくなりますが、cli からは完全に参照可能になります。

/mnt/centralstorage のマウントは次のようになります。

192.168.12.222:/srv/storage/customers on /mnt/centralstorage/ type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.12.222,mountvers=3,mountport=49535,mountproto=udp,local_lock=none,addr=192.168.12.222)

中央サーバーへのエクスポート:

/srv/storage 192.168.12.30(rw,async,no_subtree_check,no_root_squash)

(名前等はすべて変更されています)

セットアップに関して何か問題があると感じた人はいますか?

よろしくお願いいたします、FrontSlash

編集1:

@Fox からの助言により、問題は NFS 接続にあるようです。私が上記に投稿した NFS 構成に問題があると思われる方はいらっしゃいますか? さらに詳しい情報が必要な場合は投稿します。

編集2:

簡単なテストを実行し、他の 2 つのエクスポートと同じ設定で、NFS サーバー上の新しいフォルダー /srv/temp をエクスポートしました。

以前に実行した起動スクリプトの代わりに、fstab を使用してこれを SQL サーバーにマウントしました。

スクリプトは単に

mount $host:$dir $mnt_dir/$mmount

このマウントを製造したのは:

192.168.12.222:/srv/storage/customers on /mnt/centralstorage/ type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.12.222,mountvers=3,mountport=49535,mountproto=udp,local_lock=none,addr=192.168.12.222)

fstab マウント:

192.168.12.222:/srv/temp /mnt/temp nfs rw,sync,hard,intr 0   0

これを制作しました:

192.168.12.222:/srv/temp on /mnt/temp type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.12.222,mountvers=3,mountport=49535,mountproto=udp,local_lock=none,addr=192.168.12.222)

そして、ここが奇妙な部分ですが、データベース ディレクトリを /mnt/temp フォルダーに移動し、これへのリンクを作成すると、動作します。引き続き調査します。

編集3: 回答として解決策を追加しました。nfs-kernel-server には、/etc/nfs-kernel-server の --manage-gids オプションがあり、これが mysql ユーザーのセカンダリ グループに影響していました。

答え1

使用しているエンジンが何なのかは書かれていませんが、InnoDB(最近では標準的)だと仮定します。MySQL ドキュメント

(実際のシンボリック リンクの使用は、InnoDB テーブルではサポートされていません。)

そして

DATA DIRECTORY 句は、これまで常に問題があり、個々の InnoDB テーブルではサポートされていなかったシンボリック リンクの使用に代わるサポートされている代替手段です。

.islファイルを手動で作成することもできますが、テストライブでそれを実行する前に。

興味深いかもしれない警告が 1 つあります。

MySQL テーブルを NFS マウントされたボリューム上に配置しないでください。NFS はメッセージ パッシング プロトコルを使用してファイルに書き込むため、ネットワーク メッセージが失われたり、順序どおりに受信されなかったりすると、データの不整合が発生する可能性があります。

編集: わかりました... InnoDB ではないので、これは正しい答えではありませんでした。ただし、他の誰かが InnoDB ソリューションを探してここに来た場合に備えて、残しておきます。

さらに読むMySQL とシンボリックリンクについて。

特に興味深いのは

シンボリックリンクを使用していない場合は、--skip-symbolic-linksmysqld を使用してデータ ディレクトリ外のファイルを削除したり名前を変更したりできないようにするオプションを指定して mysqld を起動します。

それは Debian ではデフォルトである可能性があります。(知りません。)

編集2: 確認するためのより良い方法は次のとおりです:

SHOW VARIABLES LIKE 'have_symlink';

外部からデータベースを取得しないもう 1 つの理由はdata-dir、AppArmor または同様のセキュリティ対策です。

ところで、NFS に関連するものであれば、テストする価値があります。ローカル ファイル システムの完全に異なる部分 (または、まったく異なるファイル システム) へのシンボリック リンクが機能する場合は、NFS 内にあります。機能しない場合は、シンボリック リンク内にあります...

答え2

@Fox と @Sven の助力に感謝します。問題は解決しました。

これは nfs-kernel-server の設定で、/etc/defaults/nfs-kernel-server にはセカンダリ グループの使用を無効にする --manage-gids オプションが含まれていました。そのため、mysql ユーザーはセカンダリ グループを通じて適切な権限を持っていましたが、nfs-server 側の権限は間違っていました。

同じ問題を抱えている他の誰かが、数時間を無駄にする前にこれを見ていただければ幸いです。

よろしくお願いいたします、FrontSlash

関連情報