Tulis
Halaman ini mencantumkan jenis permintaan tulis yang dapat Anda kirim ke Bigtable dan menjelaskan kapan Anda harus menggunakannya dan kapan tidak boleh. Untuk informasi tentang menggabungkan data dalam sel pada waktu penulisan, lihat Menggabungkan nilai pada waktu penulisan.
Bigtable Data API dan library klien memungkinkan Anda menulis data ke tabel secara terprogram. Bigtable akan mengirimkan kembali respons atau konfirmasi untuk setiap operasi tulis.
Setiap library klien menawarkan kemampuan untuk mengirim jenis permintaan tulis berikut:
- Operasi tulis sederhana
- Penambahan dan penambahan
- Operasi tulis bersyarat
- Operasi tulis batch
Library klien Bigtable memiliki fitur percobaan ulang cerdas bawaan untuk operasi tulis sederhana dan batch, yang berarti library tersebut menangani ketiadaan sementara dengan lancar. Misalnya, jika aplikasi Anda mencoba menulis data dan mengalami pemadaman sementara atau masalah jaringan, aplikasi akan otomatis mencoba lagi hingga penulisan dilakukan atau batas waktu permintaan tercapai. Ketahanan ini berfungsi 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 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 tulis.
Jenis operasi tulis dan kapan harus menggunakannya
Semua permintaan tulis menyertakan komponen dasar berikut:
- Nama tabel yang akan ditulis.
- 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, yang 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 operasi tulis ini saat Anda membuat beberapa mutasi ke
satu baris.
Untuk mengetahui contoh kode yang menunjukkan cara mengirim permintaan tulis sederhana, lihat Melakukan operasi tulis sederhana.
Kapan sebaiknya Anda tidak menggunakan operasi tulis sederhana
Operasi tulis sederhana bukanlah cara terbaik untuk menulis data untuk kasus penggunaan berikut:
Anda menulis batch data yang akan memiliki kunci baris yang berurutan. Dalam hal ini, Anda harus menggunakan penulisan batch, bukan penulisan sederhana berturut-turut, karena batch yang berurutan dapat diterapkan dalam satu panggilan backend.
Anda menginginkan throughput tinggi (baris per detik atau byte per detik) dan tidak memerlukan latensi rendah. Dalam hal ini, operasi tulis batch akan lebih cepat.
Agregasi, termasuk penambahan
Gabungan adalah sel tabel Bigtable yang menggabungkan nilai sel saat data ditulis. Jenis agregasi berikut tersedia:
- Sum - Menambahkan penghitung atau mempertahankan total berjalan.
- Minimum - Kirim bilangan bulat ke sel, dan Bigtable akan menyimpan nilai sel saat ini dan nilai yang dikirim, atau nilai yang dikirim jika sel belum ada.
- Maksimum - Kirim bilangan bulat ke sel yang berisi nilai, 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. Untuk mengetahui informasi selengkapnya tentang jenis agregasi dan
keluarga kolom agregat, lihat Nilai agregat pada waktu
penulisan.
Penambahan
Untuk menambahkan data ke nilai yang ada, Anda dapat menggunakan permintaan ReadModifyWriteRow
.
Permintaan ini mencakup nama tabel, ID profil aplikasi yang harus
digunakan, kunci baris, dan kumpulan aturan yang akan digunakan saat menulis data. Setiap aturan
menyertakan nama grup kolom, penentu kolom, dan nilai tambahan atau
jumlah penambahan.
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 diubah dua kali dalam satu operasi tulis atomik, dan nilai yang dihasilkan
adalah somethingbody
. Aturan yang lebih baru tidak akan menimpa aturan yang lebih lama.
Anda juga dapat menambahkan bilangan bulat dengan panggilan ReadModifyWriteRow
, tetapi sebaiknya
gunakan sel gabungan dan AddToCell
atau MergeToCell
.
Nilai hanya dapat ditambah menggunakan ReadModifyWrite
jika dienkode sebagai
bilangan bulat bertanda big-endian 64-bit. Bigtable memperlakukan penambahan ke nilai yang kosong atau tidak ada seolah-olah nilainya nol.
Permintaan ReadModifyWriteRow
bersifat atomik. Operasi tersebut tidak akan dicoba ulang jika gagal karena
alasan apa pun.
Kapan sebaiknya ReadModifyWriteRow
tidak digunakan
Jangan kirim permintaan ReadModifyWriteRow
dalam situasi berikut:
Kasus penggunaan Anda dapat ditangani dengan mengirim permintaan
MutateRow
dengan mutasiAddToCell
. Untuk mengetahui informasi selengkapnya, lihat Agregasi.Anda menggunakan profil aplikasi yang memiliki pemilihan rute 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. Dengan pemilihan rute cluster tunggal, permintaan tulis dikirim ke satu cluster, lalu direplikasi.
Anda mengandalkan fitur percobaan ulang cerdas yang disediakan oleh library klien. Permintaan
ReadModifyWriteRow
tidak dapat dicoba lagi.Anda menulis data dalam jumlah besar dan Anda memerlukan penulisan yang selesai dengan cepat. Permintaan yang membaca, lalu mengubah baris lebih lambat daripada permintaan tulis sederhana. Akibatnya, jenis penulisan ini sering kali bukan pendekatan terbaik dalam skala besar.
Misalnya, jika Anda ingin menghitung sesuatu yang jumlahnya akan mencapai jutaan, seperti kunjungan halaman, Anda harus
MutateRow
dengan mutasiAddToCell
untuk memperbarui jumlah pada waktu penulisan.
Operasi tulis bersyarat
Jika Anda ingin memeriksa kondisi baris, lalu, bergantung pada hasilnya,
menulis data ke baris tersebut, kirimkan permintaan CheckAndMutateRow
. Jenis permintaan ini mencakup kunci baris dan filter baris. Filter baris adalah kumpulan aturan
yang Anda gunakan untuk memeriksa nilai data yang ada. Mutasi kemudian di-commit
ke kolom tertentu dalam baris hanya jika kondisi tertentu, yang diperiksa oleh
filter, terpenuhi. Proses pemeriksaan, lalu penulisan ini diselesaikan sebagai
satu tindakan atomik.
Permintaan filter harus menyertakan salah satu atau kedua jenis mutasi berikut:
- Mutasi benar, 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 dari setiap jenis mutasi--benar dan salah--dalam satu operasi tulis, dan Anda harus mengirim setidaknya satu. Bigtable mengirimkan respons saat semua mutasi selesai.
Untuk contoh kode yang menunjukkan cara mengirim operasi tulis bersyarat, lihat Menulis nilai secara bersyarat.
Kapan sebaiknya tidak menggunakan operasi tulis bersyarat
Anda tidak dapat menggunakan operasi tulis bersyarat untuk kasus penggunaan berikut:
Anda menggunakan profil aplikasi yang memiliki pemilihan rute 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. Dengan pemilihan rute cluster tunggal, permintaan tulis dikirim ke satu cluster, lalu direplikasi.
Anda menulis data dalam jumlah besar dan memerlukan operasi tulis yang selesai dengan cepat. Serupa dengan
ReadModifyWriteRow
, permintaan tulis kondisional perlu membaca baris sebelum mengubahnya, sehingga permintaanCheckAndModifyRow
lebih lambat daripada permintaan tulis sederhana. Akibatnya, jenis penulisan ini sering kali bukan pendekatan terbaik dalam skala besar.
Operasi tulis batch
Anda dapat menulis lebih dari satu baris dengan satu panggilan menggunakan permintaan
MutateRows
. Permintaan MutateRows
berisi kumpulan hingga 100.000 entri yang
setiap kali diterapkan secara atomik. Setiap entri terdiri dari kunci baris dan minimal satu
mutasi yang akan diterapkan ke baris. Permintaan operasi tulis batch dapat berisi hingga
100.000 mutasi yang tersebar di semua entri. Misalnya, operasi tulis batch dapat
menyertakan 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, metode ini akan menampilkan respons yang mengidentifikasi setiap operasi tulis dalam batch dan
apakah operasi tulis berhasil atau tidak.
Untuk contoh kode yang menunjukkan cara mengirim operasi tulis batch, lihat Melakukan operasi tulis batch.
Kapan sebaiknya Anda tidak menggunakan operasi tulis batch
Anda menulis data massal ke baris yang tidak berdekatan. Bigtable menyimpan data secara leksikografis berdasarkan kunci baris, yang setara dengan urutan abjad dalam biner. Oleh karena itu, saat 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 tersebut, gunakan
MutateRows
saat kunci baris serupa dan Bigtable akan menulis baris yang berdekatan. GunakanMutateRow
, 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 tulis 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 tulis batch
Jika mengirim operasi tulis batch (termasuk penghapusan) menggunakan salah satu hal berikut, Anda dapat mengaktifkan kontrol alur operasi tulis batch dalam kode.
- Konektor Bigtable Beam (
BigtableIO
) - Library klien Bigtable untuk Java
- Konektor Beam Bigtable HBase (
CloudBigtableIO
) - Klien Bigtable HBase untuk Java
Saat kontrol alur penulisan batch diaktifkan untuk tugas Dataflow, Bigtable akan otomatis melakukan hal berikut :
- Batasi kapasitas traffic untuk menghindari kelebihan beban cluster Bigtable
- Memastikan cluster memiliki beban yang cukup untuk memicu penskalaan otomatis Bigtable (jika diaktifkan), sehingga lebih banyak node 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 pengoperasian penulisan batch. Jika kontrol alur diaktifkan, penskalaan cluster akan terjadi selama tugas Dataflow, bukan sebelum tugas, sehingga tugas mungkin memerlukan waktu lebih lama untuk selesai daripada 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 kontrol alur tulis batch sepenuhnya. 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 pemilihan rute profil aplikasi, lihat Ringkasan profil aplikasi.
Untuk contoh kode, lihat Mengaktifkan kontrol alur operasi tulis batch.
Menulis data ke tampilan yang diotorisasi
Untuk menulis data ke tampilan yang diotorisasi, Anda harus menggunakan salah satu dari hal berikut:
- gcloud CLI
- Klien Bigtable untuk Java
Library klien Bigtable lainnya belum mendukung akses tampilan yang diotorisasi.
Saat menulis data ke tampilan yang diotorisasi, Anda harus memberikan ID tampilan yang diotorisasi selain ID tabel.
Semua operasi tulis ke tampilan yang diotorisasi diterapkan langsung ke tabel yang mendasarinya.
Batasan definisi tampilan yang diotorisasi
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 yang ditentukan untuk tampilan yang diotorisasi.
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 tidak dapat menggunakan penentu kolom order-tablet
.
Permintaan tulis Anda juga tidak dapat mereferensikan data yang berada di luar tampilan yang diotorisasi, seperti saat Anda memeriksa nilai dalam permintaan tulis bersyarat.
Untuk setiap permintaan yang menulis atau mereferensikan data di luar tampilan yang diotorisasi, pesan error PERMISSION_DENIED
akan ditampilkan.
Replikasi
Saat satu cluster dari instance yang direplikasi menerima operasi tulis, operasi tulis tersebut akan langsung direplikasi ke cluster lain dalam instance.
Atomitas
Setiap permintaan MutateRows
yang Anda kirim ke instance yang direplikasi di-commit
sebagai satu tindakan atomik di cluster tempat permintaan dirutekan. Saat
penulisan direplikasi ke cluster lain dalam instance, cluster tersebut juga
masing-masing menerima penulisan sebagai operasi atomik. Cluster tidak menerima mutasi
sebagian; 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 dalam instance dan jenis perutean yang digunakan profil aplikasi Anda.
Dengan instance cluster tunggal, data dapat segera dibaca, tetapi jika instance memiliki lebih dari satu cluster, yang berarti menggunakan replikasi, Bigtable akan konsisten tertunda. Anda dapat mencapai konsistensi read-your-write dengan merutekan permintaan ke cluster yang sama.
Anda dapat membuat dan menggunakan token konsistensi serta memanggil CheckConsistency
dalam
mode StandardReadRemoteWrites
setelah mengirim permintaan tulis. Token
memeriksa konsistensi replikasi. Secara umum, Anda membuat token konsistensi
setelah batch operasi tulis 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 untuk 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 menggunakannya. Penundaan ini 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 kali, 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. Dalam kasus yang jarang terjadi, jika dua operasi tulis dengan empat tuple yang sama persis dikirim ke dua cluster yang berbeda, Bigtable akan otomatis menyelesaikan konflik menggunakan algoritma last write wins internal berdasarkan waktu sisi server. Implementasi "last write wins" Bigtable bersifat deterministik, dan saat replika mengejar, semua cluster memiliki nilai yang sama untuk empat tuple.