@@ -38,122 +38,119 @@ SourceHostIP=
3838interval=0
3939rflag=0
4040cflag=0
41- UUIDList=" "
41+ UUIDList=
4242skeyPath=" /var/lib/libvirt/images/"
4343
44- while getopts ' p:n:s:h:i:t:u:r:c' OPTION; do
44+ while getopts ' p:n:s:h:i:t:u:r:c' OPTION
45+ do
4546 case $OPTION in
4647 p)
47- PoolName=" $OPTARG "
48- ;;
48+ PoolName=" $OPTARG "
49+ ;;
4950 n)
50- PoolAuthUserName=" $OPTARG "
51- ;;
51+ PoolAuthUserName=" $OPTARG "
52+ ;;
5253 s)
53- PoolAuthSecret=" $OPTARG "
54- ;;
54+ PoolAuthSecret=" $OPTARG "
55+ ;;
5556 h)
56- HostIP=" $OPTARG "
57- ;;
57+ HostIP=" $OPTARG "
58+ ;;
5859 i)
59- SourceHostIP=" $OPTARG "
60- ;;
60+ SourceHostIP=" $OPTARG "
61+ ;;
6162 t)
62- interval=" $OPTARG "
63- ;;
63+ interval=" $OPTARG "
64+ ;;
6465 u)
65- UUIDList=" $OPTARG "
66- ;;
66+ UUIDList=" $OPTARG "
67+ ;;
6768 r)
68- rflag=1
69- ;;
69+ rflag=1
70+ ;;
7071 c)
71- cflag=1
72- ;;
72+ cflag=1
73+ ;;
7374 * )
74- help
75- ;;
75+ help
76+ ;;
7677 esac
7778done
7879
7980if [ -z " $PoolName " ]; then
8081 exit 2
8182fi
8283
84+ # rados object touch action for vol list
85+ res=$( rbd -p $PoolName ls --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret | grep MOLD-AC)
86+ if [ $? -gt 0 ]; then
87+ rbd -p $PoolName create --size 1 --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret MOLD-AC
88+ fi
89+
90+ timestamp=$( date +%s)
91+
92+ if [ -n " $UUIDList " ]; then
93+ for uuid in $( echo $UUIDList | sed ' s/,/ /g' ) ; do
94+ objId=$( rbd -p $PoolName info $uuid --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret | grep ' id:' )
95+ objId=${objId#* id: }
96+ res=$( timeout 3s bash -c " rados -p $PoolName touch rbd_object_map.$objId " )
97+ if [ $? -eq 0 ]; then
98+ # 정상적인 touch 상태면 image meta에 key: uuid / value : timestamp 입력
99+ rbd -p $PoolName --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret image-meta set MOLD-AC $uuid $HostIP :$timestamp
100+ else
101+ # 정상적으로 touch 상태가 아니면 image meta에 key : uuid 삭제
102+ rbd -p $PoolName --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret image-meta rm MOLD-AC $uuid
103+ fi
104+ done
105+ fi
106+
83107# write the heart beat log
84108write_hbLog () {
85109 Timestamp=$( date +%s)
86- CurrentTime=$( date +" %Y-%m-%d %H:%M:%S" )
87-
88- obj=$( rbd -p $PoolName ls --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret | grep MOLD-HB-$HostIP )
110+ obj=$( rbd -p $PoolName ls --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret | grep MOLD-HB)
89111
90112 if [ $? -gt 0 ]; then
91- rbd -p $PoolName create --size 1 --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret MOLD-HB- $HostIP
113+ rbd -p $PoolName create --size 1 --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret MOLD-HB
92114 fi
93115
94- rbd -p $PoolName --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret image-meta set MOLD-HB-$HostIP $HostIP $Timestamp
95- ret=$?
96- if [ $ret -eq 0 ]; then
97- logger -p user.info -t MOLD-HA-HB " [Writing] 호스트:$HostIP | HB 파일 갱신(RBD, 스토리지:$PoolName ) > [현 시간:$CurrentTime ]"
98- else
99- logger -p user.info -t MOLD-HA-HB " [Writing] 호스트:$HostIP | HB 파일 갱신(RBD, 스토리지:$PoolName ) > HB 갱신 실패!!!"
100- fi
101- return $ret
102-
116+ obj=$( rbd -p $PoolName --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret image-meta set MOLD-HB $HostIP $Timestamp )
103117 if [ $? -gt 0 ]; then
104- printf " Failed to create rbd file and set image-meta"
118+ printf " Failed to create rbd file and set image-meta"
105119 return 2
106120 fi
107121 return 0
108122}
109123
110124# check the heart beat log
111125check_hbLog () {
112- Timestamp=$( date +%s)
113- CurrentTime=$( date +" %Y-%m-%d %H:%M:%S" )
114-
115- getHbTime=$( rbd -p $PoolName --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret image-meta get MOLD-HB-$HostIP $HostIP )
126+ now=$( date +%s)
127+ getHbTime=$( rbd -p $PoolName --id $PoolAuthUserName -m $SourceHostIP -K $skeyPath$PoolAuthSecret image-meta get MOLD-HB $HostIP )
116128 if [ $? -gt 0 ] || [ -z " $getHbTime " ]; then
117129 return 1
118130 fi
119131
120- diff=$( expr $Timestamp - $getHbTime )
121- getHbTimeFmt=$( date -d @${getHbTime} ' +%Y-%m-%d %H:%M:%S' )
122- logger -p user.info -t MOLD-HA-HB " [Checking] 호스트:$HostIP | HB 파일 체크(RBD, 스토리지:$PoolName ) > [현 시간:$CurrentTime | HB 파일 시간:$getHbTimeFmt | 시간 차이:$diff 초]"
123- if { [ " $diff " -gt 30 ] && [ " $diff " -le 45 ]; } || { [ " $diff " -gt 60 ] && [ " $diff " -le 75 ]; }; then
124- timeout 1 ssh ccvm "
125- mysql -u cloud -pAblecloud1! -D cloud -e \"
126- INSERT INTO event (
127- uuid, type, state, description, user_id, account_id, domain_id,
128- resource_id, resource_type, created, level, start_id,
129- parameters, archived, display
130- ) VALUES (
131- UUID(), 'HA.STATE.TRANSITION', 'Completed',
132- '[Heartbeat Checking] Host: $HostIP | Storage: $PoolName [Current Time: $CurrentTime | HB File Time: $getHbTimeFmt | Time Difference: $diff seconds]', 1, 1, 1, 0, 'Host',
133- UTC_TIMESTAMP(), 'WARN', 0, NULL, 0, 1
134- );
135- \"
136- "
137- fi
132+ diff=$( expr $now - $getHbTime )
133+
138134 if [ $diff -gt $interval ]; then
139- logger -p user.info -t MOLD-HA-HB " [Result] 호스트:$HostIP | HB 체크 결과(RBD, 스토리지:$PoolName ) > [HOST STATE : DEAD]"
140- echo " ### [HOST STATE : DEAD] Set maximum interval: ($interval seconds), Actual difference: ($diff seconds) => Considered host down in [PoolType : RBD] ###"
141- return 0
142- else
143- logger -p user.info -t MOLD-HA-HB " [Result] 호스트:$HostIP | HB 체크 결과(RBD, 스토리지:$PoolName ) > [HOST STATE : ALIVE]"
144- echo " ### [HOST STATE : ALIVE] in [PoolType : RBD] ###"
135+ return $diff
145136 fi
146137 return 0
147138}
148139
149140if [ " $rflag " == " 1" ]; then
150141 check_hbLog
151- exit 0
142+ diff=$?
143+ if [ $diff == 0 ]; then
144+ echo " ### [HOST STATE : ALIVE] in [PoolType : RBD] ###"
145+ else
146+ echo " ### [HOST STATE : DEAD] Set maximum interval: ($interval seconds), Actual difference: ($diff seconds) => Considered host down in [PoolType : RBD] ###"
147+ fi
148+ exit 0
152149elif [ " $cflag " == " 1" ]; then
153150 /usr/bin/logger -t heartbeat " kvmheartbeat_rbd.sh will reboot system because it was unable to write the heartbeat to the storage."
154151 sync &
155152 sleep 5
156- echo b > /proc/sysrq-trigger
153+ echo b > /proc/sysrq-trigger
157154 exit $?
158155else
159156 write_hbLog
0 commit comments