환경
- centos7.6
- gluster 3중화
- 호스트들은 Pacemaker로 통한 VIP 할당되어 있는상태
- 호스트들 물리디스크 추가
- 설치는 root
- 클라이언트는 autofs설치되어 있는 상태
- 파일 쓰기는 일반 유저
호스트마다 name 설정
참고 : 기존 것 xxx_primary
이런 (_) 특수문자 hostname은 glusterfs에서 허용하지 않음.
모든 호스트 및 사용할 클라이언트는 hostname을 알고 있어야한다. 이유 :트러블슈팅 1
> sudo vi /etc/hosts
xxx.xxx.xxx.xx4 xxx_primary mdbprimary
xxx.xxx.xxx.xx5 xxx_standby01 mdbstandby01
xxx.xxx.xxx.xx6 xxx_standby02 mdbstandby02
호스트 마다 방화벽 open
주의
mount 를 하기위해서는 기본 24007 말고도 8,9 .. 등등 다른 포트도 필요하다.
> firewall-cmd --add-service=glusterfs --permanent
> sudo firewall-cmd --reload
호스트 1에서 다른 호스트끼리 ssh 연결 설정
peer 설정을 하기 위함.
> ssh-keygen
> ssh-copy-id xxx_standby01
> ssh-copy-id xxx_standby02
# 접속확인
> ssh xxx_standby01
> ssh xxx_standby02
호스트 마다 repo update
> sudo yum update
호스트 마다 glusterfs 설치
> sudo yum install centos-release-gluster
> sudo yum install glusterfs-server
> sudo yum install glusterfs
> systemctl enable glusterd
> systemctl start glusterd
호스트1 에서 peer 설정
# 없음을 확인
> sudo gluster peer status
Number of Peers: 0
# 다른 호스트 연결
> sudo gluster peer probe "MDBstandby01"
> sudo gluster peer probe "MDBstandby02"
# 잘못 등록 될 시 해제
> sudo gluster peer detach "MDBstandby01"
# 연결됨 확인 (ip address가 아닌 name 형식으로 등록하길 추천한다.)
> sudo gluster peer status
Number of Peers: 2
Hostname: MDBstandby01
Uuid: 85e5b596-5d91-49d8-a5aa-10f1304a5364
State: Peer in Cluster (Connected)
Hostname: MDBstandby02
Uuid: 440e17f7-6b4f-4e85-841a-3acbd199d8a3
State: Peer in Cluster (Connected)
호스트1 마다 공유디렉토리 생성
> cd ...
> mkdir .../web-share-file
호스트1 에서 공유 디렉토리 볼륨생성1
root의 하위 디렉토리에 gluster 볼륨 생성 시 문제생길 수 있으므로.. 추천하지 않음. 예를 들어 다음과 같은 문제 발생할 수 있음.
1.디스크 풀로 인한 기존 볼륨 이미 존재하지만 찾기 실패 2.볼륨 재 생성 시 이미 존재한 볼륨이 존재.. 3.반복
> sudo gluster volume create storage replica 3 arbiter 1 mdbprimary:.../web-share-file MDBstandby01:.../web-share-file MDBstandby02:.../web-share-file
volume create: storage: failed: The brick mdbprimary:.../web-share-file is a mount point. Please create a sub-directory under the mount point and us
e that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.
물리 디스크 생성 후 lvm 생성
> lsblk
> sudo pvcreate /dev/sdb
> sudo vgcreate sharedisk /dev/sdb
> sudo lvcreate -L 10G -n root sharedisk
> mkfs.xfs /dev/mapper/sharedisk-root
> sudo mkfs.xfs /dev/mapper/sharedisk-root
lvm 마운트 해놓기
> sudo mount /dev/mapper/sharedisk-root .../web-share-file
> mount
호스트 재시작 시 자동 lvm 마운트 설정
> sudo vi /etc/fstab
/dev/mapper/sharedisk-root .../web-share-file xfs defaults 0 0
호스트1 에서 공유 디렉토리 볼륨생성2
lv 마운트 포인터와 gluster 볼륨 포인트가 있다면 앞의 문제로 순서가 맞지 않을 시 데이터의 문제가 발생될 가능성 있다고 시사하여 하위에 brick이라는 디렉토리를 만들고 볼륨을 생성하라고 추천함.
Imagine you have a LV you want to use for the gluster volume. Now you mount this LV to /mnt/gluster1. You do this on the other host(s), too and you create the gluster volume with /mnt/gluster1 as brick. By mistake you forget to add the mount entry to fstab so the next time you reboot server1, /mnt/gluster1 will be there (because it's the mountpoint) but the data is gone (because the LV is not mounted). I don't know how gluster would handle that but it's actually easy to try it out :)
So using a subfolder within the mountpoint makes sense, because that subfolder will not exist when the mount of the LV didn't happen.
각 호스트마다 brick 폴더 생성
> sudo mkdir .../web-share-file/brick
# 디렉토리에 권한 할당필요 시
> sudo chown -R ..user: .../web-share-file
호스트1 에서 공유 디렉토리 볼륨생성3
> sudo gluster volume create storage replica 3 arbiter 1 mdbprimary:.../web-share-file/brick MDBstandby01:.../web-share-file/brick MDBstandby02:.../web-share-file/brick
volume create: storage: success: please start the volume to access data
호스트1 에서 볼륨 시작
> sudo gluster volume start storage
volume start: storage: success
호스트1 에서 확인
> sudo gluster vol info
Volume Name: storage
Type: Replicate
Volume ID: 7400b61c-fd38-4507-b2d5-fa4adf2fb44c
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (2 + 1) = 3
Transport-type: tcp
Bricks:
Brick1: mdbprimary:.../web-share-file/brick
Brick2: MDBstandby01:.../web-share-file/brick
Brick3: MDBstandby02:.../web-share-file/brick (arbiter)
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
> sudo gluster volume status
Status of volume: storage
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick mdbprimary:.../web-share-
file/brick 49152 0 Y 31069
Brick MDBstandby01:.../web-shar
e-file/brick 49152 0 Y 27948
Brick MDBstandby02:.../web-shar
e-file/brick 49152 0 Y 31334
Self-heal Daemon on localhost N/A N/A Y 31086
Self-heal Daemon on MDBstandby02 N/A N/A Y 31351
Self-heal Daemon on MDBstandby01 N/A N/A Y 27965
Task Status of Volume storage
------------------------------------------------------------------------------
There are no active volume tasks
호스트 2 에서 확인
> sudo gluster vol info
Volume Name: storage
Type: Replicate
Volume ID: 7400b61c-fd38-4507-b2d5-fa4adf2fb44c
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (2 + 1) = 3
Transport-type: tcp
Bricks:
Brick1: mdbprimary:.../web-share-file/brick
Brick2: MDBstandby01:.../web-share-file/brick
Brick3: MDBstandby02:.../web-share-file/brick (arbiter)
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
> sudo gluster volume status
Status of volume: storage
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick mdbprimary:.../web-share-
file/brick 49152 0 Y 31069
Brick MDBstandby01:.../web-shar
e-file/brick 49152 0 Y 27948
Brick MDBstandby02:.../web-shar
e-file/brick 49152 0 Y 31334
Self-heal Daemon on localhost N/A N/A Y 27965
Self-heal Daemon on xxx_primary N/A N/A Y 31086
Self-heal Daemon on MDBstandby02 N/A N/A Y 31351
Task Status of Volume storage
------------------------------------------------------------------------------
There are no active volume tasks
호스트 3 에서 확인
> sudo gluster vol info
Volume Name: storage
Type: Replicate
Volume ID: 7400b61c-fd38-4507-b2d5-fa4adf2fb44c
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (2 + 1) = 3
Transport-type: tcp
Bricks:
Brick1: mdbprimary:.../web-share-file/brick
Brick2: MDBstandby01:.../web-share-file/brick
Brick3: MDBstandby02:.../web-share-file/brick (arbiter)
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
> sudo gluster volume status
Status of volume: storage
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick mdbprimary:.../web-share-
file/brick 49152 0 Y 31069
Brick MDBstandby01:.../web-shar
e-file/brick 49152 0 Y 27948
Brick MDBstandby02:.../web-shar
e-file/brick 49152 0 Y 31334
Self-heal Daemon on localhost N/A N/A Y 31351
Self-heal Daemon on MDBstandby01 N/A N/A Y 27965
Self-heal Daemon on xxx_primary N/A N/A Y 31086
Task Status of Volume storage
------------------------------------------------------------------------------
There are no active volume tasks
[관리] 호스트1 에서 볼륨 삭제
> sudo gluster volume stop storage
> sudo gluster volume delete storage
# 이미 .../web-share-file/brick에 .glusterfs 가 존재하기 때문
# 각노드마드 .glusterfs 삭제 혹은 생성 시 force를 한다. (삭제를 추천.)
# 1번째 방법 : create 시 강제 force
> sudo gluster volume create storage replica 3 arbiter 1 mdbprimary:.../web-share-file/brick MDBstandby01:/etc/c
lovir-vdi/web-share-file/brick MDBstandby02:.../web-share-file/brick
volume create: storage: failed: .../web-share-file/brick is already part of a volume
> sudo gluster volume create storage replica 3 arbiter 1 mdbprimary:.../web-share-file/brick MDBstandby01:.../web-share-file/brick MDBstandby02:.../web-share-file/brick force
volume create: storage: success: please start the volume to access data
# 2번째 방법 : 각 노드마다 삭제
> sudo setfattr -x trusted.glusterfs.volume-id .../web-share-file/brick
> sudo setfattr -x trusted.gfid .../web-share-file/brick
> sudo rm -rf .../web-share-file/brick/.glusterfs
호스트1 에서 네이티브 마운트 테스트
마운트 방식중 여러 방식이 있는데, 여기서는 네이티브 방식으로 한다. 추가로 cifs, nfs 마운트 방법도 있다.
> mkdir .../doc
> sudo mount -t glusterfs mdbstandby02:/storage ./doc
> mount
...
mdbstandby02:/storage on .../doc type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)
호스트1 에서 파일쓰기 테스트
# 1. 호스트1의 brick 디렉토리에 직접 데이터 쓴경우
# 다른 호스트 2, 3에는 해당 파일이 보이지 않는다.
# 호스트에 brick으로 마운트되어 있을때 쓰기 시 반영이됨.
# 2. 호스트1의 물리 디렉토리 위치에 권한을 유저권한 변경.
# 다른 호스트 2,3의 권한은 변경되지 않음.
# 마운트되어 있는 곳에서 파일 쓰기 할 시 '허가 거부' 발생
# 3. 모든 호스트의 물리 디렉토리 위치에 권한을 유저권한 변경.
# 마운트되어 있는 곳에서 파일 쓰기 할 시 반영됨.
클라이언트들에서 클라이언트 설치
> sudo yum install glusterfs-fuse
클라이언트들에서 설정 마무리
> mkdir .../doc
> sudo vi /etc/auto.direct
.../doc -fstype=glusterfs VIP:/storage
> sudo systemctl restart autofs
[트러블슈팅 1] 클라이언트 1에서 마운트 테스트
> sudo mount -t glusterfs VIP:/storage ./doc
Mount failed. Check the log file for more details.
# 클라이언트 마운트 로그 위치
> sudo vi sudo tail -333f /var/log/glusterfs/...-...-xxx.log
...
[2022-01-26 03:37:52.093155] E [MSGID: 101075] [common-utils.c:508:gf_resolve_ip6] 0-resolver: getaddrinfo failed (family:2) (이름 혹은 서비스를 알 수 없습니다)
...
# 클라이언트에서 /etc/hosts에 호스트의 명이 제대로 등록안되어 있는 문제.
[관리] 호스트들에서 추가 공유할 디렉토리 ( brick )
# 앞서 디렉토리 권한을 일반 유저로 변경했기때문에 sudo 안함.
> mkdir .../web-share-file/web-doc-file
호스트1 에서 볼륨생성
> sudo gluster volume create storageDoc replica 3 arbiter 1 mdbprimary:.../web-share-file/web-doc-file MDBstandby01:.../web-share-file/web-doc-file MDBstandby02:.../web-doc-file
volume create: storageDoc: success: please start the volume to access data
> sudo gluster volume start storageDoc
volume start: storageDoc: success
클라이언트들에서 추가 설정 마무리
> mkdir .../upload
> sudo vi /etc/auto.direct
...
.../upload -fstype=glusterfs VIP:/storageDoc
> sudo systemctl restart autofs