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

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

Imgur график средней нагрузки

Как только ресурс снова становится доступным, нагрузка падает.

До этого я не могу убить процесс, который вызывает загрузку. Это просто не уйдет.

Это очень раздражает.

Как я могу предотвратить это? Можно ли как-то интегрировать таймаут или что-то?

Вот скрипт, который запускается каждую ночь через cron:

#!/bin/sh
REPOSITORY=/media/offsiteserver_netbackup/system.attic  #no backslash at the end of this
NFSMOUNT=/media/offsiteserver_netbackup  #no backslash at the end of this
NFSDIR="192.168.178.2:disk2/netbackup"

export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games

###############start of script#################   
#exec >> $LOGFILE 2>&1

#simple function that just prints the time and the info you pass to it
echotime () {
  echo "`date +%Y-%m-%d--%H:%M:%S` ----$1---"
}

# simple function to check if openvpn is connected (1 means NOT CONNECTED)
checkvpn () {
  if ping 192.168.178.2 -c 1 &> /dev/null; then
      echotime "VPN connected"
      return 1
  else
      echotime "VPN not connected"
      return 0
  fi
}  

# simple function to check if nfs is mounted (1 means NOT MOUNTED)
checkmount () {
  #http://stackoverflow.com/a/14698865
  #http://stackoverflow.com/a/9422947
  if mount | grep $NFSMOUNT > /dev/null; then
      echotime "NFS mounted"
      return 1
  else
      echotime "NFS not mounted"
      return 0
  fi
}

echotime "Script Start"

# restart vpn if not connected
if checkvpn; then
  echotime "VPN not connected, attepting to connect"
  /etc/init.d/openvpn restart
  sleep 5
  #check again if its connected
  if checkvpn; then
     echotime "ERROR: VPN still not connected, exiting \n"
     exit 1
  fi
fi

# mount nfs if not mounted
# if your not using NFS, you can delete this section all together
if checkmount; then
  echotime "NFS not mounted, attepting to mount"
  mount -v $NFSDIR $NFSMOUNT -o nolock
  #check again if its mounted
  if checkmount; then
     echotime "ERROR: NFS still not mounted, exiting \n"
     exit 1
  fi
fi

# Backup all of / except a few excluded directories
# if your running into issues, add -v after create for verbose mode
# the below / means backup all of root.
echotime "ATTIC CREATE"
attic create --stats                            \
    $REPOSITORY::host.stscode-`date +%Y-%m-%d--%H:%M:%S`  \
    /                                           \
    --exclude /sys                              \
    --exclude /mnt                              \
    --exclude /dev                              \
    --exclude /media                            \
    --exclude /lost+found                       \
    --exclude /proc                             \
    --exclude /run

# Use the `prune` subcommand to maintain 7 daily, 4 weekly
# and 6 monthly archives.
echotime "ATTIC PRUNE"
attic prune -v $REPOSITORY --keep-hourly=23 --keep-daily=7 --keep-weekly=2 --keep-monthly=2

#unmount the NFS folder, I do this b/c
#   if it stays mounted, sometimes servers freak
#   out when rebooting.
# Uncomment the below 2 lines if you need to unmount every time.
echotime "UNMOUNT"
umount -v $NFSMOUNT

# end of script
echotime "End of Script"

Или, может быть, НФС не путь сюда?

Я благодарен за любые подсказки о том, как я могу улучшить эту процедуру и сделать ее более стабильной.

2 ответа2

0

Это "особенность" NFS. Когда соединение потеряно, оно будет пытаться бесконечно восстановить соединение, и, если оно сможет, обычно довольно хорошо выбирает, где оно остановилось, как будто ничего не произошло. Однако это может быть невероятно раздражающим. Единственный способ избежать этого - не использовать NFS. Если вас не волнует производительность (или атрибуты файлов UNIX), вы можете использовать CIFS/SMB. rsync также может быть вариантом, хотя он может не очень хорошо работать на attic .

0

Тривиальным решением было бы запустить чердак как подпроцесс и прервать его, если это займет слишком много времени. Некоторые предложения сделать это в этом посте

Если прерывание не работает (как вы упомянули в своем вопросе), вы все равно можете запустить его как дочерний процесс, и у вашего основного приложения будет NFS-монитор.
Если NFS перестает работать, вы можете перезапустить или перемонтировать его. (У вас есть код для мониторинга и перезапуска уже в вашем скрипте.)

Если вам повезет, ваш процесс продолжится после перезапуска NFS.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .