긴 이야기 짧게
pNFS는 중앙 집중식 공유 스토리지에 대한 다중 동시 액세스를 제공하는 좋은 방법처럼 보이지만 문제가 있습니다. NFS 메타데이터(메타데이터 서버, MDS)를 제공하는 단일 NFS 서버는 단일 실패 지점입니다. MDS에 액세스할 수 없게 되면 곧 공유 스토리지에도 액세스할 수 없게 됩니다.
이 문제를 방지하기 위해 MDS 클러스터를 설정하고 싶습니다. 어떻게 이를 달성할 수 있나요?중앙 집중식 스토리지에 대한 클라이언트 직접 I/O를 거부하지 마십시오.?
HA-NFS를 위한 몇 가지 솔루션이 있지만 모두 직접 I/O pNFS 기능을 중단합니다.
이야기가 엄청 길어요
OpenStack 환경을 위한 공유 "데이터 저장소"를 구현하기 위한 (여러) 옵션을 탐색 중입니다.
저는 현재 중앙 집중식 스토리지 시스템에서 스토리지를 블록 스토리지로 사용하는 시나리오를 작업 중입니다. 이러한 시나리오에서는 대부분의 파일 시스템을 동시에 여러 번 안전하게 마운트할 수 없기 때문에 문제가 발생합니다. 적어도 여러 호스트에 대한 동시 읽기 및 쓰기 I/O가 있는 경우에는 그렇지 않습니다.
다중 마운트 문제에 대한 한 가지 가능한 해결책은 XFS와 함께 NFS 4.1을 사용하는 것입니다. 이번 버전부터 NFS를 허용하는 pNFS가 있습니다.고객블록 기반 I/O를 스토리지 시스템에 직접 연결합니다. 커널 문서에 따르면 현재 XFS만 nfs 블록 레이아웃을 지원합니다.
이 접근 방식을 사용하면 NFS 서버는 평소와 같이 공유를 클라이언트에 내보내지만 클라이언트가 실제로 I/O를 수행할 때는 NFS 서버가 아닌 스토리지 시스템과 직접 상호 작용합니다. 특히 가상 머신의 사용 사례(한 번에 하나의 호스트에서만 실행된다고 가정할 수 있음)의 경우 이는 적합해 보입니다.
공유를 클라이언트로 내보내는 NFS 서버는 단일 실패 지점입니다. 오류가 발생하면 다른 클라이언트는 공유를 탑재할 수 없으며 열리지 않은 파일에 액세스할 수 없습니다. 해결책은 한 서버에 장애가 발생하면 다른 서버가 대신할 수 있도록 NFS 서버 클러스터를 설정하는 것입니다. pNFS 서버는 어떻게 클러스터링됩니까?
Gluster 또는 drbd를 사용하여 NFS를 클러스터링하는 방법에 대한 많은 자습서가 있습니다. 이러한 도우미를 기반으로 하는 솔루션은 NFS 클라이언트와 NFS 서버 간에 데이터 I/O가 수행된다는 것을 의미합니다. 하지만 pNFS의 흥미로운 점은 데이터 I/O가 NFS 서버가 아닌 NFS 클라이언트와 중앙 스토리지 시스템 사이에서 수행된다는 점입니다. 따라서 이 두 가지 방법 중 하나를 사용하면 pNFS의 중요한 기능이 파괴되므로 솔루션으로 간주할 수 없습니다.
저는 이 분야에 존재하는 작업에 대해 매우 감사드립니다. 하지만 난 리뷰도 중요하게 생각하는데...
내 자신의 이론
pNFS는 몇 년 동안 안정적으로 사용되었지만 주변에는 잡음이 많지 않습니다. 내가 가지고 있는 작은 정보는 다음과 같습니다.
대부분의/모든 상태는 클라이언트에 속합니다. 이는 NFS 서버가 실패하더라도 상태가 즉시 손실되지 않음을 의미합니다.
클라이언트가 스토리지 시스템에 직접 I/O를 수행하기 때문에 서버 중단으로 인해 진행 중인 데이터 흐름이 중단되지 않습니다.
이 정보를 바탕으로 다음과 같은 접근 방식이 가능할 것으로 추측됩니다.
- 공유 LUN을 생성하고 하나의 서버를 사용하여 XFS를 배치합니다.
- 각 NFS 서버에 커널 nfsd를 설정합니다.
- 이 NFS 서버 그룹은 모두 읽기 전용 모드로 동일한 LUN을 마운트하도록 합니다.
- 각 서버에 램디스크 생성
- DRBD를 사용하여 모든 램디스크에 동기화된 미러링 설정
- 동기화된 미러 램디스크를 사용하여 NFS 서버 상태를 /var/lib/nfs에 마운트하여 저장하고 nfs 서비스를 다시 시작합니다.
keepalived
한 번에 하나의 서버만 활성화되는 VIP를 사용하여 서버 그룹을 활성/수동 클러스터로 구성하는 데 사용됩니다 .keepalived
활성 NFS 서버가 읽기-쓰기 모드로 LUN을 마운트하도록 허용하고 다른 서버가 읽기 전용 모드로 LUN을 마운트하도록 허용하려면 알림 메커니즘을 사용합니다 .
"기본" NFS 서버의 로드는 매우 낮으며 VM의 변경 사항과 직접적인 관련이 있습니다. 따라서 한 번에 하나의 NFS 서버만 보유하는 것은 중소 규모의 가상화 환경에서는 문제가 되지 않는 것 같습니다.
NFS 4.*가 작동하는 방식으로 미러링된 NFS 서버 상태를 동기화하면 기본 서버에 장애가 발생할 경우 다른 서버가 인계받을 수 있습니다. Gluster를 공유 서버 상태 디렉터리로 사용할 때 이것이 활성/활성 클러스터링을 허용해야 한다고 생각하지만 이에 대해 작동하는 항목을 찾을 수 없습니다.
미러 서버 상태가 작동하지 않더라도 다른 서버가 액티브/패시브 클러스터를 대신할 경우 I/O는 중앙 스토리지 시스템을 통해 직접 수행되므로 영향이 크지 않아야 합니다. 옳은?