메뉴 닫기

CentOS 7 에서 GlusterFS 를 yum 으로 설치하기

GlusterFS 개요

GlusterFS는 분산 파일 시스템으로, 여러 대의 서버를 하나의 클러스터로 구성해 대용량 데이터를 분산 저장하고 관리할 수 있는 기술입니다. RAID와 유사하게, 노드에 데이터를 분산 저장(Distributed), 복제(Replicated), 또는 분산 이레이저 코딩(Disperse) 방식으로 관리할 수 있습니다.

이 시스템은 Red Hat에서 개발하여 오픈 소스로 제공되며, 다양한 용도로 활용됩니다. 특히, 분산 스토리지파일 공유를 위해 기업 환경에서 자주 사용됩니다.


테스트 환경

본 매뉴얼에서는 CentOS 7 환경을 기준으로 다양한 볼륨 구성 예제를 다루고 있습니다.
CentOS 6 또는 8 버전의 경우, 설치 과정에 약간의 차이가 있으므로 아래 문서를 참고해 주세요.

https://wiki.centos.org/SpecialInterestGroup/Storage/gluster-Quickstart

[사전 작업]

각 노드에 추가적인 디스크를 연결하고, 이를 /data 디렉토리에 마운트하였습니다. 또한, 각 마운트 디렉토리 내에 “gv0″라는 이름의 Brick 디렉토리를 생성해 두었습니다.

Brick 디렉토리는 GlusterFS 볼륨에서 데이터를 저장하는 중요한 역할을 합니다.

 

– /data/gv0

1. GlusterFS 서버 구축

1) hostname 설정

호스트 명을 변경합니다.
# hostnamectl set-hostname gnode1  // 1번 노드에서
# hostnamectl set-hostname gnode2  // 2번 노드에서

# hostnamectl set-hostname gnode3  // 3번 노드에서

(모든 노드에서)
호스트를 등록 합니다.
# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain gnode1
192.168.10.20 gnode2
192.168.10.30 gnode3

위는 gnode1 의 hosts 내용인데, 자신의 노드는 따로 행을 추가하지 말고 127.0.0.1 라인에 기록해 둡니다.

gnode2, gnode3 노드에서의 hosts 는 각각 다음과 같습니다.

127.0.0.1   localhost localhost.localdomain gnode2
192.168.10.10 gnode1
192.168.10.30 gnode3
127.0.0.1   localhost localhost.localdomain gnode3
192.168.10.10 gnode1
192.168.10.20 gnode2

2) 패키지 설치
GlusterFS 설치를 위한 Repository 를 등록해줍니다.
등록은 yum 로 간단히 할 수 있습니다.
# yum -y install centos-release-gluster

GlusterFS 패키지를 설치합니다.
# yum -y install glusterfs glusterfs-libs glusterfs-server

서버 부팅시 glusterd 데몬이 자동 구동 되도록 하고, 현재 세션에서도 구동시켜줍니다.
# systemctl enable –now glusterd

설치된 버전을 확인합니다.

# glusterd –version
glusterfs 9.6
Repository revision: git://git.gluster.org/glusterfs.git
Copyright (c) 2006-2016 Red Hat, Inc. <https://www.gluster.org/>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
It is licensed to you under your choice of the GNU Lesser
General Public License, version 3 or any later version (LGPLv3
or later), or the GNU General Public License, version 2 (GPLv2),
in all cases as published by the Free Software Foundation.

서버 간 통신이 원활하게 이루어지기 위해, firewalld 또는 iptables와 같은 방화벽에서 서로의 IP를 허용해 주어야 합니다. 만약 데이터가 없는 테스트 서버인 경우, 방화벽을 잠시 비활성화하여 테스트를 진행할 수 있습니다.

2. 복제 (Replica) 볼륨 구성

Replica 볼륨은 데이터를 여러 브릭에 복제하여 데이터의 안정성과 내구성을 제공합니다. 이는 RAID 시스템의 1(미러)와 유사합니다. 단, 노드 2대로만 구성하는 것이 아니라 여러 대로 복제가 가능합니다.

GlusterFS에서는 기본적으로 3대 이상의 노드로 구성할 것을 권장하며, 2대로 구성할 경우에는 아래의 ‘8. 판사(Arbiter) 볼륨 구성’을 참고하시기 바랍니다.

여기에서는 3대의 노드로 구성해 보겠습니다. 패키지 설치와 호스트명 등록 이후의 설정은 하나의 노드에서만 진행합니다.

1) Pool 연결

(gnode1 노드에서)

Cluster Pool 을 구성합니다.

# gluster peer probe gnode2

peer probe: success

# gluster peer probe gnode3
peer probe: success

연결된 노드를 확인합니다.

gnode1 에서 명령 실행시 연결된 두개의 노드 (gnode2, gnode3) 가 보입니다.

# gluster peer status
Number of Peers: 2

Hostname: gnode2
Uuid: edea03f3-472b-47b5-a711-ed06763631c4
State: Peer in Cluster (Connected)

Hostname: gnode3
Uuid: 0771cb09-89d3-4a5b-8e7d-3980473ffc0e
State: Peer in Cluster (Connected)

다른 노드에서도 같은 명령을 사용해보면 자신의 노드를 제외한 총 2개의 노드 정보가 확인됩니다.

참고로 peer 노드 제거 명령은 ‘gluster peer detach <노드명>’ 을 사용합니다.

Pool 리스트를 확인합니다.

# gluster pool list
UUID Hostname  State
edea03f3-472b-47b5-a711-ed06763631c4 gnode2    Connected 
0771cb09-89d3-4a5b-8e7d-3980473ffc0e gnode3    Connected 
25d3f6cb-b2ed-4aa1-add7-0a27890ed5ed localhost Connected 

이 명령에서는 자신의 노드를 포함한 총 3개의 노드 정보가 확인됩니다.

2) 볼륨 생성

데이터를 저장할 수 있도록 GlusterFS 볼륨을 생성합니다.

(gnode1 노드에서)

3대의 노드를 하나의 볼륨으로 묶습니다. (볼륨명 : gv0, 복제본 : 3)

# gluster volume create gv0 replica 3 gnode1:/data/gv0 gnode2:/data/gv0 gnode3:/data/gv0

volume create: gv0: success: please start the volume to access data

여기에서 volume create: gv0: failed: /data/gv0 is already part of a volume 에러가 출력되는 분은 아래 ‘5. 볼륨 재구성’ 을 참고하세요.

노드 서버 3대로 복제 저장 구성을 선택한 이유는 2대만으로 복제할 경우 스플릿 브레인(splitting brain)에 취약할 수 있기 때문입니다. 스플릿 브레인은 분산 파일 시스템에서 복제된 데이터의 일관성을 유지하는 데 중요한 개념입니다. 복제된 볼륨이 스플릿 브레인에 취약하다는 것은 데이터의 불일치가 발생할 가능성이 있음을 의미합니다.

복제 2 볼륨은 두 개의 복제본을 가지므로, 데이터의 일관성을 유지하기 위해 두 복제본이 반드시 동기화되어야 합니다. 그러나 네트워크 문제나 장애 등의 이유로 복제본 간의 통신이 중단될 경우, 각각의 복제본이 독립적으로 운영되는 상황이 발생할 수 있습니다. 이는 데이터의 일관성을 해치는 스플릿 브레인 상태를 초래할 수 있습니다.

gv0 볼륨을 시작합니다.

# gluster volume start gv0

volume start: gv0: success

gv0 볼륨 상태를 확인합니다.

# gluster volume info gv0

Volume Name: gv0
Type: Replicate
Volume ID: 09540703-2a84-4dce-bb6c-af156cf1813d
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: gnode1:/data/gv0
Brick2: gnode2:/data/gv0
Brick3: gnode3:/data/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

* 중요 : 볼륨 생성 후 옵션을 하나 설정합니다.

볼륨 구성이 어떤 형태이든(비록 Replica일지라도), GlusterFS 클러스터를 구성하는 한 개의 피어가 장애가 발생했을 경우, 클라이언트는 기본적으로 42초간(기본값) GlusterFS의 응답을 기다리며 데이터를 읽거나 쓸 수 없습니다. 서비스 제공 시 42초는 매우 긴 시간으로, 장애 서버의 다운을 신속하게 감지하고 해당 피어를 빠르게 제거하기 위해 network.ping-timeout 옵션을 설정해야 합니다.

여기에서는 서버 응답 대기 시간을 0초로 설정합니다. 이렇게 하면 피어가 다운될 때 순간적인 지연(delay)은 발생하더라도 연결이 끊어지지 않으며 데이터 유실 또한 발생하지 않습니다.

# gluster volume set gv0 network.ping-timeout 0

volume set: success

# gluster volume info | grep timeout
network.ping-timeout: 0

추후 장애가 발생한 피어를 복구할 경우, 파티션(Brick Directory) 연결 및 glusterd 데몬의 순차적인 실행이 이루어진다면, 다른 피어에서 생성되거나 변경된 파일이 자동으로 동기화되어 최신 데이터를 유지하게 됩니다.

사용가능한 옵션 종류는 아래 URL 에서 확인 가능합니다.

https://access.redhat.com/documentation/ko-kr/red_hat_gluster_storage/3.5/html/administration_guide/volume_option_table

* 데이터 저장 형태

데이터가 어느 노드에 어떻게 저장되는지 확인하기 위해 적당한 크기의 파일을 하나씩 생성해 보았고, 아래와 같은 결과를 확인하였습니다.

– 파일을 저장하면 replica 3 으로 구성된 gnode1, gnode2, gnode3 노드에 동일한 데이터 저장

3. Quota 설정

Brick 디렉토리에 하위 디렉토리를 생성하여 용량을 제한을 할 수 있습니다.

공식 Document : https://docs.gluster.org/en/v3/Administrator%20Guide/Directory%20Quota/

gv0 볼륨 쿼터 설정을 활성화 합니다.

# gluster volume quota gv0 enable

volume quota : success

참고로 비활성화는 enable 대신 disable 을 입력합니다.

또한, 클라이언트가 마운트하여 사용하던 중 쿼터 제한을 설정할 때 사용하는 옵션에 대한 설명은 아래와 같습니다.  (Default : on)

# gluster volume set gv0 quota-deem-statfs on

* 참고

on: GlusterFS는 디렉토리의 용량 제한을 강제로 적용하며, 해당 디렉토리에서 사용 가능한 실제 용량을 디렉토리의 용량 제한으로 간주합니다. 즉, 사용자가 설정한 용량 제한보다 실제 사용 중인 용량이 더 크더라도 GlusterFS는 해당 디렉토리의 용량 제한을 적용합니다. 이는 사용자가 실제 사용 중인 용량을 고려하지 않고 일관된 용량 제한을 유지하고자 할 때 유용합니다.

(예: 2GB의 데이터를 사용 중일 때 쿼터를 1GB로 제한하면, 제한값은 1GB에 머물러 있게 됩니다.)

off: GlusterFS는 디렉토리의 용량 제한을 강제로 적용하지 않고, 실제 사용 중인 용량을 기준으로 디렉토리의 용량 제한을 판단합니다. 즉, 사용자가 설정한 용량 제한보다 실제 사용 중인 용량이 크다면 GlusterFS는 해당 디렉토리의 용량 제한을 초과로 간주합니다. 이는 실제 사용 중인 용량을 기준으로 용량 제한을 적용하고자 할 때 유용합니다.

(예: 2GB의 데이터를 사용 중일 때 쿼터를 1GB로 제한하면, 제한값은 2GB에 머물러 있게 됩니다.)

하위 디렉토리를 그냥 만들 경우, mkdir 명령을 실행한 노드에서만 디렉토리가 생성되기 때문에 쿼터가 적용되지 않습니다. 따라서 볼륨을 마운트한 상태에서 디렉토리를 만들어야 쿼터가 올바르게 적용됩니다.

Client 또는 아무 node 에서나 마운트 명령을 내려도 상관없습니다.

# mkdir /imsi

# mount -t glusterfs gnode1:/gv0 /imsi

# mkdir /imsi/{apple,banana,grape}

# umount /imsi

하위 디렉토리에 각 1G 씩 용량 제한을 합니다.

디렉토리를 지정할때는 Brick 디렉토리 (/data/gv0) 를 제외하고 하위 디렉토리만 입력합니다.

# gluster volume quota gv0 limit-usage /apple 1GB

volume quota : success
# gluster volume quota gv0 limit-usage /banana 1GB
volume quota : success
# gluster volume quota gv0 limit-usage /grape 1GB
volume quota : success

gv0 볼륨의 쿼터 설정값을 확인합니다.

# gluster volume quota gv0 list

                  Path                   Hard-limit  Soft-limit      Used  Available  Soft-limit exceeded? Hard-limit exceeded?
——————————————————————————————————————————-
/apple                                     1.0GB     80%(819.2MB)   0Bytes   1.0GB              No                   No
/banana                                    1.0GB     80%(819.2MB)   0Bytes   1.0GB              No                   No
/grape                                     1.0GB     80%(819.2MB)   0Bytes   1.0GB              No                   No

Hard-limit은 1GB로 설정된 반면, Soft-limit은 80% 선으로 설정된 것으로 보입니다.

Hard-limit: 사용자 또는 프로세스가 설정된 최대 제한을 초과하지 못하도록 하는 값입니다.

Soft-limit: 사용자 또는 프로세스가 현재 사용 중인 리소스의 제한으로, 사용자가 시스템 리소스를 임시로 초과할 수 있는 한계를 설정합니다. Soft-limit은 Hard-limit보다 작거나 같아야 하며, 이를 초과하려는 경우 경고가 발생하지만 작업을 계속할 수 있습니다. 이는 시스템의 안정성을 고려하여 용량이 거의 채워져 간다는 알림을 주기 위한 용도로 이해할 수 있습니다.

Soft-limit 도 100% 까지 사용하기 위해 아래와 같이 변경 설정 해줍니다.

# gluster volume quota gv0 limit-usage /apple 1GB 100
volume quota : success
# gluster volume quota gv0 limit-usage /banana 1GB 100
volume quota : success
# gluster volume quota gv0 limit-usage /grape 1GB 100
volume quota : success

변경 내용을 확인합니다.

# gluster volume quota gv0 list
                  Path                   Hard-limit  Soft-limit      Used  Available  Soft-limit exceeded? Hard-limit exceeded?
——————————————————————————————————————————-
/apple                                     1.0GB    100%(1.0GB)   0Bytes   1.0GB              No                   No
/banana                                    1.0GB    100%(1.0GB)   0Bytes   1.0GB              No                   No
/grape                                     1.0GB    100%(1.0GB)   0Bytes   1.0GB              No                   No

4. Client 마운트

GlusterFS에서는 몇 가지 마운트 방법을 제공합니다. GlusterFS (FUSE), NFS, iSCSI, SMB 방식 중 여기에서는 일반적인 FUSE 방식을 설명하겠습니다.

클라이언트에서 마운트에 필요한 패키지를 설치하고 마운트를 진행합니다.

GlusterFS 서버를 찾을 수 있도록 도메인을 연결하는 것이 좋지만, 현재 테스트 환경에서는 hosts 파일을 이용하였으므로 클라이언트에서도 찾을 수 있도록 /etc/hosts 파일에 아래 내용을 추가해 주세요.

# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain
192.168.10.10 gnode1
192.168.10.20 gnode2
192.168.10.30 gnode3

그리고 마운트 할때는 gnode1 부터 gnode3 까지 아무 서버로 연결해도 상관없습니다.

# yum -y install glusterfs-client

# mkdir /backup

# mount -t glusterfs gnode1:/gv0 /backup

또는 쿼터 적용된 디렉토리로 마운트가 가능합니다.

# mount -t glusterfs gnode1:/gv0/apple /backup

마운트 디렉토리에 파일을 쓰면 모든 노드에 동일하게 복제되어 저장됩니다.

이와 같이 GlusterFS를 활용한 클라이언트 마운트 방법과 설정에 대해 알아보았습니다. GlusterFS는 유연한 데이터 저장 및 관리를 제공하며, 다양한 환경에서 효율적으로 사용할 수 있습니다. 이를 통해 분산 파일 시스템의 이점을 최대한 활용할 수 있기를 바랍니다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x