Tulis

Halaman ini mencantumkan jenis permintaan tulis yang dapat Anda kirim ke Bigtable dan menjelaskan kapan Anda harus menggunakannya dan kapan tidak. Untuk mengetahui informasi tentang menggabungkan data dalam sel pada waktu tulis, lihat Menggabungkan nilai pada waktu tulis.

Bigtable Data API dan library klien memungkinkan Anda menulis data ke tabel secara terprogram. 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 penyambungan
  • Operasi tulis bersyarat
  • Penulisan batch

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

Untuk operasi penulisan batch dan streaming, Anda dapat menggunakan konektor Bigtable Beam. Untuk mengetahui informasi selengkapnya, lihat Penulisan batch.

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

Untuk contoh library klien Cloud Bigtable dari permintaan tulis yang dijelaskan di halaman ini, lihat Contoh penulisan.

Jenis penulisan dan waktu penggunaannya

Semua permintaan tulis mencakup komponen dasar berikut:

  • Nama tabel yang akan ditulisi.
  • ID profil aplikasi, yang memberi tahu Bigtable cara merutekan traffic.
  • Satu atau beberapa mutasi. Mutasi terdiri dari elemen berikut:
    • Nama grup kolom
    • 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 maksimum 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 penulisan memiliki stempel waktu yang sama kecuali jika Anda menggantinya. Anda dapat menyetel stempel waktu semua mutasi dalam permintaan penulisan agar sama atau berbeda satu sama lain.

Operasi tulis sederhana

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

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

Kapan sebaiknya tidak menggunakan penulisan sederhana

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

  • Anda sedang menulis batch data yang akan memiliki row key yang berdekatan. Dalam kasus ini, Anda harus menggunakan penulisan batch, bukan penulisan 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. Penulisan batch akan lebih cepat dalam kasus ini.

Update inkremental

Bigtable memungkinkan Anda membuat sel dengan jenis data aggregate. Sel gabungan dioptimalkan saat Anda ingin mengubah nilai dalam sel tabel yang ada, menggabungkan nilai sel saat data ditulis. Jenis agregasi berikut tersedia:

  • Sum - Menambahkan penghitung atau menyimpan total berjalan.
  • Minimum - Kirim bilangan bulat ke sel, dan Bigtable akan menyimpan nilai yang lebih rendah dari kedua nilai tersebut.
  • Maksimum - Kirim bilangan bulat ke sel, dan Bigtable akan menyimpan nilai yang lebih tinggi dari kedua nilai tersebut.
  • HyperLogLog (HLL) - Mengirim nilai yang ditambahkan ke kumpulan probabilistik semua nilai yang ditambahkan ke sel.

Permintaan untuk memperbarui sel gabungan dikirim dengan permintaan MutateRow dan jenis mutasi AddToCell atau MergeToCell atau salah satu jenis mutasi penghapusan.

Menambahkan

Untuk menambahkan data ke nilai yang ada, Anda dapat menggunakan permintaan ReadModifyWriteRow. Permintaan ini mencakup nama tabel, ID profil aplikasi yang harus digunakan, row key, dan sekumpulan aturan yang akan digunakan saat menulis data. Setiap aturan mencakup nama grup kolom, penentu kolom, dan nilai penambahan atau jumlah kenaikan.

Aturan diterapkan secara berurutan. Misalnya, jika permintaan Anda menyertakan permintaan untuk menambahkan nilai untuk kolom yang berisi nilai some dengan string thing, dan aturan berikutnya dalam permintaan yang sama menambahkan kolom yang sama dengan body, nilai akan diubah dua kali dalam satu penulisan atomik, dan nilai yang dihasilkan adalah somethingbody. Aturan yang lebih baru tidak akan menggantikan aturan yang lebih lama.

Anda juga dapat menambah bilangan bulat dengan panggilan ReadModifyWriteRow, tetapi sebaiknya gunakan sel gabungan dan AddToCell atau MergeToCell. Nilai dapat di-increment menggunakan ReadModifyWrite hanya jika dienkode sebagai bilangan bulat bertanda big-endian 64-bit. Bigtable memperlakukan penambahan ke nilai yang kosong atau tidak ada seolah-olah nilai tersebut adalah nol.

Permintaan ReadModifyWriteRow bersifat atomik. Tugas tidak akan dicoba lagi jika gagal karena alasan apa pun.

Kapan sebaiknya tidak menggunakan ReadModifyWriteRow

Jangan mengirim permintaan ReadModifyWriteRow dalam situasi berikut:

  • Kasus penggunaan Anda dapat ditangani dengan mengirim permintaan MutateRow dengan mutasi AddToCell. Untuk mengetahui informasi selengkapnya, lihat Menggabungkan nilai pada waktu penulisan.

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

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

  • Anda mengandalkan fitur coba lagi cerdas yang disediakan oleh library klien. Permintaan ReadModifyWriteRow tidak dapat dicoba lagi.

  • Anda sedang menulis data dalam jumlah besar dan Anda ingin penulisan selesai dengan cepat. Permintaan yang membaca lalu mengubah baris lebih lambat daripada permintaan penulisan sederhana. Akibatnya, jenis penulisan ini sering kali bukan pendekatan terbaik dalam skala besar.

    Misalnya, jika Anda ingin menghitung sesuatu yang jumlahnya mencapai jutaan, seperti tayangan halaman, Anda harus MutateRow dengan mutasi AddToCell untuk memperbarui jumlah pada waktu penulisan.

Operasi tulis bersyarat

Jika Anda ingin memeriksa kondisi baris, lalu, bergantung pada hasilnya, menulis data ke baris tersebut, kirim permintaan CheckAndMutateRow. Jenis permintaan ini mencakup kunci baris dan filter baris. Filter baris adalah serangkaian aturan yang Anda gunakan untuk memeriksa nilai data yang ada. Kemudian, mutasi dilakukan ke kolom tertentu dalam baris hanya jika kondisi tertentu, yang diperiksa oleh filter, terpenuhi. Proses pemeriksaan, lalu penulisan ini diselesaikan sebagai tindakan atomik tunggal.

Permintaan filter harus menyertakan satu atau kedua jenis mutasi berikut:

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

Anda dapat menyediakan hingga 100.000 mutasi dari setiap jenis--benar dan salah--dalam satu penulisan, dan Anda harus mengirimkan setidaknya satu. Bigtable mengirimkan respons saat semua mutasi selesai.

Karena operasi tulis bersyarat membaca baris untuk mengevaluasi filter, pemanggil harus memiliki izin bigtable.tables.readRows dan bigtable.tables.mutateRows pada tabel (atau izin bigtable.authorizedViews.readRows dan bigtable.authorizedViews.mutateRows yang setara pada tampilan yang diizinkan). Untuk mengetahui informasi selengkapnya, lihat Kontrol akses.

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

Kapan sebaiknya tidak menggunakan penulisan bersyarat

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 berkonflik dengan data yang ditulis ke baris dan kolom yang sama di cluster lain dalam instance. Dengan perutean cluster tunggal, permintaan tulis dikirim ke satu cluster, lalu direplikasi.

  • Anda sedang menulis data dalam jumlah besar dan Anda ingin penulisan selesai dengan cepat. Serupa dengan ReadModifyWriteRow, permintaan tulis bersyarat perlu membaca baris sebelum mengubahnya, sehingga permintaan CheckAndModifyRow lebih lambat daripada permintaan tulis sederhana. Akibatnya, jenis penulisan ini sering kali bukan pendekatan terbaik dalam skala besar.

Penulisan batch

Anda dapat menulis lebih dari satu baris dengan satu panggilan menggunakan permintaan MutateRows. Permintaan MutateRows berisi serangkaian 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 penulisan batch dapat berisi hingga 100.000 mutasi yang tersebar di semua entri. Misalnya, penulisan batch dapat mencakup salah satu permutasi berikut:

  • 100.000 entri dengan 1 mutasi di 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, API akan menampilkan respons yang mengidentifikasi setiap penulisan dalam batch dan apakah penulisan berhasil atau tidak.

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

Kapan sebaiknya tidak menggunakan penulisan batch

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

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

Kontrol alur penulisan batch

Jika Anda mengirim batch tulis (termasuk penghapusan) menggunakan salah satu berikut, Anda dapat mengaktifkan kontrol alur batch tulis dalam kode Anda.

Jika kontrol alur penulisan batch diaktifkan untuk tugas Dataflow, Bigtable akan otomatis melakukan hal berikut :

  • Membatasi traffic untuk menghindari kelebihan beban pada cluster Bigtable Anda
  • Memastikan cluster berada di bawah beban yang cukup untuk memicu penskalaan otomatis Bigtable (jika diaktifkan), sehingga lebih banyak node ditambahkan secara otomatis ke cluster saat diperlukan

Kombinasi tindakan ini mencegah kelebihan beban cluster dan kegagalan tugas, dan Anda tidak perlu menskalakan cluster secara manual untuk mengantisipasi penulisan batch. Jika kontrol alur diaktifkan, penskalaan cluster terjadi selama tugas Dataflow, bukan sebelumnya, sehingga tugas mungkin memerlukan waktu lebih lama untuk selesai 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 bukan persyaratan, tetapi penskalaan otomatis memungkinkan Anda memanfaatkan sepenuhnya kontrol aliran penulisan batch. Anda dapat menggunakan penskalaan otomatis Dataflow seperti yang Anda lakukan dengan tugas lainnya.

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

Untuk contoh kode, lihat Mengaktifkan kontrol alur penulisan batch.

Menulis data ke tampilan yang diotorisasi

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

  • gcloud CLI
  • Klien Bigtable untuk Java

Library klien Bigtable lainnya belum mendukung akses tampilan yang diizinkan.

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

Semua penulisan ke tampilan yang diotorisasi diterapkan langsung ke tabel dasar.

Batasan definisi tampilan yang diotorisasi

Dalam tampilan yang diizinkan, baris atau kolom yang dapat Anda tulis datanya dibatasi oleh definisi tampilan yang diizinkan. Dengan kata lain, Anda hanya dapat menulis ke baris dan kolom yang memenuhi kriteria yang sama yang ditentukan untuk tampilan yang diberi otorisasi.

Misalnya, jika tampilan yang diotorisasi ditentukan oleh awalan row key examplepetstore1, Anda tidak dapat menulis data menggunakan row key examplepetstore2; awal nilai row key 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 penulisan Anda juga tidak dapat mereferensikan data yang berada di luar tampilan yang diizinkan, seperti saat Anda memeriksa nilai dalam permintaan penulisan bersyarat.

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

Replikasi

Saat satu cluster dari instance yang direplikasi menerima penulisan, penulisan tersebut akan segera direplikasi ke cluster lain dalam instance.

Atomitas

Setiap permintaan MutateRows yang Anda kirim ke instance yang direplikasi akan dilakukan sebagai satu tindakan atomik pada cluster tempat permintaan dirutekan. Saat penulisan direplikasi ke cluster lain dalam instance, setiap cluster tersebut juga menerima penulisan sebagai operasi atomik. Cluster tidak menerima mutasi parsial; mutasi berhasil atau gagal secara atomik untuk semua sel yang diubahnya.

Konsistensi

Waktu yang diperlukan agar data yang Anda tulis tersedia untuk dibaca bergantung pada beberapa faktor, termasuk jumlah cluster di instance Anda dan jenis perutean yang digunakan profil aplikasi Anda.

Dengan instance cluster tunggal, data dapat langsung dibaca, tetapi jika instance memiliki lebih dari satu cluster, yang berarti menggunakan replikasi, Bigtable akan konsisten pada akhirnya. Anda dapat mencapai konsistensi baca-tulis Anda dengan merutekan permintaan ke cluster yang sama.

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

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

Penyelesaian konflik

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

Langkah berikutnya