Como substituir um disco em um pool ZFS não redundante?

8

Estive lendo um pouco e parece que o ZFS não gosta de discos sendo removidos de matrizes não redundantes :

Você pode usar o zpool detachcomando para desconectar um dispositivo de um pool de armazenamento espelhado. Por exemplo:

# zpool detach zeepool c2t1d0

No entanto, essa operação será recusada se não houver outras réplicas válidas dos dados. Por exemplo:

# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

O problema básico é compreensível: remover a única cópia de uma parte dos dados (sejam dados de metadados ou de carga) de uma matriz tornaria esses dados indisponíveis.

Os exemplos de substituição de dispositivos em um conjunto de armazenamentos ZFS fornecem uma descrição passo a passo básica de como substituir um dispositivo em um conjunto de armazenamentos: desconecte o disco, remova o disco, insira o disco de substituição, execute zpool replacepara informar o ZFS sobre a alteração e on-line o disco. Obviamente, isso requer que a matriz não dependa da substituição do disco; portanto, a matriz deve ter redundância; se depender da unidade em questão, essa abordagem apresentará o mesmo problema acima.

Qual é a maneira recomendada de substituir um disco em uma matriz ZFS não redundante ?

Suponha que o disco existente esteja funcionando corretamente e suponha que o disco de substituição tenha pelo menos o mesmo tamanho do disco que está sendo substituído. (Se o disco existente falhar, claramente tudo o que você pode fazer é adicionar um novo disco e restaurar todos os arquivos afetados pela falha do disco do backup.)

um CVn
fonte

Respostas:

3

Não sei se as coisas eram tão diferentes no `13, mas o 'zfs replace' funciona em conjuntos não redundantes. Você acabou de executar o comando 1 em vez de desconectar primeiro.

d1 é 1G, d2 é 2G, ambos são arquivos vazios em / tmp:

/t/test #> zpool create test /tmp/test/d1
/t/test #> zpool set autoexpand=on test
/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: none requested
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d1  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1008M   258K  1008M         -     0%     0%  1.00x  ONLINE  -


/t/test #> zpool replace test /tmp/test/d1 /tmp/test/d2


/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: resilvered 61K in 0h0m with 0 errors on Sun Sep 18 18:55:32 2016
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d2  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1.98G   408K  1.98G         -     0%     0%  1.00x  ONLINE  -
alaricljs
fonte
12
zpool attach pool old-disk new-disk

Isso converterá o disco antigo em um espelho com o disco antigo e o novo disco e começará a resilvering, após o qual você poderá desanexar o disco antigo.

zpool detach pool old-disk

Testado com dispositivos de loop:

# truncate -s 1G a b
# truncate -s 1200M c
# losetup  /dev/loop0 a
# losetup  /dev/loop1 b
# losetup  /dev/loop2 c
# zpool create test loop{0,1}
# zpool attach test loop1 loop2
# zpool status
      pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            loop1   ONLINE       0     0     0
            loop2   ONLINE       0     0     0
# zpool detach test loop1
# zpool status
  pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          loop2     ONLINE       0     0     0
Stéphane Chazelas
fonte
Então você está dizendo que o ZFS não suporta essa operação nativamente? Parece estranho. ( Parece que tudo o que é necessário é ter as duas unidades conectadas e, em seguida, informar ao ZFS que a unidade antiga está prestes a ficar offline, dando a chance de migrar os dados para outras unidades da mesma forma que seria feita se que era um resilvering em uma matriz redundante).
um CVn
@ MichaelKjörling, não estou dizendo isso. Eu apenas digo que o acima deve funcionar, pois não vejo qualquer razão para que não deva.
Stéphane Chazelas
Dito isto, parece que o ZFS suporta de fato. Resposta atualizada.
Stéphane Chazelas
Ótimo! Esse é o tipo de resposta que eu estava procurando e esperando obter. Daria mais um +1 para você experimentar se eu pudesse.
a CVn 31/07/2013