여러 응용 프로그램 서버에 파일을 제공하기 위해 미러링된 ZFS 풀 위에 복제된 GlusterFS 볼륨 위에 NFS 서버를 설정했습니다.
ZFS + GlusterFS + NFS 클러스터 아키텍처
NFS 공유에 저장된 파일을 검색하는 두 개의 응용 프로그램 서버가 있습니다. 업무량은 거의 비슷해요한 번 쓰다/가끔 읽는다: 파일은 저장소에 기록되고 거의 수정되지 않으며 때로는 요청을 충족하기 위해 읽혀집니다.
요청 클라이언트에 데이터를 반환하기 전에 애플리케이션은 파일 SHA256 해시를 계산하고 이를 데이터베이스에 저장된 해시와 비교합니다.
애플리케이션이 파일의 전체 경로를 사용하더라도 때로는 노드가 완전히 다른(그리고 잘못된) 파일 콘텐츠를 가져오는 경우가 있습니다. 예를 들어 애플리케이션이 file 을 요청 /data/storage_archive/20220802/filename
하고 file 에서 데이터를 가져옵니다 /data/storage_archive/RANDOM_DATE_HERE/RANDOM_FILENAME
.
이런 일이 발생하면(다행히 지금까지 몇 번만) 애플리케이션 서버에 로그인하여 추가 분석을 위해 (올바른) 경로에서 로컬 저장소로 (잘못된) 파일을 복사할 수 있지만 파일 내용은 여전히 잘못된 것입니다. 파일 이름 외에도 다른 메타데이터(예: 파일 크기, 파일 생성 날짜 등)는 정확하며 실제(잘못된) 파일을 반영합니다.
그리고잘못된이는 완전하고 완전한 파일(비트 부패 또는 기타 손상 없음)을 의미합니다. 예를 들어 PDF 파일이 아닌 완전한 XML 파일입니다.
동일한 NFS 공유에 마운트된 다른 애플리케이션 서버에서 동일한 파일에 액세스하려고 하면 올바른 파일을 얻습니다.
내가 만든 레이어를 살펴보면 다음과 같습니다.
- 두 GlusterFS 노드에 있는 파일의 SHA256이 올바른지 확인하세요.
- ZFS 데이터 세트 마운트 지점에 있는 파일의 SHA256이 올바른지 확인하세요.
클라이언트에서 NFS 공유를 마운트 해제했다가 다시 마운트하면 상황이 다시 정상으로 돌아올 수 있습니다.
체인 어딘가에서 캐시 손상이 발생한 것 같은데 어디인지 알 수 없습니다. NFS? GlusterFS? 제브스? 관련된 레이어를 고려하면 ZFS는 잘못된 데이터에 대해 최초로 응답할 수 있는 플레이어이기 때문에 주범인 것처럼 보이지만 동시에 거의 방탄 레이어여야 합니다. 오류가 발생했을 때 실행 중인 집중적인 작업(백업, rsync, 대규모 디렉터리 탐색 등)이 없었습니다.
아래에서 ZFS 및 GlusterFS 구성에 대한 세부 정보를 확인할 수 있습니다.
pool: testdata
state: ONLINE
scan: scrub repaired 0B in 19h4m with 0 errors on Sun Jul 10 19:28:54 2022
config:
NAME STATE READ WRITE CKSUM
testdata ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-ST16000NM001G-2KK103_ZL2JSCGA ONLINE 0 0 0
ata-ST16000NM001G-2KK103_ZL2JS4SB ONLINE 0 0 0
errors: No known data errors
Gluster 볼륨 정보 예:
gluster volume info test_volume
Volume Name: test_volume
Type: Replicate
Volume ID: 2ca11c4a-442f-4887-b65f-f02a34b14b03
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster01-10gbe:/data/testdata/test_volume/data
Brick2: gluster02-10gbe:/data/testdata/test_volume/data
Options Reconfigured:
server.event-threads: 2
performance.parallel-readdir: on
performance.readdir-ahead: off
network.inode-lru-limit: 50000
performance.client-io-threads: off
nfs.disable: on
transport.address-family: inet
storage.fips-mode-rchecksum: on
cluster.granular-entry-heal: on
cluster.enable-shared-storage: enable
GlusterFS가 클러스터에 마운트되었습니다.
gluster01-10gbe:/test_volume /mnt/testdata/test_volume/data/ glusterfs defaults 0 0
클러스터에서 NFS 내보내기:
/mnt/testdata/test_volume/data/ 10.1.1.2(rw,fsid=1,sync,no_subtree_check,no_root_squash) 10.1.1.3(rw,fsid=1,sync,no_subtree_check,no_root_squash)
애플리케이션 서버에 NFS 마운트:
10.1.1.1:/mnt/testdata/test_volume/data/ /data nfs proto=udp,nfsvers=3,rsize=8192,wsize=8192,timeo=14,intr,soft 0 0
민감한 정보 유출 위험을 방지하기 위해 IP 주소, 볼륨 이름, 풀 이름 등을 대체했습니다.
스토리지 서버에 대한 일부 세부 정보:
- HP ProLiant DL380e Gen8에는 다음이 포함됩니다.
- 듀얼 인텔(R) 제온(R) CPU E5-2450L @ 1.80GHz
- 64GB 메모리
- Dell Perc H200(IT 모드)
- 10GbE 네트워크
- 우분투 18.04.6 LTS
- Linux의 OpenZFS 0.7.5-1ubuntu16.12