Software Defined Storage

GlusterFS 설치

DaehanCNI 2020. 9. 7. 14:11

다음은 GlusterFS 설치 관련하여 내용입니다.

각각의 환경 정보에 맞추어서 설치하는 것이 중요합니다. 

 

시스템 구성도

환경 정보

Package Item
OS CentOS-7-x86_64-Everything-1908.iso
Kernel kernel-3.10.0-1062.el7.x86_64
GlusterFS glusterfs-6.10-1.el7.x86_64

 글러스터의 구성 및 설정은 기본적으로 root 계정 사용을 권고한다. 그러므로 설치민 진행을 위해서는 root 계정으로 진행하여야 하며, 또한 노드에 설치할 Packages와 OS는 동일한 버전을 사용하는것을 권고하므로 동일한 버전 을 사용하여 구성한다.

 

 

Pre-Requisties

 

  •  모든 노드(gnode1 - gnode6)에 환경정보에서 정의한 버젼의 OS를 설치

  •  모든 노드에 Hostname 등록

example )
gnode1 에서 설정할때,

# hostnamectl set-hostname gnode1
# hostname
gnode1
  • DNS 서버가 따로 존재하지 않을경우, 모든 노드에 Hostname을 통해 IP 주소를 알수 있도록 hosts 파일 설정.
    DNS 서버가 따로 존재하지 하는 경우 이 단계는 생략가능

example )

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1     	localhost localhost.localdomain localhost6 localhost6.localdomain6 
192.168.0.61    gnode1
192.168.0.62    gnode2
192.168.0.63    gnode3
192.168.0.64    gnode4
192.168.0.65    gnode5
192.168.0.66    gnode6
  • 글러스터 서버노드들은 고정 아이피 사용하는것을 권고한다. 그러므로 모든 노드(gnode1 - gnode6)의 네트워크를 고정 IP(static) 네트워크를 사용하도록 설정한다.

example )

gnode1 에서 설정할때,

# cat ifcfg-eth0  
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.0.61 
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
# ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=32.0 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=32.0 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=31.6 ms 
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 31.633/31.887/32.018/0.231 ms
  • Repository 설정

    • 외부 네트워크를 사용하는 경우, GlusterFS 관련 패키지 설치를 위해 centos-release-gluster를 설치해야한다.

      # yum install centos-release-gluster

       

       내부 네트워크를 사용하여 패키지를 받을수 없는 경우 ISO를 사용하거나  Repository를 따로 구성해야 합니다. (이에 대 한 내용은 향후 업데이트 예정)

  • 패스워드를 사용하지 않고도 SSH 접속할 수 있도록 공개키 생성.

 

글러스터 peer 등록의 과정을 수행할 노드에서 ssh-keygen 명령을 사용하여 키를 생성한다.

테스트 환경에서는 gnode1에서 수행할 예정으므로 gnode1에서 아래 명령어를 수행한다.

#ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nIZOWnurLujYAWGmFrPAGnwS3JwEpGSOiTKTV11x4KA root@gnode1
The key's randomart image is:
+---[RSA 2048]----+
|o*=.o...+o.      |
|X+.= ..o .       |
|&X..E   .        |
|B**    o .       |
|+o    + S        |
|..   = o         |
|  ... o .        |
| o...  . .       |
|..o  oo..        |
+----[SHA256]-----+
  • ssh 동작시 패스워드 입력을 생략하기 위해 생성된 공개키를 다른 GlusterFS노드들(gnode1 - gnode6) 에 등록

gnode1에서 아래 명령어를 수행한다.

#ssh-copy-id gnode1
…
#ssh-copy-id gnode6
  • 글러스터의 정상적인 동작을 위해 모든 GlusterFS 노드들(gnode1 - gnode6)에 다음 명령어를 참고하여 방화벽과 SELINUX 해지한다. (방화벽 과 SELINUX 설정에 방법에 대한 부분은 향후 업데이트 예정)

#setenforce 0
# cat /etc/selinux/config  
...
SELINUX=disabled
SELINUXTYPE=targeted  
…
# systemctl stop firewalld
# systemctl disable firewalld 

위 설정 후, 노드를 재부팅하여 위 설정이 정상적으로 적용되었는지 확인하여야 한다.

 

Brick 구성을 위한 설정

파티션 할당

일반적으로 fdisk 명령을 통해 파티션을 할당하면 되지만 2TB 이상은 할당되지 않는다. 2TB 이하와 이상의 설정 방법이 다르므로 참고하기 바란다. 

 

  •  파티션 할당이 2TB 이하일 경우

 

  •  파티션 할당이 2TB 이상일 경우

LVM 생성

 Gluster의 SNAPSHOT 기능 이나 안정적인 동작을 위해서는 LVM을 구성하여야 한다. 하지만 단순 NAS나 Gluster의 다른 기능을 사용할 계획이 없다면 LVM 구성은 생략하여도 무방하다. 

 

각 노드에서 brick를 위해 LVM 생성을 할경우 아래 예제를 참고하여 생성하면 된다. 
생성은 모든 노드의 brick들에서 수행해야 한다.
example)

#pvcreate --dataalignment 1280k /dev/sdb  
#vgcreate --physicalextentsize 128k rhs_vg /dev/sdb
(전체 디스크가 20기가이고 이중 640M은 메타데이터 저장용, 나머지 18기가는 데이터 저장용으로 구성한다고 할때 가정이다.. 필요에 맞게 아래 사이즈만 변경하면 된다.)

#lvcreate -L 655350K --name rhs_pool_meta rhs_vg  
#lvcreate -L 18874368K --name rhs_pool rhs_vg (18G 로 디스크 용량을 설정할때)
#lvconvert --chunksize 1280k --thinpool rhs_vg/rhs_pool --poolmetadata rhs_vg/rhs_pool_meta
#lvdisplay
#lvcreate -V 18G -T rhs_vg/rhs_pool -n rhs_lv

 - XFS 파일 시스템 생성

글러스터는 여러 BaseFilesystem 을 지원하지만 Centos/RHEL 에서는 XFS 사용을 기본적으로 권고하고 있다.

 

아래 예제를 참고하여 모든 노드들의 brick들에서 XFS 파일 시스템 생성을 수행 한다.
example)

#mkfs.xfs -f -i size=512 -n size=8192 /dev/rhs_vg/rhs_lv

 - 마운트

아래 예제를 참고하여 각 노드들의 brick들이 부팅시 자동으로 마운트 할수있도록 아래 과정을 수행 한다.
example)

#mkdir /brick
#cat /etc/fstab
..
/dev/rhs_vg/rhs_lv /brick xfs rw,inode64,noatime,nouuid 1 2
#mount -a          

 

GlusterFS 설치

  • 전체 Gluster 노드들에 아래 명령어를 수행하여 Packages를 설치

yum install glusterfs* gluster-cli glusterfs-libs glusterfs-server
  • Packages 설치 확인

Gluster의 기능을 동작시키기 위해 아래 Package 중에 누락되어진 패키지가 있으면 안된다.

# rpm -qa | grep glusterfs
glusterfs-api-6.10-1.el7.x86_64
glusterfs-libs-6.10-1.el7.x86_64
glusterfs-client-xlators-6.10-1.el7.x86_64
glusterfs-fuse-6.10-1.el7.x86_64
glusterfs-rdma-6.10-1.el7.x86_64
glusterfs-6.10-1.el7.x86_64
glusterfs-cli-6.10-1.el7.x86_64
glusterfs-server-6.10-1.el7.x86_64
  • 전체 Gluster 노드들에 아래 명령어를 수행하여 glusterd 데몬을 구동.

# systemctl start glusterd
# systemctl enable glusterd
  • 다음 명령어를 통하여 gnode1에서 각 노드를 trustpool(클러스터)에 추가한다. 

# gluster peer status
Number of Peers: 0


# gluster peer probe gnode2
peer probe: success.
..
# gluster peer probe gnode6
peer probe: success.

 trustpool에는 명령어를 수행하는 자기 자신을 노출되지 않으며 추가할 때도 자기 자신 즉 gnode1은 추가할 필요가 없다. gnode1 이외의 다른 노드에서도 수행이 가능하지만 위에서 생성한 ssh키 생성 및 복사를 수행한 과정이 필요하다.

  • 볼륨 생성

 - storage라는 볼륨명으로 분산(distributed)볼륨을 생성하는 경우. (일반 NAS 방식)


example)

# gluster volume create storage gnode1:/brick gnode2:/brick gnode3:/brick gnode4:/brick gnode5:/brick gnode6:/brick

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

 - storage 라는 볼륨명으로 아비타(arbitrated replicated volume) 볼륨을 생성하는 경우. (가장 안정적이며 추천되는 볼륨 방식)

 

example)

# gluster volume create storage replica 3 arbiter 1 gnode1:/brick gnode2:/brick gnode3:/brick gnode4:/brick gnode5:/brick gnode6:/brick

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

 - test-volume 이라는 볼륨명으로 2벌 복제(arbitrated replicated volume) 볼륨을 생성하는 경우. (일반적인 볼륨 방식으로 split-brain 이슈가 발생될 수 있는 구조)

 

example)

# gluster volume create test-volume replica 2 gnode1:/brick gnode2:/brick gnode3:/brick gnode4:/brick gnode5:/brick gnode6:/brick

volume create: test-volume: success: please start the volume to access data

 - dis-volume 이라는 볼륨명으로 EC 볼륨(disperse volume) 볼륨을 생성하는 경우. (복제 볼륨보다는 적은 용량을 사용하고 전체 노드의 리소스를 사용하는 경우에 사용하는 볼륨 방식으로 4+2 방식의 예제이며 노드의 구성에 따라 더 다양한 방식으로 구성이 가능하다.)

 

example)

# gluster volume create dis-volume disperse-data 4 redundancy 2 gnode1:/brick gnode2:/brick gnode3:/brick gnode4:/brick gnode5:/brick gnode6:/brick

volume create: dis-volume: success: please start the volume to access dat

 bricks가 root 아래에 존재할 경우, 볼륨 생성 시 아래와 같은 이슈가 발생할 수 있다. 이러한 경우 아래와 같은 방법처럼 force 명령어를 추가하여 사용하여 볼륨을 생성할 수있다.

 

아래와 같은 에러가 발생하는 이유는 root 디렉토리 바로 아래에 brick가 존재하면, brick 디스크의 umount 나 에러 발생 시, root 아래에 디렉토리를 생성 후 데이터를 저장하여 계속 서비스가 되어 root 디렉토리가 full 이 나는 이슈를 방지하기 하기 위함이다. (root 아래에 디렉토리를 바로 사용하는 경우는 추천하지 않는다.)

# gluster volume create storage oozootech1:/brick oozootech2:/brick
volume create: storage: failed: The brick oozootech1:/brick is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.

# gluster volume create storage oozootech1:/brick oozootech2:/brick force
volume create: storage: success: please start the volume to access data
  • 아무 글러스터 노드에서 아래 명령을 수행하여 생성되어진 볼륨을 구동시킨다.

# gluster volume start storage
Starting storage has been successful
  • 아무 글러스터 노드에서 아래 명령을 수행하여 생성되어진 볼륨 확인을 확인한다.

 - 생성한 볼륨 정보 확인

# gluster vol info

Volume Name: storage
Type: Distribute
Volume ID: f427e325-6d44-4a3f-88e5-59dca90a02a0
Status: Created
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: gnode1:/brick
Brick2: gnode2:/brick
Options Reconfigured:
transport.address-family: inet
storage.fips-mode-rchecksum: on
nfs.disable: on

 - 동작중인 볼륨의 상태 정보 확인

   정상적으로 동작하는 경우 아래와 같이 동작중인 모든 노드의 brick 들이 Y 상태가 되어 있어야 한다.

# gluster volume status
Status of volume: storage
Gluster process                         	TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick gnode1:/brick                 	49152 	0      	Y   	12153  
Brick gnode2:/brick                 	49152 	0      	Y   	12093

Task Status of Volume storage
------------------------------------------------------------------------------
There are no active volume tasks

 - 마운트로 동작 확인

# mount -t glusterfs gnode1:/storage /test
# df -h
Filesystem           	Size  Used Avail Use% Mounted on
devtmpfs              	16G 	0   16G   0% /dev
tmpfs                 	16G 	0   16G   0% /dev/shm
tmpfs                 	16G  9.1M   16G   1% /run
tmpfs                 	16G 	0   16G   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G   14G   37G  27% /
/dev/nvme0n1p2      	1014M  143M  872M  15% /boot
/dev/nvme0n1p1       	200M   12M  189M   6% /boot/efi
/dev/sda1            	3.7T   33M  3.7T   1% /brick
/dev/mapper/centos-home  399G   33M  399G   1% /home
/dev/loop0            	11G   11G 	0 100% /mnt
/dev/loop1           	1.4G  1.4G 	0 100% /mnt2
tmpfs                	3.2G 	0  3.2G   0% /run/user/0
gnode1:/storage  	7.3T   75G  7.3T   2% /test

 

위 article 에 대해 질문이나 궁금한 점이 있다면 언제든지 댓글을 통해 문의하여 주시기 바랍니다.