한 Linux 서버에서 다른 Linux 서버로 큰 파일 복사


20

LA 데이터 센터의 Linux 서버에서 NY 데이터 센터의 다른 Linux 서버로 10MB 링크를 통해 75 기가 바이트 tgz (mysql lvm 스냅 샷)를 복사하려고합니다.

200-300 시간 사이에서 변동하는 rsync 또는 scp로 약 20-30Kb / s를 얻습니다.

현재 두 번째 데이터 센터가 아직 활성화되지 않았기 때문에 비교적 조용한 링크입니다. 작은 파일 전송으로 뛰어난 속도를 얻었습니다.

나는 구글을 통해 찾은 다른 tcp 튜닝 가이드를 따랐다. (아마도 잘못된 가이드를 읽고 있을지도 모른다.)

tar + netcat 터널 팁을 보았지만 작은 파일의 LOTS에만 유용하며 파일 전송이 효과적으로 완료되면 업데이트하지 않는다는 것을 이해합니다.

하드 드라이브 배송에 의지하기 전에 누구에게나 좋은 정보가 있습니까?

업데이트 : 글쎄 ... 그것은 결국 링크 일 수 있습니다 :( 아래 내 테스트 참조 ...

NY에서 LA로 환승 :

빈 파일을 가져옵니다.

[nathan@laobnas test]$ dd if=/dev/zero of=FROM_LA_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.412 seconds, 164 MB/s
[nathan@laobnas test]$ scp -C obnas:/obbkup/test/FROM_NY_TEST .
FROM_NY_TEST                                    3%  146MB   9.4MB/s   07:52 ETA

스냅 샷 타르볼을 가져옵니다.

[nathan@obnas db_backup]$ ls -la db_dump.08120922.tar.gz
-rw-r--r-- 1 root root 30428904033 Aug 12 22:42 db_dump.08120922.tar.gz

[nathan@laobnas test]$ scp -C obnas:/obbkup/db_backup/db_dump.08120922.tar.gz .
db_dump.08120922.tar.gz            0%   56MB 574.3KB/s 14:20:40 ET

LA에서 NY로 환승 :

빈 파일을 가져옵니다.

[nathan@obnas test]$ dd if=/dev/zero of=FROM_NY_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.2501 seconds, 165 MB/s
[nathan@obnas test]$ scp -C laobnas:/obbkup/test/FROM_LA_TEST .
FROM_LA_TEST                                    0% 6008KB 497.1KB/s 2:37:22 ETA

스냅 샷 타르볼을 가져옵니다.

[nathan@laobnas db_backup]$ ls -la db_dump_08120901.tar.gz
-rw-r--r-- 1 root root 31090827509 Aug 12 21:21 db_dump_08120901.tar.gz

[nathan@obnas test]$ scp -C laobnas:/obbkup/db_backup/db_dump_08120901.tar.gz .
db_dump_08120901.tar.gz                0%  324KB  26.8KB/s 314:11:38 ETA

링크를 MPLS / 이더넷 10MB 링크로 표시 한 우리 시설을 운영하는 사람들과 함께 할 것입니다. (으 rug하다)


한 의견은 최근에 약 50GB 인 Seagate FreeAgent (USB 디스크)의 소프트웨어 공급 업체로부터 릴리스를 받았습니다. 문제의 회사는 웹 사이트를 가지고 있었으며 일반적으로 고객이 웹 사이트에서 간단히 다운로드하도록 요청했습니다. 그것은 흥미로운 해결책이라고 생각하고 이것이 결정에 도움이되는 정보를 추가 할 수 있다고 생각했습니다.
mdpc

어떤 대기 시간이 표시됩니까?
2009 년

링크를 통해 약 80ms
Nathan Milford

네, 지금 혼란스럽고 좌절했습니다. 나는 그것을 50MB 덩어리로 나누었고 여전히 느리게 진행됩니다! 그러나 다른 데이터를 rsyncing 것은 .... 내가 놓친 거지 5백킬로바이트 / s의 ...이 있어야 뭔가 심각하게 잘못 ehre를 얻을 수
나단 밀 퍼드에게

로 트래픽을 확인하십시오 tcpdump. 전송 속도를 늦추는 데 도움이됩니다.
lexsys

답변:


16

스니커 넷 누구?

이것이 한 번만 복사한다고 가정하면 파일을 CD (또는 다른 매체)에 복사하고 밤새 대상으로 복사 할 수 있다고 생각하지 않습니까?

실제로 해당 연결을 통해 해당 크기의 파일 전송이 올바르게 복사되지 않을 수있는 가장 빠른 옵션 일 수 있습니다.이 경우 다시 시작해야합니다.


rsync

두 번째 선택 / 시도는 실패한 전송, 부분 전송 등을 감지하고 중단 된 곳에서 픽업 할 수 있기 때문에 rsync입니다.

rsync --progress file1 file2 user@remotemachine:/destination/directory

--progress 플래그는 단지 거기에 앉아서 자신을 다시 추측하는 대신 피드백을 줄 것입니다. :-)


Vuze (비트 토렌트)

세 번째 선택은 Vuze를 토렌트 서버로 사용하고 원격 위치에서 표준 bitorrent 클라이언트를 사용하여 다운로드하는 것입니다. 나는 이것을 한 다른 사람들을 알고 있지만 당신은 알고 있습니다 ... 그들이 모든 것을 실행할 때까지 ... 나는 밤새 데이터를 얻을 수있었습니다 ...

당신의 상황에 따라 다릅니다.

행운을 빕니다!


최신 정보:

알다시피, 나는 당신의 문제에 대해 조금 더 생각하고 있습니다. 왜 파일이 ​​하나의 거대한 타르볼이어야합니까? Tar는 큰 파일을 작은 파일로 완벽하게 분할 할 수 있습니다 (예를 들어 미디어를 스팬하기 위해).


3
+1이지만이 경우에는 비용 효율적이지 않을 수 있습니다. : 하드 드라이브의 전체 747의 대역폭을 과소 평가하지 마십시오
차드 Huneycutt

2
링크를 찾을 수 없지만 몇 년 전에 Google은 드라이브 상자를 배송하는 것을 찾고있었습니다. A 지점에서 B 지점으로 총 500TB의 드라이브 상자를 옮길 수 있다면, 어떤 방식 으로든 아주 정밀한 대역폭입니다
STW

2
아마 당신은이 문서를 참조됩니다 arstechnica.com/science/news/2007/03/...
KPWINC

1
네, 결국 하드 드라이브를 배송했습니다. 실제로 문제는 스위치의 흐름 제어였습니다.
Nathan Milford

여러 파종기가있는 경우 Bittorrent는 직접 전송보다 더 잘 작동합니다. OP가 여러 컴퓨터에 bt를 설치하더라도 연결은 하나만 있습니다. 그리고 그는 이미 여러 개의 작은 파일이 하나의 큰 파일보다 빠르지 않다고 판단하여 네트워크 연결을 가리 킵니다.
Xalorous

7

나는 과거에 60GB tbz2 파일로 그 작업을 수행했습니다. 더 이상 스크립트가 없지만 다시 작성하기 쉬워야합니다.

먼저 파일을 ~ 2GB로 분할하십시오.

split --bytes=2000000000 your_file.tgz

각 조각에 대해 MD5 해시를 계산하고 (이것은 무결성을 검사하는 것입니다) 어딘가에 저장 한 다음 선택한 도구를 사용하여 조각과 해당 MD5를 원격 사이트에 복사하기 시작합니다 (화면의 netcat-tar-pipe) 세션).

잠시 후 md5에 조각이 괜찮은지 확인한 다음 :

cat your_file* > your_remote_file.tgz

원본 파일의 MD5도 수행 한 경우 해당 파일도 확인하십시오. 괜찮 으면 파일의 압축을 풀 수 있습니다. 모든 것이 정상입니다.

(시간을 찾으면 스크립트를 다시 작성합니다)


5

일반적으로 나는 rsync를 크게 옹호하지만 단일 파일을 처음 전송할 때별로 의미가없는 것 같습니다. 그러나 약간의 차이만으로 파일을 다시 전송하는 경우 rsync가 확실한 승자가 될 것입니다. 어쨌든 rsync를 사용하기로 선택한 경우 --daemon성능을 저하시키는 ssh 터널을 제거하기 위해 한쪽 끝을 모드 에서 실행하는 것이 좋습니다 . 매뉴얼 페이지는이 모드를 매우 자세하게 설명합니다.

내 추천? 중단 된 다운로드 재개를 지원하는 서버 및 클라이언트가있는 FTP 또는 HTTP 두 프로토콜 모두 빠르고 가벼워 ssh-tunnel 패널티를 피할 수 있습니다. Apache + wget이 빠르게 비명을지를 것입니다.

netcat 파이프 트릭도 잘 작동합니다. 하나의 큰 파일을 전송할 때 Tar은 필요하지 않습니다. 그리고 그것이 끝났을 때 당신에게 알리지 않는 이유는 당신이 그것을 말하지 않았기 때문입니다. -q0서버 측에 플래그를 추가하면 예상대로 작동합니다.

server $ nc -l -p 5000> outfile.tgz

client $ nc -q0 server.example.com 5000 <infile.tgz

netcat 접근 방식의 단점은 전송이 74GB로 죽으면 다시 시작할 수 없다는 것입니다.


rsyncd의 경우 +1 CIFS 또는 NFS에 비해 처리량이 더 높기 때문에 실제로 LAN에서 전송하는 데 사용합니다.
Ophidian

1
FTP와 HTTP는 "ssh-tunnel 패널티"를 피하지만 데이터를 암호화하지 않는 "벌칙"을 고려해야합니다.
J.Money

3

netcat (때때로 nc라고 함)에 샷을줍니다. 다음은 디렉토리에서 작동하지만 하나의 파일 만 처리하도록 쉽게 조정할 수 있어야합니다.

대상 상자에서 :

netcat -l -p 2342 | tar -C /target/dir -xzf -

소스 상자에서 :

tar czf * | netcat target_box 2342

두 tar 명령 모두에서 'z'옵션을 제거하여 파일이 이미 압축 된 상태에서 조금 더 빠르게 볼 수 있습니다.


1

큰 파일의 경우 기본 SCP와 Rsync (SCP를 사용)가 매우 느립니다. 오버 헤드가 적은 프로토콜을 사용하려고 생각합니다. 더 간단한 암호화 사이퍼를 사용하거나 전혀 사용하지 않았습니까? --rsh전송 방법을 변경하려면 rsync 옵션을 살펴보십시오 .

FTP 또는 HTTP가 아닌 이유


1
나는 소스에서 commandlinefu에서 ol ' "python -m SimpleHTTPServer"를 수행하고 대상에서 파일을 얻었습니다. 나는 여전히 "18.5K / s eta 15d 3h"를 얻는다
Nathan Milford

1

상황에 약간의 오버 헤드가 추가되지만 BitTorrent는 실제로 큰 파일을 전송하는 정말 좋은 솔루션입니다. BitTorrent는 파일을 기본적으로 청크하고 손상되면 다시 전송 될 수있는 각 청크를 체크섬하는 등 많은 훌륭한 기능을 가지고 있습니다.

Azureus (현재 Vuze) 와 같은 프로그램 에는 하나의 앱에서 토렌트를 생성, 서버 및 다운로드하는 데 필요한 모든 부분이 포함되어 있습니다. 빈을 염두에두고 Azureus는 BitTorrent에 가장 적합한 솔루션이 아니며 GUI도 필요하다고 생각합니다. 리눅스 용 명령 줄 구동 토런트 도구가 많이 있습니다.


시드가 여러 개인 경우 bt는 직접 전송보다 빠릅니다. 그는 단일 소스를 가지고 있습니다. 더 중요한 것은 네트워크 연결이 잘못된 단일 소스 네트워크를 가지고 있다는 것입니다. 파일을 로컬로 여러 위치에 복사 한 다음 여러 시드로 bt를 설정해도 연결이 잘못되어 생산성이 떨어집니다. 또한 여러 복사본을 만들어 시드로 설정하면 복사 시간이 줄어들지 않고 복사 시간이 늘어납니다. OP가 여러 명의 수신자가 큰 파일을 사용할 수있게하려는 경우 BT가 실행 가능한 솔루션 일 수 있습니다.
Xalorous

0

개인적으로 20-30Kb / s는 10Mb (10MB가 아닌 10MB로 가정) 링크의 경우 매우 낮은 것 같습니다.

내가 당신이라면, 나는 두 가지 중 하나를 할 것입니다 (물리적 접근이 불가능하다고 가정)-

어느 쪽이든, 큰 파일을 약 500MB의 작은 청크로 분할하는 것이 좋습니다. 운송 중 손상이 발생할 경우에 대비합니다.

작은 청크가 있으면 rsync를 다시 사용하거나 개인적으로 개인 보안 ftp 세션을 사용하고 완료시 파일을 CRC하는 것을 선호합니다.


0

몇 가지 질문이 토론에 도움이 될 수 있습니다. 데이터를 전송하는 것이 얼마나 중요합니까? 이것은 재해 복구, 핫 백업, 오프라인 스토리지 또는 무엇입니까? 데이터베이스가 작동 중이거나 작동 중지 된 상태에서 백업하려고합니까? 원격 시스템에서 데이터베이스를 설정하고 변경 로그를 통해 클러스터링 또는 업데이트를 사용하여 동기화 상태를 유지하는 방법은 무엇입니까? 이는 링크를 통해 전송해야하는 데이터 양을 줄이는 데 도움이 될 수 있습니다.


다른 MYSQL 복제본 (다른 주요 MYSQL 인스턴스)의 LVM 스냅 샷입니다. 일단 전송되고 목적지에 도달하면 mysql 인스턴스는 해당 스냅 샷 (델타로 사용)과 마스터가있는 위치의 차이를 간단히 업데이트 할 수 있습니다. MYSQL 백업은 관련이 없으며 한 번만 이동하면되는 많은 양의 데이터입니다.
Nathan Milford

0

bbcp는 파일을 청크하고 여러 스트림으로 복사합니다.


0

Google 직원을위한 최신 답변 :

큰 데이터 세트를 전송할 때 rsync를 사용하여 소스와 대상을 비교 한 다음 --only-write-batch 플래그를 사용하여 배치 파일을 로컬 이동식 매체에 쓸 수 있습니다. 그런 다음 --read-batch를 사용하여 로컬 미디어를 원격 위치로 가져 와서 꽂은 다음 rsync를 다시 실행하여 변경 사항을 원격 데이터 세트에 통합합니다.

물리적 전송 중에 소스 파일이 변경되거나 전송 매체가 가득 차면 --only-write-batch | 배 | 대상이 모두 잡힐 때까지 --read-batch주기.

(참고 : 나는 rsync 에서이 기능의 저자 중 하나였습니다. 더 많은 배경과 사용 사례는 프로토 타입 구현에 대한 토론을 참조하십시오 : https://lists.samba.org/archive/rsync/2005-March/011964 .html )

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