UMGUM.COM (лучше) 

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

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

OS: Debian Linux.

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

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

Думаю, что, раз уж мы ранее использовали принцип ручного формирования списка обслуживаемых устройств, его можно применить и в этом случае. Необходимо иметь в виду то, что публиковать можно не только рассмотренные ранее DRBD устройства, но и любые произвольные блочные устройства, так что отдельный список совсем не лишний. На стороне отдающей создаем файл списка блочных устройств, предназначенных для публикации:

# mkdir -p /etc/custom/hdd/vblade
# touch /etc/custom/hdd/vblade/list

Наименования устройств вносим с разделителем в виде пробельного символа. К имени публикуемого устройства добавляем через разделитель в виде "слэша" присвоенный ему нами индекс ("номер шасси или компьютера"."номер слота или интерфейса диска") для опознания его в сети:


# cat /etc/custom/hdd/vblade/list

drbd0/0.0 drbd1/0.1 drbd2/0.2 ... drbdX/0.X

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

# 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"
OBJECTS=`cat /etc/custom/hdd/vblade/list`
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL=`cat /etc/custom/hdd/email`
mkdir -p /tmp/custom/vblade
# Поднимаем флаг обнаружения ошибок при отработке скрипта
FLAG="1"

# Устанавливаем флаг блокировки на время работы скрипта
echo "0" > /tmp/custom/vblade/flag

# Проверяем, не установлен ли флаг блокировки от более низкого уровня схемы
if [ "`cat /tmp/custom/drbd/flag`" != "1" ]
then
  exit 0
fi

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
}

# Перебираем в цикле все наши публикуемые (экспортируемые) блочные устройства
for OBJECTIVE in $OBJECTS
do
  # Получаем в переменные имя устройства и назначенный ему индекс
  OBJECT=`echo $OBJECTIVE | awk -F / '{print $1}'`
  INDEX=`echo $OBJECTIVE | awk -F / '{print $2}'`
  INDEXF=`echo $INDEX | awk -F . '{print $1}'`
  INDEXS=`echo $INDEX | awk -F . '{print $2}'`

  # Проверяем наличие публикуемого блочного устройства
  if [ "`ls -l /dev/ | grep -i brw | grep -i $OBJECT`" != "" ]
  then
    # Проверяем, опубликовано ли блочное устройство
    if [ "`ps wax | grep -i vblade | grep -i $INDEXF | grep -i $INDEXS | grep -i $INTERFACE | grep -i /dev/$OBJECT`" = "" ]
    then
      # Публикуем устройство, если оно доступно и не занято
      if [ "`mount | grep -i $OBJECT`" = "" ]
      then
        echo "Waiting 10 seconds for correct publication /dev/$OBJECT as AoE resource e$INDEXF.$INDEXS..."
        vblade $INDEXF $INDEXS $INTERFACE /dev/$OBJECT &
        sleep 10
        # Проверяем успешность публикации
        if [ "`ps wax | grep -i vblade | grep -i $INDEXF | grep -i $INDEXS | grep -i $INTERFACE | grep -i /dev/$OBJECT`" = "" ]
        then
          # Устанавливаем флаг обнаружения ошибки
          FLAG="0"
          # Огорчаемся неудаче
          send-report $OBJECT "Panic! Блочное устройство не было опубликовано или опубликовано некорректно."
          echo >&2 "Panic! Блочное устройство /dev/$OBJECT не было опубликовано или опубликовано некорректно."
        fi
      else
        # Устанавливаем флаг обнаружения ошибки
        FLAG="0"
        # Паникуем по поводу занятости устройства
        send-report $OBJECT "Panic! Блочное устройство занято иным процессом и не может быть опубликовано."
        echo >&2 "Panic! Блочное устройство /dev/$OBJECT занято иным процессом и не может быть опубликовано."
      fi
    fi
  else
    # Устанавливаем флаг обнаружения ошибки
    FLAG="0"
    # Паникуем по поводу отсутствия публикуемого устройства
    send-report $OBJECT "Panic! Блочное устройство, предназначенное для публикации, не обнаружено."
    echo >&2 "Panic! Блочное устройство /dev/$OBJECT, предназначенное для публикации, не обнаружено."
  fi
done

# Снимаем флаг блокировки если не было обнаружено ни одной ошибки
if [ "$FLAG" = "1" ]
then
  echo "1" > /tmp/custom/vblade/flag
fi

exit 0

На стороне принимающей опубликованные (экспортированные) блочные устройства так же составляем статичный список:

# mkdir -p /etc/custom/hdd/aoe
# touch /etc/custom/hdd/aoe/list

С учётом того, что принимающая сторона может проанализировать только присвоенный устройству индекс ("номер шасси или компьютера"."номер слота или интерфейса диска") - указываем только его в качестве наименования:

# cat /etc/custom/hdd/aoe/list

0.0 0.1 0.2 ... 0.X

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

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

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
OBJECTS=`cat /etc/custom/hdd/aoe/list`
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL=`cat /etc/custom/hdd/email`
mkdir -p /tmp/custom/aoe
# Поднимаем флаг обнаружения ошибок при отработке скрипта
FLAG="1"

# Устанавливаем флаг блокировки на время работы скрипта
echo "0" > /tmp/custom/aoe/flag

# Проверяем факт запуска AoE по созданным им конструкциям
if [ ! -e /dev/etherd/discover ]
then
  # Загружаем модуль AoE, если этого не было сделано ранее
  echo "Waiting 10 seconds for correct load module AoE..."
  modprobe aoe
  aoe-discover
  sleep 10
  if [ ! -e /dev/etherd/discover ]
  then
    # Устанавливаем флаг обнаружения ошибки
    FLAG="0"
    echo >&2 "Warning! AoE не работает или работает некорректно."
    exit 1
  fi
fi

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
}

# Перебираем в цикле все импортируемые блочные устройства
for OBJECTIVE in $OBJECTS
do
  # Получаем в переменные назначенный устройству индекс
  INDEXF=`echo $OBJECTIVE | awk -F . '{print $1}'`
  INDEXS=`echo $OBJECTIVE | awk -F . '{print $2}'`

  # Проверяем, опубликовано ли блочное устройство
  aoe-discover
  if [ "`aoe-stat | grep e$INDEXF.$INDEXS | grep up`" != "" ]
  then
    # Проверяем, доступно ли блочное устройство
    if [ "`aoeping -v -s 5 0 0 eth0 | grep -i alarm`" != "" ]
    then
      # Устанавливаем флаг обнаружения ошибки
      FLAG="0"
      # Паникуем по поводу недоступности импортируемого устройства
      send-report /dev/etherd/e$INDEXF.$INDEXS "Panic! Импортируемое блочное устройство обнаружено, но не доступно."
      echo >&2 "Panic! Импортируемое блочное устройство /dev/etherd/e$INDEXF.$INDEXS обнаружено, но не доступно."
    fi
  else
    # Устанавливаем флаг обнаружения ошибки
    FLAG="0"
    # Паникуем по поводу отсутствия импортируемого устройства
    send-report /dev/etherd/e$INDEXF.$INDEXS "Panic! Импортируемое блочное устройство не обнаружено или недоступно."
    echo >&2 "Panic! Импортируемое блочное устройство /dev/etherd/e$INDEXF.$INDEXS не обнаружено или недоступно."
  fi
done

# Снимаем флаг блокировки если не было обнаружено ни одной ошибки
if [ "$FLAG" = "1" ]
then
  echo "1" > /tmp/custom/aoe/flag
else
  # В связи с обнаруженной ошибкой завершаем работу приложений, использующих эти устройства
  /etc/init.d/application stop
  # Для пущей уверенности в том, что все "хвосты" будут удалены, выгружаем модуль AoE
  rmmod -f aoe
fi

exit 0

После отработки публикующего (экспортирующего) скрипта в директориях "/dev/etherd/" всех компьютеров в одном сегменте сети Ethernet с запущенным AoE можно будет обнаружить ссылки на автоматически обнаруженные блочные устройства AoE, например:

# ls -l /dev/etherd/ | grep b

....
brw-r

1 root disk 152, 16 2010-05-31 17:25 e0.1
brw-r

1 root disk 152, 48 2010-05-31 17:25 e0.3
....

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

# cat /etc/crontab

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


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


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