Tulis
Halaman ini mencantumkan jenis permintaan tulis yang dapat Anda kirim ke Bigtable dan menjelaskan kapan harus menggunakannya dan kapan tidak menggunakannya. Untuk mengetahui informasi tentang cara 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 mengirimkan kembali respons atau konfirmasi untuk setiap penulisan.
Setiap library klien menawarkan kemampuan untuk mengirim jenis permintaan tulis berikut:
- Operasi tulis sederhana
- Penambahan dan penggabungan
- Operasi tulis bersyarat
- Menulis batch
Library klien Bigtable memiliki fitur coba ulang cerdas bawaan untuk penulisan sederhana dan batch, yang berarti library ini menangani ketidaktersediaan sementara dengan lancar. Misalnya, jika aplikasi Anda mencoba menulis data dan mengalami pemadaman layanan sementara atau masalah jaringan, aplikasi akan otomatis mencoba lagi hingga penulisan di-commit atau batas waktu permintaan tercapai. Ketahanan ini berfungsi dengan instance cluster tunggal dan instance yang direplikasi, dengan pemilihan rute cluster tunggal atau pemilihan rute 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 kapan harus menggunakannya
Semua permintaan tulis menyertakan 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, yang diukur sebagai waktu yang telah berlalu sejak epoch Unix, 00:00:00 UTC pada 1 Januari 1970.
Secara default, stempel waktu yang Anda kirim ke Bigtable harus berupa nilai mikrodetik dengan presisi maksimal milidetik. Bigtable menolak stempel waktu dengan presisi mikrodetik, seperti 3023483279876543, kecuali jika Anda menulis ke tabel dengan tingkat perincian stempel waktu mikrodetik.
Tabel dengan perincian mikrodetik menerima stempel waktu yang disediakan pengguna dengan presisi mikrodetik penuh.
Fitur ini hanya tersedia untuk instance di edisi Enterprise Plus.
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,
row key, dan hingga 100.000 mutasi untuk baris tersebut. Penulisan satu baris bersifat atomik. Gunakan jenis penulisan ini saat Anda membuat beberapa mutasi ke satu baris.
Untuk contoh kode yang menunjukkan cara mengirim permintaan tulis sederhana, lihat Melakukan penulisan sederhana.
Kapan sebaiknya tidak menggunakan penulisan sederhana
Penulisan sederhana bukanlah cara terbaik untuk menulis data untuk kasus penggunaan berikut:
Anda menulis batch data yang akan memiliki row key yang berdekatan. Dalam hal ini, Anda harus menggunakan penulisan batch, bukan penulisan sederhana yang berurutan, 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 hal ini, penulisan batch akan lebih cepat.
Update inkremental
Bigtable memungkinkan Anda membuat sel dengan jenis data agregat. Sel agregat dioptimalkan saat Anda ingin mengubah nilai dalam sel tabel yang ada, dengan menggabungkan nilai sel saat data ditulis. Jenis agregasi berikut tersedia:
- Sum - Menambahkan penghitung atau mempertahankan total berjalan.
- Minimum - Mengirim bilangan bulat ke sel, dan Bigtable akan menyimpan nilai yang lebih rendah dari kedua nilai tersebut.
- Maksimum - Mengirim 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 dari semua nilai yang ditambahkan ke sel.
Permintaan untuk memperbarui sel agregat dikirim dengan permintaan MutateRow dan
jenis mutasi AddToCell atau MergeToCell atau salah satu jenis mutasi
penghapusan.
Tambahkan
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 kumpulan aturan yang akan digunakan saat menulis data. Setiap aturan
mencakup nama grup kolom, penentu kolom, dan nilai penambahan atau
jumlah inkremental.
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 tersebut akan diubah dua kali dalam satu penulisan 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 dapat ditingkatkan 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 nilainya adalah nol.
Permintaan ReadModifyWriteRow bersifat atomik. Tugas tidak akan dicoba lagi jika gagal karena alasan apa pun.
Kapan sebaiknya tidak menggunakan ReadModifyWriteRow
Jangan kirim permintaan ReadModifyWriteRow dalam situasi berikut:
Kasus penggunaan Anda dapat ditangani dengan mengirimkan permintaan
MutateRowdengan mutasiAddToCell. 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 penulisan 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 pencobaan ulang cerdas yang disediakan oleh library klien. Permintaan
ReadModifyWriteRowtidak dapat dicoba lagi.Anda menulis data dalam jumlah besar dan perlu menyelesaikan penulisan dengan cepat. Permintaan yang membaca, lalu mengubah baris lebih lambat daripada permintaan tulis sederhana. Oleh karena itu, jenis penulisan ini sering kali bukan pendekatan terbaik dalam skala besar.
Misalnya, jika Anda ingin menghitung sesuatu yang akan berjumlah jutaan, seperti kunjungan halaman, Anda harus
MutateRowdengan mutasiAddToCelluntuk memperbarui jumlah pada waktu penulisan.
Operasi tulis bersyarat
Jika Anda ingin memeriksa baris untuk suatu kondisi, lalu, bergantung pada hasilnya,
menulis data ke baris tersebut, kirimkan permintaan CheckAndMutateRow. Jenis permintaan ini mencakup row key dan filter baris. Filter baris adalah serangkaian aturan
yang Anda gunakan untuk memeriksa nilai data yang ada. Mutasi kemudian di-commit ke kolom tertentu di baris hanya jika kondisi tertentu, yang diperiksa oleh filter, terpenuhi. Proses pemeriksaan dan 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 salah, yang diterapkan jika filter tidak menghasilkan apa pun.
Anda dapat menyediakan hingga 100.000 dari setiap jenis mutasi--true dan false--dalam satu penulisan, dan Anda harus mengirimkan setidaknya satu. Bigtable mengirimkan respons saat semua mutasi selesai.
Karena penulisan 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 penulisan 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 penulisan 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 Anda memerlukan penulisan untuk diselesaikan dengan cepat. Serupa dengan
ReadModifyWriteRow, permintaan tulis bersyarat perlu membaca baris sebelum mengubahnya, sehingga permintaanCheckAndModifyRowlebih lambat daripada permintaan tulis sederhana. Akibatnya, jenis penulisan ini sering kali bukan pendekatan terbaik dalam skala besar.
Menulis batch
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 tulis 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 dalam batch yang tidak berhasil, hingga semua penulisan berhasil atau batas waktu permintaan tercapai. Kemudian, metode ini akan menampilkan respons yang mengidentifikasi setiap penulisan dalam batch dan
apakah penulisan tersebut 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 menulis data massal ke baris yang tidak berdekatan. Bigtable menyimpan data secara leksikografis berdasarkan row key, yang merupakan padanan biner dari urutan abjad. Oleh karena itu, jika row key 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
MutateRowssaat row key serupa dan Bigtable akan menulis baris yang berdekatan. GunakanMutateRow, atau penulisan 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 penulisan sederhana, semua perubahan di-commit dalam satu tindakan atomik, tetapi penulisan batch dipaksa untuk melakukan serialisasi mutasi ke baris yang sama, sehingga menyebabkan latensi.
Kontrol alur penulisan batch
Jika Anda mengirim penulisan batch (termasuk penghapusan) menggunakan salah satu cara berikut, Anda dapat mengaktifkan kontrol alur penulisan batch dalam kode Anda.
- Bigtable Beam connector (
BigtableIO) - Library klien Bigtable untuk Java
- Bigtable HBase Beam connector (
CloudBigtableIO) - Klien Bigtable HBase untuk Java
Jika kontrol alur penulisan batch diaktifkan untuk tugas Dataflow, Bigtable akan otomatis melakukan hal berikut :
- Membatasi kapasitas 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
Tindakan gabungan ini mencegah overload 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 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 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 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 diizinkan, Anda harus menggunakan salah satu dari berikut ini:
- 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 diizinkan akan langsung diterapkan ke tabel yang mendasarinya.
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 diizinkan.
Misalnya, jika tampilan yang diizinkan 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 diizinkan 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 bersyarat.
Untuk setiap permintaan yang menulis atau mereferensikan data di luar
tampilan yang diizinkan, 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 di-commit sebagai satu tindakan atomik pada cluster yang menjadi tujuan perutean permintaan. Saat penulisan direplikasi ke cluster lain dalam instance, cluster tersebut juga masing-masing menerima penulisan sebagai operasi atomik. Cluster tidak menerima mutasi parsial; mutasi akan 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 pemilihan rute 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 read-your-writes dengan merutekan permintaan ke cluster yang sama.
Anda dapat membuat dan menggunakan token konsistensi dan memanggil CheckConsistency dalam mode StandardReadRemoteWrites setelah mengirim permintaan tulis. Token ini memeriksa konsistensi replikasi. Secara umum, Anda membuat token konsistensi
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 guna memastikan 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 lainnya 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.
Resolusi konflik
Setiap nilai sel dalam tabel Bigtable diidentifikasi secara unik oleh empat tuple (row key, 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 akan otomatis menyelesaikan konflik menggunakan algoritma penulisan terakhir yang menang internal berdasarkan waktu sisi server. Implementasi "last write wins" Bigtable bersifat deterministik, dan saat replikasi selesai, semua cluster memiliki nilai yang sama untuk empat tuple.