Wednesday, April 27, 2016

GlusterFS

GlusterFS 구축하기
@문서 작성일 : 2013/02/04
@문서 수정일 : 2013/02/04
@문서 작성자 : YoungJoo.Kim(vozltx@gmail.com)



1. 개요
1.1. GlusterFS 란?
1.2. 구축 시나리오
1.3. 용어들
2. GlusterFS 서버 구성하기
2.1. 패키지 설치 & brick1/{vol0, vol1} 디렉토리 생성
2.2. Gluster pool 등록
2.3. Gluster pool 등록 확인
2.4. Gluster Volume 생성
2.5. 기타 사항
2.5. Gluster Volume 생성 확인
2.6. Gluster Volume 사용 시작
2.7. Gluster Volume 사용 시작 확인
2.8. Gluster Volume ACL 설정
2.9. Client 에서 Gluster Volume 마운트
3. GlusterFS Volume 확장(brick 추가)
3.1. Gluster brick 추가
3.2. Gluster volume Rebalancing
3.3. Gluster volume Rebalancing 상태 확인
4. GlusterFS brick 교체
4.1. 신규 장비 pool 등록
4.2. 신규 장비 기존 volume 에 추가
4.3. 기존 장비 volume 에서 제거 시작
4.4. 제거 상태 확인
4.5. 기존 장비 volume 에서 제거 완료
4.6. 기존 장비 volume 에서 제거 확인
4.7. 기존 장비 pool 에서 제거
5. GlusterFS Geo-replication
5.1. Geo-replication 시작
5.2. Geo-replication 상태 확인
5.3.  에러등으로 인한 재 동기화시
5.4. 기타사항
6. GlusterFS volume 제거
5.1. volume 정지
5.2. volume 제거


1. 개요



1.1. GlusterFS 란?



GlusterFS 란 수천 PetaByte 급의 대용량에, 수천 개의 클라이언트가 접속하여 사용가능한 scale-out 방식의 분산 파일 시스템이다.
GlusterFS is a powerful network/cluster filesystem written in user space which uses FUSE to hook itself with VFS layer. GlusterFS takes a layered approach to the file system, where features are added/removed as per the requirement. Though GlusterFS is a File System, it uses already tried and tested disk file systems like ext3, ext4, xfs, etc. to store the data. It can easily scale up to petabytes of storage which is available to user under a single mount point.


1.2. 구축 시나리오



총 6대의 서버에 한개의 디스크 파티션에 두개의 볼륨을 생성한다. 볼륨 생성(Distributed Volume)후 brick 의 추가 그리고 마이그레이션 및 geo-replication 을 테스트 한다.


Server
Volume
Volume Type
Version
FileSystem
OS
Arch
ts[1-6].vozlt.com
/brick1/vol0
Distributed Volume
3.3.1
XFS
CentOS 6.3
64bit
ts[1-6].vozlt.com
/brick1/vol1
Distributed Volume
3.3.1
XFS
CentOS 6.3
64bit


포맷 옵션


shell> mkfs.xfs -b size=4096 -d sunit=512,swidth=4096 -L gluster /dev/sdb1

1.3. 용어들



brick
The brick is the storage filesystem that has been assigned to a volume.
client
The machine which mounts the volume (this may also be a server).
server
The machine (virtual or bare metal) which hosts the actual filesystem in which data will be stored.
subvolume
a brick after being processed by at least one translator.
volume
The final share after it passes through all the translators.


2. GlusterFS 서버 구성하기



2.1. 패키지 설치 & brick1/{vol0, vol1} 디렉토리 생성



ts[1-2].vozlt.com 서버에 패키지 설치(glusterfs-server, glusterfs-geo-replication) 및 volume 을 구성할 디렉토리를 생성한다.


shell> vi install_package.sh

#! /bin/sh
for i in {1..6}
do
ssh ts$i.vozlt.com "yum install glusterfs-server glusterfs-geo-replication -y; \
/etc/init.d/glusterd start; \
chkconfig glusterd on; \
mkdir -p /brick1/{vol0,vol1};
done

shell> sh install_package.sh


2.2. Gluster pool 등록



shell> gluster peer probe ts2.vozlt.com
shell> gluster peer probe ts3.vozlt.com
shell> gluster peer probe ts4.vozlt.com
shell> gluster peer probe ts5.vozlt.com
shell> gluster peer probe ts6.vozlt.com


2.3. Gluster pool 등록 확인



shell> gluster peer status

Number of Peers: 5

Hostname: ts2.vozlt.com
Uuid: c2f6b805-3090-47f9-8106-bb9318bd5a81
State: Peer in Cluster (Connected)

Hostname: ts3.vozlt.com
Uuid: 4a49c4c5-44f2-4639-ab10-a56cce92bee8
State: Peer in Cluster (Connected)

Hostname: ts4.vozlt.com
Uuid: 886498cf-e2b9-44ef-8ab4-ef4a4fbd5683
State: Peer in Cluster (Connected)

Hostname: ts5.vozlt.com
Uuid: 8c31ebd7-33e9-4cd8-a61d-cde718820678
State: Peer in Cluster (Connected)

Hostname: ts6.vozlt.com
Uuid: 0833bc54-8fdc-46d1-b665-1cbafde3c98e
State: Peer in Cluster (Connected)

2.4. Gluster Volume 생성



shell> gluster volume create vol0 ts1.vozlt.com:/brick1/vol0 \
ts2.vozlt.com:/brick1/vol0 \
ts3.vozlt.com:/brick1/vol0 \
ts4.vozlt.com:/brick1/vol0 \
ts5.vozlt.com:/brick1/vol0 \
ts6.vozlt.com:/brick1/vol0

shell> gluster volume create vol1 ts1.vozlt.com:/brick1/vol1 \
ts2.vozlt.com:/brick1/vol1 \
ts3.vozlt.com:/brick1/vol1 \
ts4.vozlt.com:/brick1/vol1 \
ts5.vozlt.com:/brick1/vol1 \
ts6.vozlt.com:/brick1/vol1


2.5. 기타 사항



에러
볼륨 생성시 아래의 메시지 출력시 기존에 생성 되었던 볼륨이므로 자료 정리(삭제)와 상관 없이 파일에 확장 속성이 걸려 있기 때문에 발생하는 에러이다. (kernel 2.6 에서 부터 파일에 확장 속성을 기록 할 수 있다.)


/brick1/vol0 or a prefix of it is already part of a volume


해결책
아래 명령어으로 확장 속성을 해제 한후 volume create 를 실행 한다.


shell> cd /brick1/vol0
shell> for i in `attr -lq .`; do setfattr -x trusted.$i .; done

2.5. Gluster Volume 생성 확인



shell> gluster volume info all

Volume Name: vol0
Type: Distribute
Status: Created
Number of Bricks: 6
Transport-type: tcp
Bricks:
Brick1: ts1.vozlt.com:/brick1/vol0
Brick2: ts2.vozlt.com:/brick1/vol0
Brick3: ts3.vozlt.com:/brick1/vol0
Brick4: ts4.vozlt.com:/brick1/vol0
Brick5: ts5.vozlt.com:/brick1/vol0
Brick6: ts6.vozlt.com:/brick1/vol0

Volume Name: vol1
Type: Distribute
Status: Created
Number of Bricks: 6
Transport-type: tcp
Bricks:
Brick1: ts1.vozlt.com:/brick1/vol1
Brick2: ts2.vozlt.com:/brick1/vol1
Brick3: ts3.vozlt.com:/brick1/vol1
Brick4: ts4.vozlt.com:/brick1/vol1
Brick5: ts5.vozlt.com:/brick1/vol1
Brick6: ts6.vozlt.com:/brick1/vol1


2.6. Gluster Volume 사용 시작



shell> gluster volume start vol0
shell> gluster volume start vol1


2.7. Gluster Volume 사용 시작 확인



shell> gluster volume info all

Volume Name: vol0
Type: Distribute
Status: Started
Number of Bricks: 6
Transport-type: tcp
Bricks:
Brick1: ts1.vozlt.com:/brick1/vol0
Brick2: ts2.vozlt.com:/brick1/vol0
Brick3: ts3.vozlt.com:/brick1/vol0
Brick4: ts4.vozlt.com:/brick1/vol0
Brick5: ts5.vozlt.com:/brick1/vol0
Brick6: ts6.vozlt.com:/brick1/vol0

Volume Name: vol1
Type: Distribute
Status: Started
Number of Bricks: 6
Transport-type: tcp
Bricks:
Brick1: ts1.vozlt.com:/brick1/vol1
Brick2: ts2.vozlt.com:/brick1/vol1
Brick3: ts3.vozlt.com:/brick1/vol1
Brick4: ts4.vozlt.com:/brick1/vol1
Brick5: ts5.vozlt.com:/brick1/vol1
Brick6: ts6.vozlt.com:/brick1/vol1


2.8. Gluster Volume ACL 설정



shell> gluster volume set vol0 auth.allow 10.*
shell> gluster volume set vol1 auth.allow 10.*


2.9. Client 에서 Gluster Volume 마운트



shell> yum install glusterfs-fuse
shell> mkdir -p /mnt/gluster/{vol0,vol1}
shell> mount -t glusterfs ts1.vozlt.com:vol0 /mnt/gluster/vol0
shell> mount -t glusterfs ts1.vozlt.com:vol1 /mnt/gluster/vol1

3. GlusterFS Volume 확장(brick 추가)





기존에 ts[1-6].vozlt.com 구성에 ts7.vozlt.com 을 추가하여 volume 를 확장하는 과정이다.

3.1. Gluster brick 추가



shell> gluster peer probe ts7.vozlt.com
shell> gluster volume add-brick vol0 ts7.vozlt.com:/brick1/vol0
shell> gluster volume add-brick vol1 ts7.vozlt.com:/brick1/vol1


3.2. Gluster volume Rebalancing



shell> gluster volume rebalance vol0 start
shell> gluster volume rebalance vol1 start


3.3. Gluster volume Rebalancing 상태 확인



shell> gluster volume rebalance vol0 status
shell> gluster volume rebalance vol1 status

4. GlusterFS brick 교체





기존에 ts1.vozlt.com 의 brick 을 신규 장비(ts7.vozlt.com)로 마이그레이션 하는 과정이다. 3.3.0 이상부터는 brick 의 교체 방식이 이전과 다른 방식을 사용하며 여기서는 Distributed Volume 에 대한 교체만 설명 한다. 이전버전과 변경된 자세한 내용은 아래 내용을 참조 하기 바란다.


4.1. 신규 장비 pool 등록



shell> gluster peer probe ts7.vozlt.com


4.2. 신규 장비 기존 volume 에 추가



shell> gluster volume add-brick vol0 ts7.vozlt.com:/brick1/vol0
shell> gluster volume add-brick vol1 ts7.vozlt.com:/brick1/vol1


4.3. 기존 장비 volume 에서 제거 시작



shell> gluster volume remove-brick vol0 ts1.vozlt.com:/brick1/vol0 start
shell> gluster volume remove-brick vol1 ts1.vozlt.com:/brick1/vol1 start


4.4. 제거 상태 확인



상태가 in progress 에서 completed 로 변경되면 기존 서버(ts1.vozlt.com)의 자료는 모두 신규 장비로 이전 완료 된 상태이다.


shell> gluster volume remove-brick vol0 ts1.vozlt.com:/brick1/vol0 status
       Node Rebalanced-files          size       scanned      failures         status
  ---------      -----------   -----------   -----------   -----------   ------------
 ts1.vozlt.com                1        7Bytes             3             0      completed
 ts2.vozlt.com                0        0Bytes             0             0    not started
 ts3.vozlt.com                0        0Bytes             0             0    not started
 ts4.vozlt.com                0        0Bytes             0             0    not started
 ts5.vozlt.com                0        0Bytes             0             0    not started
 ts6.vozlt.com                0        0Bytes             0             0    not started
 ts7.vozlt.com                0        0Bytes             0             0    not started


4.5. 기존 장비 volume 에서 제거 완료



shell> gluster volume remove-brick vol0 ts1.vozlt.com:/brick1/vol0 commit
shell> gluster volume remove-brick vol1 ts1.vozlt.com:/brick1/vol1 commit


4.6. 기존 장비 volume 에서 제거 확인



shell> gluster volume info vol0

Volume Name: vol0
Type: Distribute
Volume ID: 7c20dffd-2f1d-45d8-b610-1f1926cca552
Status: Started
Number of Bricks: 6
Transport-type: tcp
Bricks:
Brick2: ts2.vozlt.com:/brick1/vol0
Brick3: ts3.vozlt.com:/brick1/vol0
Brick4: ts4.vozlt.com:/brick1/vol0
Brick5: ts5.vozlt.com:/brick1/vol0
Brick6: ts6.vozlt.com:/brick1/vol0
Brick7: ts7.vozlt.com:/brick1/vol0


4.7. 기존 장비 pool 에서 제거



shell> gluster peer detach ts1.nwz.kr


5. GlusterFS Geo-replication





LAN, WAN 구간에서 서버간에 비동기 방식의 동기화를 제공하는 기능이다. slave 서버는 GlusterFS volume 이 구성되어 있지 않은 서버라도 상관 없다. 구성후에는 Master 에서 Slave 로 실시간 동기화가 이루어 지며 indexing 을 사용하기 때문에 Slave 서버의 정지시 완벽한 재동기화를 위해서는 옵션 geo-replication.indexing 을 off 후 재 동기화 해야 한다.


Master, Slave 서버는 아래와 같이 정의 된다.


Master
GlusterFS volume


Slave
Local Directory:
file:///path/to/dir (단축형: /path/to/dir)
GlusterFS Volume:
gluster://slave.vozlt.com:volname
(단축형: slave.vozlt.com:volname)
SSH:
ssh://root@slave.vozlt.com:/path/to/dir
(단축형: root@slave.vozlt.com:/path/to/dir)
ssh://root@slave.vozlt.com:gluster://localhost:volname
(단축형: root@slave.vozlt.com::volname)


Example
x : gluster volume geo-replication vol0 slave.vozlt.com:/vol0 start
o : gluster volume geo-replication vol0 slave.vozlt.com:vol0 start
o : gluster volume geo-replication vol0 gluster://slave.vozlt.com:vol0 start
o : gluster volume geo-replication vol0 ssh://root@slave.vozlt.com::vol0 start
o : gluster volume geo-replication vol0 root@slave.vozlt.com:/path/to/dir/ start


기본 환경 구성
- 시간 동기화
Master, Slave 모두 ntp 등을 이용하여 시간 동기화는 꼭 해주어야 한다.


- SSH 사용을 위한 구성(gluster:// 프로토콜 사용시 불필요)
SSH 프로토콜 사용시 Master 서버에서 와 Slave 서버간 통신을 위해 아래와 같은 키 생성 과정이 필요하다.
slave 서버의 타켓은 volume 이거나 일반적인 디렉토리가 될 수 있고 volume 을 구성하지 않고 일반적인 디렉토리에 replication을 수행 하더라도 glusterd 데몬은 구동 되어야 한다.


shell> yum install glusterfs-server
shell> service glusterd start
shell> chkconfig glusterd on
shell> ssh-keygen -f /var/lib/glusterd/geo-replication/secret.pem
shell> ssh-copy-id -i /var/lib/glusterd/geo-replication/secret.pem.pub user@slave.vozlt.com


보안
원격 명령에 대한 제한이나 mountbroker 및 IP 기반의 접근 제어등은 배포되는 관리문서 를 참조 하길 바란다.

5.1. Geo-replication 시작



shell> gluster volume geo-replication vol0 gluster://slave.vozlt.com:vol0 start


5.2. Geo-replication 상태 확인



shell>  gluster volume geo-replication vol0 gluster://slave.vozlt.com:vol1 status
MASTER               SLAVE                                              STATUS
--------------------------------------------------------------------------------
vol0                 gluster://slave.vozlt.com:vol1                        starting...

shell>  gluster volume geo-replication vol0 gluster://slave.vozlt.com:vol1 status
MASTER               SLAVE                                              STATUS
--------------------------------------------------------------------------------
vol0                 gluster://slave.vozlt.com:vol1                        OK


5.3.  에러등으로 인한 재 동기화시



shell> gluster volume set vol0 geo-replication.indexing off
shell> gluster volume geo-replication vol0 gluster://slave.vozlt.com:vol1 start


5.4. 기타사항



gsyncd 경로 문제
glusterfs-3.3.1 은 gsyncd 의 위치가 /usr/local/libexec/glusterfs/gsyncd 로 하드코딩 되어 있어서 gsyncd 경로 에러시 적절하게 변경 해주어야 한다.(http://review.gluster.org/#change,4392)


해결책
아래처럼 gsyncd 경로를 올바르게 재설정 하거나 Patch0 처럼 패치를 가한후 glusterfs 를 빌드 한다. (혹은 gsyncd.conf 수정)


shell> gluster volume geo-replication vol0 gluster://slave.vozlt.com:vol1 config remote_gsyncd /usr/libexec/glusterfs/gsyncd


Patch0: glusterfs-3.3.1.gsyncd.prefix.patch
diff -urNp glusterfs-3.3.1.org/xlators/mgmt/glusterd/src/glusterd.c glusterfs-3.3.1/xlators/mgmt/glusterd/src/glusterd.c
--- glusterfs-3.3.1.org/xlators/mgmt/glusterd/src/glusterd.c    2012-10-12 02:38:25.000000000 +0900
+++ glusterfs-3.3.1/xlators/mgmt/glusterd/src/glusterd.c    2013-02-06 14:49:22.873156172 +0900
@@ -461,8 +461,8 @@ configure_syncdaemon (glusterd_conf_t *c
        RUN_GSYNCD_CMD;

        runinit_gsyncd_setrx (&runner, conf);
-        runner_add_args (&runner, "remote-gsyncd",
-                         "/usr/local/libexec/glusterfs/gsyncd", ".", "^ssh:", NULL);
+       runner_add_args (&runner, "remote-gsyncd", GSYNCD_PREFIX"/gsyncd", ".", "^ssh:", NULL);
+
        RUN_GSYNCD_CMD;

        /* gluster-command-dir */


6. GlusterFS volume 제거



6.1. volume 정지



shell> gluster volume stop vol0
shell> gluster volume stop vol1


6.2. volume 제거



shell> gluster volume delete vol0
shell> gluster volume delete vol1



Post a Comment