VPS가 4개 있다고 가정해 보겠습니다. 각각에서 다음 cron 명령은 로컬 백업을 위해 일주일에 한 번 실행됩니다.
0 0 * * 6 zip -r /root/backups/dirs/html-$(date +\%F-\%T-).zip /var/www/html
1 0 * * 6 find /root/backups/dirs/* -mtime +30 -exec rm {} \;
0 0 * * 6 mysqldump -u root -pPASSWORD --all-databases > /root/backups/db/db-$(date +\%F-\%T-).sql
1 8 * * 6 find /root/backups/db/* -mtime +30 -exec rm {} \;
(4개의 VPS 각각에서) 각 로컬 백업의 사본을 다음으로 보내고 싶습니다.다섯 번째 VPS, 중앙 백업 환경으로 사용하겠습니다. 전송은 가능한 한 안전해야 합니다(합리적인 범위 내에서).
rsync를 사용하여 이 작업을 자동으로(일정에 따라) 어떻게 수행할 수 있나요?
(아니면 SCP일까요?)
답변1
각 백업이 파일이라고 가정하면(위의 두 파일을 아카이브하여),SCP와 비교될 것이다동기화파일을 전송하는 것 외에 전반적으로 작업량이 적기 때문입니다.
자동화가 진행되는 한 다음과 같이 설정해야 합니다.
- 다섯 번째 VPS는 백업을 읽을 수 있는 사용자로서 비밀번호 없이 다른 4개의 VPS에 연결할 수 있습니다(관리하기는 약간 쉽지만 코딩하기는 더 어렵습니다).
- 다른 4개의 VPS는 비밀번호 없이 다섯 번째 VPS에 연결할 수 있으며, 각각에 대해 별도의 계정을 사용하는 것이 좋습니다(관리하기는 약간 더 어렵지만 코딩하기는 더 쉽습니다).
둘 다 선호하는 방법은 일반적으로 암호화되지 않은 SSH 키입니다. 완료되면 크론 작업(1의 경우 5번째 VPS, 2의 경우 다른 4개의 VPS)을 설정하여 최신 백업을 원하는 위치로 전송할 수 있습니다.
다음은 디렉터리의 최신 파일을 원격 시스템에 복사하는 두 번째 옵션에 대한 빠르고 더러운 셸 스크립트입니다.
#!/bin/bash
file=`ls -t "${1}" | head -n 1`
scp -pCB "${1}"/"${file}" ${2}
백업이 저장된 디렉터리 경로를 첫 번째 매개변수로 지정하고 user@host:/path
다섯 번째 VPS의 위치를 가리키는 문자열을 두 번째 매개변수로 사용하여 이 명령을 실행하면 로컬 시스템의 최신 백업이 다섯 번째 VPS로 복사됩니다.
-p
SCP 옵션은 mtime을 보존하고(동일한 명령을 사용하여 find
이전 백업을 축소할 수 있음) -C
압축을 활성화하며(성능이 향상되거나 향상되지 않을 수 있음) -B
아무 메시지도 표시되지 않도록 합니다.
답변2
이 단계에서 각 클라이언트 VPS에 대해 별도의 사용자를 만듭니다. 반드시 필요한 것은 아니지만 VPS가 손상된 경우 다른 시스템에서 백업을 읽거나 쓸 수 없도록 하고 싶습니다.
계정이 있다고 가정하면VPN1 VPN 2, 백업 서버 VPS에서.
SSH를 통해 백업 서버 VPS에 액세스하기 위해 비밀번호 대신 인증서를 사용하도록 각 VPS를 설정합니다.
- 사용자를 만듭니다(예: "백업")(꼭 필요한 것은 아님).
ssh-keygen
각 VPS에서 사용자 "백업"을 위한 SSH 키 세트를 만듭니다.- 각 VPS 계정
~/backup/.ssh/id_rsa.pub
에 콘텐츠를 연결합니다 .~/<vps-user>/.ssh/authorized_keys
이 사용자만 읽을 수 있는지 확인하세요(chmod 600 ~<vps-user>/.ssh/authorized_keys
)
이제 각 VPS에서 "백업" 계정에서 백업 서버 vps 계정으로 SSH를 통해 연결할 수 있습니다.
각 클라이언트 머신에 대해 VPS 서버 머신에 백업을 기록할 디렉터리를 생성하고 해당 클라이언트의 VPS 계정에서만 사용할 수 있도록 합니다. 예:
mkdir /var/spool/big-backups/vps1; chown vps1 /var/spool/big-backups/vps1; chmod 600 /var/spool/big-backups/vps1;
각 vps에서 사용자 "백업"을 위한 cronjob을 생성합니다
rsync -avz /root/backups/db/ -e "ssh -l vps1" /root/backups/ /var/spool/big-backups/vps1/"
. 분명히 클라이언트 VPS 시스템에서 로컬 백업 작업 후에 이를 예약하십시오. (z
파일이 이미 압축되어 있고 데이터베이스 백업이 예제에 없으면 rsync의 플래그는 바람직하지 않습니다...)
원한다면 scp
대신 사용할 수 있습니다 rsync
(왜 그렇게 하는지는 모르겠지만 모두 작동합니다).