gdeploy를 이용해서 glusterfs를 설치해 보았다.
gdeploy config file은 이전에 이미 살펴 봣고…
이제 실제 설치하면서 겪은일들이나 덧 필요한 script, ctdb 구성시 필요한것들을 알아본다.
먼저 fstab setup script이다.
#!/bin/bash
MOUNTDIR=”/mnt/gluster1/ /mnt/gluster2/”
SEARCHGV=”RHGS-VG”
umount $MOUNTDIR
sed -i “/$SEARCHGV/ s/,/,discard,/” /etc/fstab
mount -a
gdeploy를 돌리면 /etc/fstab file에 자동으로 추가가되는데, sed를 이용해서 RHGS-VG라는 곳을 찾아서 첫번째 쉼표를 만나면 거기다가 discard 옵션을 추가해 넣는 script이다.
저 sed 구문이 gdeploy config file에 넣을 수가 없더라. 이유는 “,” 이 쉼표 때문… 이걸 gdeploy에서 각 환경변수값의 구분자로 취급하다보니 이상하게 parsing이 된다.
다음으로 ctdb 설정인데… 설정하는것은 쉽다. red hat manual 보고 따라하면 된다. 그런데… reboot을 하게되면 이게 잘 안올라옴 ㅋㅋㅋ
일일히 봐가면서 mount해주고 service 다시시작 해줘야된다… 이유는 glusterfs에서 제공하는 ctdb package가 있는데 어떤 script를 실행 시키면 설정파일들이 자동으로 알아서 세팅이 된다. gluster volume을 만들고 /gluster/lock/ 이라는 directory에 moun를 하고 여기다가 lockfile을 만들어서 먼저 lock 거는놈이 master가 되어서 다른놈들한테 ip들을 분배 시켜준다.
여기서 첫 번째 문제가 한가지 발생하는데… 위에서 만든 gluster volume을 mount후 lockfile을 만든다고 했는데… 이게 server 재시작을 하면 mount가 잘 안된다. 어떨땐 mount 잘 되고.. 어떨땐 마운트가 잘 안되고… mount가 잘 되면 glusterfs가 만든 공유볼륨안에 lockfile을 보게 되는데… mount가 안되면 그냥 root filesystem에있는 /gluster/lock/lockfile 을 락을 잡아버려서 master가 두놈이 되는 현상이 발생한다. 어떤node는 glusterfs 공유볼륨에 있는 lockfile을 잘 lock을 걸어서 작동하는데… 어떤 node는 지 root filesystem에 있는 lockfile을 락을 잡아서 서로 lock 잡은게 두개라 무한 recovery mode로 빠진다. glusterfs가 어디서 계속 동작하고 있는게 아니라, rebooting 후 mount가 안되는 문제를 해결 하기가 힘들었다. 그래서 이것저것 해보다가 생각한게… /lib/systemd/system/ctdb.service file을 수정해줬다. ctdb service의 systemd unit config file인데…
하나하나 살펴보자.
일단 service는 [unit], [service], [install] 이 세개의 섹션이 필요하다.
[Unit]
Description=CTDB ### 단순 설명임. 뭘적든 상관없다. internet manual을 적어 놓기도 하더라.
After=network.target glusterd.service ### network랑 glusterd가 뜬 후에 이게 구동 되게끔 해달라는것 dependancy를 만든다.
Requires=glusterd.service ### 이것 역시 dependancy를 만드는데… glusterfs가 구동되어도 만약 fail이 되면 이것역시 구동되지 않는다.
RequiresMountsFor=/gluster/lock ### fstab에 있는 /gluster/lock 을 mount를 해야지만이 구동된다. 근데 이것만 해놔도 잘 안되드라… 그래서 아래 나오겠지만 crontab에 까지 넣어줬음…
[Service] ### service section이다. 여기서 service 시작 및 action에 관련된것들을 정의한다.
Type=forking ### forking을 하여서 동작 시키라는것. 기본적으로 daemon은 forking으로 되어 있는듯 하다. simple, oneshot, dbus, notify가 있다. 그냥 default로 두면됨 ㅋ
LimitCORE=infinity ### cpu resource 제한하는건데 이것도 그냥 둿다. 다 점유해서 쓸 수 있게 했다.
PIDFile=/run/ctdb/ctdbd.pid ### pid file이 생성되는 path이다.
#ExecStartPre=/usr/bin/umount /gluster/lock ### 삽질한 흔적인데 별의미 없었음… 똑같더라.
#ExecStartPre=/usr/bin/mount -t glusterfs rhgs11.test.dom:/ctdb /gluster/lock ### 이것역시 삽질한 흔적… 이렇게 하면 안됨…
ExecStart=/usr/sbin/ctdbd_wrapper /run/ctdb/ctdbd.pid start ### 실질적인 start script이다.
ExecStop=/usr/sbin/ctdbd_wrapper /run/ctdb/ctdbd.pid stop ### 실질적인 stop script이다.
KillMode=control-group ### killmode인데 죽일 때 cgroup에 잇는 남은 관련 process를 전부 죽이라는 뜻이다. 몇가지 옵션이 더 있는데 man page참조. ㅋ
Restart=always ### 이게 설정파일에 넣은건데… 뭔일이 있던지 멈추면 재시작 하라는 뜻이다. 아래 no가 있는데 저게 default였다. 하지만 난 service를 죽이기 싫으니까 always로 해둠 ㅋ
RestartSec=3s ### service 재시작 할때 3초 쉬고 하라는 뜻. service계속 실패하면 3초마다 계속 뜬다.
#Restart=no
[Install] ### install section인데 여기다가 runlevel 몇데 띄울지(정확히는 어떤 target에 띄울지) 결정한다.
WantedBy=multi-user.target ### 기본으로 multi-user.target ( runlevel 3 )에 뜨게 되어있다.
내가 추가한 것들은 bold 체로 해놧다.
이렇게 수정 후… 한가지더.. crontab에다가 1분마다 shell script를 실행하게 설정 해놨다.
#!/bin/bash
/usr/bin/ctdb status |grep -q mode:RECOVERY ### recovery mode인지 확인한다.
if test $? = 0 ### 이전 command의 return code가 0인지 아닌지를 확인한다. 0이면 true 아니면 다 false, 위의 grap command에서 recovery mode라는 구문이 검출되면 return code는 0이고 아니면 1이 나온다.
then
/usr/bin/mount /gluster/lock ### fstab에 있는 /gluster/lock 을 mount를 한다.
/usr/bin/systemctl restart ctdb.service ### ctdb service를 restart 한다.
else
sleep 0 ### return code 0 이 아니면 아무일도 안한다.
fi
위에 ctdb.service file에도 mount를 넣어놧고 여기에다가도 넣어 놧는데 … 별 문제는 없더라. 일단 마운트가 되야하는게 중요하니까…
이 script는 ctdb가 정상적으로 작동 중일때는 아무일도 하지않고 종료된다. 그러나 recovery mode로 들어가 있으면 그 node에서 ctdb service를 재시작 한다. 재시작을 한다해도 normal mode가 되는데 1분이 안걸리니 작동하는데는 문제가 없더라.
한가지 보충 할 것이 있다면… ctdb 공유 볼륨의 mount point를 /gluster/lock 이 아니라 /gluster/ 로 하고 공유 volume안에 /lock/lockfile 을 만들면 위와같은 master가 두개가 되는 일은 발생 하지 않을것 같다. 한이사님이 알려주셧다.
다음 test할 때 유용한 remove script이다. 그냥 내가만든 shell script인데 나름 잘 쓰고 있다.
또 한줄 한줄 살펴 보면…
#!/bin/bash
# change LIST, CLIENT, GLUSTERVOL
### host, client, gluster volume list ###
HOSTLIST=”rhgs16 rhgs15 rhgs14 rhgs13 rhgs12 rhgs11″ ### 변수 들이다… 여기다가 삭제할 node들을 넣자.
CLHOST=”centos7″ ### 삭제 할 client
GLUSTERVOL=”`gluster vol list`” ### 삭제할 볼륨 이름인데 만들어진 gluster volume 전부를 지정한것임.
#GLUSTERVOL=”glustervol1 glustervol2″ ### 위와 같은데 이름으로 지정해도 된다.
SEDSEARCHVG=”RHGS-VG” ### fstab에서 삭제할때 검색 할 volume group
DELVG=”${SEDSEARCHVG}{1,2}” ### vgremove 로 삭제할 volume group
#DELVG=”${SEDSEARCHVG}1″ ### 위와 같은데 1번만 만 있을때…
DELPV=”/dev/{vda1,vdb1,vdc1,vdd1}” ### 삭제할 pv
CLMOUNTPOINT=”/mnt/gluster{1,2,1-1,2-1}” ### unmount 할 client에 mount되어있는 mount point
HSMOUNTPOINT=”/mnt/gluster1 /mnt/gluster2″ ### unmount 할 node들의 mount point
### volume delete ###
for d in $GLUSTERVOL ### volume을 먼저 지운다.
do ### for 문을 시작한다.
gluster vol stop $d << DD ### volume을 stop 시키고… 뒤에 나온 << 는 hear document이다. 멈출려면 y 를 쳐줘야 됨…
y ### y를 쳐주고…
### 그냥 빈칸이 아니라 enter이다.
### enter 두번을 해줘야지 되더라.
DD ### hear document 끝.
sleep 1 ### 별 의미없이 1초 쉬어주고…
gluster vol del $d << DD ### 이제 gluster volume을 삭제한다.
y ### y를 쳐줘야 지울 수가 있음.…
### 위에도 말했지만 그냥 빈칸이 아님..!! enter이다.
### enter 두번
DD ### hear document 끝. !!
sleep 1 ### 또 1초 쉬어주고…
done ### for 문을 끝낸다.
echo gluster volume deleted’!!’ ————— ### 어떤 볼륨이 지워졌는지 echo로 알려주자.
echo ### 보기 편하게 하기위한 빈칸
### client unmount ###
for c in $CLHOST ### client를 순회하면서 umount를 해준다. 이걸 하려면 같은곳에 mount되어 있어야 한다는 조건이 필요함. ㅋ
do
ssh $c “umount $CLMOUNTPOINT” ### 해당 볼륨들을 umount 시켜준다.
sleep 1
ssh $c “umount $CLMOUNTPOINT” ### 두번 unmount 시켜준다. 간혹 umount안 될때가 있더라.
echo unmount done’!!’ ——————— ### umount 한것을 알려준다.
echo “” ### 보기 편하게 하기위한 빈칸
done ### for문을 종료한다.
### service remove ###
for I in $HOSTLIST ### 이제 service를 삭제해주자.
do
echo —– $I processing ——————– ### 어디에서 지울지 알려준다.
ssh $I sed -i “/$SEDSEARCHVG/d” /etc/fstab ### fstab에서 volume mount 구문을 지워주고…
ssh $I “umount $HSMOUNTPOINT” ### gluster volume을 umount를 해준다.
ssh $I “vgremove $DELVG -f” ### volume group을 지워준다. 그럼 알아서 lv도 지워진다.
ssh $I “pvremove $DELPV -f” ### physical volume을 지운다.
gluster peer detach $I ### gluster peer detach
ssh $I “systemctl stop glusterd” ### glusterd stop
ssh $I “systemctl disable glusterd” ### glusterd disable
echo —– $I done ‘!!’ ———————–
echo “”
done
configuration script 를 다 봤다.