MySQL, NFS 및 심볼릭 링크

MySQL, NFS 및 심볼릭 링크

우분투에서 apache2 + mysql을 실행하는 이전 서버를 데비안(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:

빠른 테스트를 수행하고 다른 두 내보내기와 동일한 설정을 사용하여 NFS 서버 /srv/temp에 새 폴더를 내보냈습니다.

실행된 이전 시작 스크립트 대신 fstab을 사용하여 SQL Server에 이것을 마운트했습니다.

스크립트는 단순히

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 폴더로 이동하고 이에 대한 링크를 생성하면 작동합니다. 나는 계속 탐구할 것이다.

Edit3: 솔루션이 답변으로 추가되었습니다. nfs-kernel-server에는 mysql 사용자의 보조 그룹에 영향을 미치는 /etc/nfs-kernel-server의 --manage-gids 옵션이 있습니다.

답변1

어떤 엔진을 사용하고 있는지는 밝히지 않았지만 (요즘 거의 표준이기 때문에) InnoDB라고 가정하겠습니다.MySQL 문서

(실제 심볼릭 링크 사용은 InnoDB 테이블에 대해 지원되지 않습니다.)

그리고

DATA DIRECTORY 절은 항상 문제가 있었고 개별 InnoDB 테이블에 대해 지원되지 않았던 기호 링크 사용에 대한 대안으로 지원됩니다.

.isl 파일을 직접 만들 수도 있지만(그러나시험라이브로 하기 전에).

그리고 관심을 가질 만한 한 가지 경고가 있습니다.

NFS 마운트 볼륨에 MySQL 테이블을 배치하지 마십시오. NFS는 메시지 전달 프로토콜을 사용하여 파일에 기록합니다. 이로 인해 네트워크 메시지가 손실되거나 잘못된 순서로 수신되면 데이터 불일치가 발생할 수 있습니다.

편집: 좋습니다. 그렇다면... 이것은 InnoDB가 아니기 때문에 정답이 아닙니다. 하지만 다른 사람이 InnoDB 솔루션을 찾으러 여기에 올 경우를 대비해 보관하겠습니다.

더 있습니다독서MySQL과 심볼릭 링크에서.

특히 흥미로운 것은

심볼릭 링크를 사용하지 않는 경우, --skip-symbolic-links아무도 mysqld를 사용하여 데이터 디렉토리 외부에 파일을 삭제하거나 이름을 바꿀 수 없도록 하는 옵션으로 mysqld를 시작하십시오.

데비안에서는 기본값이 될 수 있습니다. (모르겠어요.)

Edit2: 확인하는 더 좋은 방법은 다음과 같습니다.

SHOW VARIABLES LIKE 'have_symlink';

외부에서 데이터베이스를 선택하지 않는 또 다른 이유 data-dir는 AppArmor 또는 유사한 보안 조치 때문입니다.

그나저나. NFS와 관련된 경우 테스트할 가치가 있습니다. 로컬 fs의 완전히 다른 부분(또는 전혀 다른 fs)에 대한 심볼릭 링크가 작동하면 NFS에 있고, 그렇지 않으면 심볼릭 링크에 있습니다.

답변2

@Fox와 @Sven의 도움에 감사드립니다. 이제 문제를 해결했습니다.

nfs-kernel-server 설정이었고, /etc/defaults/nfs-kernel-server에는 보조 그룹의 사용을 중단하는 --manage-gid 옵션이 포함되어 있었습니다. 따라서 mysql 사용자는 보조 그룹을 통해 올바른 권한을 갖고 있었지만 nfs-server 측의 권한은 잘못되었습니다.

몇 시간을 낭비하기 전에 문제가 있는 다른 사람이 이 내용을 보기를 바랍니다.

관련하여 FrontSlash

관련 정보