UMGUM.COM (лучше) 

Автоматизация AoE-экспорта ( Контроль за экспортом блочных устройств файловой системы. )

1 августа 2010  (обновлено 2 ноября 2014)

OS: Linux Debian Lenny/Squeeze.

Аналогично тому, как мы автоматизировали процесс проверки состояния DRBD устройств, организуем публикацию AOE устройств.

Учитывая то, что публиковать мы должны только устройства корректно работающие и доступные для чтения и записи, необходимо в обязательном порядке удостоверяться в их удовлетворительном статусе, что мы будем делать с помощью утилит DRBD.

Раз уж мы ранее использовали принцип ручного формирования списка обслуживаемых DRBD устройств, то его и будем использовать в качестве перечня публикуемых блочных устройств.

Создадим скрипт проверяющие состояние DRBD устройств с определённой периодичностью на стороне отдающей, в течении работы, публикующий устройства и информирующего администратора об обнаруженных проблемах:


# touch /etc/custom/hdd/vblade/check-vblade.sh && chmod ugo+x /etc/custom/hdd/vblade/check-vblade.sh

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
# INTERFACE="eth0"
INTERFACE="bond0"
OBJECTS=`cat /etc/custom/hdd/drbd/list`
# Определяем исходные параметры для формирования индекса публикуемого блочного устройства (RACK - условный номер компьютера в списке задействованных в схеме, а SLOT - условный номер (начинается с нуля) диска в списке публикуемых с этого компьютера)
RACK="0"
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL=`cat /etc/custom/hdd/email`
mkdir -p /tmp/custom/vblade

# Определяем функцию уведомления администратора о нештатном развитии ситуации
function send-report() {
  local LOCAL_OBJECT=$1
  local LOCAL_REPORT=$2
  # Посылаем электронное письмо с уведомлением о проблеме
  echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Warning AoE: ${HOSTNAME}: /dev/${LOCAL_OBJECT}\n${DATE}.\nHost: ${HOSTNAME}.\nDevice: /dev/${LOCAL_OBJECT}.\n${LOCAL_REPORT}" | sendmail -F${HOSTNAME} ${EMAIL}
}

# Проверяем, не установлены ли флаги блокировки от текущего уровня схемы
if [ -e /tmp/custom/vblade/lock ]
then
  exit 0
fi

# Устанавливаем флаг блокировки на время работы скрипта
touch /tmp/custom/vblade/lock

# Перебираем в цикле все наши публикуемые (экспортируемые) блочные устройства
for OBJECTIVE in ${OBJECTS}
do

  # Получаем в переменную имя устройства
  OBJECT=`echo ${OBJECTIVE} | awk -F / '{print $1}'`

  # Применяем к переменной условный индекс "SLOT", исходя из именования DRBD-устройства (пример: "drdb0" => "0")
  SLOT=`echo "${OBJECT}" | cut -c 5-`

  # Проверяем наличие публикуемого блочного устройства
  if [ "`ls -l /dev/ | grep -i brw | grep -i ${OBJECT}`" != "" ]
  then

    # Проверяем, доступно ли DRBD устройство для полноценного использования локально
    if [ "`drbdadm dstate ${OBJECT} 2>/dev/null | awk -F / '{print $1}'`" = "UpToDate" ]
    then

      # Выясняем, какая в действительности роль назначена локальному устройству
      ROLE="`drbdadm state ${OBJECT} | awk -F / '{print $1}' | tr A-Z a-z`"

      if [ ${ROLE} = "primary" ]
      then

        # Проверяем, опубликовано ли блочное устройство
        if [ "`ps wax | grep -i vblade | grep -i ${RACK} | grep -i ${SLOT} | grep -i ${INTERFACE} | grep -i /dev/${OBJECT}`" = "" ]
        then

          # Публикуем AoE устройство
          echo "Waiting 10 seconds for correct publication /dev/${OBJECT} as AoE resource e${RACK}.${SLOT}..."
          vblade ${RACK} ${SLOT} ${INTERFACE} /dev/${OBJECT} &
          sleep 10

          # Проверяем успешность публикации
          if [ "`ps wax | grep -i vblade | grep -i ${RACK} | grep -i ${SLOT} | grep -i ${INTERFACE} | grep -i /dev/${OBJECT}`" = "" ]
          then
            # Огорчаемся неудаче
            send-report ${OBJECT} "Panic! Блочное устройство не было опубликовано или опубликовано некорректно."
            echo >&2 "Panic! Блочное устройство /dev/${OBJECT} не было опубликовано или опубликовано некорректно."
          fi

        fi

      else

        # Проверяем, не опубликовано ли блочное устройство
        PID="`ps wax | grep -i vblade | grep -i /dev/${OBJECT} | awk '{print $1}'`"
        if [ "${PID}" != "" ]
        then

          # Останавливаем публикацию блочного устройства, сменившего статус на secondary
          kill -KILL `echo ${PID}`

        fi

      fi

    fi

  fi

done

# Удаляем флаг блокировки во время исполнения
rm --force /tmp/custom/vblade/lock

exit 0

Понятно, что вышеприведённый скрипт будут публиковать устройства так редко, как будет перезапускаться операционная система или будут вводиться в строй новые диски, все остальные периодические запуски будут лишь проверять изменения состояния. Размещаем команды запуска скриптов в таблице /etc/crontab:

# vi /etc/crontab

....
*/15  * * * *  root  /etc/custom/hdd/vblade/check-vblade.sh &
....


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )