Rsync 증분 백업은 여전히 ​​모든 파일을 복사합니다.

Rsync 증분 백업은 여전히 ​​모든 파일을 복사합니다.

현재 rsync용 bash 스크립트를 작성 중입니다. 나는 내가 뭔가 잘못하고 있다고 확신합니다. 그러나 나는 그것이 무엇인지 말할 수 없습니다. 나는 모든 것을 자세히 설명하고 누군가가 나를 도울 수 있기를 바랍니다.

스크립트의 목표는 전체 및 증분 백업에 rsync를 사용하는 것입니다. 한 가지 중요한 점을 제외하고는 모든 것이 잘 작동하는 것 같았습니다. 해당 --link-dest매개변수를 사용하더라도 여전히 모든 파일을 복사하는 것처럼 보입니다 . 파일 크기를 확인해 봤습니다 du -chs.

먼저 이것은 내 스크립트입니다.

#!/bin/sh
while getopts m:p: flags
do
  case "$flags" in
    m) mode=${OPTARG};;
    p) prev=${OPTARG};;
    *) echo "usage: $0 [-m] [-p]" >&2
       exit 1 ;;
  esac
done

date="$(date '+%Y-%m-%d')";


#Create Folders If They Do Not Exist (-p paramter)
mkdir -p /Backups/Full && mkdir -p /Backups/Inc

FullBackup() {
  #Backup Content Of Website
  mkdir -p /Backups/Full/$date/Web/html
  rsync -av user@IP:/var/www/html/ /Backups/Full/$date/Web/html/

  #Backup All Config Files NEEDED. Saving Storage Is Key ;)
  mkdir -p /Backups/Full/$date/Web/etc
  rsync -av user@IP:/etc/apache2/ /Backups/Full/$date/Web/etc/

  #Backup Fileserver
  mkdir -p /Backups/Full/$date/Fileserver
  rsync -av user@IP:/srv/samba/private/ /Backups/Full/$date/Fileserver/

  #Backup MongoDB
  ssh user@IP /usr/bin/mongodump --out /home/DB
  rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
  ssh user@IP rm -rf /home/DB
}

IncrementalBackup(){
  Method="";
  if [ "$prev" == "full" ]
  then
    Method="Full";
  elif [ "$prev" == "inc" ]
  then
    Method="Inc";
  fi

  if [ -z "$prev" ]
  then
  echo "-p Parameter Empty";
  else
  #Get Latest Folder - Ignore the hacky method, it works.
  cd /Backups/$Method
  NewestBackup=$(find . ! -path . -type d | sort -nr | head -1 | sed s@^./@@)
  IFS='/'
  read -a strarr <<< "$NewestBackup"
  Latest_Backup="${strarr[0]}";
  cd /Backups/

  #Incremental-Backup Content Of Website
  mkdir -p /Backups/Inc/$date/Web/html
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/html/ user@IP:/var/www/html/ /Backups/Inc/$date/Web/html/

  #Incremental-Backup All Config Files NEEDED
  mkdir -p /Backups/Inc/$date/Web/etc
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/etc/ user@IP:/etc/apache2/ /Backups/Inc/$date/Web/etc/

  #Incremental-Backup Fileserver
  mkdir -p /Backups/Inc/$date/Fileserver
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Fileserver/ user@IP:/srv/samba/private/ /Backups/Inc/$date/Fileserver/

  #Backup MongoDB
  ssh user@IP /usr/bin/mongodump --out /home/DB
  rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
  ssh user@IP rm -rf /home/DB
  fi
}

if [ "$mode" == "full" ]
then
  FullBackup;
elif [ "$mode" == "inc" ]
then
  IncrementalBackup;
fi

내가 사용한 명령: 전체 백업 bash script.sh -m full

증가 bash script.sh -m inc -p full

스크립트를 실행하면 전혀 오류가 발생하지 않습니다. 위에서 언급했듯이 여전히 모든 파일을 복사하는 것 같습니다. 제가 수행한 몇 가지 테스트는 다음과 같습니다.

du -chs의 출력

root@Backup:/Backups# du -chs /Backups/Full/2021-11-20/*
36K     /Backups/Full/2021-11-20/DB
6.5M    /Backups/Full/2021-11-20/Fileserver
696K    /Backups/Full/2021-11-20/Web
7.2M    total
root@Backup:/Backups# du -chs /Backups/Inc/2021-11-20/*
36K     /Backups/Inc/2021-11-20/DB
6.5M    /Backups/Inc/2021-11-20/Fileserver
696K    /Backups/Inc/2021-11-20/Web
7.2M    total

ls -li의 출력

root@Backup:/Backups# ls -li /Backups/Full/2021-11-20/
total 12
1290476 drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
1290445 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290246 drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web
root@Backup:/Backups# ls -li /Backups/Inc/2021-11-20/
total 12
1290506 drwxr-xr-x 4 root root 4096 Nov 20 19:28 DB
1290496 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290486 drwxr-xr-x 4 root root 4096 Nov 20 19:28 Web

증분 백업을 수행하고 파일을 변경/추가할 때 Rsync 출력

receiving incremental file list
./
lol.html

sent 53 bytes  received 194 bytes  164.67 bytes/sec
total size is 606  speedup is 2.45
receiving incremental file list
./

sent 33 bytes  received 5,468 bytes  11,002.00 bytes/sec
total size is 93,851  speedup is 17.06
receiving incremental file list
./

sent 36 bytes  received 1,105 bytes  760.67 bytes/sec
total size is 6,688,227  speedup is 5,861.72
*Irrelevant MongoDB Dump Text*

sent 146 bytes  received 2,671 bytes  1,878.00 bytes/sec
total size is 2,163  speedup is 0.77

나는 이것이 ./그것과 관련이 있다고 의심합니다. 제가 틀렸을 수도 있지만 의심스러워 보입니다. 같은 명령을 다시 실행하면 ./로그에는 남지 않지만, 같은 날 실행한 탓인지 /Backup/Inc/2021-11-20폴더에 덮어씌워졌습니다.

ls -l의 출력

root@Backup:/Backups# ls -l /Backups/Inc/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:49 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:49 Web
root@Backup:/Backups# ls -l /Backups/Full/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web

편집자 코멘트:

root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Full/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 19:49:31.701680076 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:17.586745740 +0000 ..
-rw-r--r-- 2 root root  158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root   34 2021-11-20 19:49:31.701680076 +0000 lol.html
-rw-r--r-- 2 root root  414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css
root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Inc/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 23:16:47.673977833 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:54.903294115 +0000 ..
-rw-r--r-- 2 root root  158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root   44 2021-11-20 23:16:47.673977833 +0000 lol.html
-rw-r--r-- 2 root root  414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css

자세한 내용은 알려주시기 바랍니다. 나는 오랫동안 노력해 왔습니다. 어쩌면 링크를 만들고 디스크 공간을 절약하는 것이 틀렸을 수도 있습니다.

답변1

링크된 파일이 파일 시스템의 두 위치에 존재하기 때문에 혼란이 발생합니다. 사용된 디스크 보기를 사용하면 du파일이 두 트리 모두에 위치하므로 각 호출에서 du모든 파일을 찾습니다. 상위 결과를 합산하고 파일이 원하는 것보다 두 배의 공간을 차지한다는 결론을 내렸습니다. 즉, 하드 링크가 작동하지 않습니다.

오류는 최고 디스크 사용량 결과를 합산하는 데 있습니다. 대신, du두 백업 트리를 모두 포함하는 단일 트리를 실행해 보십시오. du파일은 검색 횟수에 관계없이 한 번만 계산되므로 디스크 절약 효과가 나타나기 시작합니다 .

다음은 실제 예입니다.

mkdir /tmp/a                       # Working directories
cp -a /etc/* /tmp/a 2>/dev/null    # Generate some data in /tmp/a
cp -al /tmp/a /tmp/b               # Link it into /tmp/b

이제 각 트리에서 사용되는 디스크의 양을 측정해 보겠습니다. 모든 파일이 링크되어 있으므로 동일해야 합니다. ( ls -l모든 파일의 링크 수를 보면 이를 확인할 수 있습니다 .)

du -ms /tmp/a                      # Disk usage summary
8       /tmp/a                     # Result

du -ms /tmp/b                      # Disk usage summary
8       /tmp/b                     # Result

여기서 두 디렉터리 트리 모두 약 8MB를 사용하는 것으로 나타납니다. 이제 이 두 트리를 함께 살펴보겠습니다.

du -ms /tmp/a /tmp/b               # Disk usage summaries
8       /tmp/a
1       /tmp/b

/tmp/a여전히 8MB 정도가 사용되는 것을 볼 수 있는데 , /tmp/b이제는 8MB 대신 1MB만 추가로 사용됩니다. 이는 다른 파일이 이미 고려되었기 때문에 추가 디스크 공간을 차지하지 않기 때문입니다. (디렉토리 구조가 추가 공간을 차지합니다.)

데이터 세트가 클수록 비율은 더 좋아집니다. 아래는 내 작은 시스템 중 하나에서 가져온 백업 조각으로 rsnapshot, 이러한 백업 사이 24시간 동안 1GB 미만의 백업이 발생하는 것을 보여줍니다.

du -ms daily.{0,1}
30752   daily.0
782     daily.1

관련 정보