gdeploy를 이용해서 glsuterfs 설치를 해봤다.
좀 삽질하면서 써봤는데 잘 만들어 둔것 같다.
사용법을 좀 알아보면… [<section>[number]] 을 지정하고 원하는 option들을 넣어 준다. 이때 중복되는 section은 뒤에 숫자를 붙여준다.
### 사용할 hosts의 list이다. ip addres나 hostname을 넣는다. ###
[hosts]
rhgs1.test.dom
rhgs2.test.dom
rhgs3.test.dom
rhgs4.test.dom
rhgs5.test.dom
rhgs6.test.dom
### hardware raid(sas controller) type이다 기본이 JBOD(raid 없음)이고 raid6, raid10을 지정 할 수 있다. ###
[disktype]
raid6
### data disk의 갯수 이다. raid6에 disk 12개 이면 보통 data disk는 10개이다. raid6 의erasure code는 보통 parity disk를 2개로 설정하지만 그 이상으로도 설정 할 수 있다. ###
[diskcount]
10
### raid를 구성 할 때 지정 한 stripe-unit(chunk)의 size이다. red hat glusterfs admin guide 에서는 raid6일때 128k, raid10일때 256k를 권장 하고 있다. 단위는 KB이다. ###
[stripesize]
128
### file을 update 할 때 쓰는 옵션이다. copy하거나 안에 있는 내용을 수정 할 수 있다. ###
#[update-file1]
#action=add
#dest=/etc/ntp.conf
#line=server clock.redhat.com iburst
### service를 management 할 수 있다. action에는 enable, disable, stop 이 들어간다. ###
[service1]
action=enable
service=ntpd
[service2]
action=restart
service=ntpd
### 특정 script를 실행 시킬 수가 있다. 아래는 gdeploy package안에 들어있는 multipath를 disable하는 shell script이다. 실행 시 /etc/multipath.conf file에 blocklist { devnode “*” } 를 추가하여 모든 device를 multipath에서 제외시키게 된다. ###
#[script1]
#action=execute
#file=/usr/share/ansible/gdeploy/scripts/disable-multipath.sh
### 역시 gdeploy package 안에 있는 script로 gluster hook을 disable시킨다. 잠깐 봤는데 nfs나 등등의 상황에서 hook을 걸어서 뭘 하게끔 설정 되어 있는걸 없애더라… ###
#[script2]
#action=execute
#file=/usr/share/ansible/gdeploy/scripts/disable-gluster-hooks.sh
### shell 에서 command를 실행 시킨다. 아래 command는 parted를 이용해서 /dev/vdb block device에서 1개의 통 파티션(1개의 파티션이 모든영역을 차지하게끔)을 만드는 command이다. ###
[shell100]
action=execute
command=parted -s -a optimal /dev/vdb mklabel msdos — mkpart primary ext2 1 -1
[shell101]
action=execute
command=parted -s -a optimal /dev/vdc mklabel msdos — mkpart primary ext2 1 -1
[shell102]
action=execute
command=parted -s -a optimal /dev/vdd mklabel msdos — mkpart primary ext2 1 -1
[shell103]
action=execute
command=parted -s -a optimal /dev/vde mklabel msdos — mkpart primary ext2 1 -1
### physical volume group을 만든다. action에는 create, resize가 들어간다. 아래는 위에서 만든 /dev/vdb1, vdc1, vdd1, vde1을 physical volume group에 넣는데 만약 filesystem format이 되어 있는경우 filesystem label을 강제로 지워버리겠다는 뜻이다. ###
[pv]
action=create
devices=vdb1,vdc1,vdd1,vde1
wipefs=yes
force=yes
### volume group을 생성한다. action에는 create와 extend가 들어간다. 아래는 volume group name을 gv1로 하고 /dev/vdb1, /dev/vdc1을 physical volume을 이용하여 volume group을 생성 시키겠다는 뜻이다. ###
[vg1]
action=create
vgname=gv1
pvname=vdb1,vdc1
### logical volume을 만드는 section이다. action에는 create, setup-cache, convert, change가 있다. 옵션들도 굉장히 많다. 아래를 일단 보면… logical volume을 만드는데 volume group gv1의 pysical volume /dev/vdb1을 이용하고, 크기는 /dev/vdb1에있는 모든 extent를 사용하고, lvtype은 thick으로 한다. lvtype은 thin과 thick이 있다. 만든 후 mount는 /mnt/gluster1에 할 것이며, xfs로 format 하는데 option은 inode size 512, logical block size 8192로 하고 강제로 format을 한다. logical volume을 만들 때 강제로 만든다. ###
[lv1]
action=create
vgname=gv1
pvname=/dev/vdb1
lvname=glv1
extent=100%PVS
lvtype=thick
mount=/mnt/gluster1/
mkfs=xfs
mkfs-opts=-i size=512 -n size=8192 -f
force=yes
ignore_lv_errors=no
#size=3GB
### lv 생성 시 setup-cache를 이용하여 dm-cache를 구성 할 수 있다. action에 setup-cache로 넣고 ssd에 cache영역으로 사용할 disk를 지정 해준다. vgname과 lvname을 지정해주고, poolname에 cache-pool 이름을 지정해준다. cache_lv에는 생성 할 cache-data volume 의 이름을 지정해준다. cache_lvsize에는 cache-data 영역의 크기를 지정한다. cache_meta_lv에 metadata로 쓸 volume의 이름을 지정한다. cach_meta_lvsize에는 metadata로 쓸 volume의 크기를 지정한다. cachemode에는 기본 writethrough가 되어 있으므로 writeback을 지정해준다. ignore_lv_error는 만약에 error가 생기면 무시 하겠느냐 물어보는건데 error가 발생 시 무시하지않고 멈추겠다는 뜻이다. 아직 cache pool 만 만들고 위에서 생성한 lv와 붙이진 않았다 이건 convert에서 해야한다. ###
[lv2]
action=setup-cache
ssd=vdc1
vgname=gv1
lvname=glv1
poolname=cache-pool
cache_lv=glv1-cache-data
cache_lvsize=700M
cache_meta_lv=glv1-meta-data
cache_meta_lvsize=50M
cachemode=writeback
force=yes
ignore_lv_errors=no
### 원래 lv section의 conver 에서 lvconver가 되야 하는데 잘안되서 shell command로 하게끔 우회하였다. 아래는 mount된 것을 umount 하는것. ###
[shell1]
action=execute
command=umount /mnt/gluster1/
### lvconvert를 이용하여 cache영역과 lv를 연결시킨다. ###
[shell2]
action=execute
command=lvconvert –type cache /dev/gv1/glv1 –cachepool /dev/gv1/glv1-cache-data
### 다시 format을 시킨다 사실 위에서([lv1] section) format할 필요가 없는데 format을 안시키거나 mount를 안시키는 옵션이 없더라…###
[shell4]
action=execute
command=mkfs.xfs -i size=512 -n size=8192 /dev/gv1/glv1 -f
### 다시 원래 위치에 mount 시킨다. ###
[shell5]
action=execute
command=mount /dev/gv1/glv1 /mnt/gluster1/
### 위에서 한걸 반복한다 이번엔 두번째 volume group을 만든다. ###
[vg2]
action=create
vgname=gv2
pvname=vdd1,vde1
[lv3]
action=create
vgname=gv2
pvname=/dev/vdd1
lvname=glv2
extent=100%PVS
lvtype=thick
mount=/mnt/gluster2/
mkfs=xfs
force=yes
ignore_lv_errors=no
#mkfs-opts=-i size=512 -n size=8192 -f
#size=3GB
[lv4]
action=setup-cache
ssd=vde1
vgname=gv2
lvname=glv2
poolname=cache-pool
cache_lv=glv2-cache-data
cache_lvsize=700M
cache_meta_lv=glv2-meta-data
cache_meta_lvsize=50M
cachemode=writeback
force=yes
ignore_lv_errors=no
[shell6]
action=execute
command=umount /mnt/gluster2/
[shell7]
action=execute
command=lvconvert –type cache /dev/gv2/glv2 –cachepool /dev/gv2/glv2-cache-data
[shell8]
action=execute
command=mkfs.xfs -i size=512 -n size=8192 /dev/gv2/glv2 -f
[shell9]
action=execute
command=mount /dev/gv2/glv2 /mnt/gluster2/
### sed command를 이용하여 lvm.conf file을 수정한다. issu_discards option은 filesystem trim을 하라는 뜻이다. trim에 관해서는 나중에 다시 또 posting 하겠다. ###
[shell10]
action=execute
command=sed -i ‘/issue_discards = 0/ s/= 0/= 1/’ /etc/lvm/lvm.conf
### selinux disable ###
[shell11]
action=execute
command=sed -i ‘/SELINUX=/ s/enforcing/disabled/’ /etc/selinux/config
### selinux permissive로 만든다. 행여 enforcing으로 되어 있으면 permissive로 바꾸라는뜻… ###
[shell12]
action=execute
command=setenforce 0
### network manager를 stop disable 한다. redhat admin guide에 보니까 disable하라고 나와있더라. ###
[service4]
action=stop
service=NetworkManager
[service5]
action=disable
service=NetworkManager
### 기초 설정이 끝난 뒤 glusterd를 재시작 시켜준다. ###
[service6]
action=restart
service=glusterd
### filewalld 가 죽어있으면 시작 시켜준다. action을 restart로 해봤는데 이상하게 여기서 멈추더라… 그래서 start로 해둠. ###
[service7]
action=start
service=firewalld
[service8]
action=enable
service=firewalld
### kernel nfs 를 stop, disable 해준다. kernel nfs(기존의 nfs, native nfs)를 쓰게되면 얘가 nfs port를 먼저 점유해버리게 되서 glusterfs에서 nfs service를 할 수가 없게된다. ###
[service9]
action=stop
service=nfs
[service10]
action=disable
service=nfs
### fstab의 내용을 바꾼다. sed -i “/gv/ s/,/,discard,/” /etc/fstab 이게 들어가 있는데… 안에 쉼표가 있어서 shell section에서 인식을 못하더라. 그래서 shell script로 만들어서 실행 하게끔 하였다. mount 할 때 discard 옵션을 넣어서 mount하게 할려는 것이다. 이것도 역시 위에서와같이 os에서 ssd device에 trim을 알려주라는 뜻이다. ###
[script3]
action=execute
file=/root/fstab_setup.sh
### firewall port를 열어주거나 닫을 수 가 있다. 아래는 glusterfs service와 nfs와 필요 port들을 열어주는것이다. permanent=true를 안해주면 휘발성이되어, firewalld 재시작 시 설정이 없어진다. ###
[firewalld]
action=add
ports=111/tcp,2049/tcp,54321/tcp,5666/tcp,16514/tcp,4379/tcp
services=glusterfs
permanent=true
### 간단하게 pv, vg, lv를 다 만들어줄 수 가있다. 세부적인 옵션은 지정할 수가 없다. ###
#[backend-setup]
#devices=/dev/vdb1
#lvtype=thick
#poolnanme=gl-pool
#vgs=vg1
#lvs=lv1
#mountpoints=/mnt/bric1
#mkfs=xfs
#force=yes
### 특정 host에서만 lv를 만들게 지정 할 수 있다. rhgs1에서만 실행 하라는 뜻 ###
#[backend-setup:rhgs1]
#devices=/dev/vdb1
#vgs=vg1
#lvs=lv1
#mountpoints=/mnt/bric1
#brick_dirs=vol1
#force=yes
#[backend-setup:rhgs2]
#devices=/dev/vdb1
#vgs=vg1
#lvs=lv1
#mountpoints=/mnt/bric1
#brick_dirs=vol1
#force=yes
#[backend-setup:rhgs3]
#devices=/dev/vdb1
#vgs=vg1
#lvs=lv1
#mountpoints=/mnt/bric1
#brick_dirs=vol1
#force=yes
### selinux 설정인데… 이거 no로하면 아무것도 하지 말라는 뜻인지… enforcing으로 되어 있는데도 바뀌질 않더라. 그래서 위에 shell command로 바꾸게끔 해줬다. ###
[selinux]
no
### tuned를 이용한 glusterfs tunning이다. rhgs-sequential-io setting을 하라는뜻… kernel parameter setting이 들어가 있다. ###
[tune-profile]
rhgs-sequential-io
### gluster peer probe를 해주라는뜻 ###
[peer]
action=probe
### 드디어 gluster volume을 만들수가 있다. volume name을 gvol1로 하고 어떤 brick을 이용하여 만들지를 지정한다. 아래는 모든 host의 brick을 /mnt/gluster1/gvol1로 지정한다. replica_count를 이용하여 몇 way replica를 할 지 지정할 수 있다. 아래는 6 distribut volume을 만들게 될것이다. ###
[volume1]
action=create
volname=gvol1
transport=tcp
#replica=yes
#replica_count=3
brick_dirs=/mnt/gluster1/gvol1/
#force=yes
### 6 way replica volume을 만든다. ###
[volume2]
action=create
volname=gvol2
transport=tcp
replica=yes
replica_count=6
brick_dirs=/mnt/gluster2/gvol2/
#force=yes
### client 설정이다. centos7이라는 hostname의 client에 rhgs1:gvol1을 /mnt/gluster1에 mount시킨다. ###
[clients1]
action=mount
volname=rhgs1:gvol1
hosts=centos7
fstype=glusterfs
client_mount_points=/mnt/gluster1
### 같은 client에서 다른 mount point에 mount를 또 할 수 있다. 이렇게 되면 glusterfs daemon이 하나 더 뜨게 되는데, 각각의 daemon이 따로 일을 하기 때문에 작은 파일에 대한 성능을 비약적으로 올릴 수 있다. sequential io는 안높아짐. network bandwidth에서 bottleneck이 걸려서… ###
[clients2]
action=mount
volname=rhgs1:gvol1
hosts=centos7
fstype=glusterfs
client_mount_points=/mnt/gluster1-1
[clients3]
action=mount
volname=rhgs1:gvol2
hosts=centos7
fstype=glusterfs
client_mount_points=/mnt/gluster2
[clients4]
action=mount
volname=rhgs1:gvol2
hosts=centos7
fstype=glusterfs
client_mount_points=/mnt/gluster2-1
다음으로 remove script를 알아보면…
#!/bin/bash
# change LIST, CLIENT, GLUSTERVOL
### 아래 변수들은 대상에 맞게 바꿔주면 된다. ###
### host, client, gluster volume list ###
HOSTLIST=”rhgs6 rhgs5 rhgs4 rhgs3 rhgs2 rhgs1″
CLHOST=”centos7″
GLUSTERVOL=”gvol1 gvol2″
SEDSEARCHGV=”gv”
DELVG=”${SEDSEARCHGV}{1,2}”
DELPV=”/dev/{vdb1,vdc1,vdd1,vde1}”
CLMOUNTPOINT=”/mnt/gluster{1,2,1-1,2-1}”
HSMOUNTPOINT=”/mnt/gluster1 /mnt/gluster2″
### client host로 접속하여 umount 하는 script이다. 왜 그런지 한번에 안될때가 있어서 2번 하게 해놨다. ###
### client unmount ###
for c in $CLHOST
do
ssh $c “umount $CLMOUNTPOINT”
sleep 1
ssh $c “umount $CLMOUNTPOINT”
echo unmount done’!!’ ———————
echo “”
done
### glusterfs volume delete 이다. here documents 를 이용해서 만들었다. gluster vol stop volumename 을 실행 시키면 진짜 할거냐고 물어보는데 이때 y를 넣는 script이다. ###
### volume delete ###
for d in $GLUSTERVOL
do
gluster vol stop $d << DD
y
DD
sleep 1
gluster vol del $d << DD
y
DD
sleep 1
done
echo gluster volume deleted’!!’ —————
echo
### glusterfs server에서 실행되는 script이다. /etc/fstab에서 volume group을 검색하여 그 라인을 지운다. 그리고 umount를 하고, volume group을 force로 지운다. volume group만 지우면 logical volume은 따라서 지워진다. 다음 pysical volume을 삭제해준다. 마지막으로 gluster peer detach 를 실행 시켜준다. ###
### service remove ###
for I in $HOSTLIST
do
echo —– $I processing ——————–
ssh $I sed -i “/$SEDSEARCHGV/d” /etc/fstab
ssh $I “umount $HSMOUNTPOINT”
ssh $I “vgremove $DELVG -f”
ssh $I “pvremove $DELPV -f”
gluster peer detach $I
#ssh $I “sed -i “/lv[12]/d” /etc/fstab”
#ssh $I “lvremove gv1/glv1 gv2/glv2 -f”
#ssh $I “vgremove gv{1,2} -f”
#ssh $I “pvremove /dev/{vdb1,vdc1,vdd1,vde1} -f”
#ssh $I “shutdown -r +0”
echo —– $I done ‘!!’ ———————–
echo “”
done
모든 과정이 종료되엇다. 이로서 설치 및 제거를 자동화하여 할 수가 있다.
https://leeyj7141blog.wordpress.com/2016/10/17/gdeploy를-이용한-glusterfs-install/ 에서 가져옴