Transferir dados de ou para o Cloud Storage

O Google Cloud Managed Lustre pode importar e exportar dados do e para o Cloud Storage. As transferências de dados são incrementais. Elas copiam apenas arquivos que ainda não existem no destino ou que foram alterados desde a transferência.

Os buckets do Cloud Storage com o namespace hierárquico ativado oferecem velocidades de transferência mais rápidas para e do Managed Lustre em comparação com os buckets padrão.

Limitações

Só é possível ativar uma operação de transferência por instância por vez. Tentar iniciar uma segunda operação de transferência enquanto uma anterior ainda está em execução resultará em um erro como:

ERROR: (gcloud.lustre.instances.export-data) ABORTED: unable to queue the operation

Considerações sobre a largura de banda de saída do Cloud Storage

O Cloud Storage oferece uma largura de banda de saída padrão de até 200 Gbps por região por projeto. Se a carga de trabalho exigir uma velocidade de transferência de dados maior, você poderá pedir um aumento no limite de largura de banda de saída. Para mais informações, consulte as cotas de largura de banda do Cloud Storage.

Permissões necessárias

Permissões para iniciar a transferência

A conta de usuário ou de serviço usada para iniciar a transferência precisa das seguintes permissões:

  • lustre.instances.exportData para transferir do Lustre gerenciado para o Cloud Storage.
  • lustre.instances.importData para transferir do Cloud Storage.

Ambas as permissões são concedidas com a função roles/lustre.admin. É possível criar um papel personalizado para conceder permissões de forma independente.

Permissões para o agente de serviço do Managed Lustre

Acessar o agente de serviço do Managed Lustre

Um agente de serviço do Managed Lustre é criado na primeira vez que você cria uma instância do Managed Lustre no projeto. A identidade do agente de serviço está no formato service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com.

Se você ainda não tiver um agente de serviço do Managed Lustre
  1. Execute o comando services identity create:

    gcloud beta services identity create \
      --service=lustre.googleapis.com \
      --project=PROJECT_NUMBER_OR_ID
    

    Substitua PROJECT_NUMBER_OR_ID pelo número ou ID do projeto em que você quer criar a instância do Lustre gerenciado. O resultado será o seguinte:

    Service identity created: service-1234567890@gcp-sa-lustre.iam.gserviceaccount.com
    
  2. Copie o valor da identidade do agente de serviço para usar na próxima etapa.

Se você já criou uma instância do Managed Lustre
  1. Para construir a identidade do agente de serviço, obtenha o número do projeto. Um PROJECT_NUMBER não é o mesmo que um ID do projeto:

    • Um ID do projeto é uma string exclusiva que pode ser uma combinação de letras, números e hifens. Você especifica um ID do projeto ao criar seu projeto. Por exemplo, example-project-123.
    • O número do projeto é um identificador exclusivo gerado automaticamente para seu projeto, composto apenas por números. Por exemplo, 1234567890.

    Para obter o PROJECT_NUMBER de um determinado ID do projeto, use o comando gcloud projects describe:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    
  2. Copie o número do projeto retornado na identidade do agente de serviço:

    service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com
    
  3. Copie a identidade do agente de serviço para usar na próxima etapa.

Conceder permissões

O agente de serviço do Managed Lustre requer uma das seguintes funções do Cloud Storage:

  • Para transferir dados de e para o Cloud Storage, roles/storage.objectUser no bucket do Cloud Storage.
  • Para transferir apenas do Cloud Storage: roles/storage.objectViewer no bucket do Cloud Storage.

Para conceder um desses papéis, execute o seguinte comando gcloud:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
  --member=serviceAccount:SERVICE_AGENT_IDENTITY \
  --role=roles/storage.objectViewer_OR_objectUser

SERVICE_AGENT_IDENTITY é a identidade do agente do serviço Managed Lustre da etapa anterior.

Importar dados para o Managed Lustre

É possível importar dados de um bucket do Cloud Storage. O bucket pode estar no mesmo projeto ou em um projeto diferente. O bucket pode estar em uma zona ou região diferente da instância gerenciada do Lustre, mas as transferências entre regiões
podem ser mais lentas do que as transferências na mesma região.

gcloud

gcloud lustre instances import-data INSTANCE_ID \
  --location=LOCATION \
  --gcs-path-uri=gs://BUCKET_NAME/ \
  --lustre-path=PS_PATH

Em que:

  • INSTANCE_ID é o nome da sua instância do Managed Lustre.
  • --location é a zona da sua instância do Managed Lustre. Por exemplo, us-central1-a.
  • --gcs-path-uri especifica o URI de um bucket do Cloud Storage ou um caminho dentro de um bucket usando o formato gs://<bucket_name>/<optional_path_inside_bucket>/. Se um caminho dentro do bucket for especificado, ele precisará terminar com uma barra (/).
  • --lustre-path especifica o caminho do diretório raiz para o sistema de arquivos Lustre gerenciado. É necessário começar com /. O padrão é /. Se você especificar um valor diferente do padrão, o diretório já precisará existir no sistema de arquivos.

Os seguintes parâmetros são opcionais:

  • --request-id permite atribuir um ID exclusivo a essa solicitação. Se você repetir essa solicitação usando o mesmo ID, o servidor vai ignorar a solicitação se ela já tiver sido concluída. Precisa ser um UUID válido que não seja composto apenas de zeros.
  • --async retorna uma resposta imediatamente, sem aguardar a conclusão da operação.

Para mais detalhes, consulte a documentação do SDK Cloud.

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:importData
Authorization: Bearer [YOUR_ACCESS_TOKEN]

{
  "gcsPath" : {
    "uri" : "gs://BUCKET_NAME/"
  },
  "lustrePath" : {
    "path" : "/PATH"
  }
}

Em que:

  • PROJECT_ID é o nome do projeto Google Cloud .
  • LOCATION é a zona da sua instância gerenciada do Lustre. Por exemplo, us-central1-a.
  • INSTANCE_ID é o nome da sua instância do Managed Lustre.
  • gcsPath contém uma chave uri cujo valor especifica o URI de um bucket do Cloud Storage ou um caminho dentro de um bucket, usando o formato gs://<bucket_name>/<optional_path_inside_bucket>/. Se um caminho dentro do bucket for especificado, ele precisará terminar com uma barra (/).
  • lustrePath contém uma chave path cujo valor especifica o caminho do diretório raiz para o sistema de arquivos Lustre gerenciado. É necessário começar com /. O padrão é /. Se você especificar um valor diferente do padrão, o diretório já precisa existir no sistema de arquivos.

Para usar sua própria conta de serviço em vez do agente de serviço gerenciado pelo Google, a solicitação aceita um campo serviceAccount no objeto JSON:

"serviceAccount" : "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID"

Um exemplo de comando curl é:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:importData \
  -d '{"gcsPath": {"uri":"gs://BUCKET_NAME/"}, "lustrePath": {"path":"/"}}'

Atributos do arquivo

Ao importar dados de um bucket do Cloud Storage para uma instância do Managed Lustre, os atributos de arquivo na instância do Managed Lustre são definidos de uma das duas maneiras:

  • Se o objeto do Cloud Storage tiver metadados personalizados, conforme descrito para exportação de dados, faça o seguinte:
    • O UID, o GID, o modo e o mtime do arquivo são definidos com base nos metadados personalizados do objeto.
    • O atime do arquivo é definido como o mesmo valor do mtime.
  • Se o objeto do Cloud Storage não tiver os metadados personalizados, faça o seguinte:
    • O UID e o GID do arquivo são definidos como 0 (root).
    • O modo do arquivo está definido como rwxr-xr-x (755).
    • O atime e o mtime do arquivo são definidos como o horário de criação do objeto do Cloud Storage.

Em qualquer um dos casos:

  • O ctime de um arquivo é definido como o horário em que ele foi gravado na instância.
  • Os atime, ctime e mtime de um diretório são definidos como o momento em que o diretório foi criado na instância.

Exportar dados

É possível exportar dados da sua instância do Lustre gerenciado para um bucket do Cloud Storage no mesmo projeto ou em um diferente. O bucket pode estar em uma zona ou região diferente da sua instância gerenciada do Lustre, mas as transferências entre regiões podem ser mais lentas do que as transferências dentro da região.

gcloud

gcloud lustre instances export-data \
  INSTANCE_ID \
  --location=LOCATION \
  --gcs-path-uri="gs://BUCKET_NAME/" \
  --lustre-path="/"

Em que:

  • INSTANCE_ID é o nome da sua instância do Managed Lustre.
  • --location é a zona da sua instância gerenciada do Lustre. Por exemplo, us-central1-a.
  • --gcs-path-uri especifica o URI de um bucket do Cloud Storage ou um caminho dentro de um bucket usando o formato gs://<bucket_name>/<optional_path_inside_bucket>/. Se um caminho dentro do bucket for especificado, ele precisará terminar com uma barra (/).
  • --lustre-path especifica o caminho do diretório raiz para o sistema de arquivos Lustre gerenciado. É necessário começar com /. O padrão é /.

Os seguintes parâmetros são opcionais:

  • --request-id permite atribuir um ID exclusivo a essa solicitação. Se você repetir essa solicitação usando o mesmo ID, o servidor vai ignorar a solicitação se ela já tiver sido concluída. Precisa ser um UUID válido que não seja composto apenas de zeros.
  • --async retorna uma resposta imediatamente, sem aguardar a conclusão da operação.

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:exportData
Authorization: Bearer [YOUR_ACCESS_TOKEN]

{
  "lustrePath" : {
    "path" : "/"
  },
  "gcsPath" : {
    "uri" : "gs://BUCKET_NAME/"
  }
}

Em que:

  • PROJECT_ID é o nome do projeto Google Cloud .
  • INSTANCE_ID é o nome da sua instância do Managed Lustre.
  • LOCATION é a zona da sua instância gerenciada do Lustre. Por exemplo, us-central1-a.
  • lustrePath contém uma chave path cujo valor especifica o caminho do diretório raiz para o sistema de arquivos Lustre gerenciado. É necessário começar com /. O padrão é /.
  • gcsPath contém uma chave uri cujo valor especifica o URI de um bucket do Cloud Storage ou um caminho dentro de um bucket, usando o formato gs://<bucket_name>/<optional_path_inside_bucket>/. Se um caminho dentro do bucket for especificado, ele precisará terminar com uma barra (/).

Para usar sua própria conta de serviço em vez do agente de serviço gerenciado pelo Google, a solicitação aceita um campo serviceAccount no objeto JSON:

"serviceAccount" : "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID"

Um exemplo de comando curl é:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json"
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:exportData \
  -d '{"lustrePath": {"path":"/"}, "gcsPath": {"uri":"gs://BUCKET_NAME/"}}'

Atributos do arquivo

Ao exportar dados de uma instância gerenciada do Lustre para um bucket do Cloud Storage, os seguintes atributos de arquivo são preservados como metadados personalizados no Cloud Storage:

  • O UID do arquivo é armazenado com a chave goog-reserved-posix-uid.
  • O GID do arquivo é armazenado com a chave goog-reserved-posix-gid.
  • O modo numérico do arquivo é armazenado com a chave goog-reserved-posix-mode.
  • O mtime do arquivo é armazenado com a chave goog-reserved-file-mtime.

Esses nomes de chave de metadados personalizados são os mesmos usados pelo Serviço de transferência do Cloud Storage para transferências com sistemas de arquivos POSIX.

Os seguintes atributos de arquivo não são preservados:

  • Os links simbólicos não são preservados.
  • Os links físicos são exportados como objetos separados do Cloud Storage, resultando em várias cópias.
  • O striping do Lustre definido explicitamente usando lfs setstripe ou lfs setdirstripe não é preservado.
  • O atime e o ctime dos arquivos não são preservados.
  • O mtime de diretórios não é preservado.
  • Diretórios vazios não são preservados.

Receber operação

Para conferir o status de uma operação de importação ou exportação, você precisa do ID da operação. Esse ID é retornado pelo serviço quando você faz uma solicitação de importação ou exportação e usa o seguinte formato:

  • operation-1234567890123-6127783ad26ea-88913969-02748053

gcloud

gcloud lustre operations describe OPERATION_ID \
  --location=LOCATION

REST

GET https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
Authorization: Bearer [YOUR_ACCESS_TOKEN]

Um exemplo de comando curl é:

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID

Cancelar operação

Para cancelar uma operação de importação ou exportação, você precisa do ID da operação. Esse ID é retornado pelo serviço quando você faz uma solicitação de importação ou exportação e usa o seguinte formato:

  • operation-1234567890123-6127783ad26ea-88913969-02748053

gcloud

gcloud lustre operations cancel OPERATION_ID \
  --location=LOCATION

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID:cancel
Authorization: Bearer [YOUR_ACCESS_TOKEN]

Um exemplo de comando curl é:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID:cancel