이 튜토리얼에서는 Compute Engine에서 Linux 기반 커널 공간 네트워크 파일 시스템(NFS) 캐싱 프록시를 배포, 구성, 테스트하는 방법을 보여줍니다. 이 튜토리얼에서 설명하는 아키텍처는 읽기 전용 데이터가 NFS 원본 파일 서버(예: 온프레미스 NFS 파일 서버)에서 Google Cloud로 바이트 수준에서 동기화되거나, 단일 기본 정보 소스에서 여러 읽기 전용 복제본으로 주문형으로 동기화되는 시나리오를 위해 설계되었습니다.
이 가이드에서는 사용자가 다음 항목에 익숙하다고 가정합니다.
- Linux 운영체제의 커스텀 버전 빌드
- Compute Engine에서 시작 스크립트를 사용하여 소프트웨어 설치 및 구성
- NFS 파일 시스템 구성 및 관리
이 아키텍처는 파일 잠금을 지원하지 않습니다. 이 아키텍처는 고유한 파일 이름을 사용하여 파일 버전을 추적하는 파이프라인에 가장 적합합니다.
아키텍처
이 튜토리얼의 아키텍처에는 NFS 프록시 및 캐시 역할을 하는 커널 공간 NFS 데몬(KNFSD)이 있습니다. 이 설정을 사용하면 NFS 클라이언트가 요청할 때 데이터를 마이그레이션하여 클라우드 기반 컴퓨팅 노드가 빠른 로컬 스토리지에 액세스할 수 있습니다. NFS 클라이언트 노드는 write-through 캐싱을 사용하여 NFS 원본 파일 서버에 직접 데이터를 씁니다. 다음 다이어그램은 이 아키텍처를 보여줍니다.
이 튜토리얼에서는 KNFSD 프록시 시스템을 배포하고 테스트합니다. Google Cloud에서 단일 NFS 서버, 단일 KNFSD 프록시, 단일 NFS 클라이언트를 만들고 구성합니다.
KNFSD 프록시 시스템은 NFS 서버에서 볼륨을 마운트하고 해당 볼륨을 다시 내보내는 방식으로 작동합니다. NFS 클라이언트는 프록시에서 다시 내보낸 볼륨을 마운트합니다. NFS 클라이언트가 데이터를 요청하면 KNFSD 프록시는 다양한 캐시 테이블을 확인하여 데이터가 로컬에 있는지 확인합니다. 데이터가 이미 캐시에 있으면 KNFSD 프록시가 즉시 데이터를 제공합니다. 요청된 데이터가 캐시에 없으면 프록시는 데이터를 마이그레이션하고 캐시 테이블을 업데이트한 다음 데이터를 제공합니다. KNFSD 프록시는 파일 데이터와 메타데이터를 모두 바이트 수준에서 캐시하므로 사용되는 바이트만 요청 시 전송됩니다.
KNFSD 프록시에는 L1 및 L2의 두 가지 캐시 레이어가 있습니다. L1은 RAM에 있는 운영체제의 표준 블록 캐시입니다. 데이터 볼륨이 사용 가능한 RAM을 초과하면 L2 캐시는 데이터를 디스크에 로컬로 캐시하는 Linux 커널 모듈인 FS-Cache를 사용하여 구현됩니다. 이 배포에서는 여러 가지 방법으로 시스템을 구성할 수 있지만 로컬 SSD를 L2 캐시로 사용합니다.
이 튜토리얼의 아키텍처를 구현하려면 NFS 버전 2, 3, 4와 호환되는 표준 NFS 도구를 사용합니다.
하이브리드 아키텍처의 KNFSD 배포
하이브리드 아키텍처에서는 Google Cloud에서 실행 중인 NFS 클라이언트는 필요할 때 데이터를 요청합니다. 이러한 요청은 KNFSD 프록시로 전송되며, 이 프록시는 로컬 캐시에 데이터가 있는 경우 데이터를 제공합니다. 데이터가 캐시에 없으면 프록시는 온프레미스 서버로의 통신을 다시 관리합니다. 시스템은 단일 또는 여러 NFS 원본 서버를 마운트할 수 있습니다. 프록시는 VPN 또는 Dedicated Interconnect를 통해 온프레미스 NFS 원본 서버로 향해야 하는 모든 통신 및 데이터 마이그레이션을 관리합니다. 다음 다이어그램은 하이브리드 아키텍처에서의 이 KNFSD 배포를 보여줍니다.
하이브리드 연결은 이 튜토리얼에서 다루지 않습니다. 하이브리드 아키텍처에 대한 배포, 고성능을 위한 확장, 문제 해결 및 조정을 위한 측정항목 및 대시보드 사용에 대한 고려사항과 같은 고급 주제에 대한 자세한 내용은 고급 워크플로 주제를 참조하세요.
목표
- KNFSD 프록시 시스템을 배포하고 테스트합니다.
- Google Cloud에서 다음 구성요소를 만들고 구성합니다.
- 커스텀 디스크 이미지
- KNFSD 프록시
- NFS 서버
- NFS 클라이언트
- NFS 클라이언트에 NFS 프록시를 마운트합니다.
- NFS 프록시를 통해 NFS 서버에서 NFS 클라이언트로 파일을 복사합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
사용량의 경우 Google Cloud에서 온프레미스 스토리지로 다시 작성된 데이터의 네트워킹 이그레스 비용과 하이브리드 연결 비용을 고려하세요.
시작하기 전에
이 참조 가이드에는 Google Cloud 프로젝트가 필요합니다. 새 프로젝트를 만들거나 기존에 만든 프로젝트를 선택할 수 있습니다.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine API.
-
In the Google Cloud console, activate Cloud Shell.
Cloud Shell 터미널에서 로그인을 인증합니다.
gcloud auth application-default login
명령줄은 승인 단계를 완료하는 과정을 안내합니다.
환경 변수를 설정합니다.
export GOOGLE_CLOUD_PROJECT=PROJECT_NAME gcloud config set project $GOOGLE_CLOUD_PROJECT
PROJECT_NAME
을 이전에 만들거나 선택한 프로젝트의 이름으로 바꿉니다.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
튜토리얼 구성 파일 다운로드
Cloud Shell에서 GitHub 저장소를 클론합니다.
cd ~/ git clone https://github.com/GoogleCloudPlatform/knfsd-cache-utils.git
Git 태그를 알려진 정상 버전(이 경우
v0.9.0
)으로 설정합니다.cd ~/knfsd-cache-utils git checkout tags/v0.9.0
코드 저장소의
image
디렉터리로 이동합니다cd ~/knfsd-cache-utils/image
네트워크 구성
배포의 편의를 위해 이 튜토리얼에서는 기본 VPC 네트워크를 사용합니다. 이 튜토리얼에서는 구성 및 모니터링 목적으로 SSH를 사용하여 다양한 리소스에 연결할 수 있도록 외부 IP 주소도 배포합니다.
VPC 설계에 관한 권장사항 및 참조 아키텍처는 이 튜토리얼에서 다루지 않습니다. 하지만 이러한 리소스를 하이브리드 환경에 통합할 때는 다음을 포함한 권장사항을 따르는 것이 좋습니다.
- 외부 IP 주소 없이 Compute Engine 리소스를 만듭니다.
- 소프트웨어를 구성하기 위해 비공개 VM용 인터넷 연결을 구축합니다.
- TCP 전달용 IAP(Identity-Aware Proxy)를 사용하여 리소스에 연결합니다.
네트워크를 구성하려면 다음 안내를 따르세요.
Cloud Shell에서 다음 변수를 설정합니다.
export BUILD_MACHINE_NETWORK=default export BUILD_MACHINE_SUBNET=default
NFS 프록시 빌드 머신 만들기
이 섹션에서는 NFS 프록시 빌드 머신 역할을 하는 VM을 만든 다음 로그인합니다. 그런 다음 제공된 설치 스크립트를 실행하여 커널 버전을 업데이트하고 KNFSD 프록시 시스템에 필요한 모든 소프트웨어를 설치합니다. 소프트웨어 설치 스크립트는 실행하는 데 몇 분 정도 걸릴 수 있지만 한 번만 실행하면 됩니다.
Cloud Shell에서 다음 변수를 설정합니다.
export BUILD_MACHINE_NAME=knfsd-build-machine export BUILD_MACHINE_ZONE=us-central1-a export IMAGE_FAMILY=knfsd-proxy export IMAGE_NAME=knfsd-proxy-image
VM 인스턴스를 시작합니다.
gcloud compute instances create $BUILD_MACHINE_NAME \ --zone=$BUILD_MACHINE_ZONE \ --machine-type=n1-standard-16 \ --project=$GOOGLE_CLOUD_PROJECT \ --image=ubuntu-2004-focal-v20220615 \ --image-project=ubuntu-os-cloud \ --network=$BUILD_MACHINE_NETWORK \ --subnet=$BUILD_MACHINE_SUBNET \ --boot-disk-size=20GB \ --boot-disk-type=pd-ssd \ --metadata=serial-port-enable=TRUE
디스크 크기 불일치를 나타내는 경고 메시지가 표시될 수 있습니다. 이 메시지는 무시해도 됩니다.
설치해야 하는 소프트웨어의 tar 파일을 만든 다음 빌드 머신에 복사합니다.
tar -czf resources.tgz -C resources . gcloud compute scp resources.tgz build@$BUILD_MACHINE_NAME: \ --zone=$BUILD_MACHINE_ZONE \ --project=$GOOGLE_CLOUD_PROJECT
VM이 시작되면 SSH 터널을 엽니다.
gcloud compute ssh build@$BUILD_MACHINE_NAME \ --zone=$BUILD_MACHINE_ZONE \ --project=$GOOGLE_CLOUD_PROJECT
SSH 터널이 설정되고 명령줄이
knfsd-build-machine
인스턴스를 타겟팅하면 설치 스크립트를 실행합니다.tar -zxf resources.tgz sudo bash scripts/1_build_image.sh
스크립트는 Ubuntu Kernel Code 저장소를 클론하고 커널 버전을 업데이트하고 추가 소프트웨어를 설치합니다. 저장소 클론이 관련되어 있으므로 스크립트를 완료하는 데 시간이 오래 걸릴 수 있습니다.
설치 스크립트가 완료되고
SUCCESS
메시지가 표시되면 빌드 머신을 재부팅합니다.sudo reboot
빌드 머신이 재부팅되면 다음 메시지가 표시됩니다.
WARNING: Failed to send all data from [stdin] ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255]
이러한 오류는 Cloud Shell이 NFS 프록시 빌드 머신에서 호스트 머신으로 되돌리는 동안 발생합니다. 이러한 오류는 무시해도 됩니다.
VM이 재부팅되면 SSH 터널을 다시 엽니다.
gcloud compute ssh $BUILD_MACHINE_NAME \ --zone=$BUILD_MACHINE_ZONE \ --project=$GOOGLE_CLOUD_PROJECT
SSH 터널이 설정되고 명령줄이
nfs-proxy-build
인스턴스를 타겟팅하면Root
로 전환하고 OS 버전을 확인합니다.uname -r
출력은 다음과 비슷하며 소프트웨어 업데이트가 성공했음을 나타냅니다.
linux <$BUILD_MACHINE_NAME> 5.13.*-gcp ...
출력이 앞의 예시와 유사하지 않으면 이 프로세스를 완료하여 다시 NFS 프록시 빌드 머신을 만듭니다.
로컬 디스크를 정리하고 빌드 머신을 종료합니다.
sudo bash /home/build/scripts/9_finalize.sh
다음과 같은 경고가 표시됩니다.
userdel: user build is currently used by process 1431 userdel: build mail spool (/var/mail/build) not found
이러한 경고는 Cloud Shell이 NFS 프록시 빌드 머신에서 호스트 머신으로 되돌리는 동안 발생합니다. 이러한 오류는 무시해도 됩니다.
커스텀 디스크 이미지 만들기
이 섹션에서는 인스턴스에서 커스텀 이미지를 만듭니다. 커스텀 이미지는 미국에 있는 멀티 리전 Cloud Storage 버킷에 저장됩니다.
Cloud Shell에서 다음 변수를 설정합니다.
export IMAGE_NAME=knfsd-image export IMAGE_DESCRIPTION="first knfsd image from tutorial" export IMAGE_LOCATION=us
디스크 이미지를 만듭니다.
gcloud compute images create $IMAGE_NAME \ --project=$GOOGLE_CLOUD_PROJECT \ --description="$IMAGE_DESCRIPTION" \ --source-disk=$BUILD_MACHINE_NAME \ --source-disk-zone=$BUILD_MACHINE_ZONE \ --storage-location=$IMAGE_LOCATION
디스크 이미지가 생성되면 인스턴스를 삭제합니다.
gcloud compute instances delete $BUILD_MACHINE_NAME \ --zone=$BUILD_MACHINE_ZONE
계속 진행할지 묻는 메시지가 표시되면
Y
를 입력합니다.$BUILD_MACHINE_NAME
인스턴스를 삭제하면 VM에 연결된 디스크가 삭제된다는 메시지가 표시됩니다. 커스텀 이미지를 방금 저장했으므로 이 임시 디스크가 더 이상 필요하지 않으며 삭제해도 안전합니다.
NFS 원본 서버 만들기
앞에서 언급했듯이 이 아키텍처는 클라우드 기반 리소스를 온프레미스 파일 서버에 연결하도록 설계되었습니다. 이 튜토리얼의 프로세스를 단순화하기 위해 Google Cloud 프로젝트에서 실행되는 임시 대기 리소스를 만들어 이 연결을 시뮬레이션합니다. 임시 대기 리소스의 이름을 nfs-server
로 지정합니다. 소프트웨어 설치 및 설정은 시작 스크립트에 포함되어 있습니다. 자세한 내용을 보려면 ~/knfsd-cache-utils/tutorial/nfs-server/1_build_nfs-server.sh
스크립트를 살펴보세요.
Cloud Shell에서 다운로드한
nfs-server
스크립트 디렉터리로 이동합니다.cd ~/knfsd-cache-utils/tutorial
임시 대기 NFS 서버를 만듭니다.
gcloud compute \ --project=$GOOGLE_CLOUD_PROJECT instances create nfs-server \ --zone=$BUILD_MACHINE_ZONE \ --machine-type=n1-highcpu-2 \ --maintenance-policy=MIGRATE \ --image-family=ubuntu-2004-lts \ --image-project=ubuntu-os-cloud \ --boot-disk-size=100GB \ --boot-disk-type=pd-standard \ --boot-disk-device-name=nfs-server \ --metadata-from-file startup-script=nfs-server-startup.sh
이 스크립트를 완료하는 데 몇 분 정도 걸릴 수 있습니다. 디스크 크기가 200GB 미만임을 나타내는 경고 메시지가 표시될 수 있습니다. 이 경고는 무시해도 됩니다.
NFS 프록시 만들기
이 섹션에서는 NFS 프록시를 만듭니다. 프록시가 시작되면 로컬 스토리지를 구성하고 NFS 서버의 마운트 옵션을 준비하며 캐시된 결과를 내보냅니다. 제공되는 시작 스크립트는 이 워크플로의 대부분을 조정합니다.
Cloud Shell에서 다음 변수를 설정합니다.
export PROXY_NAME=nfs-proxy
nfs-proxy
VM을 만듭니다.gcloud compute instances create $PROXY_NAME \ --machine-type=n1-highmem-16 \ --project=$GOOGLE_CLOUD_PROJECT \ --maintenance-policy=MIGRATE \ --zone=$BUILD_MACHINE_ZONE \ --min-cpu-platform="Intel Skylake" \ --image=$IMAGE_NAME \ --image-project=$GOOGLE_CLOUD_PROJECT \ --boot-disk-size=20GB \ --boot-disk-type=pd-standard \ --boot-disk-device-name=$PROXY_NAME \ --local-ssd=interface=NVME \ --local-ssd=interface=NVME \ --local-ssd=interface=NVME \ --local-ssd=interface=NVME \ --metadata-from-file startup-script=proxy-startup.sh
디스크 크기가 200GB 미만이라는 경고 메시지가 표시될 수 있습니다. 이 경고는 무시해도 됩니다.
시작 스크립트는 NFS 마운트 명령어를 구성하며 시스템을 조정할 수 있게 해줍니다. NFS 버전, 동기화 또는 비동기,
nocto
,actimeo
의 설정은 시작 스크립트를 통해 최적화할 수 있는 몇 가지 변수입니다. 이러한 설정에 대한 자세한 내용은 NFS 파일 시스템 최적화를 참조하세요.이 단계의 명령어는 시작 스크립트를 이미지 템플릿에 삽입하는
--metadata-from-file
플래그를 정의합니다. 이 튜토리얼에서는 간단한proxy-startup.sh
스크립트를 사용합니다. 스크립트에는 몇 가지 사전 설정된 변수가 포함되어 있으며, 파이프라인에 통합할 때 사용할 수 있는 많은 옵션은 포함되어 있지 않습니다. 고급 사용 사례는knfsd-cache-utils
GitHub 저장소를 참조하세요.
NFS 클라이언트 만들기
이 단계에서는 규모에 따라 더 큰 관리형 인스턴스 그룹(MIG)에 대해 임시로 사용할 단일 NFS 클라이언트(nfs-client
)를 만듭니다.
Cloud Shell에서 NFS 클라이언트를 만듭니다.
gcloud compute \ --project=$GOOGLE_CLOUD_PROJECT instances create nfs-client \ --zone=$BUILD_MACHINE_ZONE \ --machine-type=n1-highcpu-8 \ --network-tier=PREMIUM \ --maintenance-policy=MIGRATE \ --image-family=ubuntu-2004-lts \ --image-project=ubuntu-os-cloud \ --boot-disk-size=10GB \ --boot-disk-type=pd-standard \ --boot-disk-device-name=nfs-client
디스크 크기가 200GB 미만이라는 경고 메시지가 표시될 수 있습니다. 이 경고는 무시해도 됩니다.
NFS 클라이언트에 NFS 프록시 마운트
이 단계에서는 NFS 클라이언트에서 별도의 SSH 세션을 연 다음 NFS 프록시를 마운트합니다. 이와 동일한 셸을 사용하여 다음 섹션에서 시스템을 테스트합니다.
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
nfs-client
에 연결하려면 연결 열에서 SSH를 클릭합니다.nfs-client
SSH 창에서 필요한 NFS 도구를nfs-client
에 설치합니다.sudo apt-get install nfs-common -y
마운트 지점을 만들고 NFS 프록시를 마운트합니다.
sudo mkdir /data sudo mount -t nfs -o vers=3 nfs-proxy:/data /data
시스템 테스트
이제 모든 리소스가 생성되었습니다. 이 섹션에서는 NFS 서버에서 NFS 프록시를 통해 NFS 클라이언트로 파일을 복사하여 테스트를 실행합니다. 이 테스트를 처음 실행하면 데이터를 원본 서버에서 가져오며, 1분 이상 걸릴 수 있습니다.
이 테스트를 두 번째 실행하면 NFS 프록시의 로컬 SSD에 저장된 캐시에서 데이터가 제공됩니다. 이 전송에서는 데이터를 복사하는 데 걸리는 시간이 훨씬 짧아 캐싱이 데이터 전송 속도를 높이고 있음을 검증합니다.
이전 섹션에서 연
nfs-client
SSH 창에서test
파일을 복사하고 해당 출력을 확인합니다.time dd if=/data/test.data of=/dev/null iflag=direct bs=1M status=progress
출력은 파일 크기, 전송 시간, 전송 속도를 보여주는 줄을 포함하는 다음과 비슷합니다.
10737418240 bytes (11 GB, 10 GiB) copied, 88.5224 s, 121 MB/s real 1m28.533s
이 전송에서는 파일이 NFS 서버의 영구 디스크에서 제공되므로 NFS 서버 디스크의 속도에 따라 제한됩니다.
같은 명령어를 다시 실행합니다.
time dd if=/data/test.data of=/dev/null iflag=direct bs=1M status=progress
출력은 파일 크기, 전송 시간, 전송 속도를 보여주는 줄을 포함하는 다음과 비슷합니다.
10737418240 bytes (11 GB, 10 GiB) copied, 9.41952 s, 948 MB/s real 0m9.423s
이 전송에서는 파일이 NFS 프록시의 캐시에서 제공되므로 더 빠르게 완료됩니다.
이제 KNFSD 캐싱 프록시의 배포와 테스트가 완료되었습니다.
고급 워크플로 주제
이 섹션에는 하이브리드 아키텍처에 대한 배포, 고성능을 위한 확장, 문제 해결 및 조정을 위한 측정항목 및 대시보드 사용에 대한 정보가 포함되어 있습니다.
성능 특성 및 리소스 크기 조정
앞에 설명된 것처럼 이 튜토리얼에서는 단일 KNFSD 프록시를 사용합니다. 따라서 시스템을 확장하려면 CPU, RAM, 네트워킹, 스토리지 용량 또는 성능에 맞게 개별 프록시 리소스를 수정해야 합니다. 이 튜토리얼에서는 다음 옵션을 사용하여 단일 Compute Engine VM에 KNFSD를 배포했습니다.
- vCPU 16개, RAM 104GB(
n1-highmem-16
).- vCPU 16개와 Sandy Bridge 이상의 아키텍처를 사용하면 최대 네트워킹 속도를 32Gbps로 설정할 수 있습니다.
- 10GB Persistent Disk를 부팅 디스크로 사용합니다.
- 4개의 로컬 SSD 디스크. 이 구성은 고속의 1.5TB 파일 시스템을 제공합니다.
이 튜토리얼에서는 다루지 않지만 NFS 클라이언트와 NFS 프록시 간의 연결을 관리할 수 있도록 MIG에서 여러 KNFSD 프록시를 만들고 TCP 부하 분산기를 사용하여 이 아키텍처를 확장할 수 있습니다. 자세한 내용은 Terraform 스크립트, 배포 예시 코드, 확장 워크로드와 관련된 다양한 FAQ가 포함된 knfsd-cache-utils
GitHub 저장소를 참조하세요.
하이브리드 배포 고려사항
많은 배포에서 시스템을 구성할 때 온프레미스에서 클라우드로의 연결 대역폭은 중요한 고려사항입니다. 하이브리드 연결은 이 튜토리얼에서 다루지 않습니다. 사용 가능한 옵션에 대한 개요는 하이브리드 연결 문서를 참조하세요. 권장사항과 설계 패턴에 대한 안내는 Google Cloud를 사용하여 하이브리드 및 멀티 클라우드 아키텍처 빌드 시리즈를 참조하세요.
측정항목 살펴보기
대시보드는 성능 조정 및 전체 문제 해결에 사용할 측정항목에 대한 의견을 제공하는 데 유용할 수 있습니다. 측정항목 살펴보기는 이 튜토리얼에서 다루지 않지만 측정항목 대시보드는 knfsd-cache-utils
GitHub 저장소에 정의된 멀티 노드 시스템을 배포할 때 사용할 수 있습니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
다음 단계
- 이미지 관리 권장사항 자세히 알아보기
- NFS 다시 내보내기에 대해 Linux 개발자 커뮤니티에서 수행 중인 작업에 대해 자세히 알아보기
- Ubuntu 기반 NFS의 전체 관리 및 구성 자세히 알아보기
knfsd-cache-utils
GitHub 저장소에서 MIG와 부하 분산기를 사용하여 KNFSD 배포를 확장하는 방법 자세히 알아보기- 클라우드 아키텍처 센터에서 참조 아키텍처, 다이어그램, 권장사항 자세히 살펴보기