[CLUSTERPRO]HAクラスタのファイルサーバを構築してみた。(汎用リソース追加)
こんにちは、秋晴れって素晴らしいですね。城内です。
引き続きクラプロネタです。
今回は、前回構築した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サーバで共有フォルダを開きます。
次に、クラスタをフェイルオーバーさせます。
無事にセッションも切られ、別のノードにフェイルオーバーができました。
さいごに
いかがでしたでしょうか?
前回の記事で足りなった部分を補ってみました。これで本当に完成です!
ではまたー。