Di chuyển một khối hợp lý trực tiếp từ máy chủ này sang máy chủ khác qua mạng?


13

Tôi có một máy chủ KVM với một số VM trên đó. Mỗi VM sử dụng Khối lượng logic trên máy chủ. Tôi cần sao chép LV sang máy chủ khác.

Thông thường, tôi sẽ sử dụng một cái gì đó như:

dd if=/the/logical-volume of=/some/path/machine.dd

Để biến LV thành một tệp hình ảnh và sử dụng SCP để di chuyển nó. Sau đó sử dụng DD để sao chép tệp trở lại LV mới trên máy chủ mới.

Vấn đề với phương pháp này là bạn cần dung lượng đĩa gấp đôi so với VM chiếm trên cả hai máy. I E. LV 5 GB sử dụng 5 GB dung lượng cho LV và bản sao dd cũng sử dụng thêm 5 GB dung lượng cho hình ảnh. Điều này tốt cho LV nhỏ, nhưng nếu (như trường hợp của tôi) bạn có LV 500GB cho máy ảo lớn thì sao? Máy chủ mới có ổ cứng 1TB, do đó, nó không thể chứa tệp hình ảnh dd 500 GB có dung lượng logic 500 GB để sao chép có chỗ cho HĐH máy chủ có chỗ cho các khách nhỏ hơn.

Những gì tôi muốn làm là một cái gì đó như:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv

Nói cách khác, sao chép dữ liệu trực tiếp từ một ổ đĩa logic sang ổ đĩa khác qua mạng và bỏ qua tệp hình ảnh trung gian.

Điều này có thể không?


Câu trả lời:


24

Chắc chắn, tất nhiên là có thể.

dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv

Bùng nổ.

Mặc dù vậy, hãy tự làm và sử dụng một cái gì đó lớn hơn kích thước khối mặc định. Có thể thêm bs = 4M (đọc / ghi trong khối 4 MB). Bạn có thể thấy có một số ý kiến ​​trái chiều về việc chặn trong các bình luận; nếu đây là điều bạn thấy mình làm khá thường xuyên, hãy dành một chút thời gian để thử nó một vài lần khác nhau với các khối khác nhau và tự mình xem điều gì giúp bạn có được tỷ lệ chuyển tốt nhất.

Trả lời một trong những câu hỏi từ các ý kiến:

Bạn có thể chuyển khoản qua pv để lấy số liệu thống kê về việc chuyển tiền. Nó đẹp hơn nhiều so với đầu ra bạn nhận được từ việc gửi tín hiệu đến dd.

Tôi cũng sẽ nói rằng trong khi tất nhiên sử dụng netcat - hoặc bất cứ điều gì khác không áp đặt chi phí mã hóa - sẽ hiệu quả hơn, tôi thường thấy rằng tốc độ bổ sung sẽ mất đi sự tiện lợi. Trừ khi tôi di chuyển xung quanh các bộ dữ liệu thực sự lớn, tôi thường gắn bó với ssh mặc dù chi phí hoạt động vì trong hầu hết các trường hợp, mọi thứ đều đã được thiết lập thành Just Work.


1
Có phải bs chỉ ảnh hưởng đến tốc độ sao chép, hoặc nó có ảnh hưởng đến cách lưu trữ dữ liệu không?
Nick

3
Nó không ảnh hưởng đến cách lưu trữ dữ liệu, nhưng nó hiệu quả hơn rất nhiều so với việc sử dụng kích thước khối mặc định (512 byte) để đọc và ghi.
larsks

3
@Nick: Trên Linux, bạn có thể gửi tín hiệu ddxử lý USR1để làm cho nó hiển thị một dòng trạng thái với số tiền được chuyển. Lấy số tiến trình của ddquy trình của bạn với một cái gì đó giống như ps aux | grep ddvà sau đó sử dụng PID này với lệnh kill -USR1 $PID. Thông báo sẽ được hiển thị trên thiết bị đầu cuối ban đầu nơi bạn bắt đầu dd.
Sven

3
Bạn có thể không muốn sử dụng một bs lớn vì nó sẽ chặn việc ghi vào đường ống thành ssh cho đến khi nó có thể chuyển phần lớn nó vào ổ cắm mạng, trong thời gian đó đĩa sẽ không hoạt động. Vì kích thước readahead mặc định là 128k, có lẽ bạn muốn gắn bó với điều đó. Hoặc tăng kích thước đọc đĩa.
psusi

1
@psusi: Liên kết Zoredache đặt bình luận bên dưới câu hỏi đã chứng minh điều ngược lại, họ nhận được kết quả nhanh nhất với kích thước khối 16M, nhưng sử dụng netcat thay vì ssh làm phương thức chuyển, luôn là lựa chọn tốt hơn khi không yêu cầu mã hóa.
Sven

18

Đây là một phiên bản được tối ưu hóa, cho thấy tiến trình sử dụng pvvà sử dụng BS cho các phần lớn hơn và cũng sử dụng gzipđể giảm lưu lượng mạng.

Điều đó thật hoàn hảo khi di chuyển dữ liệu giữa các kết nối chậm như máy chủ internet. Tôi khuyên bạn nên chạy lệnh bên trong một màn hình hoặc phiên tmux. Bằng cách đó, kết nối ssh đến máy chủ từ nơi bạn thực thi lệnh có thể bị ngắt kết nối mà không gặp sự cố.

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh root@78.46.36.22 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'

2
Bạn có thể sử dụng ssh -Cthay vì gzip. Tôi không chắc có ảnh hưởng đến hiệu suất hay không, nhưng nó ít gõ hơn.
Samuel Edwin Phường

1
Tôi cũng đề nghị sử dụng pigz hoặc pxz -1 thay vì gzip, đa luồng thực sự hữu ích trên bất kỳ máy chủ hiện đại nào.
sCiphre

pvcó thể gây ra sự cố (trong trường hợp tôi chuyển hơn 500 vps sang các máy chủ khác có hệ thống này) với số byte và sau sự cố này, khối lượng lvm không nhất quán. Lợi ích của việc xem tiến độ của công việc là null và dange. Nếu bạn muốn xem tiến trình mở bảng điều khiển aa với ifto chẳng hạn.
abkrim

4

Làm thế nào về việc sử dụng một freind cũ để làm điều này. NetCat.

Trên hệ thống đang mất loại âm lượng hợp lý

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

Sau đó trên hệ thống tiếp nhận. kiểu

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

Dịch, nhập vào hộp dd tệp này và chuyển nó sang nc (netcat) sẽ nghe cổng này. Trên hệ thống nhận, netcat sẽ đợi 10 giây nếu nó không có dữ liệu trước khi đóng vào [ip hoặc tên] trên [port] sau đó chuyển dữ liệu đó sang dd để ghi ra.


2
Netcat không sử dụng UDP với các tùy chọn này.
Samuel Edwin Phường

3

Đầu tiên tôi sẽ chụp ảnh lv:

lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>

Sau đó, bạn phải tạo một lv mới trên máy chủ mới (ví dụ: sử dụng lvcreate) với cùng kích thước. Sau đó, bạn có thể sao chép trực tiếp dữ liệu vào máy chủ mới. Dưới đây là ví dụ của tôi về lệnh sao chép:

dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_host -C 'dd of=/dev/vg1/<created lv> bs=4096'

Tôi đã sử dụng thủ tục để sao chép một proxmox pve duy trì VM sang một máy chủ khác. Khối lượng logic chứa một số LV bổ sung được duy trì bởi chính VM.


2

Trước tiên hãy chắc chắn rằng khối lượng logic không được gắn kết. Nếu có và bạn muốn tạo một "bản sao nóng", trước tiên hãy tạo một ảnh chụp nhanh và sử dụng nó: lvcreate --snapshot --name transfer_snap --size 1G

Tôi phải chuyển rất nhiều dữ liệu (7TB) giữa hai Máy chủ được kết nối 1Gbit, vì vậy tôi cần cách nhanh nhất có thể để làm như vậy.

Bạn có nên sử dụng SSH?

Sử dụng ssh là không cần thiết, không phải vì mã hóa của nó (nếu bạn có CPU có hỗ trợ AES-NI, nó không gây hại nhiều) mà là do bộ đệm mạng của nó. Những cái đó không được nhân rộng. Có một phiên bản Ssh được vá để giải quyết vấn đề này, nhưng vì không có gói tiền biên dịch nên nó không tiện lợi lắm.

Sử dụng nén

Khi truyền hình ảnh đĩa thô, luôn luôn nên sử dụng nén. Nhưng bạn không muốn nén trở thành nút cổ chai. Hầu hết các công cụ nén unix như gzip đều là một luồng đơn, vì vậy nếu quá trình nén bão hòa một CPU, nó sẽ là một nút cổ chai. Vì lý do đó, tôi luôn sử dụng pigz, một biến thể gzip sử dụng tất cả các lõi CPU để nén. Và điều này là cần thiết của bạn muốn tăng và tăng tốc độ GBit.

Sử dụng mã hóa

Như đã nói, ssh chậm. Nếu bạn có CPU AES-NI, đây không phải là nút cổ chai. Vì vậy, thay vì sử dụng ssh, chúng ta có thể sử dụng openssl trực tiếp.

Tốc độ

Để cung cấp cho bạn một ý tưởng về tác động tốc độ của các thành phần, đây là kết quả của tôi. Đó là tốc độ truyền giữa hai hệ thống sản xuất đọc và ghi vào bộ nhớ. Kết quả thực tế của bạn phụ thuộc vào tốc độ mạng, tốc độ ổ cứng và tốc độ CPU nguồn! Tôi đang làm điều này để cho thấy rằng ít nhất là không có hiệu suất giảm lớn. Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s Kết luận: sử dụng nén cho phép tăng tốc đáng chú ý, vì nó làm giảm kích thước dữ liệu rất nhiều. Điều này thậm chí còn quan trọng hơn nếu bạn có tốc độ mạng chậm hơn. Khi sử dụng nén, xem sử dụng cpu của bạn. nếu việc sử dụng được tối đa hóa, bạn có thể thử mà không cần sử dụng nó. Sử dụng nén chỉ là một tác động nhỏ trên các hệ thống AES-NI, imho chỉ vì nó đánh cắp khoảng 30-40% cpu từ quá trình nén.

Sử dụng màn hình

Nếu bạn đang truyền nhiều dữ liệu như tôi, bạn không muốn bị gián đoạn bởi việc ngắt kết nối mạng của máy khách ssh của bạn, vì vậy tốt hơn bạn nên khởi động nó bằng màn hình ở cả hai bên. Đây chỉ là một ghi chú, tôi sẽ không viết một hướng dẫn màn hình ở đây.

Cho phép sao chép

Cài đặt một số phụ thuộc (về nguồn và đích): apt install pigz pv netcat-openbsd

sau đó tạo một âm lượng trên đích với cùng kích thước với nguồn. Nếu không chắc chắn, hãy sử dụng lvdisplay trên nguồn để lấy kích thước và tạo mục tiêu tức là: lvcreate -n lvname vgname -L 50G

tiếp theo, chuẩn bị đích để nhận dữ liệu:

nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname

và khi sẵn sàng, bắt đầu chuyển tiền trên Nguồn:

pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1

Lưu ý: Nếu bạn đang truyền dữ liệu cục bộ hoặc không quan tâm đến mã hóa, chỉ cần xóa phần Openssl khỏi cả hai bên. Nếu bạn quan tâm, asdkjn2hb là khóa Mã hóa, bạn nên thay đổi nó.


ĐỪNG BAO GIỜ LÀM ĐIỀU NÀY TRÊN MÁY CHỦ PROXMOX: apt cài đặt netcat-openbsd Cài đặt netcat-openbsd xóa sạch ProxMox khỏi máy chủ và gây ra hơn 5 giờ ngừng hoạt động và làm việc !!!
Zoltan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.