, ,

계기

인스턴스에 새롭게 적용하고 싶은 것들이 생겼습니다.
Cloudflared와 같은 것이 대표적이죠.
Cloudflared를 사용하게 되면서 불필요해진 서비스들이 많습니다.
VPN 같은 서비스가 대표적인 예시죠.

그러다보니 OS를 재설치하고 싶었습니다.
그런데 인스턴스를 지우려니 많은 서비스가 중단이 된다는 것을 깨닳았죠.

그래서 기왕 새로 만드는거 가용성을 확보해보자고 결심했습니다.

가용성 확보해보자

정말 많은 연구를 했습니다.
OCFS2, GFS2, GlusterFS, Ceph
K3s, K8s, Docker Swarm 등등..

이번 편에서는 GlusterFS를 설치하고 구성하는 방법을 적었습니다

Storage: Shared File System vs Distributed File System

오토 스냅샷 맛보신 분들은 스냅샷이 얼마나 대단한지 아실겁니다.
한번 빠지면 못빠져나오죠.
실수하면 그냥 복사하면 되죠.

전 Btrfs나 zfs로 스냅샷을 이용하고 싶었어요.
그래서 성능을 포기하고 Distributed File System을 이용하기로 결정했습니다.
어차피 Public Cloud 위에 올라가있기 때문에 스토리지가 고장 날 일을 염려할 필요는 없다고 생각합니다.

스냅샷: zfs vs btrfs

외전으로.. sanpshot 기능 비교를 살짝 해보고 가겠습니다.

zfs
zfs는 각 파일 시스템 안에 .zfs/snapshots라는 폴더 안에 스냅샷 이름으로 나열됩니다.
근데 zfs-auto-snapshot이라는 스냅샷 도구가 '날짜'- suffix라는 이름으로 스냅샷이 찍히면
날짜순으로 나열이 될텐데.. 안타깝게도 prefix - '날짜'순서로 작성됩니다.
예를 들면 root-5min-2023-0421T164050과 같은 형식이죠
문제는 zfs auto snapshot이라는 도구가 이 prefix를 가지고 관리한다는 것이죠.
그래서 5분마다 찍고 3일 후에 지우는 스케쥴에 prefix를 root-5m-3d로 설정하고,
1시간마다 스냅샷 찍고 3달 후에 지우는 스케쥴은 root-1h-3m가 될겁니다.
그래서 ls로 나열하면 순서가 엉망이 되죠. 시간순서가 아니게 됩니다.

반면 btrfs는 달라요.
마운트 위치부터 root던, home이던, userpool이던
하나의 폴더에 나열됩니다.
또한 스냅샷 이름도, directory-날짜로 됩니다.

GlusterFS + Docker Swarm + Docker Traefik 구성

HA는 Quorum 때문에 홀수로 구성해야 합니다.
docker swarm과 GlusterFS 모두 홀수개로 구성 하되, docker container는 오로지 고사양 머신에서만 구동할 예정입니다.

이 때 문제가 발생하여서 Traefik을 docker로 올리고,
로드밸런서까지 구현해보도록 하겠습니다.
문제가 된 부분은 Traefik 설정할 때 말씀드리도록 하겠습니다.
일단은 GlusterFS부터 설정합시다.

설치 환경

Oracle Cloud Infra structure에 구현되어있습니다.
인스턴스 이름은 Instance1, Instance2, Instance3로 하겠습니다.

항목I1I2I3
shapeE2A1A1
CPU core1C2T2C2T2C2T
CPU clock2Ghz2Ghz2Ghz
memory1GiB12GiB12GiB
storage47GB53GB53GB
OSFedora 37.1Fedora 37.1Fedora 37.1
Linux Kernel6.2.106.2.106.2.10
FileSystemBtrfsBtrfsBtrfs

GlusterFS

subvolume(또는 filesystem 또는 directory) 생성

먼저 GlusterFS에 사용할 Btrfs subvolume을 생성합니다.
GlusterFS에 사용된 서브볼륨만 별도로 스냅샷을 찍기 위함입니다.

sudo btrfs subvolume list /
sudo btrfs subvolume create /gluster_userdataBrick
sudo btrfs subvolume show /gluster_userdataBrick

저는 btrfs이기 때문에 subvolume을 생성했지만
zfs라면 zfs create로 filesystem을 생성하거나,
ext4같은 traditional fs인 경우 단순하게 mkdir로 폴더를 만들어주세요.

GlusterFS 설치

sudo dnf -y install glusterfs-server  glusterfs-fuse
sudo systemctl enable --now glusterd

GlusterFS peer 통신 방화벽(tcp 24007) 해제

firewall-cmd --add-service=glusterfs
OCI에서도 privateIP에 대해서 열어줘야 하고, firewalld에서도 열어줘야 합니다!

GlusterFS management 방화벽 해제

먼저 다음을 입력해서 glusterfs가 사용하는 포트를 확인합니다.

cat /etc/glusterfs/glusterd.vol
다음과 같은 꼴로 결과가 나올거예요

volume management
    type mgmt/glusterd
    option working-directory /var/lib/glusterd
    option transport-type socket
    option transport.socket.keepalive-time 10
    option transport.socket.keepalive-interval 2
    option transport.socket.read-fail-log off
    option transport.socket.listen-port 24007
    option ping-timeout 0
    option event-threads 1
#   option lock-timer 180
#   option transport.address-family inet6
#   option base-port 49152
    option max-port  60999
end-volume

여기서 base-port부터 max-port까지 volume에서 사용한다는 것입니다.
동시에 모든 포트를 사용하는 것은 아니고, 제 환경에서는 8개 사용하더라구요.
바꾸고 싶으시면 바꿔도 될 것 같은데.. 안바꿔봤습니다.ㅠㅠ

tcp로 해당 포트들을 열어줍니다.
OCI에서도 privateIP에 대해서 열어줘야 하고, firewalld에서도 열어줘야 합니다!

peer 연결

GlusterFS에 연결된 머신을 peer라고 합니다.
3대를 먼저 연결해줍니다.

보통은 /etc/hosts 파일을 수정한 후에 연결하지만,
저는 OCI에서 구현하는 것을 예로 들고 있습니다.
OCI는 hostname을 위한 DNS를 제공하기 때문에 따로 설정할 필요 없이 hostname으로 통신이 가능합니다

# I1에서 실행한 경우
sudo gluster peer probe I2
sudo gluster peer probe I3

GlusterFS volume 생성 및 실행

sudo gluster volume create userdataVolume replica 3 I1:/gluster_userdataBrick I2:/gluster_userdataBrick I3:/gluster_userdataBrick force
sudo gluster volume start userdataVolume

sudo gluster volume info

Gluster volume Mount

시작시에 마운트 될 수 있도록 설정하고, 마운트를 해줍니다.

sudo mkdir /gluster_userdataVolume
# 전에 만든 폴더는 brick입니다.
# 이 폴더는 glusterFS volume이 마운트 될 폴더입니다.
# 파일이 저장되는 폴더가 아니므로, btrfs나 zfs도 mkdir로 폴더 만들어주세요.

sudo tee -a /etc/fstab << "EOF"
localhost:/userdataVolume /gluster_userdataVolume glusterfs _netdev,defaults,backupvolfile-server=I2 0 0
EOF
sudo systemctl daemon-reload
sudo mount -a

GlusterFS Tunning

이제 튜닝입니다
Redhat 문서에 따르면 용량이 작고 많은 파일을 다룬다면 다음 설정을 적용하라고 합니다.

sudo gluster volume set userdataVolume performance.cache-invalidation on #def false
sudo gluster volume set userdataVolume features.cache-invalidation on #def off
sudo gluster volume set userdataVolume performance.qr-cache-timeout 600 #def 1 10 min recommended setting
sudo gluster volume set userdataVolume cache-invalidation-timeout 600 #def 60 10 min recommended setting

설명이 매우매우매우 부족하지만 공식 문서도 있기는 합니다.
얼마나 부족하냐면 group nl-cache라고 적어두고는 nl-cache를 켜고 끈다고만 되어있고, 무엇의 줄인말인지 조차 없습니다.

그냥 이런 옵션이 있구나, 뭔가 성능에 영향줄것 같은데?
싶으면 구글링해야 합니다..

암튼 GlusterFS는 이것으로 끝입니다.

Docker Swarm

Docker Traefik

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

닫기를 누르면 이용하실 수 있지만, 광고 차단은 해제해주시면 좋겠습니다.
Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock