Operasi tulis

Halaman ini berisi daftar jenis permintaan tulis yang dapat Anda kirim ke Bigtable dan menjelaskan kapan Anda harus menggunakannya dan kapan tidak.

Bigtable Data API dan library klien memungkinkan Anda menulis data secara terprogram ke tabel. Bigtable mengirimkan kembali respons atau konfirmasi untuk setiap penulisan.

Setiap library klien menawarkan kemampuan untuk mengirim jenis permintaan tulis berikut:

  • Operasi tulis sederhana
  • Penambahan dan penambahan
  • Operasi tulis bersyarat
  • Batch operasi tulis

Library klien Bigtable memiliki fitur percobaan ulang cerdas bawaan untuk operasi tulis sederhana dan batch, yang berarti library tersebut menangani ketidaktersediaan sementara dengan lancar. Misalnya, jika aplikasi Anda mencoba menulis data dan mengalami gangguan sementara atau masalah jaringan, aplikasi akan otomatis mencoba ulang hingga operasi tulis di-commit atau batas waktu permintaan tercapai. Ketahanan ini dapat digunakan dengan instance cluster tunggal dan instance yang direplikasi, dengan perutean cluster tunggal atau perutean multi-cluster.

Untuk operasi tulis batch dan streaming, Anda dapat menggunakan [ konektor Bigtable Beam . Untuk mengetahui informasi selengkapnya, lihat Batch operasi tulis.

Untuk mempelajari batas yang berlaku untuk permintaan tulis, lihat Kuota dan batas.

Contoh setiap jenis penulisan tersedia untuk setiap library klien Cloud Bigtable.

Untuk informasi tentang cara menambahkan data ke sel, lihat Menggabungkan nilai pada waktu penulisan (Pratinjau).

Jenis penulisan dan kapan menggunakannya

Semua permintaan tulis mencakup komponen dasar berikut:

  • Nama tabel yang akan menjadi tujuan penulisan.
  • ID profil aplikasi, yang memberi tahu Bigtable cara mengarahkan traffic.
  • Satu atau beberapa mutasi. Mutasi terdiri dari empat elemen:
    • Nama kolom keluarga
    • Penentu kolom
    • Stempel waktu
    • Nilai yang Anda tulis ke tabel

Stempel waktu mutasi memiliki nilai default tanggal dan waktu saat ini, diukur sebagai waktu yang telah berlalu sejak epoch Unix, 00:00:00 UTC pada 1 Januari 1970.

Stempel waktu yang Anda kirim ke Bigtable harus berupa nilai mikrodetik dengan presisi maksimal milidetik. Stempel waktu dengan presisi mikrodetik, seperti 3023483279876543, ditolak. Dalam contoh ini, nilai stempel waktu yang dapat diterima adalah 3023483279876000.

Semua mutasi dalam satu permintaan tulis memiliki stempel waktu yang sama kecuali jika Anda menggantinya. Anda dapat menetapkan stempel waktu semua mutasi dalam permintaan tulis agar sama atau berbeda satu sama lain.

Operasi tulis sederhana

Anda dapat menulis satu baris ke Bigtable dengan permintaan MutateRow yang menyertakan nama tabel, ID profil aplikasi yang harus digunakan, kunci baris, dan hingga 100.000 mutasi untuk baris tersebut. Penulisan baris tunggal bersifat atomik. Gunakan jenis penulisan ini saat Anda membuat beberapa mutasi menjadi satu baris.

Untuk contoh kode yang menunjukkan cara mengirim permintaan tulis sederhana, lihat Melakukan penulisan sederhana.

Kapan sebaiknya tidak menggunakan operasi tulis sederhana

Penulisan sederhana bukanlah cara terbaik untuk menulis data untuk kasus penggunaan berikut:

  • Anda menulis batch data yang akan memiliki kunci baris yang berdekatan. Dalam hal ini, Anda harus menggunakan batch operasi tulis, bukan operasi tulis sederhana berturut-turut, karena batch yang berdekatan dapat diterapkan dalam satu panggilan backend.

  • Anda menginginkan throughput tinggi (baris per detik atau byte per detik) dan tidak memerlukan latensi rendah. Dalam kasus ini, batch operasi tulis akan lebih cepat.

Penambahan dan penambahan

Dalam banyak kasus, menggunakan agregat (Pratinjau), yang memungkinkan Anda memperbarui nilai pada waktu penulisan, adalah opsi terbaik untuk kasus ketika Anda ingin menambah atau meningkatkan nilai. Namun, agregat tidak mendukung operasi penambahan. Untuk mengetahui informasi selengkapnya, lihat Nilai gabungan pada waktu tulis.

Jika ingin menambahkan data ke nilai yang ada, atau perlu menambahkan nilai numerik yang ada dan tidak dapat menggunakan agregat, Anda dapat mengirim permintaan ReadModifyWriteRow. Permintaan ini mencakup nama tabel, ID profil aplikasi yang harus digunakan, row key, dan kumpulan aturan yang digunakan saat menulis data. Setiap aturan mencakup nama kolom, penentu kolom, dan nilai tambahan atau jumlah pertambahan.

Aturan diterapkan secara berurutan. Misalnya, jika permintaan Anda menyertakan permintaan untuk menaikkan nilai suatu kolom sebanyak dua, dan aturan selanjutnya dalam permintaan yang sama menambahkan kolom yang sama tersebut sebanyak 1, kolom tersebut akan bertambah 3 dalam satu penulisan atomik ini. Aturan berikutnya tidak menimpa aturan sebelumnya.

Nilai dapat bertambah hanya jika dienkode sebagai bilangan bulat yang ditandatangani big-endian 64-bit. Bigtable memperlakukan kenaikan ke nilai yang kosong atau tidak ada seolah-olah nilainya nol. Permintaan ReadModifyWriteRow bersifat atomik. Proses ini tidak akan dicoba lagi jika gagal karena alasan apa pun.

Untuk contoh kode yang menunjukkan cara menambahkan nilai dalam sel, lihat Menambahkan nilai yang sudah ada.

Kapan sebaiknya ReadModifyWriteRow tidak digunakan

Anda tidak boleh mengirim permintaan ReadModifyWriteRow dalam situasi berikut:

  • Kasus penggunaan Anda dapat ditangani dengan gabungan (Pratinjau).

  • Anda menggunakan profil aplikasi yang memiliki perutean multi-cluster.

  • Anda menggunakan beberapa profil aplikasi cluster tunggal dan mengirim operasi tulis yang dapat bertentangan dengan data yang ditulis ke baris dan kolom yang sama di cluster lain dalam instance tersebut. Dengan perutean cluster tunggal, permintaan tulis dikirim ke satu cluster lalu direplikasi.

  • Anda mengandalkan fitur percobaan ulang cerdas yang disediakan oleh library klien. Penambahan dan penambahan tidak dapat dicoba lagi.

  • Anda menulis data dalam jumlah besar dan perlu operasi tulis yang selesai dengan cepat. Permintaan yang membaca, lalu mengubah baris lebih lambat dari permintaan tulis sederhana. Akibatnya, jenis operasi tulis ini sering kali bukan pendekatan terbaik dalam skala besar. Misalnya, jika ingin menghitung sesuatu yang akan berjumlah jutaan, seperti kunjungan halaman, Anda harus menggunakan agregat untuk memperbarui jumlah pada waktu penulisan. Anda juga dapat mempertimbangkan untuk mencatat setiap tampilan sebagai penulisan sederhana, bukan menambah nilai, kemudian menggunakan tugas Dataflow untuk menggabungkan data.

Operasi tulis bersyarat

Jika Anda ingin memeriksa suatu kondisi pada suatu baris, lalu bergantung pada hasilnya, kirim data ke baris tersebut, kirim permintaan CheckAndMutateRow. Jenis permintaan ini menyertakan kunci baris dan filter baris. Filter baris adalah kumpulan aturan yang Anda gunakan untuk memeriksa nilai data yang ada. Selanjutnya, mutasi akan diterapkan ke kolom tertentu dalam baris hanya jika kondisi tertentu terpenuhi oleh filter. Proses pemeriksaan dan penulisan ini diselesaikan sebagai tindakan atomik tunggal.

Permintaan filter harus menyertakan salah satu atau kedua dari dua jenis mutasi:

  • Mutasi yang sebenarnya, atau mutasi yang akan diterapkan jika filter menampilkan nilai.
  • Mutasi palsu, yang diterapkan jika filter tidak menghasilkan apa pun.

Anda dapat menyediakan hingga 100.000 setiap jenis mutasi--benar dan salah--dalam satu penulisan, dan Anda harus mengirim minimal satu. Bigtable mengirimkan respons ketika semua mutasi selesai.

Untuk contoh kode yang menunjukkan cara mengirim penulisan bersyarat, lihat Menulis nilai secara bersyarat.

Kapan penulisan bersyarat tidak boleh digunakan

Anda tidak dapat menggunakan penulisan bersyarat untuk kasus penggunaan berikut:

  • Anda menggunakan profil aplikasi yang memiliki perutean multi-cluster.

  • Anda menggunakan beberapa profil aplikasi cluster tunggal dan mengirim operasi tulis yang dapat bertentangan dengan data yang ditulis ke baris dan kolom yang sama di cluster lain dalam instance tersebut. Dengan perutean cluster tunggal, permintaan tulis dikirim ke satu cluster lalu direplikasi.

Batch operasi tulis

Anda dapat menulis lebih dari satu baris dengan satu panggilan menggunakan permintaan MutateRows. Permintaan MutateRows berisi kumpulan hingga 100.000 entri yang masing-masing diterapkan secara atomik. Setiap entri terdiri dari row key dan setidaknya satu mutasi yang akan diterapkan ke baris. Permintaan batch operasi tulis dapat berisi hingga 100.000 mutasi yang tersebar di semua entri. Misalnya, batch operasi tulis dapat menyertakan salah satu permutasi berikut:

  • 100.000 entri dengan 1 mutasi dalam setiap entri.
  • 1 entri dengan 100.000 mutasi.
  • 1.000 entri dengan masing-masing 100 mutasi.

Setiap entri dalam permintaan MutateRows bersifat atomik, tetapi permintaan secara keseluruhan tidak. Jika perlu, Bigtable akan mencoba kembali entri apa pun dalam batch yang tidak berhasil, hingga semua penulisan berhasil atau batas waktu permintaan tercapai. Kemudian, kode ini akan menampilkan respons yang mengidentifikasi setiap penulisan dalam batch dan apakah operasi tulis berhasil atau tidak.

Untuk contoh kode yang menunjukkan cara mengirim batch operasi tulis, lihat Melakukan penulisan batch.

Kapan tidak boleh menggunakan batch operasi tulis

  • Anda menulis data massal ke baris yang tidak berdekatan satu sama lain. Bigtable menyimpan data secara leksikografis berdasarkan kunci baris, biner yang setara dengan urutan abjad. Oleh karena itu, jika kunci baris dalam permintaan tidak mirip satu sama lain, Bigtable akan menanganinya secara berurutan, bukan secara paralel. Throughput akan tinggi, tetapi latensi juga akan tinggi. Untuk menghindari latensi tinggi, gunakan MutateRows jika kunci baris serupa, dan Bigtable akan menulis baris yang berdekatan satu sama lain. Gunakan MutateRow, atau operasi tulis sederhana, untuk baris yang tidak berdekatan satu sama lain.

  • Anda meminta beberapa mutasi ke baris yang sama. Dalam hal ini, Anda akan mendapatkan performa yang lebih baik jika melakukan semua mutasi dalam satu permintaan tulis sederhana. Hal ini karena dalam operasi tulis sederhana, semua perubahan dilakukan dalam satu tindakan atomik, tetapi operasi tulis batch dipaksa untuk membuat serialisasi mutasi ke baris yang sama, sehingga menyebabkan latensi.

Kontrol alur penulisan batch

Jika mengirim batch operasi tulis menggunakan salah satu opsi berikut, Anda dapat mengaktifkan kontrol alur penulisan batch dalam kode.

Saat kontrol alur penulisan batch diaktifkan untuk tugas Dataflow, Bigtable secara otomatis melakukan hal berikut :

  • Membatasi traffic agar tidak kelebihan beban pada cluster Bigtable Anda
  • Memastikan cluster memiliki beban yang cukup untuk memicu penskalaan otomatis Bigtable (jika diaktifkan), sehingga lebih banyak node akan otomatis ditambahkan ke cluster saat diperlukan

Tindakan gabungan ini mencegah kelebihan beban cluster dan kegagalan tugas, dan Anda tidak perlu menskalakan cluster secara manual untuk mengantisipasi menjalankan penulisan batch. Jika kontrol alur diaktifkan, penskalaan cluster akan terjadi selama tugas Dataflow, bukan sebelumnya, sehingga tugas mungkin memerlukan waktu lebih lama untuk diselesaikan dibandingkan jika Anda menskalakan cluster secara manual.

Anda harus menggunakan profil aplikasi yang dikonfigurasi untuk perutean cluster tunggal. Mengaktifkan Penskalaan otomatis Bigtable untuk cluster tujuan bukanlah persyaratan, tetapi penskalaan otomatis memungkinkan Anda memanfaatkan sepenuhnya kontrol alur penulisan batch. Anda dapat menggunakan penskalaan otomatis Dataflow seperti yang Anda lakukan dengan tugas lainnya.

Untuk mempelajari lebih lanjut penskalaan otomatis Bigtable, lihat Penskalaan otomatis. Untuk memahami kebijakan pemilihan rute profil aplikasi, lihat Ringkasan profil aplikasi.

Untuk contoh kode yang menunjukkan cara mengaktifkan kontrol alur penulisan batch menggunakan konektor Bigtable HBase Beam, lihat Menulis ke Bigtable.

Menulis data ke tampilan yang diizinkan

Untuk menulis data ke tampilan yang diotorisasi, Anda harus menggunakan salah satu dari berikut ini:

  • gcloud CLI
  • Klien Bigtable untuk Java

Library klien Bigtable lainnya belum mendukung akses tampilan yang sah.

Saat menulis data ke tampilan yang diotorisasi, Anda harus memberikan ID tampilan yang diizinkan selain ID tabel.

Semua penulisan ke tampilan yang diberi otorisasi langsung diterapkan ke tabel yang mendasari.

Batasan definisi tampilan yang diizinkan

Dalam tampilan yang diotorisasi, baris atau kolom tempat Anda dapat menulis data dibatasi oleh definisi tampilan yang diotorisasi. Dengan kata lain, Anda hanya dapat menulis ke baris dan kolom yang memenuhi kriteria yang sama dengan yang ditetapkan untuk tampilan yang sah.

Misalnya, jika tampilan yang diotorisasi ditentukan oleh awalan kunci baris examplepetstore1, Anda tidak dapat menulis data menggunakan kunci baris examplepetstore2; awal nilai kunci baris harus menyertakan seluruh string examplepetstore1.

Demikian pula, jika tampilan yang diotorisasi ditentukan oleh awalan penentu kolom order-phone, Anda dapat menulis data menggunakan penentu kolom order-phone123, tetapi Anda tidak dapat menggunakan penentu kolom order-tablet.

Permintaan tulis Anda juga tidak dapat mereferensikan data yang berada di luar tampilan yang diizinkan, seperti saat Anda memeriksa nilai dalam permintaan tulis kondisional.

Untuk permintaan apa pun yang menulis atau mereferensikan data di luar tampilan yang diizinkan, pesan error PERMISSION_DENIED akan ditampilkan.

Replikasi

Ketika satu cluster instance yang direplikasi menerima operasi tulis, penulisan tersebut langsung direplikasi ke cluster lain dalam instance tersebut.

Atomisitas

Setiap permintaan MutateRows yang Anda kirim ke instance yang direplikasi akan di-commit sebagai satu tindakan atomik pada cluster yang menjadi tujuan perutean permintaan. Saat penulisan direplikasi ke cluster lain dalam instance tersebut, cluster tersebut juga masing-masing menerima operasi tulis sebagai operasi atomik. Cluster tidak menerima mutasi parsial; mutasi berhasil atau gagal secara atomik untuk semua sel yang dimodifikasi.

Konsistensi

Waktu yang diperlukan agar data yang Anda tulis tersedia untuk dibaca bergantung pada beberapa faktor, termasuk jumlah cluster dalam instance dan jenis perutean yang digunakan oleh profil aplikasi Anda. Dengan instance cluster tunggal, data dapat langsung dibaca, tetapi jika sebuah instance memiliki lebih dari satu cluster, yang berarti bahwa instance tersebut menggunakan replikasi, Bigtable pada akhirnya akan konsisten. Anda dapat mencapai konsistensi read-your-write dengan mengarahkan permintaan ke cluster yang sama.

Anda dapat membuat dan menggunakan token konsistensi serta memanggil CheckConsistency dalam mode StandardReadRemoteWrites setelah Anda mengirim permintaan tulis. Token ini memeriksa konsistensi replikasi. Secara umum, Anda membuat token konsistensi setelah sekumpulan operasi tulis dikirim atau setelah interval tertentu, misalnya satu jam. Kemudian, Anda dapat menyerahkan token tersebut untuk digunakan oleh proses lain, seperti modul yang membuat permintaan baca, yang menggunakan token untuk memeriksa guna memastikan semua data telah direplikasi sebelum mencoba membaca.

Jika Anda menggunakan token tepat setelah membuatnya, perlu waktu hingga beberapa menit untuk memeriksa konsistensi saat pertama kali Anda menggunakannya. Penundaan ini terjadi karena setiap cluster akan memeriksa setiap cluster lain untuk memastikan tidak ada lagi data yang masuk. Setelah penggunaan awal, atau jika Anda menunggu beberapa menit sebelum menggunakan token untuk pertama kalinya, token akan langsung berhasil setiap kali digunakan.

Resolusi konflik

Setiap nilai sel dalam tabel Bigtable diidentifikasi secara unik dengan empat tuple (kunci baris, grup kolom, penentu kolom, stempel waktu). Lihat Model penyimpanan Bigtable untuk mengetahui detail selengkapnya tentang ID ini. Jika dua penulisan dengan empat tuple yang sama persis dikirim ke dua cluster yang berbeda, Bigtable secara otomatis akan menyelesaikan konflik menggunakan algoritma last write wins internal berdasarkan waktu sisi server. Implementasi "last write wins" Bigtable bersifat deterministik, dan jika replikasi mengejar, semua cluster akan memiliki nilai yang sama untuk empat tuple tersebut.

Langkah selanjutnya