Zfs: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Дополнительные команды при вводе в кластер pve ноды)
(Добавить диски в действующий RAID1)
 
(не показаны 23 промежуточные версии этого же участника)
Строка 69: Строка 69:
 
  zfs set volsize=1000G rpool/data/vm-201-disk-1
 
  zfs set volsize=1000G rpool/data/vm-201-disk-1
  
=Дополнительные команды при вводе в кластер pve ноды=
+
==Эксперимент==
  
Запустить gparted и подвинуть раздел с lvm до конца физического диска -- вручную
+
===Задача===
  
После первой загрузки после клонирования дать эти команды и перезагрузить:
+
Быстро передавать состояние диска виртмашины между двумя узлами PVE.
  
cd /
+
Пусть по легенде у нас будет две виртуальных машины:
tar -xzpf /opt/node_template_config/etc_backup_default.tgz
 
  
Далее из под рута дать команды:
+
A -- виртмашина, на которой работает пользователь. Она расположена на узле PVE_A
 +
 
 +
B -- виртмашина, на которую нужно оперативно получать состояние диска машины A (изначально у нее диск или отсутствует или пустой). Она расположена на узле PVE_B
 +
 
 +
 
 +
Между узлами PVE_A и PVE_B гигабитная сеть и доступ по ssh по ключам (условно можно считать что эти оба узла являются узлами одного кластера, но не обязательно. Т.е. могут быть и отдельными PVE-узлами, вне кластера).
 +
 
 +
Полностью передавать диски по сети -- ёмкая по времени задача. Чтобы минимизировать временнЫе затраты, в общем виде набор действий будет следующим:
 +
 
 +
===Решение===
 +
 
 +
1. Создаём снапшот на A. Пусть будет снапшот с названием
 +
 
 +
ok
 +
 
 +
2. Перемещаем снапшот в новый (пока ещё не существующий на первом этапе) диск машины B
 +
Для этого на машине PVE_B выполняем команду, вид которой в общем виде следующий:
 +
 
 +
ssh root@PVE_A "zfs send -R zfspool2/vm-401-disk-0@dfl" | pv --size 125413212048 | zfs receive -o compress=zle zfspool2/vm-402-disk-0 -F
 +
 
 +
3. Создаём второй снапшот на A. Пусть будет снпашот с названием
 +
 
 +
ok1
 +
 
 +
команда
 +
 
 +
zfs snapshot zfspool2/vm-401-disk-0@ok1
 +
 
 +
4. Перемещаем снапшот в снапшот созданного в п.2 диска на машине B
 +
 
 +
ssh root@PVE_A "zfs send -i zfspool2/vm-401-disk-0@ok1" | pv --size 125413212048 | zfs receive -o compress=zle -A zfspool2/vm-402-disk-0
 +
 
 +
=Управление RAID массивами (zfs)=
 +
 
 +
==Создать аналог RAID 1+0==
 +
 
 +
Собираем пулл zfs (аналог RAID 1+0) с именем zfspool из дисков /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2
 +
 
 +
Первый шаг - создаём зеркало из первых двух
 +
 
 +
zpool create -f -o ashift=12 zfspool mirror /dev/sda2 /dev/sdb2
 +
 
 +
Второй шаг - в уже созданный пулл добавляем ещё одно зеркало
 +
 
 +
zpool add zfspool mirror /dev/sdc2 /dev/sdd2
 +
 
 +
Получаем как бы пулл из двух зеркал. Пул в этом случае является страйпом (RAID0) из двух зеркал (RAID1)
 +
 
 +
Далее тюним для PVE. Отключаем сжатие и синхронизацию (экспериментально подобрано при эксплуатации PVE).
  
lvcreate pve-vg --name vmstorage -L 400g
 
zpool create zfspool /dev/mapper/pve--vg-vmstorage -f
 
 
  zfs set compression=off zfspool
 
  zfs set compression=off zfspool
 
  zfs set sync=disabled zfspool
 
  zfs set sync=disabled zfspool
  
  /opt/node_template_config/apply_rename.sh ИМЯ_УЗЛА
+
==Проверить состояние пулла==
 +
 
 +
Проверяем пулл с именем zfspool
 +
 
 +
  zpool status zfspool
 +
 
 +
В ответ придёт что-то типа этого:
 +
 
 +
<pre>
 +
  pool: zfspool
 +
state: ONLINE
 +
config:
 +
 
 +
NAME        STATE    READ WRITE CKSUM
 +
zfspool    ONLINE      0    0    0
 +
  mirror-0  ONLINE      0    0    0
 +
    sda2    ONLINE      0    0    0
 +
    sdb2    ONLINE      0    0    0
 +
  mirror-1  ONLINE      0    0    0
 +
    sdc2    ONLINE      0    0    0
 +
    sdd2    ONLINE      0    0    0
 +
</pre>
 +
 
 +
==Выбросить раздел из пулла==
 +
 
 +
Например, нужно выбросить раздел sda2.
 +
 
 +
Тогда сначала делаем этот раздел OFFLINE
 +
 
 +
zpool offline zfspool sda2
 +
 
 +
Затем вынимаем из пулла
 +
 
 +
zpool detach zfspool sda2
 +
 
 +
Если это пулл STRIPE то можно выбросить из него разлел, однако нужно иметь в виду что занятого места в пуле должно быть столько, сколько останется после отсоединения раздела от него. Т.е. пулл уменьшится.
 +
 
 +
Чтобы убрать раздел sda2 из страйпового пулла zfspool команда
 +
 
 +
zpool remove zfspool sda2
 +
 
 +
==Заменить раздел в пулле==
 +
 
 +
Допустим
 +
 
 +
zpool status zfspool
 +
 
 +
Показывает такой результат
 +
 
 +
<pre>
 +
  pool: zfspool
 +
state: ONLINE
 +
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
 +
131K memory used for removed device mappings
 +
config:
 +
 
 +
NAME          STATE    READ WRITE CKSUM
 +
zfspool      ONLINE      0    0    0
 +
  mirror-1    ONLINE      0    0    0
 +
    sdc2      ONLINE      0    0    0
 +
    sdd2      ONLINE      0    0    0
 +
  mirror-3    ONLINE      0    0    0
 +
    sda2      ONLINE      0    0    0
 +
    sdb2      ONLINE      0    0    0
 +
 
 +
</pre>
 +
 
 +
и требуется заменить диск sdc2 на диск sde2 в mirror-1 пулла под названием zfspool
 +
 
 +
Тогда сначала делаем sdc2 OFFLINE командой
 +
 
 +
zpool offline zfspool /dev/sdc2
 +
 
 +
При этом статус
 +
 
 +
zpool status zfspool
 +
 
 +
должен быть примерно такой
 +
 
 +
<pre>
 +
pool: zfspool
 +
state: DEGRADED
 +
status: One or more devices has been taken offline by the administrator.
 +
Sufficient replicas exist for the pool to continue functioning in a
 +
degraded state.
 +
action: Online the device using 'zpool online' or replace the device with
 +
'zpool replace'.
 +
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
 +
131K memory used for removed device mappings
 +
config:
 +
 
 +
NAME          STATE    READ WRITE CKSUM
 +
zfspool      DEGRADED    0    0    0
 +
  mirror-1    DEGRADED    0    0    0
 +
    sdc2      OFFLINE      0    0    0
 +
    sdd2      ONLINE      0    0    0
 +
  mirror-3    ONLINE      0    0    0
 +
    sda2      ONLINE      0    0    0
 +
    sdb2      ONLINE      0    0    0
 +
 
 +
</pre>
 +
 
 +
Далее даём команду на замену диска sdc2 на диск /dev/sde2
 +
 
 +
zpool replace zfspool sdc2 /dev/sde2
 +
 
 +
В результате команда проверки статуса
 +
 
 +
zpool status zfspool
 +
 
 +
Должна вернуть что-то похожее на это
 +
<pre>
 +
  pool: zfspool
 +
state: DEGRADED
 +
status: One or more devices is currently being resilvered. The pool will
 +
continue to function, possibly in a degraded state.
 +
action: Wait for the resilver to complete.
 +
  scan: resilver in progress since Sun Nov 19 12:32:58 2023
 +
208G scanned at 4.16G/s, 8.32G issued at 170M/s, 208G total
 +
7.75G resilvered, 4.00% done, 00:19:59 to go
 +
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
 +
131K memory used for removed device mappings
 +
config:
 +
 
 +
NAME            STATE    READ WRITE CKSUM
 +
zfspool          DEGRADED    0    0    0
 +
  mirror-1      DEGRADED    0    0    0
 +
    replacing-0  DEGRADED    0    0    0
 +
      sdc2      OFFLINE      0    0    0
 +
      sde2      ONLINE      0    0    0  (resilvering)
 +
    sdd2        ONLINE      0    0    0
 +
  mirror-3      ONLINE      0    0    0
 +
    sda2        ONLINE      0    0    0
 +
    sdb2        ONLINE      0    0    0
 +
</pre>
 +
 
 +
Повторяя команду проверки статуса ждём окончания процесса замены диска.
 +
 
 +
=Управление RAID массивами (mdadm)=
 +
 
 +
==Удалить диск из действующего RAID1==
 +
 
 +
Пусть есть RAID1
 +
 
 +
<pre>
 +
cat /proc/mdstat
 +
Personalities : [raid1]
 +
md127 : active raid1 sda1[0] sdb1[1] sdd1[3] sdc1[2]
 +
      41942976 blocks [4/4] [UUUU]
 +
 
 +
</pre>
 +
 
 +
Задача - удалить из него диски sda1 и sdb1
 +
 
 +
Для этого сначала помечаем диски сбойными
 +
 
 +
mdadm --fail /dev/md127 sda1
 +
mdadm --fail /dev/md127 sdb1
 +
 
 +
Затем удаляем их из массива
 +
 
 +
mdadm --remove /dev/md127 sda1
 +
mdadm --remove /dev/md127 sdb1
 +
 
 +
Проверяем результат
 +
 
 +
<pre>
 +
cat /proc/mdstat
 +
Personalities : [raid1]
 +
md127 : active raid1 sdd1[3] sdc1[2]
 +
      41942976 blocks [4/2] [__UU]
 +
</pre>
 +
 
 +
Как видим, информация о двух отсутствующих дисках не исчезла. Если на место этих дисков не планируется добавление замены, то можно указать другое кличество дисков для зеркала.
 +
 
 +
Для этого выполнить команду
 +
 
 +
mdadm --grow /dev/md127 --raid-devices=2
 +
 
 +
Проверяем результат
 +
 
 +
<pre>
 +
cat /proc/mdstat
 +
Personalities : [raid1]
 +
md127 : active raid1 sdd1[1] sdc1[0]
 +
      41942976 blocks [2/2] [UU]
 +
</pre>
 +
 
 +
 
 +
==Добавить диски в действующий RAID1==
 +
 
 +
Если есть массив
  
Пример
+
<pre>
 +
cat /proc/mdstat
 +
Personalities : [raid1]
 +
md127 : active raid1 sdd1[1] sdc1[0]
 +
      41942976 blocks [2/2] [UU]
 +
</pre>
  
/opt/node_template_config/apply_rename.sh pve-analise-01
+
и в него планируется добавить ещё диски /dev/sda1 и /dev/sdb1, то сначала нужно увеличить количество девайсов в массиве
  
Или
+
mdadm --grow /dev/md127 --raid-devices=4
  
/opt/node_template_config/apply_rename.sh pve-ml-01
+
Затем по очереди ввести диски командами
  
Далее нужно ввести ноду в кластер. Для этого выполнить команду (тоже из под рута)
+
mdadm --add /dev/md127 /dev/sda1
  
  pvecm add 172.16.87.100 --force
+
  mdadm --add /dev/md127 /dev/sdb1
  
Или если не помогает команда выше:
+
Далее можно наблюдать процесс синхронизации массива командой
  
  pvecm add 172.16.87.100 -link0 IP_АДРЕС_ВВОДИМОЙ_НОДЫ --force
+
  cat /proc/mdstat
  
==Disable NetworkManager==
+
По завершению синхронизации результат проверки массива должен быть примерно такой
  
systemctl stop NetworkManager
+
<pre>
systemctl disable NetworkManager
+
cat /proc/mdstat
 +
Personalities : [raid1]
 +
md127 : active raid1 sde1[0] sda1[2] sdb1[3] sdd1[1]
 +
      41942976 blocks [4/4] [UUUU]
 +
     
 +
unused devices: <none>
 +
</pre>

Текущая версия на 12:45, 19 ноября 2023

Полезные команды

Затюнить основные моменты на PVE

Отключить сжатие

zfs set compression=off rpool/data

Отключить sync

zfs set sync=disabled rpool/data

Просмотр параметров volume (внимание! - отсутствие слэша в начале - это важно)

zfs get all rpool/data/vm-100-disk-1

Аналогично - просмотр параметров пула (внимание! - слэш в начале - это важно)

zfs get all /rpool/data/

Создать volume с нужным размером блока (например, с размером блока равным размеру блока в ext4 гостевой машины по умолчанию)

zfs create -o volblocksize=4K -V 100g rpool/data/vm-100-disk-1

Проверить за собой

zfs get all rpool/data/vm-100-disk-1 | grep volblocksize

Создание дисков средствами вебинтерфейса проксмокс происходит с volblocksize=8K. Это не всегда удобно. Поэтому после создания виртмашины можно пересоздать так:

Удаляем диск

zfs destroy rpool/data/vm-100-disk-1

И создаём заново (как уже выше приводилась команда) - выключенная виртмашина ничего не заметит :-)

zfs create -o volblocksize=4K -V 100g rpool/data/vm-100-disk-1


Копирование данных через снапшоты

Просмотр списка

zfs list

Копирование

ssh root@192.168.10.123 "zfs send rpool/data/vm-106-disk-0@backup-01" | pv --size 469457889480 | zfs receive -o compress=zle storage-zfs/backup/vm-106-disk-0--DO-NOT-DELETE


создать снапшот

zfs snapshot storage-zfs/vm-206-disk-0@backup

список снапшотов

zfs list -t snapshot

посмотреть размер снапшота

zfs send -nvP storage-zfs/vm-206-disk-0@backup

должно быть на выходе что-то тпа того:

full	storage-zfs/vm-206-disk-0@backup	654563209344
size	654563209344

установить размер для диска (обычно после копирования из снапшота)

set volsize=999G rpool/data/vm-206-disk-0

Работа с томами

Изменить размер (помни о файловой системе внутри!)

zfs set volsize=1000G rpool/data/vm-201-disk-1

Эксперимент

Задача

Быстро передавать состояние диска виртмашины между двумя узлами PVE.

Пусть по легенде у нас будет две виртуальных машины:

A -- виртмашина, на которой работает пользователь. Она расположена на узле PVE_A
B -- виртмашина, на которую нужно оперативно получать состояние диска машины A (изначально у нее диск или отсутствует или пустой). Она расположена на узле PVE_B


Между узлами PVE_A и PVE_B гигабитная сеть и доступ по ssh по ключам (условно можно считать что эти оба узла являются узлами одного кластера, но не обязательно. Т.е. могут быть и отдельными PVE-узлами, вне кластера).

Полностью передавать диски по сети -- ёмкая по времени задача. Чтобы минимизировать временнЫе затраты, в общем виде набор действий будет следующим:

Решение

1. Создаём снапшот на A. Пусть будет снапшот с названием

ok

2. Перемещаем снапшот в новый (пока ещё не существующий на первом этапе) диск машины B Для этого на машине PVE_B выполняем команду, вид которой в общем виде следующий:

ssh root@PVE_A "zfs send -R zfspool2/vm-401-disk-0@dfl" | pv --size 125413212048 | zfs receive -o compress=zle zfspool2/vm-402-disk-0 -F

3. Создаём второй снапшот на A. Пусть будет снпашот с названием

ok1

команда

zfs snapshot zfspool2/vm-401-disk-0@ok1

4. Перемещаем снапшот в снапшот созданного в п.2 диска на машине B

ssh root@PVE_A "zfs send -i zfspool2/vm-401-disk-0@ok1" | pv --size 125413212048 | zfs receive -o compress=zle -A zfspool2/vm-402-disk-0

Управление RAID массивами (zfs)

Создать аналог RAID 1+0

Собираем пулл zfs (аналог RAID 1+0) с именем zfspool из дисков /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2

Первый шаг - создаём зеркало из первых двух

zpool create -f -o ashift=12 zfspool mirror /dev/sda2 /dev/sdb2

Второй шаг - в уже созданный пулл добавляем ещё одно зеркало

zpool add zfspool mirror /dev/sdc2 /dev/sdd2

Получаем как бы пулл из двух зеркал. Пул в этом случае является страйпом (RAID0) из двух зеркал (RAID1)

Далее тюним для PVE. Отключаем сжатие и синхронизацию (экспериментально подобрано при эксплуатации PVE).

zfs set compression=off zfspool
zfs set sync=disabled zfspool

Проверить состояние пулла

Проверяем пулл с именем zfspool

zpool status zfspool

В ответ придёт что-то типа этого:

  pool: zfspool
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	zfspool     ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    sda2    ONLINE       0     0     0
	    sdb2    ONLINE       0     0     0
	  mirror-1  ONLINE       0     0     0
	    sdc2    ONLINE       0     0     0
	    sdd2    ONLINE       0     0     0

Выбросить раздел из пулла

Например, нужно выбросить раздел sda2.

Тогда сначала делаем этот раздел OFFLINE

zpool offline zfspool sda2

Затем вынимаем из пулла

zpool detach zfspool sda2

Если это пулл STRIPE то можно выбросить из него разлел, однако нужно иметь в виду что занятого места в пуле должно быть столько, сколько останется после отсоединения раздела от него. Т.е. пулл уменьшится.

Чтобы убрать раздел sda2 из страйпового пулла zfspool команда

zpool remove zfspool sda2

Заменить раздел в пулле

Допустим

zpool status zfspool

Показывает такой результат

  pool: zfspool
 state: ONLINE
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
	131K memory used for removed device mappings
config:

	NAME          STATE     READ WRITE CKSUM
	zfspool       ONLINE       0     0     0
	  mirror-1    ONLINE       0     0     0
	    sdc2      ONLINE       0     0     0
	    sdd2      ONLINE       0     0     0
	  mirror-3    ONLINE       0     0     0
	    sda2      ONLINE       0     0     0
	    sdb2      ONLINE       0     0     0

и требуется заменить диск sdc2 на диск sde2 в mirror-1 пулла под названием zfspool

Тогда сначала делаем sdc2 OFFLINE командой

zpool offline zfspool /dev/sdc2

При этом статус

zpool status zfspool

должен быть примерно такой

pool: zfspool
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
	131K memory used for removed device mappings
config:

	NAME          STATE     READ WRITE CKSUM
	zfspool       DEGRADED     0     0     0
	  mirror-1    DEGRADED     0     0     0
	    sdc2      OFFLINE      0     0     0
	    sdd2      ONLINE       0     0     0
	  mirror-3    ONLINE       0     0     0
	    sda2      ONLINE       0     0     0
	    sdb2      ONLINE       0     0     0

Далее даём команду на замену диска sdc2 на диск /dev/sde2

zpool replace zfspool sdc2 /dev/sde2

В результате команда проверки статуса

zpool status zfspool

Должна вернуть что-то похожее на это

  pool: zfspool
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sun Nov 19 12:32:58 2023
	208G scanned at 4.16G/s, 8.32G issued at 170M/s, 208G total
	7.75G resilvered, 4.00% done, 00:19:59 to go
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
	131K memory used for removed device mappings
config:

	NAME             STATE     READ WRITE CKSUM
	zfspool          DEGRADED     0     0     0
	  mirror-1       DEGRADED     0     0     0
	    replacing-0  DEGRADED     0     0     0
	      sdc2       OFFLINE      0     0     0
	      sde2       ONLINE       0     0     0  (resilvering)
	    sdd2         ONLINE       0     0     0
	  mirror-3       ONLINE       0     0     0
	    sda2         ONLINE       0     0     0
	    sdb2         ONLINE       0     0     0

Повторяя команду проверки статуса ждём окончания процесса замены диска.

Управление RAID массивами (mdadm)

Удалить диск из действующего RAID1

Пусть есть RAID1

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sda1[0] sdb1[1] sdd1[3] sdc1[2]
      41942976 blocks [4/4] [UUUU]

Задача - удалить из него диски sda1 и sdb1

Для этого сначала помечаем диски сбойными

mdadm --fail /dev/md127 sda1
mdadm --fail /dev/md127 sdb1

Затем удаляем их из массива

mdadm --remove /dev/md127 sda1
mdadm --remove /dev/md127 sdb1

Проверяем результат

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sdd1[3] sdc1[2]
      41942976 blocks [4/2] [__UU]

Как видим, информация о двух отсутствующих дисках не исчезла. Если на место этих дисков не планируется добавление замены, то можно указать другое кличество дисков для зеркала.

Для этого выполнить команду

mdadm --grow /dev/md127 --raid-devices=2

Проверяем результат

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sdd1[1] sdc1[0]
      41942976 blocks [2/2] [UU]


Добавить диски в действующий RAID1

Если есть массив

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sdd1[1] sdc1[0]
      41942976 blocks [2/2] [UU]

и в него планируется добавить ещё диски /dev/sda1 и /dev/sdb1, то сначала нужно увеличить количество девайсов в массиве

mdadm --grow /dev/md127 --raid-devices=4

Затем по очереди ввести диски командами

mdadm --add /dev/md127 /dev/sda1
mdadm --add /dev/md127 /dev/sdb1

Далее можно наблюдать процесс синхронизации массива командой

cat /proc/mdstat

По завершению синхронизации результат проверки массива должен быть примерно такой

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sde1[0] sda1[2] sdb1[3] sdd1[1]
      41942976 blocks [4/4] [UUUU]
      
unused devices: <none>