NCP

[NCP] Object Storage를 서버에 Mount해서 사용해보자! (s3fs, goofys, rclone)

안녕하세요. ManVSCloud 김수현입니다.

오늘은 네이버 클라우드 플랫폼에서 Object Storage를 Mount하여 사용하는 방법을 공유하고자 합니다.

포스팅에 앞서 주의사항 하나를 말하자면…
“Storage별 특징과 장단점을 알고 상황에 맞게 적절히 사용하자! “

Object Storage를 전부 설명하기엔 해당 포스팅의 주제를 너무 벗어나니 링크 하나로 대체하겠습니다.

또한 네이버 클라우드 플랫폼에서 Object Storage 서비스를 아래와 같은 상황에 이용하라고 소개하고 있습니다.

– 언제 어디서나 데이터를 저장하고, 다운로드할 수 있는 저장 공간이 필요한 경우
– 데이터를 누구에게나 또는 특정 사용자가 다운로드할 수 있도록 하고 싶은 경우
– Amazon S3와 연동된 어플리케이션을 그대로 활용할 수 있는 다른 스토리지가 필요한 경우

서론이 많이 길었네요.
이제 s3fs, goofys, rclone을 이용하여 Object Storage를 서버에 Mount 할 수 있는 방법을 알아보겠습니다.


s3fs를 이용한 Mount

먼저 s3fs를 이용하여 Mount하는 방법입니다.
(네이버 클라우드의 Object Storage는 Amazon S3를 위해 사용되는 다양한 3rd party 도구들을 활용할 수 있습니다.)

먼저 아래와 같이 git, 라이브러리 등을 yum으로 설치해준 뒤 git으로 s3fs-fuse를 설치해줍니다.

[root@manvscloud-dev-01 ~]# yum install automake fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
[root@manvscloud-dev-01 ~]# git clone https://github.com/s3fs-fuse/s3fs-fuse.git
[root@manvscloud-dev-01 ~]# cd s3fs-fuse
[root@manvscloud-dev-01 ~]# ./autogen.sh
[root@manvscloud-dev-01 ~]# ./configure
[root@manvscloud-dev-01 ~]# make 
[root@manvscloud-dev-01 ~]# make install

s3fs를 사용하기 위해 네이버 클라우드 콘솔에서 API Key를 발급받아야 합니다.

발급 받은 키와 패스워드를 아래와 같이 /etc/passwd-s3fs에 넣어주고 권한도 변경해줍시다.
(echo AAAAAAAA:BBBBBBBBBBBB > /etc/passwd-s3fs)

[root@manvscloud-dev-01 ~]# echo APIKEY:KEYPASSWD > /etc/passwd-s3fs
[root@manvscloud-dev-01 ~]# chmod 600 /etc/passwd-s3fs

Object Storage를 Mount할 디렉토리를 생성하고 s3fs 명령어를 이용하여 아래와 같이 마운트 해줍니다.
(s3fs 버킷이름 경로 및 디렉토리명 -o url=https://kr.object.ncloudstorage.com)

[root@manvscloud-dev-01 ~]# mkdir /s3fs-storage
[root@manvscloud-dev-01 ~]# s3fs manvscloud-s3fs /s3fs-storage -o url=https://kr.object.ncloudstorage.com

ll (ls -l)명령어로 확인 시 정상적으로 Mount된 것을 확인할 수 있습니다.

drwx------    1 root root    0 Jan  1  1970 s3fs-storage

다만 권한을 보면 700으로 되어있습니다.
소유자 root에게 모든 권한이 있고 그룹 및 기타 사용자에게 권한이 없습니다.

가끔 기타 사용자 권한이 필요하다고 하시는 분들이 있어 추가 팁을 드리자면 아래와 같이
-o allow_other 옵션을 주면 모든 권한을 얻을 수 있습니다.

[root@manvscloud-dev-01 ~]# s3fs manvscloud-s3fs /s3fs-storage -o allow_other -o url=https://kr.object.ncloudstorage.com
drwxrwxrwx    1 root root    0 Jan  1  1970 s3fs-storage

지금까지 s3fs를 이용하여 Server에 Mount 하는 방법을 알아보았습니다.
다음은 goofys를 이용하여 Mount하는 방법입니다.


goofys를 이용한 Mount

goofys는 s3fs보다 빠르다고 많이 알려져있습니다.
(물론 제가 테스트할 때는 쓰기 속도가 이상하게 느리게 나오더라구요?)

goofys를 설치하기 위해 golang을 먼저 설치하도록 하겠습니다.

[root@manvscloud-dev-01 ~]# yum install fuse
[root@manvscloud-dev-01 ~]# wget https://go.dev/dl/go1.17.3.linux-amd64.tar.gz
[root@manvscloud-dev-01 ~]# tar -xvf go1.17.3.linux-amd64.tar.gz 
[root@manvscloud-dev-01 ~]# mv go /usr/local/

go 설치가 끝나면 아래 값들을 /etc/profile에 추가한 뒤 저장해줍시다.

export GOROOT=/usr/local/go
export GOPATH=$HOME/
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
// 위에서 추가한 환경설정들을 즉시 적용 해줬습니다.
[root@manvscloud-dev-01 ~]# source /etc/profile

[root@manvscloud-dev-01 ~]# wget http://bit.ly/goofys-latest -O /usr/local/bin/goofys
[root@manvscloud-dev-01 ~]# chmod 755 /usr/local/bin/goofys
[root@manvscloud-dev-01 ~]# goofys --version

goofys 설치가 끝나면 이제 권한을 얻어보도록 합시다!
네이버 클라우드에서도 awscli를 사용합니다.
아래와 같이 위에서 생성한 API KEY와 KEY PASSWORD를 입력해줍니다.

yum install awscli -y
[root@manvscloud-dev-01 ~]# aws configure
AWS Access Key ID [None]: APIKEY
AWS Secret Access Key [None]: KEY-PASSWORD
Default region name [None]: 
Default output format [None]:

s3fs 때와 똑같이 마운트할 디렉토리 생성 및 goofys 명령어를 이용하여 마운트 작업을 진행해줍니다.

[root@manvscloud-dev-01 ~]# mkdir /goofys-storage
[root@manvscloud-dev-01 ~]# goofys --endpoint https://kr.object.ncloudstorage.com/ manvscloud-goofys /goofys-storage
drwxr-xr-x    2 root root 4096 Dec  2 07:09 goofys-storage

ll(ls -l) 명령어로 확인해보면 위와 같이 정상적으로 Mount 되어있을 것입니다.


rclone을 이용한 Mount

마지막으로 rclone을 이용하여 Mount 해보도록 합시다.
rclone은 조금 많이 번거로웠습니다.

하지만 rclone은 각 버킷이 아닌 Object Storage 자체를 Mount 해버릴 수 있더군요?

rclone은 아래와 같이 설치할 수 있습니다.

“와~ 설치 쉽네? 좋은데?”라고 했다가 config에서 상당히 당황했습니다.
속도도 빠른 편이 아니었구요…

[root@manvscloud-dev-01 ~]# wget https://downloads.rclone.org/v1.57.0/rclone-v1.57.0-linux-amd64.zip --no-check-certificate
[root@manvscloud-dev-01 ~]# unzip rclone-v1.57.0-linux-amd64.zip
[root@manvscloud-dev-01 ~]# cd rclone-v1.57.0-linux-amd64/
[root@manvscloud-dev-01 rclone-v1.57.0-linux-amd64]# mv rclone /usr/local/bin/
[root@manvscloud-dev-01 rclone-v1.57.0-linux-amd64]# rclone --version
rclone v1.57.0
- os/version: centos 7.8.2003 (64 bit)
- os/kernel: 3.10.0-1127.10.1.el7.x86_64 (x86_64)
- os/type: linux
- os/arch: amd64
- go/version: go1.17.2
- go/linking: static
- go/tags: none

rclone의 꽃, rclone config 입니다.
권한 및 용도 등 여러분들의 입맛에 맞게 선택하시면 됩니다? 그런데 좀 많이 길어요.

[root@manvscloud-dev-01 ~]# rclone config
2021/12/02 07:18:27 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> manvscloud-rclone
Option Storage.
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value.
 1 / 1Fichier
   \ "fichier"
 2 / Alias for an existing remote
   \ "alias"
 3 / Amazon Drive
   \ "amazon cloud drive"
 4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, SeaweedFS, and Tencent COS
   \ "s3"
 5 / Backblaze B2
   \ "b2"
 6 / Better checksums for other remotes
   \ "hasher"
 7 / Box
   \ "box"
 8 / Cache a remote
   \ "cache"
 9 / Citrix Sharefile
   \ "sharefile"
10 / Compress a remote
   \ "compress"
11 / Dropbox
   \ "dropbox"
12 / Encrypt/Decrypt a remote
   \ "crypt"
13 / Enterprise File Fabric
   \ "filefabric"
14 / FTP Connection
   \ "ftp"
15 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
16 / Google Drive
   \ "drive"
17 / Google Photos
   \ "google photos"
18 / Hadoop distributed file system
   \ "hdfs"
19 / Hubic
   \ "hubic"
20 / In memory object storage system.
   \ "memory"
21 / Jottacloud
   \ "jottacloud"
22 / Koofr
   \ "koofr"
23 / Local Disk
   \ "local"
24 / Mail.ru Cloud
   \ "mailru"
25 / Mega
   \ "mega"
26 / Microsoft Azure Blob Storage
   \ "azureblob"
27 / Microsoft OneDrive
   \ "onedrive"
28 / OpenDrive
   \ "opendrive"
29 / OpenStack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
30 / Pcloud
   \ "pcloud"
31 / Put.io
   \ "putio"
32 / QingCloud Object Storage
   \ "qingstor"
33 / SSH/SFTP Connection
   \ "sftp"
34 / Sia Decentralized Cloud
   \ "sia"
35 / Sugarsync
   \ "sugarsync"
36 / Tardigrade Decentralized Cloud Storage
   \ "tardigrade"
37 / Transparently chunk/split large files
   \ "chunker"
38 / Union merges the contents of several upstream fs
   \ "union"
39 / Uptobox
   \ "uptobox"
40 / Webdav
   \ "webdav"
41 / Yandex Disk
   \ "yandex"
42 / Zoho
   \ "zoho"
43 / http Connection
   \ "http"
44 / premiumize.me
   \ "premiumizeme"
45 / seafile
   \ "seafile"
Storage> 4
Option provider.
Choose your S3 provider.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value.
 1 / Amazon Web Services (AWS) S3
   \ "AWS"
 2 / Alibaba Cloud Object Storage System (OSS) formerly Aliyun
   \ "Alibaba"
 3 / Ceph Object Storage
   \ "Ceph"
 4 / Digital Ocean Spaces
   \ "DigitalOcean"
 5 / Dreamhost DreamObjects
   \ "Dreamhost"
 6 / IBM COS S3
   \ "IBMCOS"
 7 / Minio Object Storage
   \ "Minio"
 8 / Netease Object Storage (NOS)
   \ "Netease"
 9 / Scaleway Object Storage
   \ "Scaleway"
10 / SeaweedFS S3
   \ "SeaweedFS"
11 / StackPath Object Storage
   \ "StackPath"
12 / Tencent Cloud Object Storage (COS)
   \ "TencentCOS"
13 / Wasabi Object Storage
   \ "Wasabi"
14 / Any other S3 compatible provider
   \ "Other"
provider> 14
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value.
 1 / Enter AWS credentials in the next step.
   \ "false"
 2 / Get AWS credentials from the environment (env vars or IAM).
   \ "true"
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> APIKEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> KEY-PASSWORD
Option region.
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value.
   / Use this if unsure.
 1 | Will use v4 signatures and an empty region.
   \ ""
   / Use this only if v4 signatures don't work.
 2 | E.g. pre Jewel/v10 CEPH.
   \ "other-v2-signature"
region> 1
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Enter a string value. Press Enter for the default ("").
endpoint> https://kr.object.ncloudstorage.com
Option location_constraint.
Location constraint - must be set to match the Region.
Leave blank if not sure. Used when creating buckets only.
Enter a string value. Press Enter for the default ("").
location_constraint> 
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value.
   / Owner gets FULL_CONTROL.
 1 | No one else has access rights (default).
   \ "private"
   / Owner gets FULL_CONTROL.
 2 | The AllUsers group gets READ access.
   \ "public-read"
   / Owner gets FULL_CONTROL.
 3 | The AllUsers group gets READ and WRITE access.
   | Granting this on a bucket is generally not recommended.
   \ "public-read-write"
   / Owner gets FULL_CONTROL.
 4 | The AuthenticatedUsers group gets READ access.
   \ "authenticated-read"
   / Object owner gets FULL_CONTROL.
 5 | Bucket owner gets READ access.
   | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
   \ "bucket-owner-read"
   / Both the object owner and the bucket owner get FULL_CONTROL over the object.
 6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
   \ "bucket-owner-full-control"
acl> 3
Edit advanced config?
y) Yes
n) No (default)
y/n> n
--------------------
[manvscloud-rclone]
type = s3
provider = Other
access_key_id = APIKEY
secret_access_key = KEY-PASSWORD
endpoint = https://kr.object.ncloudstorage.com
acl = public-read-write
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
manvscloud-rclone    s3

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

config에서 살아남으셨나요?
그렇다면 여러분들은 이제 Mount 하실 수 있는 자격을 얻으셨습니다.

[root@manvscloud-dev-01 ~]# rclone mount manvscloud-rclone: /rclone-storage --daemon

위와 같이 Mount 하시면 이제 아래처럼 Mount 및 권한을 얻게 됩니다.

drwxr-xr-x    1 root root    0 Dec  2 07:33 rclone-storage

해당 디렉토리에 접근해서 확인해보시면 manvscloud-rclone에 Mount 한 게 아니라 Object Storage를 통째로 Mount 했더라구요?

[root@manvscloud-dev-01 rclone-storage]# ll
total 0
drwxr-xr-x 1 root root 0 Dec  2 06:45 manvscloud-goofys
drwxr-xr-x 1 root root 0 Dec  2 07:20 manvscloud-rclone
drwxr-xr-x 1 root root 0 Dec  1 23:46 manvscloud-s3fs

각 Bucket별로 Mount 하는 방법을 터득하신다면 댓글로 공유 부탁드립니다!
저 config를 두 번이나 하고 싶진 않군요…


s3fs VS goofys VS rclone

마지막으로 s3fs VS goofys VS rclone 속도 테스트를 진행해보았습니다.
dd 명령어를 이용했고 시간이 없어 큰 용량으로 진행하지는 못했습니다.

먼저 전체 결과만 한 번 보도록 하겠습니다.

  • s3fs
// 쓰기 성능 테스트(Write) count=10,000
[root@manvscloud-dev-01 s3fs-storage]# dd if=/dev/zero bs=4k count=10000 of=mvscfile
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 1.15784 s, 35.4 MB/s

// 읽기 성능 테스트(Read) count=10,000
[root@manvscloud-dev-01 s3fs-storage]# dd if=mvscfile bs=4k count=10000 of=/dev/zero
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 0.199183 s, 206 MB/s

// 쓰기 성능 테스트(Write) count=100,000
[root@manvscloud-dev-01 s3fs-storage]# dd if=/dev/zero bs=4k count=100000 of=mvscfile
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 8.74186 s, 46.9 MB/s

// 읽기 성능 테스트(Read) count=100,000
[root@manvscloud-dev-01 s3fs-storage]# dd if=mvscfile bs=4k count=100000 of=/dev/zero
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 1.67846 s, 244 MB/s

  • goofys
// 쓰기 성능 테스트(Write) count=10,000
[root@manvscloud-dev-01 goofys-storage]# dd if=/dev/zero bs=4k count=10000 of=mvscfile
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 4.17406 s, 9.8 MB/s

// 읽기 성능 테스트(Read) count=10,000
[root@manvscloud-dev-01 goofys-storage]# dd if=mvscfile bs=4k count=10000 of=/dev/zero
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 0.0197085 s, 2.1 GB/s

// 쓰기 성능 테스트(Write) count=100,000
[root@manvscloud-dev-01 goofys-storage]# dd if=/dev/zero bs=4k count=100000 of=mvscfile
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 38.3632 s, 10.7 MB/s

// 읽기 성능 테스트(Read) count=100,000
[root@manvscloud-dev-01 goofys-storage]# dd if=mvscfile bs=4k count=100000 of=/dev/zero
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 0.193719 s, 2.1 GB/s
  • rclone
// 쓰기 성능 테스트(Write) count=10,000
[root@manvscloud-dev-01 manvscloud-rclone]# dd if=/dev/zero bs=4k count=10000 of=mvscfile
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 0.959519 s, 42.7 MB/s

// 읽기 성능 테스트(Read) count=10,000
[root@manvscloud-dev-01 manvscloud-rclone]# dd if=mvscfile bs=4k count=10000 of=/dev/zero
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 0.279922 s, 146 MB/s

// 쓰기 성능 테스트(Write) count=100,000
[root@manvscloud-dev-01 manvscloud-rclone]# dd if=/dev/zero bs=4k count=100000 of=mvscfile
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 8.38886 s, 48.8 MB/s

// 읽기 성능 테스트(Read) count=100,000
[root@manvscloud-dev-01 manvscloud-rclone]# dd if=mvscfile bs=4k count=100000 of=/dev/zero
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 4.26804 s, 96.0 MB/s

결론부터 말씀드리자면 이 테스트는 단순 테스트 방법? 정도로만 보시면 좋겠습니다.

정확한 속도 테스트를 진행하려면 같은 속도에서도 여러번 진행하여 평균값을 확인해보아야하고 낮은 용량부터 큰 용량까지 전체적으로 검토해보아야하는데 시간 부족으로 거기까진 할 수 없어 이렇게 Mount 방법과 테스트 방법만 공유해보았습니다.

goofys 같은 경우 Read는 100MB 밑으로 전부 캐싱해버리기때문에 정확한 속도 측정도 어려웠구요. 그런데 쓰기는 왜 이렇게 늦게 나온거지?…

goofys git 페이지에서는 s3fs와 goofys의 벤치마크 결과가 위와 같이 나오고 있습니다.
조금 더 괜찮은 속도 테스트 방법이 있다면 공유 부탁드립니다.

추후에 시간 여유가 생기면 새로운 속도 테스트 방법을 찾아서 다시 한 번 해봐야겠네요.


Personal Comments

지금까지 Object Storage를 서버에 Mount해서 사용하는 방법에 대해 알아보았습니다.

여유가 없어서 속도 테스트까지 완벽하게 하진 못했는데 방법 정도는 어느정도 공유가 되지 않았나 생각합니다? 물론 더 좋은 속도 테스트 노하우가 있으시다면 언제든지 댓글로 공유 부탁드립니다.

긴 글 읽어주셔서 감사합니다.


Previous Post Next Post

You Might Also Like

No Comments

Leave a Reply