Saya mengirim snapshot ZFS tambahan melalui jalur T1 point-to-point dan kami sampai pada titik di mana snapshot satu hari tidak dapat menembus kawat sebelum pencadangan berikutnya dimulai. Perintah kirim / terima kami adalah:
zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | bzip2 -c | \
ssh offsite-backup "bzcat | zfs recv -F tank/vm"
Saya punya banyak siklus CPU. Apakah ada algoritma kompresi yang lebih baik atau metode alternatif yang dapat saya gunakan untuk mendorong lebih sedikit data melalui saluran?
compression
zfs
snapshot
Sysadminicus
sumber
sumber
zfs receive
bisa menjadi penyebab:received 953MB stream in 36 seconds (26.5MB/sec)
Jawaban:
Sepertinya Anda sudah mencoba semua mekanisme kompresi terbaik dan masih dibatasi oleh kecepatan jalur. Dengan asumsi menjalankan garis yang lebih cepat adalah keluar dari pertanyaan, apakah Anda menganggap menjalankan cadangan lebih jarang sehingga mereka memiliki lebih banyak waktu untuk berjalan?
Singkatnya, apakah ada cara untuk mengurangi jumlah data yang ditulis? Tanpa mengetahui aplikasi Anda, sulit untuk mengatakannya, tetapi hanya melakukan hal-hal seperti memastikan aplikasi menimpa file yang sudah ada alih-alih membuat yang baru mungkin membantu. Dan pastikan Anda tidak menyimpan cadangan file temp / cache yang tidak Anda perlukan.
sumber
Inilah yang saya pelajari melakukan hal yang persis sama dengan yang Anda lakukan. Saya sarankan menggunakan mbuffer. Saat menguji di lingkungan saya, itu hanya membantu di sisi penerima, tanpa itu sama sekali pengiriman akan melambat saat menerima tertangkap.
Beberapa contoh: http://everycity.co.uk/alasdair/2010/07/using-mbuffer-to-speed-up-slow-zfs-send-zfs-receive/
Beranda dengan opsi dan sintaks http://www.maier-komor.de/mbuffer.html
Perintah kirim dari skrip replikasi saya:
ini menjalankan mbuffer pada host jarak jauh sebagai buffer penerima sehingga pengiriman berjalan secepat mungkin. Saya menjalankan baris 20mbit dan menemukan bahwa memiliki mbuffer di sisi pengirim juga tidak membantu, juga kotak zfs utama saya menggunakan semua ram sebagai cache sehingga memberikan bahkan 1g untuk mbuffer akan mengharuskan saya untuk mengurangi beberapa ukuran cache.
Juga, dan ini bukan bidang keahlian saya, saya pikir lebih baik membiarkan ssh melakukan kompresi. Dalam contoh Anda, saya pikir Anda menggunakan bzip dan kemudian menggunakan ssh yang secara default menggunakan kompresi, jadi SSH mencoba untuk mengompresi aliran terkompresi. Saya akhirnya menggunakan arcfour sebagai cipher karena ini adalah CPU yang paling sedikit dan itu penting bagi saya. Anda mungkin memiliki hasil yang lebih baik dengan cipher lain, tapi saya sarankan menyarankan SSH melakukan kompresi (atau matikan kompresi ssh jika Anda benar-benar ingin menggunakan sesuatu yang tidak didukung).
Yang sangat menarik adalah menggunakan mbuffer saat mengirim dan menerima di localhost juga mempercepat:
Saya menemukan bahwa 4g untuk transfer localhost tampaknya menjadi manisan bagi saya. Ini hanya menunjukkan bahwa zfs mengirim / menerima tidak terlalu menyukai latensi atau jeda lainnya di aliran agar berfungsi dengan baik.
Hanya pengalaman saya, semoga ini membantu. Butuh beberapa saat untuk memikirkan semua ini.
sumber
Ini adalah jawaban untuk pertanyaan spesifik Anda:
Anda dapat mencoba rzip , tetapi bekerja dengan cara yang sedikit berbeda dari kompres / bzip / gzip:
rzip berharap dapat membaca seluruh file, jadi itu tidak dapat dijalankan dalam pipa. Ini akan sangat meningkatkan persyaratan penyimpanan lokal Anda dan Anda tidak akan dapat menjalankan cadangan dan mengirim cadangan melalui kabel dalam satu pipa tunggal. Yang mengatakan, file yang dihasilkan, setidaknya menurut tes ini , sedikit lebih kecil.
Jika kendala sumber daya Anda adalah pipa Anda, Anda akan menjalankan backup 24x7 jadi Anda hanya perlu menyalin snapshot terus-menerus dan berharap Anda tetap melakukannya.
Perintah baru Anda adalah:
Anda akan ingin memasukkan koreksi kesalahan yang lebih baik, dan Anda ingin mempertimbangkan menggunakan sesuatu seperti rsync untuk mentransfer file terkompresi sehingga jika transfer gagal di tengah Anda dapat mengambil di mana Anda tinggalkan.
sumber
Banyak hal telah berubah pada tahun-tahun sejak pertanyaan ini diposting:
1: ZFS sekarang mendukung replikasi terkompresi, tambahkan saja flag -c ke perintah kirim zfs, dan blok apa yang dikompres pada disk akan tetap terkompresi ketika mereka melewati pipa ke ujung lainnya. Mungkin masih ada lebih banyak kompresi yang bisa diperoleh, karena kompresi default di ZFS adalah lz4
2: Kompresor terbaik untuk digunakan dalam hal ini adalah zstd (ZStandard), sekarang memiliki mode 'adaptif' yang akan mengubah tingkat kompresi (antara 19 tingkat yang didukung, ditambah kecepatan zstd-cepat tingkat baru) berdasarkan kecepatan tautan antara zfs send dan zfs recv. Ini memampatkan sebanyak mungkin sambil menjaga antrian data menunggu untuk keluar pipa ke minimum. Jika tautan Anda cepat, tidak akan membuang waktu untuk mengompresi data lebih banyak, dan jika tautan Anda lambat, itu akan terus bekerja untuk mengompres data lebih banyak dan menghemat waktu Anda pada akhirnya. Ini juga mendukung kompresi berulir, jadi saya bisa memanfaatkan beberapa core, yang tidak dimiliki gzip dan bzip, di luar versi khusus seperti pigzip.
sumber
Saya berasumsi Anda tidak dapat meningkatkan bandwidth mentah situs Anda ...
Anda mungkin melihat manfaat dari tidak menggunakan kompresi pada host.
Jika Anda menggunakan sesuatu seperti pengoptimal lemah, itu akan dapat mengoptimalkan transfer jauh lebih baik jika Anda tidak mengkompres file sebelum Anda mengirimnya, yaitu Anda melakukan persis apa yang Anda lakukan tetapi menghapus bzip2 dari pipa. Setelah beberapa kali pencadangan Anda, pengoptimal yang lemah akan menembolok sebagian besar dari barang-barang yang dilihatnya dalam transfer dan Anda akan melihat peningkatan besar dalam kecepatan transfer.
Jika Anda memiliki anggaran terbatas, Anda mungkin dapat melihat peningkatan serupa dengan menggunakan rsync dan rsyncing snapshot yang tidak terkompresi , yaitu:
Ini akan lebih cepat karena rsync hanya akan mentransfer perbedaan antara snapshot kemarin dan hari ini. Bergantung pada bagaimana proses snapshotting bekerja, mungkin masih ada banyak redundansi di antara keduanya bahkan jika mereka tidak benar-benar file yang sama sekali.
Pengoptimal lemah adalah cara yang jauh lebih mungkin untuk memperbaiki masalah ini (yah, metro ethernet adalah cara yang paling mungkin untuk menyelesaikan masalah ini, tetapi kami akan mengabaikannya). Rsync hanyalah bidikan liar dalam gelap yang layak diuji (secara lokal; rsync akan memberi tahu Anda berapa banyak waktu yang dihemat melalui salinan langsung) pada data lokal Anda sebelum menulis cek besar untuk serat atau pemasangan dasar sungai.
sumber
Untuk apa nilainya. Saya tidak akan melakukan pengiriman langsung | kompres | dekompresi | menerima ini dapat menyebabkan masalah di ujung penerima jika garis transfer terputus dan kolam Anda akan offline untuk waktu yang lama selama penerimaan. Kami mengirim ke file lokal kemudian gzip snapshot dan transfer menggunakan rsync (dengan dasar sungai), kemudian kami terima dari file tersebut. Dasar sungai tidak mengoptimalkan lalu lintas TETAPI jika ada masalah dengan transfer dan perlu dimulai kembali dasar sungai mempercepat pengiriman ulang.
Kami telah melihat tidak mengompresi snapshot inkremental, menggunakan kompresi Rsync dan tidak menggunakan kompresi apa pun selain dasar sungai. Sulit untuk mengatakan mana yang terbaik tetapi ketika kami mentransfer archivelog dari oracle dengan kompresi rsync, laju transfer kira-kira dua kali lipat dari file biasa dan dasar sungai (dengan RSync).
Jika Anda memiliki dasar sungai maka gunakan rsync bukan ssh karena dasar sungai memahami rsync dan akan mencoba untuk mengoptimalkannya dan akan menambahkan data ke cache (lihat di atas, memulai kembali transfer).
sumber
Pengalaman saya adalah bahwa
zfs send
itu cukup meledak walaupun jauh lebih cepat (rata-rata) daripada langkah kompresi berikut. Cadangan saya memasukkan buffering yang cukup setelahzfs send
dan lebih setelahgzip
:Dalam kasus saya, perangkat output terhubung dengan USB (bukan jaringan), tetapi buffering penting untuk alasan yang sama: Waktu cadangan keseluruhan lebih cepat ketika drive USB disimpan 100% sibuk. Anda tidak boleh mengirim lebih sedikit byte secara keseluruhan (seperti yang Anda minta) tetapi Anda masih bisa menyelesaikan lebih cepat. Buffering menjaga langkah kompresi terikat CPU dari menjadi IO-terikat.
sumber
Saya menggunakan pbzip2 sepanjang waktu (paralel bzip2) saat mengirim melalui WAN. Karena ini adalah utas, Anda dapat menentukan jumlah utas untuk digunakan dengan opsi -p. Instal pbzip2 terlebih dahulu pada host pengirim dan penerima, instruksi instalasi ada di http://compression.ca/pbzip2/ .
Kunci utamanya adalah membuat snapshot pada interval yang sering (~ 10 menit) untuk membuat ukuran foto Anda lebih kecil lalu kirim setiap foto. ssh tidak akan melanjutkan dari aliran snapshot yang rusak jadi jika Anda memiliki snapshot besar untuk dikirim, pipa aliran ke pbzip2 kemudian dipecah menjadi potongan-potongan berukuran dikelola, kemudian rsync membagi file ke host penerima, kemudian pipa ke zfs untuk memulihkan file pbzip2 yang digabungkan.
ini akan menghasilkan file dengan nama potongan 500MB:
rsync untuk menerima host beberapa kali (Anda dapat rsync bahkan sebelum zfs mengirim selesai atau segera setelah Anda melihat potongan 500MB yang lengkap), tekan ctrl + c kapan saja untuk membatalkan:
zfs menerima:
User freind menyebutkan: Untuk apa nilainya. Saya tidak akan melakukan pengiriman langsung | kompres | dekompresi | menerima ini dapat menyebabkan masalah di ujung penerima jika garis transfer terputus dan kolam Anda akan offline untuk waktu yang lama selama penerimaan. - Saya pernah mengalami masalah sebelumnya dengan versi zfs yang lebih lama <28 di host penerima jika send / recv yang sedang berlangsung terganggu oleh tetes jaringan tetapi tidak sejauh bahwa pool dibatalkan. Itu menarik. Kirim ulang snapshot hanya jika "zfs recv" telah keluar di sisi penerima. Bunuh "zfs recv" secara manual jika diperlukan. zfs send / recv sekarang jauh lebih baik di FreeBSD atau Linux.
sumber
Anda dapat mengambil cipher yang lebih cepat untuk ssh mungkin blowfish-cbc, juga coba sakelar -123456789
sumber
Anda perlu menguji dengan data Anda. Kirimkan saja ke file dan kompres dengan setiap metode.
Bagi kami, gzip membuat perbedaan besar dan kami menjalankan semuanya, tetapi bahkan tidak ada perbedaan 1% antara gzip dan bzip atau 7z.
Jika Anda menggunakan T1 yang lambat, Anda harus menyimpannya di file dan rsync.
Bagi mereka (bukan Anda) yang dibatasi sedikit lebih banyak oleh CPU daripada bandwidth, seperti lstvan mengatakan cipher yang berbeda seperti arcfour128 mempercepat semuanya. Kami menggunakannya secara internal saat memindahkan barang.
sumber
Eksperimen dengan mengaktifkan dedup untuk zfs kirim dengan -D. Penghematan tergantung pada seberapa banyak duplikasi yang ada dalam data Anda, tentu saja.
sumber
-i
yang menyiratkan cadangan "tambahan", tidak ada banyak harapan yang-D
akan memberikan apa pun.Algoritma kompresi "terbaik" tergantung pada tipe data apa yang Anda miliki - jika Anda mendorong kompresi koleksi MP3 mungkin akan memperlambat proses, sementara teks / file log dapat dikompresi secara signifikan dengan
gzip -9
.Berapa banyak data yang Anda dorong setiap hari?
sumber
Sudahkah Anda mempertimbangkan untuk menyetel tumpukan TCP / IP sehingga Anda menjadi penyangga TCP dan ukuran jendela sedikit lebih besar? Anda dapat menggunakan
ndd
alat di Solaris untuk ini atausysctl
alat di Linux / BSD / Mac OSX. Di Solaris, Anda mencari/dev/tcp tcp_max_buf
dan/dev/tcp tcp_cwnd_max
menghargai, dan di sysctl Linux, Anda mencarinet.ipv4.tcp_mem
,net.ipv4.tcp_rmem
dannet.ipv4.tcp.wmem
menghargai.Juga, tautan ini mungkin bisa membantu tambahan:
Penyesuaian Kinerja TCP Solaris
Ada satu set tautan di bagian bawah halaman itu yang akan menjelaskan bagaimana melakukan hal yang sama untuk Linux / BSD / OSX juga.
sumber