як в односторонньому дзеркалі весь пул zfs до іншого пулу zfs


16

У мене є один zfs пул, який містить кілька дзвінків і наборів даних, деякі з яких також вкладені. Усі набори даних та дзвінки періодично знімаються zfs-auto-знімком. Усі набори даних та дзвінки також мають декілька створених вручну знімків.

Я встановив віддалений пул, на якому через брак часу початкове копіювання через локальну швидкісну мережу через zfs send -R не завершилось (деякі набори даних відсутні, деякі набори даних застаріли або відсутні знімки).

Тепер пул фізично віддалений через з'єднання з низькою швидкістю, і мені потрібно періодично синхронізувати віддалений пул з локальним пулом, тобто дані, наявні в локальному пулі, повинні бути скопійовані у віддалений пул, дані, що вийшли з локального пулу, повинні бути видалені з віддаленого пулу, і Дані, наявні у віддаленому пулі, але не в локальному пулі, повинні бути видалені з віддаленого пулу, за допомогою даних, що означають "zvols", "набори даних" або "snapshots".

Якби я робив це між двома звичайними файловими системами, використовуючи rsync, це було б "-axPHAX --delete" (саме це я роблю для створення резервної копії деяких систем).

Як налаштувати завдання синхронізації, щоб дзвінки та набори даних віддаленого пулу (включаючи їх знімки) могли синхронізуватися з локальними дзвінками, наборами даних та знімками?

Я хотів би уникати передачі через ssh через низьку продуктивність ssh; Я б вважав за краще mbuffer або iscsi.


Як ви зробили свій початковий zfs send -R ...? Якщо ви переводили вихід через ssh, ви відключили символи втечі zfs send -R ... | ssh -e none ...?
Ендрю Генле

Крім того - вам потрібно переконатися, що ваш повільний зв’язок має достатню пропускну здатність, щоб оновити копію оновленою. Якщо ви отримаєте більше змін у локальній системі, ніж ви можете надіслати у віддалену систему, ви ніколи не зможете оновлювати віддалену копію. Візьміть потік реплікації zfs і збережіть його у файлі. Якщо файл перевищує кількість даних, які ви можете надіслати на віддалений сайт за проміжок часу між знімками, ви ніколи не будете в курсі. zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
Ендрю Генле

Ви також можете спробувати використовувати цей сценарій, щоб зробити це автоматично: github.com/psy0rz/zfs_autobackup/blob/master/README.md
edwin eefting

Відповіді:


12

Відмова: Оскільки я ніколи не використовував дзвінки, я не можу сказати, чи відрізняються вони у тиражуванні, ніж звичайні файлові системи чи знімки. Я припускаю, що вони є, але не приймайте за це мого слова.


Насправді у вас багато запитань, я намагаюся відповісти на них окремо:

Як копіювати / дзеркально завершувати басейн у віддалене місце

Потрібно розділити завдання на дві частини: по-перше, початкова реплікація повинна бути завершеною, згодом можлива інкрементальна реплікація, доки ви не зіпсуєтесь зі своїми знімками реплікації . Щоб увімкнути поступову реплікацію, вам потрібно зберегти останні знімки реплікації, все до цього можна видалити. Якщо ви видалите попередній знімок, zfs recvбуде скаржитися і скасовувати реплікацію. У цьому випадку вам доведеться починати все заново, тому намагайтеся цього не робити.

Якщо вам просто потрібні правильні варіанти, вони є:

  • zfs send:
    • -R: надсилайте все під заданий пул або набір даних (рекурсивна реплікація, необхідна весь час, включає -p). Також при отриманні всі видалені знімки джерела видаляються у пункті призначення.
    • -I: включити всі проміжні знімки між останнім знімком реплікації та поточним знімком реплікації (потрібні лише при поступових надсиланнях)
  • zfs recv:
    • -F: розширити цільовий пул, включаючи видалення існуючих наборів даних, які видаляються з джерела
    • -d: відкиньте ім'я вихідного пулу та замініть його назвою пулу призначення (решта шляхів файлової системи будуть збережені, а за потреби також створені)
    • -u: не монтуйте файлову систему за призначенням

Якщо ви віддаєте перевагу повний приклад, ось невеликий сценарій:

#!/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

Використовуйте щось швидше, ніж SSH

Якщо у вас є достатньо захищене з'єднання, наприклад, IPSec або тунель OpenVPN і окремий VLAN, який існує лише між відправником і одержувачем, ви можете перейти з SSH на незашифровані альтернативи, такі як mbuffer, як описано тут , або ви можете використовувати SSH зі слабким / відсутнім шифруванням та відключене стиснення, про що тут докладно . Також був веб-сайт про те, як передати SSH набагато швидше, але, на жаль, я не пам'ятаю URL-адресу - я відредагую її пізніше, якщо знайду.

Для дуже великих наборів даних і повільних з’єднань може бути корисним також перша передача через жорсткий диск (використовуйте зашифрований диск для зберігання zpool та передачі його в герметичному пакеті кур'єром, поштою або особисто). Оскільки спосіб передачі не має значення для send / recv, ви можете передавати все на диск, експортувати пул, відправляти диск до місця призначення, імпортувати пул, а потім передавати всі додаткові надсилання через SSH.

Проблема зі змішаними знімками

Як було сказано раніше, якщо ви видалите / зміните знімки реплікації, ви отримаєте повідомлення про помилку

cannot send 'pool/fs@name': not an earlier snapshot from the same fs

що означає, що або ваша команда була неправильною, або ви перебуваєте в непослідовному стані, коли потрібно видалити знімки і почати все спочатку.

Це має кілька негативних наслідків:

  1. Ви не можете видалити знімок реплікації, поки успішно не буде передано новий знімок реплікації. Оскільки ці знімки реплікації включають стан усіх інших (старіших) знімків, порожній простір видалених файлів та знімків буде відновлено лише у тому випадку, якщо реплікація закінчиться. Це може призвести до тимчасових або постійних проблем з простором у вашому пулі, які ви зможете виправити, лише перезапустивши або закінчивши повну процедуру реплікації.
  2. У вас буде багато додаткових знімків, що уповільнює команду списку (за винятком Oracle Solaris 11, де це було виправлено).
  3. Можливо, вам потрібно буде захистити знімки від (випадкового) видалення, за винятком самого сценарію.

Існує можливе рішення цих проблем, але я сам цього не пробував. Ви можете використовувати zfs bookmarkнову функцію в OpenSolaris / illos, створену спеціально для цього завдання. Це звільнить вас від управління знімками. Єдиний мінус полягає в тому, що в даний час він працює лише для окремих наборів даних, а не рекурсивно. Вам потрібно буде зберегти список усіх своїх старих і нових наборів даних, а потім провести циклічну передачу над ними, робити закладки, надсилати та отримувати їх, а потім оновлювати список (або невелику базу даних, якщо вам зручніше).

Якщо ви спробуєте маршрут закладок, мені було б цікаво почути, як це у вас вийшло!


дуже дякую за цю детальну відповідь. я просто надсилаю .. отримання-а zpool.
тремтіння

1
хороший сценарій. Я додам -d 1до обох zfs listкоманд обмеження глибини пошуку (шукати не потрібно під назвою пулу). Це дозволяє уникнути тривалих затримок у басейнах із великою кількістю знімків (наприклад, мій "резервний" пул містить 320000 знімків та zfs list -r -t snapshot backupзаймає 13 хвилин. Біг займає всього 0,06 секунди -d 1). zfs destroyКоманди протягом циклу , то потрібна -rможливість рекурсивно видалити всі знімки з тієї ж snapname.
cas

5

Особисто я склав би собі список дзвінків, наборів даних тощо на віддаленому сервері, які не мають сучасних знімків, а потім приведу ці знімки в актуальність zfs send, навіть якщо це забирає багато часу і використовує багато пропускної здатності.

Тоді я можу просто продовжувати використовувати zfs sendз цього моменту і не потрібно винаходити колесо, написавши власний код синхронізації. rsyncдобре для старих файлових систем, але zfs sendнабагато краще для zfs - він точно знає , які блоки змінилися на знімку та надсилає лише їх, тоді як rsync має порівнювати окремі файли та / або часові позначки між локальними та віддаленими серверами. те саме стосується btrfs sendі пулів btrfs.

Якщо у вас є лише невелика кількість знімків, які потрібно оновити, це можна зробити вручну. В іншому випадку, щоб зробити це автоматично, вам потрібен список останніх локальних знімків та віддалених знімків та сценарій для порівняння версій, а потім zfs sendлокальних знімків, які застаріли на сервері rmeote.

Цього буде достатньо, якщо ви дбаєте лише про останній знімок для кожного набору даних. Якщо ви переймаєтесь усіма попередніми знімками, очевидно, ваш сценарій також повинен буде працювати з ними .... і це стає ВЕЛИКІ складнішим. У деяких випадках вам може знадобитися відкат на віддаленому сервері, щоб ви могли повторно надіслати проміжні / відсутні зйомки.

Якщо ви хочете забезпечити безпечне з'єднання з віддаленим сервером, у вас дійсно мало вибору, ніж використовувати ssh- або, можливо, налаштувати тунель з openvpnчимось і використовувати netcat.


Що робити з Zrep? bolthole.com/solaris/zrep
Xdg

не знаю, ніколи не використовував. Схоже, це дасть хорошу відповідь, хоча якби хтось здійснив невелике дослідження та тестування і написав це (це підказка).
cas

Я тестував це на Ubuntu (ZFS на Linux), і він не працював на більш глибоких наборах даних (танк / щось / щось інше). Я використовував цей порт для оболонки - посилання . Рекурсивний прапор export ZREP_R=-Rвзагалі не працював. :(
Xdg

1

Подивіться на `zrepl ', на FreeBSD, який міг би зробити ваше життя, і будь-кого з цього питання набагато простіше. Він був представлений кілька днів тому під час BSDCan2018 в Оттаві. Це виглядає перспективно і може бути вирішенням ваших проблем



Питання в запитанні: "Як встановити завдання синхронізації, щоб віддалені дзвінки пулу та набори даних (включаючи їх знімки) могли синхронізуватися з локальними дзвінками, наборами даних та знімками?"
Джефф Шаллер

0

zrep - це приємне рішення "все в одному", і має документацію + гачки про те, як отримати швидші передачі, ніж просто звичайні передачі SSH

https://github.com/bolthole/zrep

це також кросплатформна форма: підтримується на Linux, freebsd та solaris /lumos



1
Питання в запитанні: "Як встановити завдання синхронізації, щоб віддалені дзвінки пулу та набори даних (включаючи їх знімки) могли синхронізуватися з локальними дзвінками, наборами даних та знімками?"
Джефф Шаллер

Джефф, ти припускаєш, що найкращою "відповіддю" було б вирізати біти-вставити біти з документації на zrep, а не просто посилатися на zrep?
Філіп Браун

1
Я не знаю, яка найкраща відповідь була б, але посилання на програмне забезпечення не є рішенням. Про це вже було сказано, насправді. Питання задає: "Як встановити завдання синхронізації, щоб віддалені дзвінки пулу та набори даних (включаючи їх знімки) могли синхронізуватися з локальними дзвінками, наборами даних та знімками?"
Джефф Шаллер

так, це питання. Однак для того, щоб виконати завдання ДОБРО, потрібно набагато більше, ніж трохи запису на веб-сторінці. Ось чому zrep - це оболонка 2000 рядка. Навіть якби було видалити всі частини, які ніколи не потребували початкової проблеми, все одно знайдеться кілька сотень рядків сценарію, щоб зробити це ДОБРО.
Філіп Браун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.