Ubuntu 18.04 NFS 설치 및 구축, 삭제

NFS

Network File System


Goal

  • NFS의 개념을 간략하게 알아봅니다.
  • Babble 프로젝트에서 NFS를 사용한 이유를 알아봅니다.
  • Ubuntu 18.04 에서 NFS를 사용하는 방법을 알아봅니다.

NFS란?

한줄로 요약하면, 유닉스 시스템에서의 저장공간 공유를 위한 프로토콜입니다.

NFS

1
2
A라는 인스턴스에 unluckyJung이라는 디렉토리를 만들어두면
B, C라는 인스턴스에서도 A의 unluckyJung 디렉토리에 접근할수 있게 해주는 분산 파일시스템 프로토콜을 이야기합니다.

사용한 이유

Scale Out 작업을 수행하면서 Babble 인프라내 WAS가 N개로 늘어나게 되었습니다.

  • 각 WAS별로 찍히는 로그를 CloudWatch를 통해서 확인하려면 WAS의 개수에 맞춰 N개의 추가 설정이 필요했습니다.
    • 즉 WAS가 100개가 된다면, CloudWatch로 추적되는 화면이 100개가 되겠죠.
  • 이것은 로그 추적에 있어서도 불편함을 야기하게 되었고, NFS를 이용해 한개의 서버(A서버)에서 LOG 파일을 관리하고 다른 WAS들은, A서버에 접근해서 LOG 파일을 수정 하도록 하게 구성하였습니다.
1
docker service logs babble-was

image

  • 어떤 WAS에서 발생하는 에러인지는 Docker의 Container ID로 구분이 가능했습니다.

설치

서버(호스트 측)

1
2
sudo apt-get update
sudo apt install nfs-kernel-server
  • nfs server를 설치합니다.
1
2
sudo mkdir -p {공유할 폴더 경로}
sudo mkdir -p /mnt/sharedfolder
  • 공유할 폴더를 만듭니다.
1
2
sudo chown nobody:nogroup /mnt/sharedfolder
sudo chmod 777 /mnt/sharedfolder
  • 폴더 접근, 수정권한을 열어줍니다.
1
2
3
4
5
sudo vi /etc/exports

// vi 창

/mnt/공유할폴더명 클라이언트IP(rw,sync,no_subtree_check)

실제로 보이는 vi 창 예시

1
2
3
4
5
6
7
8
9
10
11
12
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#

/mnt/sharedfolder 192.168.0.0/16(rw,sync,no_subtree_check)
  • 클라이언트에 호스트에 접근 할 수 있는 권한을 열어줍니다.
  • 중간에 띄어쓰기가 들어가지 않게 조심해야 합니다.
1
2
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
  • 설정을 마무리합니다.

설치

클라이언트 측

1
2
sudo apt-get update
sudo apt-get install nfs-common
  • nfs 접속 클라이언트를 설치합니다.
1
2
3
4
sudo mkdir -p /mnt/sharedfolder_client

sudo mount 호스트서버IP:호스트서버공유폴더 클라이언트공유폴더
sudo mount 192.168.100.5:/mnt/sharedfolder /mnt/sharedfolder_client
  • 클라이언트쪽에서 호스트의 공유폴더에 접근할 폴더를 만듭니다.
  • 공유폴더를 마운트합니다.
  • 이후 클라이언트에서 호스트서버의 폴더에 접근할 수 있게됩니다.
    • client : /mnt/sharedfolder_client
    • host server : /mnt/sharedfolder

Reference



구동

1
2
3
4
5
6
docker service create \
--name babble-was --replicas=3 \
--mount type=bind,source=/home/ubuntu/was-logs,target=/was-logs \
--publish mode=host,target=8080,published=8080 \
-e PROFILES_ACTIVE=prod -e DATASOURCE_PASSWORD=password -e  -e REDIS_PASSWORD=password \
2021babble/babble-was:latest

상태체크

1
2
nfsstat -s // 서버 상태 확인
nfsstat --version // nfs 버전확인

삭제

1
2
3
4
sudo apt-get remove nfs-kernel-server
sudo apt-get remove --auto-remove nfs-kernel-server
sudo apt-get purge nfs-kernel-server
sudo apt-get purge --auto-remove nfs-kernel-server
  • 이부분 까지만 진행하면 nfsstat -s 를 할경우에도 계속 nfs 서버가 살아있는것이 확인되었습니다.
1
sudo apt-get --purge remove nfs-kernel-server nfs-common portmap
  • 위의 명령어를 추가적으로 더 입력해줍니다.

Reference


Conclustion

image image image

  • 각각의 WAS에서 공유 디렉토리를 이용해 같은 파일에 읽고, 쓰기가 가능해졌습니다.
  • 공유 디렉토리 하나만 CloudWatch에 붙여서 한눈에모든 WAS의 로그를 확인할 수 있게 되었습니다.

트러블 슈팅

  • NFS 가 V3 - V4를 왔다갔다 하는 현상 발생한다. 현재 이유는모르겠다. 2021-10-26
  • 한개의 인스턴스에서 NFS Host와 Client를 동시에 두었을때 문제가 발생해썼다.
    • Host용 인스턴스를 분리해서 해결했다.

Reference