Migrasikan gambar disk mentah melalui LAN

8

Inilah situasi saya:

  • Dua dedicated server di datacenter yang sama dengan gigabit ethernet di antaranya.
  • Kedua server khusus ini mem-boot ke lingkungan penyelamatan berdasarkan Debian Squeeze dengan tambahan alat dan utilitas. Juga banyak ruang tmp (32GB RAM pada kedua kotak) untuk mengunduh perangkat lunak, menginstal paket, dan / atau mengkompilasi sesuai kebutuhan.
  • Kedua dedicated server memiliki sekitar 3TB ruang yang dapat digunakan.
  • Server "sumber" memiliki disk 4 x 1,5TB di Hardware RAID-10 dengan pengontrol port Adaptec 4.
  • Server "tujuan" memiliki disk 2 x 3TB di Hardware RAID-1 dengan pengontrol port Adaptec 2 - generasi yang sama dengan yang lain, tetapi jumlah port yang berbeda.
  • Jumlah blok yang dapat digunakan pada /dev/sdaberbeda kurang dari 10 MB, tetapi array server tujuan untuk beberapa alasan beberapa MB lebih kecil.
  • Kedua array RAID dikonfigurasikan untuk menggunakan seluruh permukaan disk semua disk konstituen untuk membuat satu, volume RAID tunggal.
  • Sistem operasi melakukan booting dalam mode MBR; tidak ada booting UEFI digunakan.

Apa yang ingin saya lakukan:

  • Salin, pada lapisan blok, seluruh gambar OS (ini hanya terdiri dari bootloader GRUB2 di tabel partisi GPT, / partisi boot, dan / partisi) dari server "sumber" ke server "tujuan".
  • Jika memungkinkan , salinannya akan berlangsung "langsung": ini berarti saya tidak memiliki cukup ruang untuk menyimpan file gambar disk yang tepat di sisi tujuan, kecuali jika saya membongkar gambar disk ke hard disk sebagai salinan. sedang terjadi . Koneksi ethernet gigabit antara server cukup dapat diandalkan sehingga saya nyaman dengan ini, dan tentu saja saya akan berjalan fsckpada kedua ujung (sumber dan tujuan) untuk memverifikasi sistem file OK sebelum dan setelah transfer.
  • Jika memungkinkan , jangan transfer blok melalui jaringan, yang tidak digunakan oleh sistem file konstituen di setiap partisi (semua partisi diformat sebagai ext4). Ini karena lebih dari 50% dari disk "sumber" adalah ruang kosong di /partisi.
  • Sesuaikan ukuran /partisi sehingga ketika disalin, ukurannya disesuaikan agar pas dengan ukuran disk tujuan yang lebih kecil.
  • Setelah salinan berhasil, pasang setiap volume dan perbaiki referensi ke IP statis untuk mencerminkan IP server baru. (Dapat melakukan ini dengan baik tanpa bantuan lebih lanjut)

Pertanyaan saya:

  • Haruskah saya menghitung dulu perbedaan (dalam byte) antara ukuran /dev/sdapada setiap server, dan kemudian gunakan e2resizeuntuk secara non-destruktif mengurangi ukuran /partisi di sisi sumber sehingga akan masuk ke dalam ruang sisi tujuan?
  • Haruskah saya menjalankan ddperangkat raw block, /dev/sdadari sumber ke tujuan (lebih ssh), atau haruskah saya membuat tata letak partisi yang setara pada tujuan dan berjalan dddi setiap partisi ? Perhatikan bahwa menangani partisi pada satu waktu membuat saya masalah dengan bootloader, tetapi jika saya tidak melakukannya partisi pada suatu waktu, maka ddperlu tahu untuk berhenti mentransfer data setelah itu telah menulis banyak byte karena tujuan dapat menampung (yang diharapkan akan "menutup" bagian paling akhir dari /partisi di blok terakhir, yang secara logis "di sebelah kanan" semua partisi lain di tata letak partisi sumber).

Beberapa misc. spesifik:

  • OS host pada kotak sumber adalah Ubuntu Server 12.04 yang menjalankan beberapa tamu OpenVZ
  • Karena kedua kotak di-boot menjadi penyelamat, akses disk langsung dimungkinkan tanpa mengharapkan perubahan apa pun pada data yang mendasarinya oleh sistem operasi yang berjalan.
allquixotic
sumber
Apakah Anda benar-benar perlu menyalin blok yang digunakan dari perangkat, atau hanya sistem file OS?
Andrew

Jawaban:

6

Ini berantakan, tetapi bisa dilakukan.

Saya kira di sini yang /aktif /dev/sda3dan yang /bootaktif /dev/sda1.

  1. Kecilkan filesystem di server lama ke ukuran seminimal mungkin.

    oldserver # resize2fs -M /dev/sda3
    
  2. Partisi disk server baru dengan ukuran /boot, swapspace, dan /partisi baru yang identik (dan apa pun yang Anda butuhkan).

    newserver # parted /dev/sda
    
  3. Salin /dan /bootfilesystems.

    oldserver # dd if=/dev/sda1 | ssh root@newserver "dd of=/dev/sda1"
    oldserver # dd if=/dev/sda3 | ssh root@newserver "dd of=/dev/sda3"
    

    Karena partisi di server baru akan sedikit lebih kecil daripada yang ada di server lama, Anda akan menerima No space left on devicepesan palsu di akhir ini. Namun, karena Anda mengecilkan sistem file pada langkah 1, ini tidak masalah.

  4. Ubah ukuran sistem file pada server baru ke ukuran partisi.

    newserver # resize2fs /dev/sda3
    
  5. Instal GRUB pada disk baru.

    newserver # mount /dev/sda3 /mnt
    newserver # mount /dev/sda1 /mnt/boot
    newserver # mount -o bind /dev /mnt/dev
    newserver # mount -o proc proc /mnt/proc
    newserver # chroot /mnt /bin/bash
    
    newserver(chroot) # grub-install /dev/sda
    newserver(chroot) # exit
    
  6. Selesaikan sisa perbaikan Anda (alamat IP, dll.).

Anda mungkin dapat menemukan cara untuk menghindari menyalin ruang kosong partisi, tetapi mungkin Anda akan perlu waktu lebih lama untuk meneliti daripada hanya menyalin semuanya ...

Michael Hampton
sumber
Luar biasa! Saya baik-baik saja dengan menyalin ruang bebas partisi karena instruksi ini memenuhi semua kriteria saya yang lain. Meskipun, tidak hanya mengubah ukuran sistem file dan partisi itu sendiri pada oldservermenghilangkan kebutuhan untuk menyalin semua ruang kosong? Saya tidak peduli /bootkarena itu sangat kecil, tapi /setidaknya, saya bisa melakukannya, kan? Cukup atur sektor akhir partisi untuk menyamakan sektor apa yang resize2fsmengatur berakhirnya sektor FS. Nah, sektor, blok ... mungkin blok . Tapi terima kasih untuk ini! Ini bagus!
allquixotic
Ya, jika Anda juga mengurangi ukuran partisi, maka Anda akan menghindari banyak penyalinan. Itu mungkin menyelamatkan Anda beberapa jam ... Saya akan meninggalkan beberapa kelonggaran, untuk berjaga-jaga kalau-kalau matematika saya sedikit turun.
Michael Hampton
Itu juga akan menghilangkan palsu / menakutkan "Tidak ada ruang tersisa di perangkat", karena itu akan mengubah ukurannya /dev/sda3menjadi sekitar 1,3 TB dan akan menyalinnya ke partisi di tujuan yang diperkirakan akan menampung sekitar 2,9 TB.
allquixotic
Butuh beberapa saat . Menyadari saya memiliki port gigabit dengan alokasi 100 Mbit / s. Sampah.
allquixotic
5

Saya akan mkfsmenyegarkan filesystem di server baru, kalau begitursync dari sistem lama. Itu dapat dimulai kembali, konsisten, dan setiap file mudah diverifikasi secara individual. Di mana Anda membuang bagian sistem file yang tidak terpakai (bukan salinan forensik), saya tidak melihat alasan untuk tidak menggunakan metode ini. Anda harus menjalankan kembali GRUB, tetapi itu seharusnya tidak menjadi tantangan.

Menjelaskan salinan mentah yang sadar-sistem file akan memakan waktu cukup lama, jadi kecuali Anda berkomentar mengapa solusi rsync saya tidak berfungsi, saya tidak perlu mengetik.

Jeff Ferland
sumber
Saya pikir partimagedapat melakukan salinan mentah yang sadar filesystem, tetapi tidak mendukung ext4. Jadi ada yang sebagai pilihan ... rsynctampak lebih bagus sebagai pilihan, selama itu mempertahankan semua kontrol akses diskresioner (ala chmod) dan dapat menyalin dengan bersih lebih dari symlink dan file perangkat ...
allquixotic
Aku yang kedua jawaban Jeff. Anda dapat mentransfer tata letak partisi dengan sfdisk -d / dev / sda | tujuan ssh "sfdisk / dev / sdb". Buat filesystem Anda dan transfer dengan 'rsync -a -e "ssh -c arcfour" / mnt / root @ tujuan: / mnt /'. Langkah-langkah berikut mengikuti langkah 5 dari Michael Hampton jawaban untuk membuat tujuan bootable
Tim Haegele
1

Jika Anda BENAR-BENAR ingin mentransfer data pada tingkat perangkat blok, saya dapat memikirkan satu trik yang cukup berguna yang saya gunakan untuk memigrasi server dengan downtime minium yang terlibat.

Masalahnya, Anda dapat membuat mirror terdegradasi pada server sumber dengan partisi data Anda menjadi satu-satunya bagian aktif dari mirror, kemudian mengekspor partisi tujuan dari server kedua melalui AOE (saya kira kedua server Anda berada dalam domain broadcast yang sama). Di server sumber Anda kemudian menghubungkan perangkat blok jaringan ke cermin terdegradasi Anda sehingga akan mulai membangun kembali. Tunggu sampai pembangunan kembali selesai, hentikan mirror Anda, lepaskan perangkat yang diekspor AOE dan Anda baik-baik saja.

Sedikit lebih banyak detail mengikuti (saya akan mencoba membuatnya singkat).

Komponen:

  • mdadmdengan mode build -nya (cermin ad-hoc tanpa metadata);
  • vblade untuk mengekspor perangkat blok sebagai perangkat jaringan AOE;
  • aoe-tools untuk mengimpor perangkat blok jaringan AOE.

Anda harus membuat tabel partisi pada server tujuan Anda, kemudian mengecilkan partisi sumber sehingga cocok dengan tujuan. Anda dapat dengan mudah menginstal GRUB ke MBR baru Anda; sinkronisasi hanya partisi di atas tabel partisi yang baru dibuat sedikit lebih rentan kesalahan.

Di sisi penerima Anda harus mengekspor partisi Anda dengan vbladealat, pada server sumber Anda dapat melihat perangkat yang diekspor setelah menginstal aoe-tools(jalankan aoe-discoverkemudian lihat /dev/ether/perangkat).

Maka Anda harus membangun perangkat raid1 di server sumber dengan drive sumber Anda :

mdadm --build /dev/md0 -n2 -l1 --force /dev/sda

Setelah ini, Anda dapat memeriksa cermin yang baru dibangun:

mdadm --detail /dev/md0
cat /proc/mdstat

Pada titik ini Anda dapat dengan aman melampirkan partisi tujuan yang diekspor ke cermin ini:

mdadm /dev/md0 --add /dev/ether/eX.Y

Kemudian, awasi kemajuan sinkronisasi:

watch -n5 cat /proc/mdstat

Setelah sinkronisasi selesai, hentikan mirror: mdadm --stop /dev/md0di server sumber, hentikan vbladeproses di server tujuan, instal GRUB di server kedua, ubah alamat IP Anda, dll.

Sebenarnya, dengan trik ini adalah mungkin untuk memindahkan server di antara kotak-kotak hampir hidup, dengan downtime hanya untuk mem-boot ulang kotak yang disinkronkan.


Untuk alasan kinerja, saya juga menyarankan Anda meningkatkan MTU tautan Anda (atau mengatur VLAN terpisah dengan bingkai jumbo diaktifkan, jika mungkin).

Catatan, Anda juga dapat menggunakan sesuatu seperti nbd-server/ nbd-client(atau bahkan iSCSI, jika Anda menginginkannya kasar) sebagai alternatif untuk AOE, tetapi AOE ( vblade+ aoe-tools) memiliki antarmuka yang sangat sederhana dan kinerja yang hebat (tanpa overhead TCP / IP),

artyom
sumber
Saya juga menambahkan bahwa sinkronisasi pada tingkat perangkat blok kadang-kadang bisa BENAR-BENAR lebih cepat daripada pergi file-over-file dengan rsync, terutama ketika Anda memiliki jutaan (secara harfiah) file yang relatif kecil pada sistem file.
artyom
mdadm? Saya menggunakan perangkat keras RAID. Dan saya tidak tahu apa itu AOE, dan tidak pernah menggunakan iSCSI. Saya tidak berpikir server saya berada di domain broadcast yang sama, hanya di pusat data yang sama. Setidaknya ada satu atau dua sakelar di antara server.
allquixotic
Saya pikir ini ide yang bagus! Tetapi bagaimana cara menangani ukuran disk yang berbeda?
Tim Haegele
@ allquixotic, namun, Anda dapat mencoba skema berikut ini untuk mengganti AOE dengan nbd (perangkat blok jaringan, yang disediakan oleh nbd-serverdan nbd-clientpaket). mdadmdigunakan hanya untuk menyinkronkan dua perangkat blok, tidak ada metadata yang ditulis dalam buildmode, sehingga Anda dapat menggunakannya di atas perangkat blok apa pun (harus di-unmount dulu). Masalahnya, saya biasanya mengatur sistem baru pada serangan mdadm terdegradasi bahkan jika saya memiliki serangan hardware yang mendasari, cara ini saya bisa menerapkan teknik yang dijelaskan tanpa harus meng-unmount partisi, mengurangi downtime migrasi ke waktu reboot tunggal.
artyom