LINUX.ORG.RU
решено ФорумAdmin

Осваиваем ZFS: как правильно готовить?

 , , ,


2

3

Из чистого любопытства, просто для ознакомления, поднял две виртуалки CentOS 8.2 (15 Гб под систему lvm), 4 виртуальных диска такого же размера в ZFS RAID 10.

zfs-0.8.5-1

zfs-kmod-0.8.5-1

В систему говноскриптом поставил LAMP, подмонтировал ZFS-пулл для его файлов.

Стащил скрипт со stackexchange

#!/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/bin/date '+%Y%m%d%H%M%S')
source_pool=data
destination_pool=data
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=hostname

# 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

На ВМ-источнике создаю в подмонтированном каталоге текстовый файл. Запускаю скрипт.

Выхлоп:

cannot receive new filesystem stream: destination has snapshots (eg. data@DO_NOT_DELETE_remote_replication_20201207101336)
must destroy them to overwrite it
cannot create snapshot 'data@DO_NOT_DELETE_remote_replication_20201207103101': dataset already exists
no snapshots were created
WARNING: could not send data@DO_NOT_DELETE_remote_replication_20201207103101:
incremental source (data@DO_NOT_DELETE_remote_replication_20201207103101) is not earlier than it
cannot receive: failed to read from stream

Хотя на целевой ВМ никаких снепшотов, конечно, нет.

ЧЯДНТ?

★★★★★

Последнее исправление: Twissel (всего исправлений: 2)

Я думаю, что на целевом пуле, таки что-то есть.

Кстати, имеются нормальные скрипты для бэкапа - syncoid, znapzend. Погугли. Там все эти детские болезни - пройдены.

Harliff ★★★★★
()
Ответ на: комментарий от Harliff

Про znapzend как раз сейчас читаю...

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Harliff

Да, действительно

[root@s2 ~]# zfs list -t all -r data2
NAME                                                    USED  AVAIL     REFER  MOUNTPOINT
data2                                                  78,1M  28,0G     78,0M  /data2
data2@DO_NOT_DELETE_remote_replication_20201207111749     0B      -     78,0M  -

Что сие значит?

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Harliff

Для начала хочется посмотреть всё на максимально низком уровне, чтобы не быть макакой и собрать чуток граблей.

Что я и делаю :-)

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Что сие значит?

zpool history data2
покажет тебе все операции с пулом

Minona ★★☆
()
Ответ на: комментарий от Twissel

Для начала хочется посмотреть всё на максимально низком уровне

man zdb
эта тулза многое тебе расскажет о низких уровнях zfs =)

Minona ★★☆
()
Ответ на: комментарий от Harliff

Для начала при первом запуске скрипта закомментировал

# 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)

Все заработало. Видимо, что ошибка в ключах инкрементального создания снимков.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Harliff

Неа, проблема была в самом скрипте:

если сначала создать полный снепшот пула, закомментировав строки создания инкрементых, а потом сделать наоборот, то всё работает.

Нужно добавить переменную и если она истинна, тогда делаем только инкрементные снепшоты.

Т.е. если после создания полного снепшота сразу запустить создание инкрементного будет ошибка как из ОП

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Harliff

говнокод вроде такого

#!/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/bin/date '+%Y%m%d%H%M%S')
source_pool=data
destination_pool=data2
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=s2.local.site
file="test.lock"
# Create first recursive snapshot of the whole pool.
create_fullsnapshot() {
  zfs snapshot -r "$new_snap"
  # Initial replication via SSH.
  zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
  touch $file
}

create_incremental_snapshot() {

	# 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"

}

if [ -e ${file} ]; then
	create_incremental_snapshot
   else
      create_full_snapshot
fi      
# 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

При таком раскладе все работает, а если скрипт из ОП - нет.

Pinkbyte, ничего не подскажешь?

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: говнокод вроде такого от Twissel

я не настоящий сварщик, но в скрипте из темы между двумя вызовами

zfs snapshot -r "$new_snap"
Переменная new_snap не меняется.

Создать два снапшота с одинаковым именем нельзя, насколько мне известно.

Это первое что бросилось в глаза.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

А ведь, действительно, и ошибка из ОП говорит то же.

Спасибо!

Twissel ★★★★★
() автор топика
Ответ на: говнокод вроде такого от Twissel

неправильно вызвал функцию

#!/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/bin/date '+%Y%m%d%H%M%S')
source_pool=data
destination_pool=data2
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=s2.local.site
file="test.lock"
# Create first recursive snapshot of the whole pool.
create_full_snapshot() {
  zfs snapshot -r "$new_snap"
  # Initial replication via SSH.
  zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
  touch $file
}

create_incremental_snapshot() {

	# 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"

}

if [ -e ${file} ]; then
	create_incremental_snapshot
   else
      create_full_snapshot
fi      
# 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

Говнокод все-таки работает, а код из ОП даже с разными именами снепшотов, даёт ошибку

#!/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/bin/date '+%Y%m%d%H%M%S')
source_pool=data
destination_pool=data
new_full_snap="$source_pool"@"$snapshot_string""$timestamp""f"
new_inc_snap="$source_pool"@"$snapshot_string""$timestamp""i"
destination_host=s2.local.site

# Initial send:

# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_full_snap"
# Initial replication via SSH.
zfs send -R "$new_full_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_inc_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_inc_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

Ошибка

cannot receive new filesystem stream: destination has snapshots (eg. data2@DO_NOT_DELETE_remote_replication_20201208215316i)
must destroy them to overwrite it
cannot receive incremental stream: most recent snapshot of data2 does not
match incremental source

Где я налажал интересно?

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.