Mentransfer data antara sistem file

Halaman ini menunjukkan kepada Anda cara mentransfer data antara dua sistem file POSIX. Kasus penggunaan umum mencakup:

  • Burst ke cloud dan HPC Hybrid: Transfer set data besar dengan cepat dari lokal ke cloud untuk diproses.
  • Migrasi dan sinkronisasi ke Filestore: Migrasikan atau sinkronkan data dari sistem file lokal ke Filestore.
  • Transfer file terkelola: Transfer 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 agen lainnya jika diperlukan. Setiap agen memerlukan 4 vCPU dan RAM 8 GiB.

Jika Anda bermigrasi ke instance Filestore, Filestore merekomendasikan penggunaan jenis instance n2-standard-8 untuk setiap agen. Tentukan nconnect=2 saat Anda memasang instance ke VM Compute Engine. Baca Panduan performa Filestore untuk informasi lebih lanjut tentang cara mengoptimalkan dan menguji performa instance.

Mentransfer sejumlah besar file kecil

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

Sebelum memulai

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

Membuat kumpulan agen dan menginstal agen

Agar sistem file dapat mentransfer sistem file, Anda perlu membuat kumpulan agen dan agen untuk sistem file sumber dan tujuan. Agen untuk kumpulan agen sumber harus diinstal pada mesin atau VM yang memiliki akses ke sistem file sumber. Agen untuk kumpulan agen tujuan harus diinstal pada mesin 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 diterapkan 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 pool.

    Buka Agent pool

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

  2. Klik Buat kumpulan lain.

  3. Masukkan nama untuk kumpulan tersebut.

  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 Persyaratan dan praktik terbaik agen.
  • MOUNT_DIRECTORIES dengan daftar direktori yang dipisahkan koma di sistem file sumber yang menjadi tempat penyalinan. Jika flag ini tidak ada, seluruh sistem file akan dipasang, yang dapat menimbulkan risiko keamanan.

Konsol Google Cloud

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

    Buka Agent pool

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

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

  3. Pada tab Agen, klik Instal agen.

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

Membuat kumpulan agen tujuan dan menginstal agen

Ulangi 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 transfer data.

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

    • Enkripsi: Anda dapat menentukan kunci enkripsi yang dikelola pelanggan (CMEK). Jika tidak, kunci enkripsi yang dikelola Google akan digunakan.
    • Object Versioning, Bucket Lock, dan default object dasar: Tetap nonaktifkan fitur ini.
  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 bagi semua fitur Storage Transfer Service. Perintah ini memberikan izin Storage Admin seluruh project:

      gcloud transfer authorize --add-missing
      

Membuat tugas transfer

gcloud CLI

Untuk melakukan 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 mentransfer data.

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 menyimpan listingan log transfer yang ditransfer dan gagal mentransfer data dalam bucket. Setelah transfer, tugas pembersihan dimulai secara otomatis untuk menghapus data perantara. Terkadang, tugas pembersihan gagal menghapus semua data di dalam bucket. Untuk menghapus data yang tidak dihapus selama pembersihan, gunakan petunjuk di bawah ini untuk menghapus data secara manual, atau untuk menetapkan aturan siklus proses guna menghapus data secara otomatis.

Pembersihan manual

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

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

    gsutil -m rm gs://STORAGE_BUCKET/PREFIX**
    
  • Untuk menghapus semua data, termasuk log transfer, tentukan root bucket menggunakan karakter pengganti match-all (*).

    gsutil -m rm gs://STORAGE_BUCKET/*
    
  • Untuk menghapus bucket, jalankan perintah berikut:

    gsutil -m rm gs://STORAGE_BUCKET
    

Ganti variabel berikut:

  • STORAGE_BUCKET dengan nama bucket perantara.

  • PREFIX dengan nama folder tempat data ditransfer ke 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 dalam bucket dengan menentukan periode yang lebih lama dari tugas transfer terpanjang yang menggunakan bucket sebagai perantara. Jika kondisi usia yang ditentukan lebih pendek dari waktu yang diperlukan untuk mendownload file dari bucket perantara ke tujuan, transfer file akan gagal.

Atau, gunakan kondisi matchesPrefix untuk menghapus data dalam 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 penyimpanan 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 pada VM1 ke /tmp/destination pada 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. Membuat bucket Cloud Storage perantara.

    1. Buat bucket bernama my-intermediary-bucket:

      gsutil mb gs://my-intermediary-bucket
      
    2. Izinkan 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