왜 볼륨을 나누는가?

단일 볼륨 장점 : 성능

Oracle은 볼륨 크기에 따라 성능이 달라집니다.
50기가 스토리지보다 200기가 스토리지가 4배가 빠르죠.
볼륨 퍼포먼스를 UHP로 해두더라도 50기가는 90MB/s 3000 IOPS 정도입니다.
하드디스크 수준이죠.
200기가 볼륨은 350MB/s, 12000 IOPS 정도입니다.
저사양 sata ssd 수준입니다. 초창기 TLC SSD 정도죠.

단일 볼륨 단점: free tier volume 용량 제한, A1 생성 제한.

그래서 저는 단일 볼륨에 최대 용량으로 사용해왔습니다.
하지만 볼륨을 잘못 건드려서 새로운 머신을 만들때 프리티어 제한 200기가를 초과해서 만들수 없었습니다.

A1이 200기가 스토리지를 사용중이면 A1 50기가 머신을 생성할 수 없죠.

그럼 먼저 삭제한 후에 생성하면 된다고 생각할 수 있지만, 안타깝게도 어렵습니다.
A1 생성이 자유롭다면 그리 했겠지만, 삭제를 해도 생성은 불가능할 수 있습니다.
매크로로 생성하는 스크립트 만들었다는 다른 분들 말 들어보면 2~3달 기다려서 겨우 생성 했다는 분도 계십니다.
그러므로 삭제하기 전에 생성이 선행 되어야 합니다.
부트 볼륨 50, 블럭볼륨 100으로 설정해두면 새 인스턴스를 생성한 후에 삭제가 가능하죠.

단일 볼륨 사용시의 예시를 더 들어볼께요
A1이 150기가 스토리지를 사용중에 이 인스턴스에 문제가 발생하면
새로운 A1 50기가 생성 후에 볼륨 확장이나 블럭 볼륨 마운트 해서 사용 가능합니다.

그러나 이 방법도 문제가 있습니다.
오라클 프리티어도 백업 볼륨 5개까지가 무료입니다.
당연히 백업기능을 이용하실텐데, 150기가 인스턴스를 사용중이시면 위와 같은 이유로
100기가까지 밖에 사용 못합니다.
boot volume의 크기가 100기가바이트보다 더 크면 문제가 발생한 인스턴스를 삭제한 후에 생성해야하는데, 생성은 자유롭지 못하기 때문입니다.
다시 말씀드리자면, 생성이 된 후에 삭제가 이루어져야 합니다.

따라서 부트볼륨과 block volume이 나누어져야 최대 152기가바이트까지 사용 가능합니다.
단일로 사용시 100기가바이트가 한계라고 보시면 됩니다.

왜 ZFS?

성능? 아닙니다.

쓰기가 별로 자주 발생하지 않아 쓰기 캐시는 별로 성능 향상 없고, 읽기 캐시는 zfs가 아니어도 됩니다.
arc가 linux page cache에서 사용한다는 clock-pro보다 좋다고 하지만,
Oracle A1은 RAM이 24기가바이트입니다.
어떤 알고리즘을 적용하든 한번 읽었던 파일은 모두 캐시에 있어요.ㅎㅎㅎㅎ

zfs를 적용하기 전에도 디스크 쓰기는 항상 존재했지만, 읽기는 최근 5일 동안 0Btye인 경우가 대부분입니다.
어차피 ram에서 읽어요.
따라서 zfs arc에 의한 성능 향상은 0.

스냅샷 때문

스냅샷이 가장 큰 요소입니다.
btrfs도 스냅샷은 가능하지 않나?

맞습니다.
하지만 cockpit에서 btrfs에 스냅샷 생성하고, 스냅샷 rollback하고,
스냅샷을 마운트(마운트가 가능해야 스냅샷에서 일부만 복원이 가능합니다)할 수 없습니다.
즉, BTRFS를 제어할 수 있는 web UI 툴이 없거나 업데이트가 없다는 것이 주요 문제점입니다.

적용 부위(?)

아쉽게도 루트 볼륨에 ZFS를 적용하지는 못했습니다.
적용 방법이 있기는 한데 커스텀 이미지를 사용한, 유료 계정에 한해서만 가능한 방법이었습니다.
현재 적용된 곳은 /userdata(독커 컴포즈 파일과 여러가지 스크립트가 저장되는 공간입니다.), /var/lib/docker, /var/log 입니다.
log는 사실 안정성이나 성능 개선을 위한 것은 아니고, 오로지 압축을 위한 것입니다.

생각보다 로그가 많이 쓰더라구요..ㅎㅎ log는 압축을 위한 것인 만큼 굳이 zfs일 필요는 없습니다.
다만 다른 볼륨을 넣기 힘들었을 뿐이죠..

부트 볼륨을 repartitioning을 할수는 없으므로 부트볼륨 일부를 압축 기능을 넣은 ext4나 xfs, btrfs로 포맷한 후에 /var/log에 마운트는 불가능.
zfs pool 중 일부를 subset을 ext4로 포맷하는 것은 가능하지만, block volume의 일부를 zfs와 ext4 파티션 분리 불가능.
zfs pool 중 일부를 ext4로 할 것이면 차라리 log 폴더도 zfs로 만들면 되는 부분이죠.
그렇다고 log에 50기가 block volume 하나를 생성해서 넣어줄수도 없었지요..

그래서 4개의 공간에 zfs를 적용했습니다.

적용한 오라클 클라우드 인스턴스 설정

운영체제는 오라클 리눅스 8,
shape는 A1(4C 24G)에 적용했습니다.

왜 우분투가 아닌가?

라즈베리파이에 zfs on boot를 적용하면서는 ubuntu를 적용했습니다.
그러면서 aarch64용 zfs가 repository에 없어서 zfs가 업데이트 될 때마다, 커널이 업데이트 될 때마다 다시 빌드해주어야 한다고 했었는데, 왜 여기에는 오라클 리눅스인가?하는 의문이 들 것입니다.
cockpit이 정상작동하지 않았기 때문입니다.

cockpit이 작동하지 않음.

아직도 이유는 모릅니다..ㅠㅠ
cockpit 설치하고, oracle cloud의 VCN에서 security list에 허용하고, ufw와 iptables를 비활성화해도 접속이 안되었습니다.
이번에 ZFS를 사용하려고 인스턴스를 새로 생성하기 전,
기존의 인스턴스는 역시 우분투였으나 cockpit이 정상 작동했다는 점입니다.

인스턴스에서 127.0.0.1:9090으로는 접속 가능하며, docker 컨테이너에서 172.17.0.0.1:9090을 이용했을 때는 접속이 불가능했습니다.
172.17.0.0.1은 docker 기본 브릿지 네트워크의 gateway로 docker container에서 host나 외부로 접속할 때 사용하는 gateway가 됩니다.
ufw는 이 네트워크를 차단하지 못합니다.
어떤 프로그램이나 데몬에서 차단하는 것은 아니라는 것이죠.
정리하면 cockpit 설정에서 출발 주소나 도착지 주소에 따라 차단한 것인데 저는 그 방법을 찾지 못했습니다.

cockpit이 안되면 zfs를 사용할 필요가 없죠.
cli로 스냅샷 제어할 거라면 btrfs여도 가능하고, 그러면 역시 우분투 사용할 이유가 없어집니다.
cockpit과 zfs가 모두 사용 가능한 OS여야 합니다.
그래서 결국 오라클 리눅스를 사용하게 되었습니다.

설치 시작해봅시다

설치 과정은 building zfs: open zfs를 참조하였습니다.

system update 및 재시동

kernel 모듈은 커널이 바뀔때마다 빌드가 필요합니다.
zfs 빌드 후에 커널 업데이트 및 재시동을 해버리면 안타깝게도 부팅할 때 zfs가 로드 되지 않아요.
따라서 먼저 업데이트하고 재시동까지 해줘야 합니다

sudo dnf upgrade && sudo reboot

&&를 사용함으로써 upgrade에 오류 없이 성공했을 경우에 재시동 되도록 합니다.

build에 필요한 것들 설치

sudo dnf install epel-release
dnf-config-manager --enable repository ol8_developer_EPEL
sudo dnf install --skip-broken gcc make autoconf automake libtool rpm-build libtirpc-devel libblkid-devel libuuid-devel libudev-devel openssl-devel zlib-devel libaio-devel libattr-devel elfutils-libelf-devel kernel-devel-$(uname -r) python3 python3-devel python3-setuptools python3-cffi libffi-devel git ncompress libcurl-devel linux-headers pv
sudo dnf install --skip-broken --enablerepo=epel --enablerepo=powertools --enablerepo=ol8_codeready_builder python3-packaging dkms

git에서 파일 다운로드 합니다.

git clone https://github.com/openzfs/zfs

#build
cd ./zfs
git checkout master

make clean
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

sh autogen.sh

★ 설정하고 빌드합니다 ★

# ./configure
./configure --prefix=/usr #공식 빌드 방법과 다른 부분입니다.
make -s -j$(nproc)

공식 자료에서는 ./configure를 수행하라고 합니다.
하지만 이 방법으로 수행하면 zfs나 zpool의 위치가 /usr/sbin이 아니고 /usr/local/etc/sbin에 저장됩니다.
이렇게 빌드 된다고 문제가 생기지는 않습니다.
하지만 실행파일 뿐만이 아니라 설정 파일들의 저장위치도 달라지기 때문에 추후 문제가 생기거나 설정을 변경할 때 인터넷의 도움을 받는데 어려움이 있습니다.
어떤 파일은 인터넷의 자료와 같은 경로에서 설정하고, 어떤 파일은 다른 위치에서 설정해야하기 때문입니다.
따라서 –prefix는 꼭 설정해주시기를 권합니다.

설치해줍니다.

sudo make install; sudo ldconfig; sudo depmod

부팅시 import하도록 설정해줍니다.

sudo systemctl enable --now zfs-import-cache.service
sudo systemctl enable --now zfs-import-scan.service
sudo systemctl enable --now zfs-mount.service
sudo systemctl enable --now zfs-share.service
sudo systemctl enable --now zfs-zed.service
sudo systemctl enable --now zed.service
sudo systemctl enable --now zfs.target

sudo modprobe zfs
sudo zpool set cachefile=/etc/zfs/zpool.cache {zfs pool 이름}

#부팅 스크립트에서 마운트 하도록 설정
sudo chmod +x /etc/rc.d/rc.local
echo "zpool import zfsblock" >>  /etc/rc.d/rc.local
echo "zfs mount -a" >> /etc/rc.d/rc.local

ZFS를 마운트 할 수 있는 환경이 되었습니다.

답글 남기기

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


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

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