55GB의 이미지를 새로운 서버로 전송하는 가장 빠른 방법


64

현재 두 개의 CentOS 서버가 있습니다. 이미지 디렉토리와 SCP를 "타르"하는 방법과 가장 빠른 방법을 알아야합니까?

tarring이 영원히 걸리기 때문에 방금 제안한 가장 빠른 방법입니까? 나는 명령을 실행했습니다.

tar cvf imagesbackup.tar images

그리고 나는 그것을 그냥 scp하려고했습니다.

더 빠른 방법이 있는지 알려주세요. 두 컴퓨터 모두에 원격 / SSH 액세스 권한이 있습니다.


12
체크를하면서?
닉 T

답변:


98

tar를 사용하여 로컬 디스크에 쓰는 대신 ssh를 사용하여 네트워크를 통해 원격 서버에 직접 쓸 수 있습니다.

server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"

"ssh"명령 뒤에 오는 문자열은 대화 형 로그온 대신 원격 서버에서 실행됩니다. 로컬 인 것처럼 SSH를 통해 해당 원격 명령과 입출력을 파이프 할 수 있습니다. 명령을 따옴표로 묶으면 특히 리디렉션을 사용할 때 혼동을 피할 수 있습니다.

또는 다른 서버에서 tar 파일을 직접 추출 할 수 있습니다.

server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"

거의 사용하지 않는 -C옵션에 유의하십시오 . "무엇을하기 전에 먼저이 디렉토리로 변경"을 의미합니다.

또는 대상 서버에서 "풀"할 수도 있습니다.

server2$ tar -zx -C /destination < <(ssh server2 "tar -zc -C /srcdir ./path")

<(cmd) 구문은 bash에 처음 도입되었으며 이전 시스템에서는 작동하지 않습니다. 프로그램을 실행하고 출력을 파이프로 보내고 해당 파이프를 파일 인 것처럼 명령으로 대체합니다.

나는 다음과 같이 쉽게 위의 내용을 쓸 수있었습니다.

server2$ tar -zx -C /destination -f <(ssh server2 "tar -zc -C /srcdir ./path")

또는 다음과 같이 :

server2$ ssh server2 "tar -zc -C /srcdir ./path" | tar -zx -C /destination

또는 슬픔을 피하고 rsync를 사용할 수 있습니다.

server1$ rsync -az ./path server2:/destination/

마지막으로 전송하기 전에 데이터를 압축하면 대역폭이 줄어들지 만 연결 속도가 매우 빠르면 실제로 작업 시간더 오래 걸릴 수 있습니다 . 경우 : 컴퓨터 유지하기 위해 충분히 빨리 압축하지 못할 수 있기 때문입니다 압축 1백메가바이트 것은이 걸릴 것보다 오래 걸립니다 보내 100MB의, 다음은 비 압축 전송하는 빠릅니다.

또는 압축 수준을 지정할 수 있도록 -z 옵션을 사용하지 않고 gzip을 직접 파이핑하는 것이 좋습니다. 압축 가능한 데이터로 빠른 네트워크 연결에서 레벨 2 또는 3 (기본값은 6)에서 gzip을 사용하면 대부분의 경우 최고의 전체 처리량을 제공하는 경험이 있습니다. 이렇게 :

server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"

Rsync는 아름답게 작동했습니다. 즉석에서 압축하고 전체 폴더를 복사하며 끊어진 링크에서 다시 시작합니다. 하나의 간단한 명령으로 모든 것. 그것을 사랑하십시오. 내가 찾은 유용한 옵션은 다음과 같습니다. z : compress r : recurse = copy subfolder v : verbose. 내 Rsync 명령 예 : rsync -azvr / src-path / username @ dest_server : / dest / path /
Bastion

68

나는 그것을 스스로 재 동기화하려는 유혹을 느꼈다. 그것은 압축을하고 링크 손실을 잘 처리한다.


14
rsync는 정확한 도구입니다.
Rich

4
+1-야 rsync!
Evan Anderson

1
+1, 그냥 쌓기. 또한, 나는 rsync를 정말로 좋아합니다.
Steven 월요일

1
그러나 rsync를 사용할 때는 어쨌든 수동으로 데이터를 압축해야합니다 (데이터를 압축하여 저장하려는 경우)
wlk

rsync로 압축 파일을 어떻게 저장할 수 있습니까?
Dolan Antenucci

12

만약 당신이 그것들을 타르 고 다른 것은 아무것도 없다면 최소한의 속도 이득으로 많은 시간을 낭비 할 것입니다.

따라서 cvf 스위치로 파일을 taring하면 55GB 이미지를 모두 읽고 디스크에 다시 쓰는 데 걸리는 시간이 효과적으로 단축됩니다. (상당한 오버 헤드가 있기 때문에 시간이 더 많이 낭비 될 것입니다).

여기서 얻을 수있는 이점은 하나 뿐이며 많은 파일을 업로드하는 데 드는 오버 헤드가 줄어 듭니다. 이미지를 압축하면 전송 시간이 빨라질 수 있습니다 (그러나 이미 압축 된 형식이라고 생각하기 때문에 별 도움이되지 않습니다). 더 많은 컴퓨팅 시간 낭비.

와이어를 통해 거대한 타르 아카이브를 전송할 때의 가장 큰 단점은 문제가 발생하면 다시 시작해야한다는 것을 의미합니다.

나는 그런 식으로 사용합니다 :

md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/

새 서버에서

md5sum /images/* > md5sum_new.txt

그리고 그냥 diff. scp는 압축을 즉석에서 지원하므로 별도의 아카이브가 필요하지 않습니다.

편집하다

OP에 도움이 되었기 때문에 MD5 정보를 유지하겠습니다. 그러나 한 의견은 새로운 통찰력으로 저를 때렸습니다. 따라서 약간의 검색으로이 유용한 정보가 제공되었습니다. 여기서 주제는 직접 SCP가 아닌 SFTP 입니다.

FTP와 달리 SFTP는 파일 전송에 오버 헤드를 추가합니다. 클라이언트와 서버간에 파일이 전송되면 "패킷"이라는 작은 덩어리로 나뉩니다. 예를 들어, 각 패킷이 32KB라고 가정하십시오. SFTP 프로토콜은 전송 될 때 각 32KB 파일에서 체크섬을 수행하고 해당 체크섬과 해당 패킷을 포함합니다. 수신자는 해당 패킷을 가져 와서 데이터를 해독 한 다음 체크섬을 확인합니다. 체크섬 자체는 CRC32 체크섬보다 "강하다". SFTP는 MD5 또는 SHA와 같은 128 비트 이상의 체크섬을 사용하기 때문에 매 패킷마다 수행되므로 전송의 일부로 수행되는 매우 세부적인 무결성 검사가 있습니다. (추가 오버 헤드로 인해) 속도가 느리지 만 전송이 성공적으로 완료되면 사실상


대단히 감사합니다, md5sum은 무엇을하고 있습니까? 그리고 diff 란 무엇입니까? 감사합니다, 지금 공연!
앤드류 패션

2
md5sum (또는 md5)은 파일의 체크섬을 가져옵니다. Diff는 파일의 차이를 찾습니다 (man diff). 체크섬은 문자열, 해시를 생성하여 파일이 전송 중에 변경되면 약간 뒤집히고 오류가 발생합니다. 다른 쪽에서 다시 가져갈 때 일치하지 않습니다. 큰 파일의 경우 오류 가능성이 높아집니다. 따라서 .iso 파일을 다운로드 할 수있는 사이트를 보게되면 MD5 체크섬이있어서 다운로드 한 파일과 비교하여 손상되지 않았는지 확인하는 경우가 많습니다.
바트 실버 스트림

3
scp는 암호화되어 회선 전체의 무결성을 보장합니다. 여전히 메모리 나 디스크에서 데이터가 손상되었을 가능성이 약간 있지만, 매우 드 rare니다.
Ryan Bair

1
SFTP 체크섬의 오버 헤드가 실제로 어떤 의미에서 중요합니까? 나는 그렇게 상상할 수 없다. 32768마다 4 바이트는 중요하지 않습니다. GB 당 128kB입니다. "느리게"라고 부르는 것은 지루한 이론적 의미를 제외하고는 과장된 것 같습니다.
underscore_d

8

Pacey의 md5sum 제안 외에도 다음을 사용합니다.

목적지에서 : nc -w5 -l -p 4567 | tar -xvf -

그런 다음 소스에서 : tar -cvf - /path/to/source/ | nc -w5 destinationserver 4567

여전히 tar / untar이며 암호화는 없지만 다른 서버로 직접 연결됩니다. 두 가지를 동시에 시작하고 ( -w55 초의 은혜를줍니다) 계속 진행하십시오. 대역폭이 꽉 찬 경우 양쪽 끝에 tar에 -z를 추가하십시오.


1
처음에는 목적지에서 (소켓을 열기 위해) 실행 한 다음 소스에서 (파견하기 위해) 실행
해야하는

대상 서버 대신 root@1.1.1.1을 넣습니까?
앤드류 패션

아니요, IP 만 있습니다. netcat은 TCP 이외의 프로토콜을 사용하지 않습니다. :)이 명령은 위에 주어진 모든 명령 중에서 가장 빠릅니다. 소스에서 파일 당 정확히 하나의 읽기, 파일을 전송하기위한 정확한 최소 네트워크 트래픽 및 대상에서 파일 당 정확히 하나의 쓰기가 있습니다. 여분의 CPU주기가있는 경우 -z 플래그 (압축 용)를 추가하면 더 적은 네트워크 데이터가 전송되므로 속도가 더 빨라집니다.
Jeff McJunkin

@ user36845-맞습니다. 나는 위의 순서와 연대기를 암시하지는 않았지만 소켓이 먼저 열려 있어야합니다. 명확히하기 위해 편집하겠습니다. :)
SmallClanger

왜 ssh / scp가 125MB / s에서 133MB / s로 캡핑되는지 잘 모르겠지만 netcat은 ~ 380MB / s로 데이터를 쉽게 파이프 할 수 있습니다 (동일한 링크)
ThorSummoner

1

한 지점-모든 호스트에 rsync가있는 것은 아니며 호스트에 다른 버전의 tar가있을 수 있습니다. 이러한 이유로 종종 무시되는 cpio를 사용하여 첫 번째 호출 포트로 권장 할 수 있습니다.

ssh를 통해 cpio를 사용하여 호스트간에 파일 / 디렉토리 구조를 임시 복제 할 수 있습니다. 이런 식으로 cpio, nom-nom에 "feed"해야 할 때 전송되는 내용을보다 세밀하게 제어 할 수 있습니다. 또한 더 논쟁적이고 이식 가능하며 cpio는 많이 변경되지 않습니다. 이기종 환경에서 여러 호스트를 돌보는 경우 중요한 사항입니다.

/ export / home 및 하위 디렉토리를 원격 호스트로 복사하는 예 :

cd /export/ find . home -print | cpio -oaV | ssh 10.10.10.10 'cd /export/home; cpio -imVd'

위의 내용은 / export / home 및 하위 디렉토리의 내용을 원격 호스트의 / export / home에 복사합니다.

도움이 되었기를 바랍니다.


그는 두 개의 CentOS 상자라고 언급했기 때문에 rsync 및 파일 호환 버전의 tar가 있습니다. rsync와 같은 도구는 cpio :)와 같은 도구를 대체하기 위해 만들어졌습니다. 적어도 정확히 어디에서 시작하고 알기 원하는지 필터링하지 않고는 cpio로 "재개"할 수 없습니다. 불필요한 시간 오버 헤드입니다. '오래된'유닉스 박스에 유용한 정보 :)
Rafiq Maniar

그렇습니다, 그 cmmand는 나를 잃었습니다
Andrew Fashion

1

ssh 액세스 권한이 있고 rsync 액세스 권한이 있습니다.

rsync -av -e ssh /storage/images/ user@[ip or domain name]:/storage/images/

또는

rsync -av -e "ssh -l user" /storage/images/ [ip or domain name]:/storage/images/

"rsync error : main.c (977) [sender = 2.6.9]에서 일부 파일을 전송할 수 없습니다 (코드 23)"와 같은 오류가 표시되면 서버 간의 사용자 및 그룹을 확인하십시오. 불일치가있을 수 있습니다.

rsync가 전송을 압축하도록하려면 rsync "-z"옵션을 사용하십시오. 이 옵션은 더 많은 CPU를 사용하지만 더 적은 대역폭을 사용하므로주의하십시오.

"-프로그레시브"옵션이있어 당신에게 이체 율을 줄 것입니다.


0

파일을 전송하기 위해 인터넷이 필요하지 않고 공유 네트워크에 있습니까? NFS 또는 FTP는 전송하는 동안 암호화를 잃을지라도 SCP의 오버 헤드보다 훨씬 빠를 수 있습니다.


원격 위치에있는 다른 서버
Andrew Fashion

0

또는 항상 tar 파이프를 사용할 수 있습니다.

(cd /path && tar -cjf - * ) | ssh user@host 'tar -xjf - -C /path'

'j'= bzip2, gzip에 'z'를 사용하거나 tar가 지원하는 경우 --lzma를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.