Увеличение размера ZFS пула

Материал из OpenWiki
Перейти к: навигация, поиск

Увеличение размера ZFS пула путём замены дисков

Имеется пул с данными, например mirror или raidz. Заканчивается место, хочется поставить жёсткие диски побольше и тем самым увеличить размер пула. Задача, скажем так, достаточно нетривиальная для аппаратных и даже программных RAID. С ZFS эта задача решается легко и просто. Всё, что для этого нужно - по очереди заменить все диски на более объёмные. После замены каждого диска нужно выполнять синхронизацию (по-умолчанию она запускается автоматически после замены диска). Продемонстрирую пример того как это сделать на виртуальных дисках.

Создам 3 диска по 200 Мб:

# mdconfig -s 200m -u md0
# mdconfig -s 200m -u md1
# mdconfig -s 200m -u md2
# mdconfig -lv
md0     swap      200M
md1     swap      200M
md2     swap      200M

И пул TEST с raidz на их основе:

# zpool create -m /mnt TEST raidz md0 md1 md2
# zpool status TEST
 pool: TEST
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        TEST        ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            md0     ONLINE       0     0     0
            md1     ONLINE       0     0     0
            md2     ONLINE       0     0     0

errors: No known data errors
# zpool list TEST
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
TEST   584M   153K   584M     0%  ONLINE  -

Теперь сюда можно скопировать какой-нибудь файл, для проверки целостности результата:

# dd if=/dev/random of=/mnt/test.file bs=1m count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 2.463299 secs (42567958 bytes/sec)
# md5 /mnt/test.file > /mnt/test.file.md5
# cat /mnt/test.file.md5
MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468

Теперь заменим диск md0 на больший, размером 300Мб. Предварительно выведем в offline текущий диск:

# zpool offline TEST md0
# zpool status TEST
  pool: TEST
 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'.
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        TEST        DEGRADED     0     0     0
          raidz1    DEGRADED     0     0     0
            md0     OFFLINE      0     0     0
            md1     ONLINE       0     0     0
            md2     ONLINE       0     0     0

errors: No known data errors
# mdconfig -du md0
# mdconfig -s 300m -u md0

Теперь заменяем этот диск:

# zpool replace TEST md0 md0
# zpool status TEST
  pool: TEST
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Mon Aug  3 14:52:54 2009
config:

        NAME        STATE     READ WRITE CKSUM
        TEST        ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            md0     ONLINE       0     0     0  50,2M resilvered
            md1     ONLINE       0     0     0  147K resilvered
            md2     ONLINE       0     0     0  148K resilvered

errors: No known data errors

Так как диски маленькие и виртуальные, то синхронизация тут проходит быстро, на реальных дисках эта операция занимает времени побольше. Теперь то же самое нужно проделать с md1 и md2.

# zpool offline TEST md1
# mdconfig -du md1
# mdconfig -s 300m -u md1
# zpool replace TEST md1 md1
# zpool status TEST
  pool: TEST
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Mon Aug  3 14:55:27 2009
config:

        NAME        STATE     READ WRITE CKSUM
        TEST        ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            md0     ONLINE       0     0     0  83K resilvered
            md1     ONLINE       0     0     0  50,1M resilvered
            md2     ONLINE       0     0     0  86K resilvered

errors: No known data errors
# zpool offline TEST md2
# mdconfig -du md2
# mdconfig -s 300m -u md2
# zpool replace TEST md2 md2
# zpool status TEST
  pool: TEST
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Mon Aug  3 14:57:01 2009
config:

        NAME        STATE     READ WRITE CKSUM
        TEST        ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            md0     ONLINE       0     0     0  83,5K resilvered
            md1     ONLINE       0     0     0  86K resilvered
            md2     ONLINE       0     0     0  50,1M resilvered

errors: No known data errors
# zpool list TEST
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
TEST   584M   151M   433M    25%  ONLINE  -

Проверяем контрольную сумму:

# cat /mnt/test.file.md5 && md5 /mnt/test.file
MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468
MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468

Что же в итоге? Размер не изменился. Для того чтобы ZFS "увидела" появившееся свободное место нужно выключить пул из работы и подключить обратно.

# zpool export TEST
# zpool import TEST
# zpool list TEST
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
TEST   884M   150M   734M    17%  ONLINE  -
# zpool status TEST
  pool: TEST
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        TEST        ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            md0     ONLINE       0     0     0
            md1     ONLINE       0     0     0
            md2     ONLINE       0     0     0

errors: No known data errors
# cat /mnt/test.file.md5 && md5 /mnt/test.file
MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468
MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468

Свободное место увеличилось, контрольные суммы совпадают.