Mengelola agen transfer

Agen Storage Transfer Service adalah aplikasi yang berjalan di dalam container Open Container Initiative (OCI), yang berkoordinasi dengan Storage Transfer Service untuk transfer yang melibatkan sistem file atau penyimpanan yang kompatibel dengan S3.

Secara default, Storage Transfer Service menggunakan Docker untuk membangun dan menjalankan container OCI. Storage Transfer Service juga mendukung Podman untuk pengelolaan container; Anda harus menginstal agen menggunakan perintah podman run agar dapat menggunakan Podman.

Jika transfer Anda tidak melibatkan sistem file atau penyimpanan yang kompatibel dengan S3, Anda tidak perlu menyiapkan agen.

Dokumen ini menjelaskan cara mengelola agen transfer di server Anda.

Ringkasan

  • Proses agen bersifat dinamis. Saat menjalankan transfer, Anda dapat menambahkan agen untuk meningkatkan performa. Agen yang baru dimulai bergabung dengan kumpulan agen yang ditetapkan dan melakukan tugas dari transfer yang ada. Anda dapat menggunakan ini untuk menyesuaikan jumlah agen yang berjalan, atau untuk menyesuaikan performa transfer dengan perubahan permintaan transfer.

  • Proses agen adalah kolektif yang toleran terhadap kesalahan. Jika satu agen berhenti berjalan, agen yang tersisa akan terus melakukan pekerjaan. Jika semua agen Anda berhenti, saat Anda menambahkan agen baru, transfer akan dilanjutkan dari tempat agen berhenti. Hal ini memungkinkan Anda menghindari pemantauan agen, mencoba ulang transfer, atau menerapkan logika pemulihan. Anda dapat menerapkan patch, memindahkan, dan menskalakan kumpulan agen secara dinamis tanpa waktu henti transfer dengan mengoordinasikan agen dengan Google Kubernetes Engine.

    Misalnya, Anda mengirimkan dua transfer saat dua agen sedang berjalan. Jika salah satu agen berhenti karena komputer di-reboot atau patch sistem operasi, agen yang tersisa akan terus berfungsi. Kedua transfer masih berjalan, tetapi lebih lambat karena satu agen memindahkan data. Jika agen yang tersisa juga berhenti, semua transfer akan berhenti menghasilkan progres, karena tidak ada agen yang berjalan. Saat Anda memulai ulang proses agen, transfer akan dilanjutkan dari tempat terakhir transfer dihentikan.

  • Proses agen termasuk dalam kumpulan. Secara bersamaan, mereka memindahkan data Anda secara paralel. Oleh karena itu, semua agen dalam kumpulan harus memiliki akses yang sama ke semua sumber data yang ingin Anda transfer.

    Misalnya, jika Anda mentransfer data dari sistem file tertentu, Anda harus memasang sistem file ke setiap mesin yang menghosting agen di kumpulan agen Anda. Jika beberapa agen di kumpulan Anda dapat mengakses sumber data dan yang lain tidak, transfer dari sumber data tersebut tidak akan berhasil.

Sebelum memulai

Sebelum mengonfigurasi transfer, pastikan Anda telah mengonfigurasi akses: untuk pengguna dan akun layanan.

Jika Anda akan menggunakan perintah gcloud, instal gcloud CLI.

Menginstal dan menjalankan agen transfer

Sebaiknya instal minimal tiga agen per kumpulan agen, idealnya di mesin yang terpisah. Untuk mengetahui informasi selengkapnya tentang cara menentukan jumlah agen yang akan dijalankan, lihat Memaksimalkan performa agen transfer.

Jangan menyertakan informasi sensitif seperti informasi identitas pribadi (PII) atau data keamanan dalam awalan ID agen Anda. Nama resource dapat disalurkan ke nama resource Google Cloud lain dan dapat diekspos ke sistem internal Google di luar project Anda.

Untuk menginstal dan menjalankan agen transfer:

Google Cloud console

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

    Buka Agent pools

  2. Pilih kumpulan agen yang akan ditambahi agen baru.

  3. Klik Instal agen.

  4. Ikuti petunjuk untuk menginstal dan menjalankan agen.

    Untuk mengetahui informasi selengkapnya tentang opsi command line agen, lihat Opsi command line agen.

gcloud CLI

Untuk menginstal satu atau beberapa agen menggunakan gcloud CLI, jalankan gcloud transfer agents install:

gcloud transfer agents install --pool=POOL_NAME --count=NUM_AGENTS \
  --mount-directories=MOUNT_DIRECTORIES

Alat ini akan memandu Anda melakukan langkah-langkah yang diperlukan untuk menginstal agen. Perintah ini menginstal agen NUM_AGENTS di mesin Anda, yang dipetakan ke nama kumpulan yang ditentukan sebagai POOL_NAME, dan mengautentikasi agen menggunakan kredensial gcloud Anda. Nama kumpulan harus ada, atau error akan ditampilkan.

Flag --mount-directories bersifat opsional, tetapi sangat direkomendasikan. Nilainya adalah daftar direktori yang dipisahkan koma di sistem file yang akan diberi akses agen. Menghilangkan tanda ini akan memasang seluruh sistem file ke container agen. Lihat referensi gcloud untuk mengetahui detail selengkapnya.

Sumber yang kompatibel dengan S3

Saat menginstal agen untuk digunakan dengan sumber yang kompatibel dengan S3, Anda harus memberikan kredensial AWS sebagai variabel lingkungan sebagai nilai AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY, atau disimpan sebagai kredensial default dalam file konfigurasi sistem Anda.

export AWS_ACCESS_KEY_ID=ID
export AWS_SECRET_ACCESS_KEY=SECRET
gcloud transfer agents install --pool=POOL_NAME \
  --creds-file=/relative/path/to/service-account-key.json

Menggunakan kunci akun layanan

Untuk menjalankan agen menggunakan kunci akun layanan, gunakan opsi --creds-file:

gcloud transfer agents install --pool=POOL_NAME --count=NUM_AGENTS \
   --creds-file=/relative/path/to/service-account-key.json

Info selengkapnya

Untuk daftar lengkap flag opsional, jalankan gcloud transfer agents install --help atau baca referensi gcloud transfer.

Docker

Sebelum menggunakan Docker untuk menginstal agen, ikuti petunjuk untuk menginstal Docker.

Perintah docker run menginstal satu agen. Untuk menambah jumlah agen di pool Anda, jalankan kembali perintah ini sebanyak yang diperlukan.

Saat menginstal agen, Anda dapat memilih untuk melakukan autentikasi menggunakan kredensial default gcloud Anda, atau dengan akun layanan.

Kredensial default

Agar container Docker dapat melakukan autentikasi dengan kredensial default gcloud Anda, buat volume Docker yang berisi file dengan kredensial default aplikasi Anda dengan menjalankan perintah berikut:

sudo docker run -ti --name gcloud-config google/cloud-sdk gcloud auth application-default login

Kemudian, gunakan perintah berikut untuk menginstal agen, menggunakan flag --volumes-from untuk memasang volume kredensial gcloud-config:

sudo docker run --ulimit memlock=64000000 -d --rm \
--volumes-from gcloud-config \
-v HOST_DIRECTORY:CONTAINER_DIRECTORY \
gcr.io/cloud-ingest/tsop-agent:latest \
--project-id=PROJECT_ID \
--hostname=$(hostname) \
--agent-pool=POOL_NAME

Autentikasi akun layanan

Untuk menginstal dan menjalankan agen transfer docker run menggunakan kredensial akun layanan, tentukan jalur ke kunci akun layanan berformat JSON menggunakan tanda --creds-file.

Jalur harus diawali dengan string, /transfer_root.

Lihat Membuat dan mengelola kunci akun layanan untuk mengetahui informasi selengkapnya tentang kunci akun layanan.

sudo docker run --ulimit memlock=64000000 -d --rm \
-v HOST_DIRECTORY:CONTAINER_DIRECTORY \
-v PATH/TO/KEY.JSON:/etc/gcloud/key.json:ro \
gcr.io/cloud-ingest/tsop-agent:latest \
--project-id=PROJECT_ID \
--creds-file=/etc/gcloud/key.json \
--hostname=$(hostname) \
--agent-pool=POOL_NAME

Opsi dan tanda

Ganti variabel dalam contoh di atas dengan informasi berikut:

  • HOST_DIRECTORY adalah direktori di komputer host yang ingin Anda salin. Anda dapat menggunakan lebih dari satu tanda -v untuk menentukan direktori tambahan yang akan disalin.
  • CONTAINER_DIRECTORY adalah direktori yang dipetakan dalam penampung agen. Nilai ini harus sama dengan HOST_DIRECTORY.
  • PROJECT_ID adalah project ID yang menghosting transfer.
  • POOL_NAME adalah nama kumpulan agen tempat menginstal agen ini. Jika Anda menghapus tanda ini, agen akan diinstal ke dalam kumpulan transfer_service_default project Anda.

Perintah docker run mendukung flag tambahan.

  • --enable-mount-directory memasang seluruh sistem file di direktori /transfer_root pada container. Jika --enable-mount-directory ditentukan, pembatasan direktori menggunakan flag -v tidak akan diterapkan.

  • --creds-file=/etc/gcloud/key.json menentukan jalur ke file kredensial akun layanan berformat JSON di penampung. File ini dipasang oleh flag -v <var>HOST_PATH/TO/KEY.JSON</var>:/etc/gcloud/key.json:ro dalam perintah.

  • --enable-s3 menentukan bahwa agen ini ditujukan untuk transfer dari penyimpanan yang kompatibel dengan S3. Agen yang diinstal dengan opsi ini tidak dapat digunakan untuk transfer dari sistem file POSIX.

  • Jika transfer Anda berasal dari AWS S3 atau penyimpanan yang kompatibel dengan S3, teruskan ID kunci akses dan kunci rahasia Anda menggunakan variabel lingkungan:

    -e AWS_ACCESS_KEY_ID=AWS_ACCESS_KEY_ID \
    -e AWS_SECRET_ACCESS_KEY=AWS_SECRET_ACCESS_KEY
    
  • --env HTTPS_PROXY=PROXY menentukan proxy penerusan di jaringan Anda. Nilai PROXY adalah URL HTTP dan port server proxy. Pastikan Anda menentukan URL HTTP, bukan URL HTTPS, untuk menghindari permintaan yang dienkapsulasi dua kali dalam enkripsi TLS. Permintaan yang dienkapsulasi ganda mencegah server proxy mengirim permintaan keluar yang valid.

  • --agent-id-prefix=ID_PREFIX menentukan awalan opsional yang ditambahkan ke ID agen untuk membantu mengidentifikasi agen atau mesinnya di konsol Google Cloud . Jika awalan digunakan, ID agen diformat sebagai prefix + hostname + Docker container ID.

  • --log-dir=LOGS_DIRECTORY mengubah direktori tempat agen menulis log. Direktori default-nya adalah /tmp/.

    Jika Anda belum menentukan --enable_mount_directory, Anda harus mengawali jalur ini dengan /transfer_root. Contohnya, /transfer_root/logs.

  • --max-physical-mem=MAX_MEMORY: agen secara default menggunakan memori sistem maksimum 8 GiB. Jika default tidak sesuai dengan lingkungan Anda, Anda dapat menentukan penggunaan memori maksimum yang relevan dalam format berikut:

    Nilai max-physical-mem Setelan memori maksimum
    6g 6 gigabyte
    6gb 6 gigabyte
    6GiB 6 gibibyte
  • --network=DOCKER_NETWORK: Tentukan jaringan Docker untuk container ini. Menentukan --network=host dapat meningkatkan performa dengan mengurangi overhead jaringan, tetapi memberikan akses penuh container ke jaringan host.

Podman

Sebelum menggunakan Podman untuk menginstal agen, instal Podman:

sudo apt-get update
sudo apt-get -y install podman

Saat menginstal agen, Anda dapat memilih untuk melakukan autentikasi menggunakan kredensial default gcloud Anda, atau dengan akun layanan.

Kredensial default

Agar container agen dapat melakukan autentikasi dengan kredensial default Google Cloud CLI Anda, buat volume yang berisi file dengan kredensial default aplikasi Anda dengan menjalankan perintah berikut:

gcloud auth print-access-token | podman login -u oauth2accesstoken --password-stdin gcr.io
sudo podman pull gcr.io/google.com/cloudsdktool/google-cloud-cli:stable
sudo podman run -ti --replace --name gcloud-config gcr.io/google.com/cloudsdktool/google-cloud-cli:stable gcloud auth application-default login

Kemudian, gunakan perintah berikut untuk menginstal agen, menggunakan flag --volumes-from untuk memasang volume kredensial gcloud-config. Perintah ini menginstal satu agen. Untuk menambah jumlah agen di pool, jalankan kembali perintah ini sebanyak yang diperlukan.

sudo podman run --ulimit memlock=64000000 -d --rm \
--volumes-from gcloud-config \
-v HOST_DIRECTORY:CONTAINER_DIRECTORY \
gcr.io/cloud-ingest/tsop-agent:latest \
--project-id=PROJECT_ID \
--hostname=$(hostname) \
--agent-pool=POOL_NAME

Autentikasi akun layanan

Untuk menginstal dan menjalankan agen transfer menggunakan kredensial akun layanan, Anda harus menyediakan kunci akun layanan berformat JSON di penampung. Untuk melakukannya:

  1. Pasang lokasi host kunci ke jalur mana pun di penampung. Contoh: -v $HOME/.config/gcloud/credentials.json:/key.json:ro. Hal ini menentukan bahwa kunci terletak di mesin host di $HOME/.config/gcloud/credentials.json dan harus di-mount sebagai /key.json di container. ro menunjukkan bahwa file disediakan sebagai hanya baca untuk container.
  2. Tentukan jalur penampung kunci sebagai nilai --creds-file. Dalam contoh dari langkah sebelumnya, tentukan --creds-file=/key.json.

Lihat Membuat dan mengelola kunci akun layanan untuk mengetahui informasi selengkapnya tentang kunci akun layanan.

sudo podman run --ulimit memlock=64000000 -d --rm \
-v HOST_DIRECTORY:CONTAINER_DIRECTORY \
-v HOST_PATH/TO/KEY.JSON:/etc/gcloud/key.json:ro \
gcr.io/cloud-ingest/tsop-agent:latest \
--project-id=PROJECT_ID \
--creds-file=/etc/gcloud/key.json \
--hostname=$(hostname) \
--agent-pool=POOL_NAME

Opsi dan tanda

Ganti variabel dalam contoh di atas dengan informasi berikut:

  • HOST_DIRECTORY adalah direktori di komputer host yang ingin Anda salin. Anda dapat menggunakan lebih dari satu tanda -v untuk menentukan direktori tambahan yang akan disalin.
  • CONTAINER_DIRECTORY adalah direktori yang dipetakan dalam penampung agen. Nilai ini harus sama dengan HOST_DIRECTORY.
  • PROJECT_ID adalah project ID yang menghosting transfer.
  • POOL_NAME adalah nama kumpulan agen tempat menginstal agen ini. Jika Anda menghapus tanda ini, agen akan diinstal ke dalam kumpulan transfer_service_default project Anda.

Perintah podman run mendukung flag tambahan.

  • --enable-mount-directory memasang seluruh sistem file di direktori /transfer_root pada container. Jika --enable-mount-directory ditentukan, pembatasan direktori menggunakan flag -v tidak akan diterapkan.

  • --creds-file=/etc/gcloud/key.json menentukan jalur ke file kredensial akun layanan berformat JSON di penampung. File ini dipasang oleh flag -v <var>HOST_PATH/TO/KEY.JSON</var>:/etc/gcloud/key.json:ro dalam perintah.

  • --enable-s3 menentukan bahwa agen ini ditujukan untuk transfer dari penyimpanan yang kompatibel dengan S3. Agen yang diinstal dengan opsi ini tidak dapat digunakan untuk transfer dari sistem file POSIX.

  • Jika transfer Anda berasal dari AWS S3 atau penyimpanan yang kompatibel dengan S3, teruskan ID kunci akses dan kunci rahasia Anda menggunakan variabel lingkungan:

      -e AWS_ACCESS_KEY_ID=AWS_ACCESS_KEY_ID \
      -e AWS_SECRET_ACCESS_KEY=AWS_SECRET_ACCESS_KEY
      ```
    
  • --env HTTPS_PROXY=PROXY menentukan proxy penerusan di jaringan Anda. Nilai PROXY adalah URL HTTP dan port server proxy. Pastikan Anda menentukan URL HTTP, bukan URL HTTPS, untuk menghindari permintaan yang dienkapsulasi dua kali dalam enkripsi TLS. Permintaan yang dienkapsulasi ganda mencegah server proxy mengirim permintaan keluar yang valid.

  • --agent-id-prefix=ID_PREFIX menentukan awalan opsional yang ditambahkan ke ID agen untuk membantu mengidentifikasi agen atau mesinnya di konsol Google Cloud . Jika awalan digunakan, ID agen diformat sebagai prefix + hostname + OCI container ID.

  • --log-dir=LOGS_DIRECTORY mengubah direktori tempat agen menulis log. Direktori default-nya adalah /tmp/.

    Jika Anda belum menentukan --enable_mount_directory, Anda harus mengawali jalur ini dengan /transfer_root. Contohnya, /transfer_root/logs.

  • --max-physical-mem=MAX_MEMORY: agen secara default menggunakan memori sistem maksimum 8 GiB. Jika default tidak sesuai dengan lingkungan Anda, Anda dapat menentukan penggunaan memori maksimum yang relevan dalam format berikut:

    Nilai max-physical-mem Setelan memori maksimum
    6g 6 gigabyte
    6gb 6 gigabyte
    6GiB 6 gibibyte
  • --network=DOCKER_NETWORK: Tentukan jaringan Docker untuk container ini. Menentukan --network=host dapat meningkatkan performa dengan mengurangi overhead jaringan, tetapi memberikan akses penuh container ke jaringan host.

Pemecahan masalah

Jika konfigurasi SELinux Anda mengharuskan label ditempatkan pada konten volume yang di-mount ke dalam container, tambahkan tanda :Z ke volume:

sudo podman run --ulimit memlock=64000000 -d --rm \
-v HOST_DIRECTORY:CONTAINER_DIRECTORY:Z \
-v HOST_PATH/TO/KEY.JSON:/etc/gcloud/key.json:ro \
gcr.io/cloud-ingest/tsop-agent:latest \
--project-id=PROJECT_ID \
--creds-file=/etc/gcloud/key.json:ro \
--hostname=$(hostname) \
--agent-pool=POOL_NAME

Tanpa label, sistem keamanan dapat mencegah proses yang berjalan di dalam container menggunakan konten. Secara default, Podman tidak mengubah label yang ditetapkan oleh OS.

Mengonfirmasi koneksi agen

Untuk mengonfirmasi bahwa agen Anda terhubung:

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

    Buka Agent pools

    Kumpulan agen Anda ditampilkan, beserta jumlah agen yang terhubung.

  2. Pilih kumpulan agen untuk melihat detail tentang agen yang terhubung.

Jika agen baru tidak muncul di halaman kumpulan agen dalam waktu 10 menit setelah dibuat, lihat Agen tidak terhubung.

Memantau aktivitas agen

Anda dapat menggunakan Cloud Monitoring untuk memantau aktivitas agen.

Pemantauan tersedia di sepanjang dimensi project, agent_pool, dan agent_id.

Dengan data pemantauan ini, Anda dapat menyiapkan pemberitahuan untuk memberi tahu Anda tentang potensi masalah pada transfer Anda. Untuk melakukannya, buat pemberitahuan pada salah satu metrik Google Cloud berikut:

Nama metrik Yang dijelaskan Penggunaan yang disarankan
storagetransfer.googleapis.com/agent/transferred_bytes_count Mengukur seberapa cepat agen tertentu memindahkan data di semua tugas yang dilayaninya pada suatu titik waktu. Pemberitahuan untuk penurunan performa.
storagetransfer.googleapis.com/agent/connected Boolean yang bernilai True untuk setiap agen yang Google Cloud menerima pesan detak jantung terbaru dari.
  • Pemberitahuan untuk agen yang gagal
  • Gagal di bawah sejumlah agen yang Anda anggap perlu untuk performa yang wajar
  • Menandakan masalah pada komputer agen

Menghentikan agen

Untuk menghentikan agen, jalankan docker stop pada ID container Docker agen. Untuk menemukan ID dan menghentikan agen:

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

    Buka Agent pools

  2. Pilih kumpulan agen yang berisi agen yang akan dihentikan.

  3. Pilih agen dari daftar. Gunakan kolom Filter untuk menelusuri awalan, status agen, usia agen, dan lainnya.

  4. Klik Hentikan agen. Perintah docker stop dengan ID penampung tertentu akan ditampilkan.

  5. Jalankan perintah di komputer tempat agen berjalan. Perintah docker stop yang berhasil akan menampilkan ID penampung.

Setelah dihentikan, agen akan ditampilkan dalam daftar kumpulan agen sebagai Terputus.

Mulai ulang agen

Agen yang dihentikan tidak dapat dimulai ulang. Sebagai gantinya, instal agen baru ke dalam kumpulan agen.

Menghapus agen

Untuk menghapus agen tertentu, buat daftar agen yang berjalan di mesin Anda:

docker container list --all --filter ancestor=gcr.io/cloud-ingest/tsop-agent

Kemudian, teruskan ID agen ke transfer agents delete:

gcloud transfer agents delete --ids=id1,id2,…

Untuk menghapus semua agen yang berjalan di mesin, gunakan flag --all atau flag --uninstall. Kedua tanda menghapus semua agen di mesin; tanda --uninstall juga menghapus instalasi image Docker agen.

gcloud transfer agents delete --all
gcloud transfer agents delete --uninstall

Detail transfer sistem file

Transfer inkremental

Storage Transfer Service memulai semua transfer dengan menghitung data yang ada di sumber dan tujuan untuk menentukan file sumber mana yang baru, diperbarui, atau dihapus sejak transfer terakhir. Kami melakukan hal ini untuk mengurangi jumlah data yang kami kirim dari mesin Anda, menggunakan bandwidth secara efektif, dan mengurangi waktu transfer.

Untuk mendeteksi apakah file telah berubah, kami memeriksa waktu dan ukuran terakhir diubah dari file sumber, lalu membandingkannya dengan waktu dan ukuran terakhir diubah yang dicatat saat file terakhir disalin. Saat mendeteksi file baru atau yang diubah, kita menyalin seluruh file ke tujuannya. Untuk mengetahui informasi selengkapnya tentang keaktualan file, lihat Detail konsistensi data.

Secara default, kami mendeteksi, tetapi tidak menindaklanjuti, file yang dihapus di sumber. Jika Anda memilih opsi sinkronisasi Hapus file tujuan yang tidak ada di sumber saat membuat atau mengedit, transfer Anda akan menghapus objek yang sesuai di tujuan.

Jika Anda memilih opsi sinkronisasi Hapus file tujuan yang tidak ada di sumber, file yang tidak sengaja dihapus di sumber juga akan dihapus di tujuan. Untuk mencegah kehilangan data akibat penghapusan yang tidak disengaja, sebaiknya aktifkan versi objek di bucket tujuan jika Anda memilih untuk menggunakan opsi ini. Kemudian, jika Anda menghapus file secara tidak sengaja, Anda dapat memulihkan objek di Cloud Storage ke versi yang lebih lama.

Detail konsistensi data

Operasi transfer yang berhasil akan mentransfer semua file sumber yang ada dan tidak diubah selama seluruh waktu operasi berjalan. File sumber yang dibuat, diperbarui, atau dihapus selama transfer mungkin atau mungkin tidak mencerminkan perubahan tersebut dalam set data tujuan.

Storage Transfer Service menggunakan waktu dan ukuran modifikasi terakhir file untuk menentukan apakah file tersebut berubah. Jika file diperbarui tanpa mengubah waktu atau ukuran modifikasi terakhirnya, dan Anda mengaktifkan opsi delete-objects-from-source, Anda dapat kehilangan data dari perubahan tersebut.

Saat menggunakan fitur delete-objects-from-source, sebaiknya Anda membekukan penulisan ke sumber selama transfer untuk melindungi dari kehilangan data.

Untuk membekukan penulisan ke sumber, lakukan salah satu hal berikut:

  • Clone direktori yang ingin Anda transfer, lalu gunakan direktori yang di-clone sebagai sumber transfer.
  • Hentikan aplikasi yang menulis ke direktori sumber.

Jika penting untuk merekam perubahan yang terjadi selama transfer, Anda dapat menjalankan ulang transfer, atau menetapkan sistem file sumber sebagai hanya baca saat operasi sedang berjalan.

Karena Cloud Storage tidak memiliki konsep direktori, direktori sumber yang kosong tidak ditransfer.