Mentransfer data antara sistem file

Halaman ini menunjukkan cara mentransfer data antar-sistem file POSIX. Kasus penggunaan umum mencakup:

  • Burst to cloud dan Hybrid HPC: Mentransfer set data besar dari infrastruktur lokal ke cloud dengan cepat untuk diproses.
  • Migrasi dan sinkronisasi ke Filestore: Migrasikan atau sinkronkan data dari sistem file lokal ke Filestore.
  • Transfer file terkelola: Mentransfer data dengan aman dan andal antara pusat data atau antara dua sistem file dalam cloud.

Panduan performa transfer

Panduan berikut dapat membantu memaksimalkan performa selama transfer sistem file ke sistem file.

Deployment agen

Secara umum, sebaiknya gunakan tiga agen di setiap kumpulan agen sumber dan tujuan. Pantau transfer dan tambahkan lebih banyak agen jika diperlukan. Setiap agen memerlukan 4 vCPU dan RAM 8 GiB.

Jika Anda bermigrasi ke instance Filestore, Filestore menyarankan untuk menggunakan jenis instance n2-standard-8 untuk setiap agen. Tentukan nconnect=2 saat Anda memasang instance ke VM Compute Engine. Lihat Panduan performa Filestore untuk mengetahui informasi selengkapnya tentang cara mengoptimalkan dan menguji performa instance.

Mentransfer banyak file kecil

Untuk performa yang lebih baik saat mentransfer sejumlah besar file kecil, sebaiknya bagi file menjadi beberapa direktori dan hindari satu direktori dengan jutaan file.

Sebelum memulai

Sebelum dapat melakukan tugas yang dijelaskan di halaman ini, selesaikan langkah-langkah prasyarat.

Membuat kumpulan agen dan menginstal agen

Untuk transfer sistem file ke sistem file, Anda perlu membuat kumpulan agen dan agen untuk sistem file sumber dan tujuan. Agen untuk kumpulan agen sumber harus diinstal di komputer atau VM yang memiliki akses ke sistem file sumber. Agen untuk kumpulan agen tujuan harus diinstal di komputer atau VM yang memiliki akses ke sistem file tujuan.

Jangan sertakan informasi sensitif seperti informasi identitas pribadi (PII) atau data keamanan di awalan ID agen atau nama kumpulan agen Anda. Nama resource dapat di-propagasi ke nama resource Google Cloud lainnya dan dapat diekspos ke sistem internal Google di luar project Anda.

Membuat kumpulan agen sumber

Buat kumpulan agen sumber menggunakan salah satu metode berikut:

gcloud CLI

Buat kumpulan agen sumber dengan menjalankan:

gcloud transfer agent-pools create SOURCE_AGENT_POOL

Ganti SOURCE_AGENT_POOL dengan nama yang ingin Anda berikan ke kumpulan agen sumber.

Konsol Google Cloud

  1. Di konsol Google Cloud, buka halaman Agent pools.

    Buka Kumpulan agen

    Halaman Kumpulan agen akan ditampilkan, yang mencantumkan kumpulan agen yang ada.

  2. Klik Buat kumpulan lain.

  3. Masukkan nama untuk kumpulan.

  4. Klik Create.

Menginstal agen untuk kumpulan agen sumber

Instal agen untuk kumpulan agen sumber di mesin atau VM yang memiliki akses ke sistem file sumber:

gcloud CLI

Instal agen untuk kumpulan agen sumber dengan menjalankan:

gcloud transfer agents install --pool=SOURCE_AGENT_POOL --count=NUMBER_OF_AGENTS \
  --mount-directories=MOUNT_DIRECTORIES

Ganti kode berikut:

  • SOURCE_AGENT_POOL dengan nama kumpulan agen sumber.
  • NUMBER_OF_AGENTS dengan jumlah agen yang ingin Anda instal untuk kumpulan agen sumber. Untuk menentukan jumlah agen yang optimal untuk lingkungan Anda, lihat Praktik terbaik dan persyaratan agen.
  • MOUNT_DIRECTORIES dengan daftar direktori yang dipisahkan koma di sistem file sumber tempat salinan akan dibuat. Menghapus tanda ini akan memasang seluruh sistem file, yang dapat menimbulkan risiko keamanan.

Konsol Google Cloud

  1. Di konsol Google Cloud, buka halaman Agent pools.

    Buka Kumpulan agen

    Halaman Kumpulan agen akan ditampilkan, yang mencantumkan kumpulan agen yang ada.

  2. Klik nama kumpulan agen sumber yang baru saja Anda buat.

  3. Di tab Agents, klik Install agent.

  4. Ikuti petunjuk di konsol Google Cloud untuk menginstal Docker dan memulai agen.

Membuat kumpulan agen tujuan dan menginstal agen

Ulangi langkah-langkah sebelumnya untuk membuat kumpulan agen tujuan dan menginstal agen.

Membuat bucket Cloud Storage sebagai perantara

Transfer sistem file ke sistem file memerlukan bucket Cloud Storage sebagai perantara untuk transfer data.

  1. Buat bucket class Cloud Storage Standar dengan setelan berikut:

    • Enkripsi: Anda dapat menentukan kunci enkripsi yang dikelola pelanggan (CMEK). Jika tidak, kunci milik dan dikelola Google akan digunakan.
    • Pembuatan Versi Objek, Penguncian Bucket, dan penangguhan objek default: Tetapkan fitur ini ke nonaktif.
  2. Berikan izin dan peran menggunakan salah satu metode berikut:

    • Berikan peran Storage Admin (roles/storage.admin) ke akun layanan Storage Transfer Service untuk bucket.
    • Gunakan gcloud transfer authorize untuk memberikan otorisasi ke akun Anda untuk semua fitur Storage Transfer Service. Perintah ini memberikan izin Admin Storage di seluruh project:

      gcloud transfer authorize --add-missing
      

Membuat tugas transfer

gcloud CLI

Untuk membuat transfer dari sistem file sumber ke sistem file tujuan, jalankan

gcloud transfer jobs create SOURCE_DIRECTORY DESTINATION_DIRECTORY \
    --source-agent-pool=SOURCE_AGENT_POOL \
    --destination-agent-pool=DESTINATION_AGENT_POOL \
    --intermediate-storage-path= gs://STORAGE_BUCKET/FOLDER/

Ganti variabel berikut:

  • SOURCE_DIRECTORY dengan jalur direktori sumber.
  • DESTINATION_DIRECTORY dengan jalur direktori tujuan.
  • SOURCE_AGENT_POOL dengan nama kumpulan agen sumber.
  • DESTINATION_AGENT_POOL dengan nama kumpulan agen tujuan.
  • STORAGE_BUCKET dengan nama bucket Cloud Storage.
  • FOLDER dengan nama folder tempat Anda ingin data ditransfer.

Saat Anda memulai tugas transfer, sistem akan terlebih dahulu menghitung data di sumber dan tujuan untuk menentukan data sumber yang baru atau diperbarui sejak transfer sebelumnya. Hanya data baru yang ditransfer.

Library Klien

Go


import (
	"context"
	"fmt"
	"io"

	storagetransfer "cloud.google.com/go/storagetransfer/apiv1"
	"cloud.google.com/go/storagetransfer/apiv1/storagetransferpb"
)

func transferFromPosix(w io.Writer, projectID string, sourceAgentPoolName string, rootDirectory string, gcsSinkBucket string) (*storagetransferpb.TransferJob, error) {
	// Your project id
	// projectId := "myproject-id"

	// The agent pool associated with the POSIX data source. If not provided, defaults to the default agent
	// sourceAgentPoolName := "projects/my-project/agentPools/transfer_service_default"

	// The root directory path on the source filesystem
	// rootDirectory := "/directory/to/transfer/source"

	// The ID of the GCS bucket to transfer data to
	// gcsSinkBucket := "my-sink-bucket"

	ctx := context.Background()
	client, err := storagetransfer.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("storagetransfer.NewClient: %w", err)
	}
	defer client.Close()

	req := &storagetransferpb.CreateTransferJobRequest{
		TransferJob: &storagetransferpb.TransferJob{
			ProjectId: projectID,
			TransferSpec: &storagetransferpb.TransferSpec{
				SourceAgentPoolName: sourceAgentPoolName,
				DataSource: &storagetransferpb.TransferSpec_PosixDataSource{
					PosixDataSource: &storagetransferpb.PosixFilesystem{RootDirectory: rootDirectory},
				},
				DataSink: &storagetransferpb.TransferSpec_GcsDataSink{
					GcsDataSink: &storagetransferpb.GcsData{BucketName: gcsSinkBucket},
				},
			},
			Status: storagetransferpb.TransferJob_ENABLED,
		},
	}

	resp, err := client.CreateTransferJob(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("failed to create transfer job: %w", err)
	}
	if _, err = client.RunTransferJob(ctx, &storagetransferpb.RunTransferJobRequest{
		ProjectId: projectID,
		JobName:   resp.Name,
	}); err != nil {
		return nil, fmt.Errorf("failed to run transfer job: %w", err)
	}
	fmt.Fprintf(w, "Created and ran transfer job from %v to %v with name %v", rootDirectory, gcsSinkBucket, resp.Name)
	return resp, nil
}

Java

import com.google.storagetransfer.v1.proto.StorageTransferServiceClient;
import com.google.storagetransfer.v1.proto.TransferProto;
import com.google.storagetransfer.v1.proto.TransferTypes.GcsData;
import com.google.storagetransfer.v1.proto.TransferTypes.PosixFilesystem;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferJob;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferSpec;
import java.io.IOException;

public class TransferBetweenPosix {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.

    // Your project id
    String projectId = "my-project-id";

    // The agent pool associated with the POSIX data source. If not provided, defaults to the
    // default agent
    String sourceAgentPoolName = "projects/my-project-id/agentPools/transfer_service_default";

    // The agent pool associated with the POSIX data sink. If not provided, defaults to the default
    // agent
    String sinkAgentPoolName = "projects/my-project-id/agentPools/transfer_service_default";

    // The root directory path on the source filesystem
    String rootDirectory = "/directory/to/transfer/source";

    // The root directory path on the sink filesystem
    String destinationDirectory = "/directory/to/transfer/sink";

    // The ID of the GCS bucket for intermediate storage
    String bucketName = "my-intermediate-bucket";

    transferBetweenPosix(
        projectId,
        sourceAgentPoolName,
        sinkAgentPoolName,
        rootDirectory,
        destinationDirectory,
        bucketName);
  }

  public static void transferBetweenPosix(
      String projectId,
      String sourceAgentPoolName,
      String sinkAgentPoolName,
      String rootDirectory,
      String destinationDirectory,
      String bucketName)
      throws IOException {

    TransferJob transferJob =
        TransferJob.newBuilder()
            .setProjectId(projectId)
            .setTransferSpec(
                TransferSpec.newBuilder()
                    .setSinkAgentPoolName(sinkAgentPoolName)
                    .setSourceAgentPoolName(sourceAgentPoolName)
                    .setPosixDataSource(
                        PosixFilesystem.newBuilder().setRootDirectory(rootDirectory).build())
                    .setPosixDataSink(
                        PosixFilesystem.newBuilder().setRootDirectory(destinationDirectory).build())
                    .setGcsIntermediateDataLocation(
                        GcsData.newBuilder().setBucketName(bucketName).build())
                    .build())
            .setStatus(TransferJob.Status.ENABLED)
            .build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources,
    // or use "try-with-close" statement to do this automatically.
    try (StorageTransferServiceClient storageTransfer = StorageTransferServiceClient.create()) {

      // Create the transfer job
      TransferJob response =
          storageTransfer.createTransferJob(
              TransferProto.CreateTransferJobRequest.newBuilder()
                  .setTransferJob(transferJob)
                  .build());

      System.out.println(
          "Created and ran a transfer job from "
              + rootDirectory
              + " to "
              + destinationDirectory
              + " with name "
              + response.getName());
    }
  }
}

Node.js


// Imports the Google Cloud client library
const {
  StorageTransferServiceClient,
} = require('@google-cloud/storage-transfer');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// Your project id
// const projectId = 'my-project'

// The agent pool associated with the POSIX data source. Defaults to the default agent
// const sourceAgentPoolName = 'projects/my-project/agentPools/transfer_service_default'

// The agent pool associated with the POSIX data sink. Defaults to the default agent
// const sinkAgentPoolName = 'projects/my-project/agentPools/transfer_service_default'

// The root directory path on the source filesystem
// const rootDirectory = '/directory/to/transfer/source'

// The root directory path on the sink filesystem
// const destinationDirectory = '/directory/to/transfer/sink'

// The ID of the GCS bucket for intermediate storage
// const bucketName = 'my-intermediate-bucket'

// Creates a client
const client = new StorageTransferServiceClient();

/**
 * Creates a request to transfer from the local file system to the sink bucket
 */
async function transferDirectory() {
  const createRequest = {
    transferJob: {
      projectId,
      transferSpec: {
        sourceAgentPoolName,
        sinkAgentPoolName,
        posixDataSource: {
          rootDirectory,
        },
        posixDataSink: {
          rootDirectory: destinationDirectory,
        },
        gcsIntermediateDataLocation: {
          bucketName,
        },
      },
      status: 'ENABLED',
    },
  };

  // Runs the request and creates the job
  const [transferJob] = await client.createTransferJob(createRequest);

  const runRequest = {
    jobName: transferJob.name,
    projectId: projectId,
  };

  await client.runTransferJob(runRequest);

  console.log(
    `Created and ran a transfer job from '${rootDirectory}' to '${destinationDirectory}' with name ${transferJob.name}`
  );
}

transferDirectory();

Python

from google.cloud import storage_transfer


def transfer_between_posix(
    project_id: str,
    description: str,
    source_agent_pool_name: str,
    sink_agent_pool_name: str,
    root_directory: str,
    destination_directory: str,
    intermediate_bucket: str,
):
    """Creates a transfer between POSIX file systems."""

    client = storage_transfer.StorageTransferServiceClient()

    # The ID of the Google Cloud Platform Project that owns the job
    # project_id = 'my-project-id'

    # A useful description for your transfer job
    # description = 'My transfer job'

    # The agent pool associated with the POSIX data source.
    # Defaults to 'projects/{project_id}/agentPools/transfer_service_default'
    # source_agent_pool_name = 'projects/my-project/agentPools/my-agent'

    # The agent pool associated with the POSIX data sink.
    # Defaults to 'projects/{project_id}/agentPools/transfer_service_default'
    # sink_agent_pool_name = 'projects/my-project/agentPools/my-agent'

    # The root directory path on the source filesystem
    # root_directory = '/directory/to/transfer/source'

    # The root directory path on the destination filesystem
    # destination_directory = '/directory/to/transfer/sink'

    # The Google Cloud Storage bucket for intermediate storage
    # intermediate_bucket = 'my-intermediate-bucket'

    transfer_job_request = storage_transfer.CreateTransferJobRequest(
        {
            "transfer_job": {
                "project_id": project_id,
                "description": description,
                "status": storage_transfer.TransferJob.Status.ENABLED,
                "transfer_spec": {
                    "source_agent_pool_name": source_agent_pool_name,
                    "sink_agent_pool_name": sink_agent_pool_name,
                    "posix_data_source": {
                        "root_directory": root_directory,
                    },
                    "posix_data_sink": {
                        "root_directory": destination_directory,
                    },
                    "gcs_intermediate_data_location": {
                        "bucket_name": intermediate_bucket
                    },
                },
            }
        }
    )

    result = client.create_transfer_job(transfer_job_request)
    print(f"Created transferJob: {result.name}")

Mengelola bucket perantara

Setelah tugas transfer selesai, Storage Transfer Service akan menyimpan log transfer yang mencantumkan data yang berhasil ditransfer dan gagal ditransfer di bucket. Setelah transfer, tugas pembersihan akan dimulai secara otomatis untuk menghapus data perantara. Dalam beberapa kasus, tugas pembersihan gagal menghapus semua data di bucket. Untuk menghapus data yang tidak dihapus selama pembersihan, gunakan petunjuk di bawah untuk menghapus data secara manual, atau menetapkan aturan siklus proses untuk menghapus data secara otomatis.

Pembersihan manual

Hapus data dari bucket perantara dengan menjalankan perintah berikut berdasarkan jenis data yang ingin Anda hapus.

  • Untuk menghapus data di bucket perantara yang tidak dihapus selama pembersihan, jalankan perintah berikut:

    gcloud storage rm gs://STORAGE_BUCKET/PREFIX**
    
  • Untuk menghapus semua data, termasuk log transfer, tentukan root bucket menggunakan karakter pengganti cocok-semua (*).

    gcloud storage rm gs://STORAGE_BUCKET/*
    
  • Untuk menghapus bucket, jalankan perintah berikut:

    gcloud storage rm gs://STORAGE_BUCKET
    

Ganti variabel berikut:

  • STORAGE_BUCKET dengan nama bucket perantara.

  • PREFIX dengan nama folder tempat data ditransfer dalam bucket perantara.

Menetapkan aturan siklus proses

Untuk menghapus data yang tidak dihapus oleh siklus pembersihan otomatis, tetapkan aturan siklus proses untuk bucket Cloud Storage. Gunakan kondisi age untuk menghapus data perantara di bucket dengan menentukan periode yang lebih lama dari tugas transfer terpanjang yang menggunakan bucket sebagai perantara. Jika kondisi usia yang ditentukan lebih singkat dari waktu yang diperlukan untuk mendownload file dari bucket perantara ke tujuan, transfer file akan gagal.

Secara opsional, gunakan kondisi matchesPrefix untuk menghapus data di folder yang Anda tentukan untuk bucket perantara. Untuk menghapus log transfer beserta data di bucket, kondisi matchesPrefix tidak diperlukan.

Mempertahankan metadata file

Untuk mempertahankan metadata file, termasuk UID numerik, GID, MODE, dan link simbolis:

gcloud CLI

Gunakan kolom --preserve-metadata untuk menentukan perilaku pelestarian untuk transfer ini. Opsi yang berlaku untuk transfer sistem file adalah: gid, mode, symlink, uid.

REST API

Tentukan opsi yang sesuai dalam objek metadataOptions.

Lihat Mempertahankan atribut POSIX opsional untuk mengetahui informasi selengkapnya.

Contoh transfer menggunakan gcloud CLI

Dalam contoh ini, kita mentransfer data dari direktori /tmp/datasource di VM1 ke /tmp/destination di VM2.

  1. Siapkan sumber transfer.

    1. Buat kumpulan agen sumber:

      gcloud transfer agent-pools create source_agent_pool
      
    2. Di VM1, instal agen untuk source_agent_pool dengan menjalankan:

      gcloud transfer agents install --pool=source_agent_pool \
          --count=1 \
          --mount-directories="/tmp/datasource"
      
  2. Siapkan tujuan transfer.

    1. Buat kumpulan agen tujuan:

      gcloud transfer agent-pools create destination_agent_pool
      
    2. Di VM2, instal agen untuk destination_agent_pool dengan menjalankan:

      gcloud transfer agents install --pool=destination_agent_pool \
          --count=3 \
          --mount-directories="/tmp/destination"
      
  3. Buat bucket Cloud Storage perantara.

    1. Buat bucket bernama my-intermediary-bucket:

      gcloud storage buckets create gs://my-intermediary-bucket
      
    2. Beri otorisasi akun Anda untuk semua fitur Storage Transfer Service dengan menjalankan:

      gcloud transfer authorize --add-missing
      
  4. Buat tugas transfer dengan menjalankan:

    gcloud transfer jobs create posix:///tmp/datasource posix:///tmp/destination \
        --source-agent-pool=source_agent_pool \
        --destination-agent-pool=destination_agent_pool \
        --intermediate-storage-path=gs://my-intermediary-bucket
    

Langkah selanjutnya