[CLUSTERPRO]HAクラスタのファイルサーバを構築してみた。(汎用リソース追加)

2016.10.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、秋晴れって素晴らしいですね。城内です。

引き続きクラプロネタです。
今回は、前回構築したHAクラスタのファイルサーバで、必要なリソースグループが一つ欠けていたようなので、補足記事になります。

はじめに

まずは、いままでの記事の紹介です。

また、インストーラやドキュメントは以下のサイトから取得できます。

今回の内容は、製品連携HAクラスター構築ガイドにドキュメントがあるので、そちらも参照してみてください。

全体構成

構成は、前回に引き続き以下のような構成です。

arch-01

セットアップ

では、さっそく設定していきますが、まず、前回の記事は以下になります。

次に、参照するドキュメントは以下になります。

前回足りなかったのは、汎用リソースでセッション切断の処理を設定することです。
今回はそこを補足していこうと思います。

ちなみに、ノード監視の設定は不要でした。
リソースグループのファイル共有リソース(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

今回は、前回作ったリソースグループに汎用リソースを追加するので、「運用管理」画面から該当のリソースグループを選択し、「設定変更」ボタンを押します。

clp-01

「リソースを追加」ボタンから「汎用リソース」を選択します。

clp-02

追加された汎用リソースのアイコンを選択し、「リソース固定設定」の「停止スクリプト」に上記のサンプルスクリプトを貼り付けます。

clp-03

「ファイル共有リソース(Samba)」のアイコンを選択し、右上の「詳細設定を表示」チェックボックスをオンにします。
「監視設定」タブを開き、「監視リトライ回数」の項目を1以上に設定します。

clp-04

最後に、前回設定しなかった依存関係の設定を追加します。

clp-05

clp-06

clp-07

clp-08

動作確認

動作確認ですが、Windowsサーバから共有フォルダを開いて、そのままフェイルオーバーさせてみたいと思います。

まず、Windowsサーバで共有フォルダを開きます。

clp-09

次に、クラスタをフェイルオーバーさせます。

clp-09

無事にセッションも切られ、別のノードにフェイルオーバーができました。

clp-102

さいごに

いかがでしたでしょうか?
前回の記事で足りなった部分を補ってみました。これで本当に完成です!

ではまたー。