Tuyên bố miễn trừ trách nhiệm: Vì tôi chưa bao giờ sử dụng zvols, tôi không thể nói liệu chúng có sao chép khác với hệ thống tập tin hoặc ảnh chụp nhanh thông thường không. Tôi cho rằng họ là như vậy, nhưng đừng tin lời tôi.
Câu hỏi của bạn thực sự là nhiều câu hỏi, tôi cố gắng trả lời chúng một cách riêng biệt:
Làm thế nào để nhân rộng / nhân bản hồ bơi hoàn chỉnh đến vị trí xa
Bạn cần chia nhiệm vụ thành hai phần: đầu tiên, bản sao ban đầu phải được hoàn thành, sau đó có thể sao chép tăng dần, miễn là bạn không gây rối với các ảnh chụp sao chép . Để cho phép nhân rộng, bạn cần giữ lại các ảnh chụp sao chép cuối cùng, mọi thứ trước đó có thể bị xóa. Nếu bạn xóa ảnh chụp nhanh trước đó, zfs recv
sẽ khiếu nại và hủy bỏ bản sao. Trong trường hợp này, bạn phải bắt đầu lại từ đầu, vì vậy hãy cố gắng không làm điều này.
Nếu bạn chỉ cần các tùy chọn chính xác, chúng là:
zfs send
:
-R
: gửi mọi thứ trong nhóm hoặc tập dữ liệu đã cho (sao chép đệ quy, cần thiết mọi lúc, bao gồm -p
). Ngoài ra, khi nhận, tất cả các ảnh chụp nhanh nguồn đã xóa sẽ bị xóa ở đích.
-I
: bao gồm tất cả các ảnh chụp nhanh trung gian giữa ảnh chụp sao chép cuối cùng và ảnh chụp sao chép hiện tại (chỉ cần với các lần gửi tăng dần)
zfs recv
:
-F
: mở rộng nhóm mục tiêu, bao gồm xóa các bộ dữ liệu hiện có bị xóa trên nguồn
-d
: loại bỏ tên của nhóm nguồn và thay thế nó bằng tên nhóm đích (phần còn lại của các đường dẫn hệ thống tập tin sẽ được giữ nguyên và nếu cần cũng được tạo)
-u
: không gắn hệ thống tập tin vào đích
Nếu bạn thích một ví dụ hoàn chỉnh, đây là một đoạn script nhỏ:
#!/bin/sh
# Setup/variables:
# Each snapshot name must be unique, timestamp is a good choice.
# You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/gnu/bin/date '+%Y%m%d%H%M%S')
source_pool=tank
destination_pool=tank
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=remotehostname
# Initial send:
# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Incremental sends:
# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
zfs destroy "$snap"
done
Sử dụng một cái gì đó nhanh hơn SSH
Nếu bạn có kết nối được bảo mật đầy đủ, ví dụ như đường hầm IPSec hoặc OpenVPN và một Vlan riêng biệt chỉ tồn tại giữa người gửi và người nhận, bạn có thể chuyển từ SSH sang các lựa chọn không được mã hóa như mbuffer như được mô tả ở đây hoặc bạn có thể sử dụng SSH với mã hóa yếu / không mã hóa và vô hiệu hóa nén, được chi tiết ở đây . Ngoài ra còn có một trang web về việc giới thiệu lại SSH nhanh hơn nhiều, nhưng tiếc là tôi không nhớ URL - tôi sẽ chỉnh sửa nó sau nếu tôi tìm thấy nó.
Đối với các bộ dữ liệu rất lớn và kết nối chậm, cũng có thể hữu ích cho lần truyền đầu tiên qua đĩa cứng (sử dụng đĩa được mã hóa để lưu trữ zpool và truyền trong gói kín qua chuyển phát nhanh, thư hoặc trực tiếp). Vì phương thức truyền tải không quan trọng đối với send / recv, bạn có thể dẫn mọi thứ vào đĩa, xuất nhóm, gửi đĩa đến đích, nhập nhóm và sau đó truyền tất cả các lần gửi tăng dần qua SSH.
Vấn đề với các snapshot lộn xộn
Như đã nêu trước đó, nếu bạn xóa / sửa đổi ảnh chụp sao chép, bạn sẽ nhận được thông báo lỗi
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
điều đó có nghĩa là lệnh của bạn sai hoặc bạn đang ở trạng thái không nhất quán khi bạn phải xóa các ảnh chụp nhanh và bắt đầu lại.
Điều này có một số ý nghĩa tiêu cực:
- Bạn không thể xóa ảnh chụp sao chép cho đến khi ảnh chụp sao chép mới được chuyển thành công. Vì các ảnh chụp sao chép này bao gồm trạng thái của tất cả các ảnh chụp nhanh (cũ) khác, không gian trống của các tệp đã bị xóa và ảnh chụp nhanh sẽ chỉ được lấy lại nếu quá trình sao chép kết thúc. Điều này có thể dẫn đến các sự cố không gian tạm thời hoặc vĩnh viễn trên nhóm của bạn mà bạn chỉ có thể khắc phục bằng cách khởi động lại hoặc hoàn tất quy trình sao chép hoàn chỉnh.
- Bạn sẽ có nhiều ảnh chụp nhanh bổ sung, làm chậm lệnh danh sách (ngoại trừ Oracle Solaris 11, trong đó điều này đã được sửa).
- Bạn có thể cần phải bảo vệ các ảnh chụp nhanh chống lại việc xóa (vô tình), ngoại trừ bởi chính tập lệnh.
Có một giải pháp khả thi cho những vấn đề đó, nhưng tôi đã không tự mình thử nó. Bạn có thể sử dụng zfs bookmark
, một tính năng mới trong OpenSolaris / illumos được tạo riêng cho nhiệm vụ này. Điều này sẽ giải phóng bạn quản lý ảnh chụp. Nhược điểm duy nhất là hiện tại, nó chỉ hoạt động cho các bộ dữ liệu duy nhất, không đệ quy. Bạn sẽ phải lưu một danh sách tất cả các bộ dữ liệu cũ và mới của bạn và sau đó lặp qua chúng, đánh dấu, gửi và nhận chúng, sau đó cập nhật danh sách (hoặc cơ sở dữ liệu nhỏ, nếu bạn muốn).
Nếu bạn thử tuyến đường đánh dấu, tôi sẽ thích thú khi nghe cách nó hoạt động cho bạn!
zfs send -R ...
? Nếu bạn dẫn đầu ra quassh
, bạn đã vô hiệu hóa các ký tự thoát vớizfs send -R ... | ssh -e none ...
?