gdploy configuration, ctdb setup

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/ 이라는 directorymoun를 하고 여기다가 lockfile을 만들어서 먼저 lock 거는놈이 master가 되어서 다른놈들한테 ip들을 분배 시켜준다.

여기서 첫 번째 문제가 한가지 발생하는데… 위에서 만든 gluster volumemountlockfile을 만든다고 했는데… 이게 server 재시작을 하면 mount가 잘 안된다. 어떨땐 mount 잘 되고.. 어떨땐 마운트가 잘 안되고… mount가 잘 되면 glusterfs가 만든 공유볼륨안에 lockfile을 보게 되는데… mount가 안되면 그냥 root filesystem에있는 /gluster/lock/lockfile 을 락을 잡아버려서 master가 두놈이 되는 현상이 발생한다. 어떤nodeglusterfs 공유볼륨에 있는 lockfile을 잘 lock을 걸어서 작동하는데… 어떤 node는 지 root filesystem에 있는 lockfile을 락을 잡아서 서로 lock 잡은게 두개라 무한 recovery mode로 빠진다. glusterfs가 어디서 계속 동작하고 있는게 아니라, rebooting mount가 안되는 문제를 해결 하기가 힘들었다. 그래서 이것저것 해보다가 생각한게… /lib/systemd/system/ctdb.service file을 수정해줬다. ctdb servicesystemd unit config file인데…

하나하나 살펴보자.

일단 service[unit], [service], [install] 이 세개의 섹션이 필요하다.

[Unit]

Description=CTDB ### 단순 설명임. 뭘적든 상관없다. internet manual을 적어 놓기도 하더라.

After=network.target glusterd.service ### networkglusterd가 뜬 후에 이게 구동 되게끔 해달라는것 dependancy를 만든다.

Requires=glusterd.service ### 이것 역시 dependancy를 만드는데… glusterfs가 구동되어도 만약 fail이 되면 이것역시 구동되지 않는다.

RequiresMountsFor=/gluster/lock ### fstab에 있는 /gluster/lock mount를 해야지만이 구동된다. 근데 이것만 해놔도 잘 안되드라… 그래서 아래 나오겠지만 crontab에 까지 넣어줬음

[Service] ### service section이다. 여기서 service 시작 및 action에 관련된것들을 정의한다.

Type=forking ### forking을 하여서 동작 시키라는것. 기본적으로 daemonforking으로 되어 있는듯 하다. 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 ### 이전 commandreturn code0인지 아닌지를 확인한다. 0이면 true 아니면 다 false, 위의 grap command에서 recovery mode라는 구문이 검출되면 return code0이고 아니면 1이 나온다.

then

/usr/bin/mount /gluster/lock ### fstab에 있는 /gluster/lock mount를 한다.

/usr/bin/systemctl restart ctdb.service ### ctdb servicerestart 한다.

else

sleep 0 ### return code 0 이 아니면 아무일도 안한다.

fi

위에 ctdb.service file에도 mount를 넣어놧고 여기에다가도 넣어 놧는데 … 별 문제는 없더라. 일단 마운트가 되야하는게 중요하니까…

scriptctdb가 정상적으로 작동 중일때는 아무일도 하지않고 종료된다. 그러나 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 clientmount되어있는 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 ### volumestop 시키고… 뒤에 나온 << 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 volumeumount를 해준다.

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 를 다 봤다.

댓글 남기기