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
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 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
ReadModifyWriteRowtidak 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
MutateRowdengan mutasiAddToCelluntuk 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 permintaanCheckAndModifyRowlebih 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
MutateRowssaat row key 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 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.
- Konektor Bigtable Beam (
BigtableIO) - Library klien Bigtable untuk Java
- Konektor Bigtable HBase Beam (
CloudBigtableIO) - Klien HBase Bigtable untuk Java
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.