Não é possível enviar zfs | zfs recebe conjuntos de dados no mesmo zpool

2

Eu tenho dois ambientes: Staging ( staging ) e Development ( choang ). Não consigo replicar ( incluindo snapshots ) do conjunto de dados zfs/staging.assets para outro conjunto de dados zfs/choang.assets dentro de o mesmo zpool zfs .

NOTA: Estou supondo que preciso desmontar os conjuntos de dados de origem e de destino.

zfs unmount zfs/staging.assets
zfs unmount zfs/choang.assets

zfs send -R zfs/staging.assets | zfs receive -F zfs/choang.assets

Quando executados, os comandos acima geram o seguinte erro:

Error: Unsupported flag with filesystem or bookmark.
cannot receive: failed to read from stream

Quando eu removo a opção -R e executo os comandos, ela é bem sucedida:

zfs send zfs/staging.assets | zfs receive -F  zfs/choang.assets

No entanto, nenhum instantâneo é recebido e um único instantâneo zfs/choang.assets@--head-- é criado.

Por fim, tentei enviar um instantâneo - pensando em talvez enviar um instantâneo de cada vez:

zfs send zfs/staging.assets@sha512_hash | zfs receive -Fduv zfs/choang.assets

Isso também não funcionou e gerou o seguinte erro:

internal error: Invalid argument
cannot receive: failed to read from stream

Como posso replicar todos os instantâneos?

    
por Michael Niño 26.09.2017 / 21:41

3 respostas

1

Uma atualização do kernel ocorreu recentemente no servidor (via CPanel) e o servidor não foi reiniciado. Depois de revisar os arquivos de log, percebi que o ZFS também foi atualizado. Eu acredito que os comandos nesta questão estão com problemas devido ao conflito de versões entre o módulo do kernel e as ferramentas CLI.

Cheguei a esta conclusão depois de executar com sucesso o seguinte em um servidor diferente.

# zfs send -R tank1@--refresh-- | zfs recv -Fu tank2

# zfs list -t snapshot
NAME                USED  AVAIL  REFER  MOUNTPOINT
tank1@turtle          9K      -    34K  -
tank1@tiger           9K      -  47.5K  -
tank1@squirrel       10K      -  58.5K  -
tank1@rabbit         10K      -    70K  -
tank1@owl            11K      -  80.5K  -
tank1@deer           11K      -  90.5K  -
tank1@bear             0      -   106K  -
tank1@--refresh--      0      -   106K  -
tank2@turtle          9K      -    34K  -
tank2@tiger           9K      -  47.5K  -
tank2@squirrel       10K      -  58.5K  -
tank2@rabbit         10K      -    70K  -
tank2@owl            11K      -  80.5K  -
tank2@deer           11K      -  90.5K  -
tank2@bear            1K      -   106K  -
tank2@--refresh--      0      -   106K  -

Em seguida, retornei ao servidor original e mudei o módulo ZFS do DKMS para o sistema de módulos kABI para o kernel e reiniciei o servidor. Os comandos executados corretamente. Veja link

    
por 28.09.2017 / 21:14
1

Usando o envio / recebimento no ZFS, você pode usá-lo apenas com instantâneos e não é necessário desmontar os conjuntos de dados. Você não poderá enviar / receber um volume.

The zfs send command creates a stream representation of a snapshot that is written to standard output. By default, a full stream is generated. You can redirect the output to a file or to a different system. The zfs receive command creates a snapshot whose contents are specified in the stream that is provided on standard input. If a full stream is received, a new file system is created as well. You can send ZFS snapshot data and receive ZFS snapshot data and file systems with these commands.

Os comandos apropriados são:

zfs send tank/data@snap1 | zfs recv spool/ds01

A melhor maneira de enviar / receber um snapshot do zfs é usar o mbuffer para minimizar o risco de latência de E / S e para preencher o buffer de rede.

Na máquina de envio:

zfs send pool/image@test | mbuffer -s 128k -m 1G -O 127.0.0.1:9090

No aparelho de recepção:

mbuffer -s 128k -m 1G -I 9090 | zfs receive -F pool/image1

Como você pode usar 127.0.0.1 para a mesma máquina ou xx.xx.xx.xx para a máquina remota.

Fonte: link

    
por 27.09.2017 / 10:24
1

Várias coisas são importantes aqui. Seus erros resultam de combinações deles:

  • Normalmente, você envia um instantâneo específico ou vários instantâneos em vez de um sistema de arquivos inteiro. Isso significa que você não precisa desmontar os conjuntos de dados e interromper seus usuários, e você pode incrementalmente send/recv mais tarde.
  • Se você não especificar um instantâneo na origem, obterá o instantâneo gerado automaticamente@--head--, que é o estado da sua origem no momento do envio (se você tivesse enviado um instantâneo existente, esse instantâneo seria tome o lugar de @--head-- no lado do destino).
  • A combinação send -R | recv -F significa replicação completa (propriedades recursivas e incluindo na origem, destruir material antigo no destino), portanto, você precisa decidir como expandir a hierarquia do sistema de arquivos: você pode usar -e , -d ou nenhum sinalizador ao receber (nenhum sinalizador significa mesclar o conteúdo sob o novo conjunto de dados sem preservar o nome do conjunto de dados pai no lado da origem):

    The -d and -e options cause the file system name of the target snapshot
    to be determined by appending a portion of the sent snapshot's name to
    the specified target filesystem.  If the -d option is specified, all
    but the first element of the sent snapshot's file system path (usually
    the pool name) is used and any required intermediate file systems
    within the specified one are created. If the -e option is specified,
    then only the last element of the sent snapshot's file system name
    (i.e. the name of the source file system itself) is used as the target
    file system name.
    
  • Sua última ideia (envio único, recebimento completo) deve funcionar (eu testei em um ambiente simples e funcionou), mas não seria o que você queria de qualquer maneira.

Então, para resumir e aplicar à sua situação específica:

  1. Primeiro crie recursivamente um instantâneo atual ou escolha um antigo que contenha todos os itens antigos que você deseja replicar):

    zfs snapshot -r zfs/staging.assets@now
    
  2. Destrua todos os instantâneos antigos no lado do destino que estão no lado da origem (mostre todos os instantâneos com zfs list -Hr -o name -t snap zfs/choang.assets ou leve as dicas da mensagem de erro). Como alternativa, destrua o conjunto de dados de destino e recrie-o, se ele não contiver nada de importância.

  3. Envie recursivamente e receba totalmente, destruindo todos os conjuntos de dados antigos no segundo conjunto de dados, mesclando os sub-conjuntos de dados no destino para que eles reflitam a origem:

    zfs send -R zfs/staging.assets@now | zfs recv -Fu zfs/choang.assets
    
por 27.09.2017 / 10:32