この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、秋晴れって素晴らしいですね。城内です。
引き続きクラプロネタです。
今回は、前回構築したHAクラスタのファイルサーバで、必要なリソースグループが一つ欠けていたようなので、補足記事になります。
はじめに
まずは、いままでの記事の紹介です。
また、インストーラやドキュメントは以下のサイトから取得できます。
今回の内容は、製品連携HAクラスター構築ガイドにドキュメントがあるので、そちらも参照してみてください。
全体構成
構成は、前回に引き続き以下のような構成です。
セットアップ
では、さっそく設定していきますが、まず、前回の記事は以下になります。
次に、参照するドキュメントは以下になります。
前回足りなかったのは、汎用リソースでセッション切断の処理を設定することです。
今回はそこを補足していこうと思います。
ちなみに、ノード監視の設定は不要でした。
リソースグループのファイル共有リソース(Samba)に、プロセスの応答監視も含まれているようです。
汎用リソース
では、早速汎用リソースの設定を行っていきたいと思います。
設定するスクリプトは、上記の構築ガイドに掲載されているサンプルスクリプトをそのまま利用させてもらいます。
以下、ドキュメントからの引用になります。
※SHARENAMEには、仮想ホスト名を入力しています。
#!/bin/sh
SHARENAME="fileserver.clp-sample.local"
TRYCNT_KILLPROC=10
TRYINT_KILLPROC=1
INSTALL_DIR="/opt/clznode"
WORK_DIR="/work"
SAMBA_DIR="/samba"
TARGET_DIR=${INSTALL_DIR}${WORK_DIR}${SAMBA_DIR}
LOG_FILE="${TARGET_DIR}/restartsamba_${SHARENAME}.log"
STAT_FILE="${TARGET_DIR}/smbstatus_${SHARENAME}"
LINE_FILE="${TARGET_DIR}/line_${SHARENAME}"
BEFORE_PROC_FILE="${TARGET_DIR}/bproc_${SHARENAME}"
AFTER_PROC_FILE="${TARGET_DIR}/aproc_${SHARENAME}"
TEMP_FILE1="${TARGET_DIR}/tmp1_${SHARENAME}"
TEMP_FILE2="${TARGET_DIR}/tmp2_${SHARENAME}"
ENDOFHEADER="\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-"
get_session_pid()
{
# initialize target pid
targetpid=-1
# create temporary file for smbstatus
touch ${STAT_FILE}
if [ $? -ne 0 ]
then
logging "failed (${STAT_FILE} cannot be created)"
exit 1
fi
# create temporary file for searching pid
touch ${LINE_FILE}
if [ $? -ne 0 ]
then
rm -f ${STAT_FILE}
logging "failed (${LINE_FILE} cannot be created)"
exit 1
fi
smbstatus -S > ${STAT_FILE} 2>&1
iret=$?
logging "get_session_pid (smbstatus retval = ${iret})"
passedheader=0
while read line
do
if [ ${passedheader} -eq 0 ]
then
# search line representing end of header
echo ${line} | grep "${ENDOFHEADER}" >/dev/null 2>&1
if [ $? -eq 0 ]
then
passedheader=1
fi
else
# read information of samba session
echo ${line} > ${LINE_FILE} 2>&1
# some continuous spaces in line are compressed to 1 space
selectedline=`sed -e 's/ */ /g' ${LINE_FILE}`
# get sharename from line
selectedname=`echo ${selectedline} | cut -d ' ' -f 1`
if [ "${SHARENAME}" = "${selectedname}" ]
then
# get pid for target samba session from line
targetpid=`echo ${selectedline} | cut -d ' ' -f 2`
break
fi
fi
done < ${STAT_FILE}
rm -f ${STAT_FILE}
rm -f ${LINE_FILE}
logging "get_session_pid (target pid = ${targetpid})"
}
get_ps_info()
{
# create temporary files
touch ${TEMP_FILE1}
if [ $? -ne 0 ]
then
logging "failed (${TEMP_FILE1} cannot be created)"
exit 1
fi
touch ${TEMP_FILE2}
if [ $? -ne 0 ]
then
rm -f ${TEMP_FILE1}
logging "failed (${TEMP_FILE2} cannot be created)"
exit 1
fi
# save ps info
ps -ef > ${TEMP_FILE1}
# some continuous spaces in line are compressed to 1 space
sed -e 's/ */ /g' ${TEMP_FILE1} > ${TEMP_FILE2}
while read line
do
selectedname=`echo ${line} | cut -d ' ' -f 8`
if [ "${selectedname}" = "smbd" ]
then
echo ${line} >> ${1}
fi
done < ${TEMP_FILE2}
rm -f ${TEMP_FILE1}
rm -f ${TEMP_FILE2}
}
logging()
{
if [ ! -e ${LOG_FILE} ]
then
touch ${LOG_FILE}
if [ $? -ne 0 ]
then
# log file cannot be created, so execute without logging
return
fi
fi
echo "`date` [restartsamba <${SHARENAME}>] : $1" >> ${LOG_FILE}
}
# restartsamba main
export LANG=C
# check existence of smbstatus command
which smbstatus >/dev/null 2>&1
if [ $? -ne 0 ]
then
logging "failed (smbstatus command does not exist)"
exit 1
fi
# create temporary directory
mkdir -p ${TARGET_DIR}
if [ $? -ne 0 ]
then
logging "failed (${TARGET_DIR} cannot be created)"
exit 1
fi
# get pid of target samba session
get_session_pid
# target session may already be disconnected, so do nothing
if [ ${targetpid} -eq -1 ]
then
logging "succeeded (target samba process does not exist)"
exit 0
fi
# create temporary file for saving samba processes before restart
touch ${BEFORE_PROC_FILE}
if [ $? -ne 0 ]
then
logging "failed (${BEFORE_PROC_FILE} cannot be created)"
exit 1
fi
# save samba processes before restart
get_ps_info ${BEFORE_PROC_FILE}
# restart samba service
logging "begin to restart samba service"
service smb restart
if [ $? -ne 0 ]
then
logging "failed (smbd cannot be restarted.)"
exit 1
fi
service nmb restart
if [ $? -ne 0 ]
then
logging "ignored (nmbd cannot be restarted)"
fi
# create temporary file for saving samba processes after restart
touch ${AFTER_PROC_FILE}
if [ $? -ne 0 ]
then
logging "failed (${AFTER_PROC_FILE} cannot be created)"
exit 1
fi
# save samba processes after restart
get_ps_info ${AFTER_PROC_FILE}
# check existence of remaining samba process
while read bline
do
bproc_pid=`echo ${bline} | cut -d ' ' -f 2`
bproc_stime=`echo ${bline} | cut -d ' ' -f 5`
while read aline
do
aproc_pid=`echo ${aline} | cut -d ' ' -f 2`
aproc_ppid=`echo ${aline} | cut -d ' ' -f 3`
aproc_stime=`echo ${aline} | cut -d ' ' -f 5`
if [ ${bproc_pid} -eq ${aproc_pid} -a \
"${bproc_stime}" = "${aproc_stime}" -a \
${aproc_ppid} -eq 1 ]
then
# remaining samba process exist
# try to kill remaining samba process
remain=${TRYCNT_KILLPROC}
while [ ${remain} -gt 0 ]
do
kill -KILL ${bproc_pid}
ps -ef | grep "${aproc_pid}" | grep "${aproc_ppid}" | grep"${aproc_stime}" >/dev/null 2>&1
if [ $? -ne 0 ]
then
logging "killed (PID=${aproc_pid} PPID=${aproc_ppid} STIME=${aproc_stime})"
break
fi
sleep ${TRYINT_KILLPROC}
remain=`expr ${remain} - 1`
done
if [ ${remain} -le 0 ]
then
rm -f ${BEFORE_PROC_FILE}
rm -f ${AFTER_PROC_FILE}
logging "failed (remaining process cannot be killed)"
exit 1
fi
fi
done < ${AFTER_PROC_FILE}
done < ${BEFORE_PROC_FILE}
rm -f ${BEFORE_PROC_FILE}
rm -f ${AFTER_PROC_FILE}
logging "succeeded (samba service was restarted)"
exit 0
今回は、前回作ったリソースグループに汎用リソースを追加するので、「運用管理」画面から該当のリソースグループを選択し、「設定変更」ボタンを押します。
「リソースを追加」ボタンから「汎用リソース」を選択します。
追加された汎用リソースのアイコンを選択し、「リソース固定設定」の「停止スクリプト」に上記のサンプルスクリプトを貼り付けます。
「ファイル共有リソース(Samba)」のアイコンを選択し、右上の「詳細設定を表示」チェックボックスをオンにします。
「監視設定」タブを開き、「監視リトライ回数」の項目を1以上に設定します。
最後に、前回設定しなかった依存関係の設定を追加します。
動作確認
動作確認ですが、Windowsサーバから共有フォルダを開いて、そのままフェイルオーバーさせてみたいと思います。
まず、Windowsサーバで共有フォルダを開きます。
次に、クラスタをフェイルオーバーさせます。
無事にセッションも切られ、別のノードにフェイルオーバーができました。
さいごに
いかがでしたでしょうか?
前回の記事で足りなった部分を補ってみました。これで本当に完成です!
ではまたー。