Bila hendak menggunakan pangkalan data berasaskan CRDT

Roshan Kumar adalah pengurus produk kanan di Redis Labs.

Membengkokkan ketekalan dan ketersediaan seperti yang dijelaskan oleh teorema CAP telah menjadi cabaran besar bagi arkitek aplikasi yang diedarkan geo. Partition rangkaian tidak dapat dielakkan. Kependaman yang tinggi antara pusat data selalu mengakibatkan terputus antara pusat data untuk jangka masa yang pendek. Oleh itu, seni bina tradisional untuk aplikasi yang diedarkan geo dirancang untuk melepaskan konsistensi data atau mempengaruhi ketersediaan.

Malangnya, anda tidak mampu mengorbankan ketersediaan untuk aplikasi pengguna interaktif. Sejak kebelakangan ini, arkitek telah mengambil perhatian secara konsisten dan menerapkan model konsistensi akhirnya. Dalam model ini, aplikasi bergantung pada sistem pengurusan pangkalan data untuk menggabungkan semua salinan data tempatan untuk menjadikannya akhirnya konsisten.

Semuanya kelihatan baik dengan model konsistensi akhirnya sehingga terdapat konflik data. Beberapa model konsistensi akhirnya menjanjikan usaha terbaik untuk menyelesaikan konflik, tetapi gagal menjamin konsistensi yang kuat. Berita baiknya ialah, model yang dibangun di sekitar jenis data yang direplikasi tanpa konflik (CRDT) memberikan konsistensi akhirnya yang kuat.

CRDT mencapai konsistensi akhirnya yang kuat melalui satu set peraturan dan semantik penyelesaian konflik yang telah ditentukan. Aplikasi yang dibangun di atas pangkalan data berasaskan CRDT mesti dirancang untuk menampung semantik penyelesaian konflik. Dalam artikel ini kita akan meneroka cara merancang, mengembangkan, dan menguji aplikasi yang diedarkan secara geo menggunakan pangkalan data berasaskan CRDT. Kami juga akan memeriksa empat kes penggunaan sampel: kaunter, cache terdistribusi, sesi bersama, dan pengambilan data pelbagai wilayah.

Majikan saya, Redis Labs, baru-baru ini mengumumkan sokongan CRDT di Redis Enterprise, dengan jenis data yang direplikasi tanpa konflik yang bergabung dengan portfolio struktur data yang kaya — String, Hash, Lists, Sets, Sorted Sets, Bitfields, Geo, Hyperloglog, dan Streams - dalam produk pangkalan data kami. Walau bagaimanapun, perbincangan berikut berlaku tidak hanya untuk Redis Enterprise, tetapi juga untuk semua pangkalan data berasaskan CRDT.

Pangkalan data untuk aplikasi yang diedarkan secara geo

Untuk aplikasi yang diedarkan secara geo, adalah biasa menjalankan perkhidmatan tempatan kepada pelanggan. Ini mengurangkan lalu lintas rangkaian dan kependaman yang disebabkan oleh perjalanan pergi balik. Dalam banyak kes, arkitek merancang perkhidmatan untuk menyambung ke pangkalan data tempatan. Kemudian timbul persoalan bagaimana anda mengekalkan data yang konsisten di semua pangkalan data. Salah satu pilihan adalah mengatasinya di peringkat aplikasi — anda boleh menulis proses pekerjaan berkala yang akan menyegerakkan semua pangkalan data. Atau anda boleh bergantung pada pangkalan data yang akan menyegerakkan data antara pangkalan data.

Untuk artikel yang selebihnya, kami menganggap bahawa anda akan memilih pilihan kedua — biarkan pangkalan data berfungsi. Seperti yang ditunjukkan dalam Gambar 1 di bawah ini, aplikasi geo-diedarkan anda menjalankan perkhidmatan di beberapa wilayah, dengan setiap perkhidmatan menghubungkan ke pangkalan data tempatan. Sistem pengurusan pangkalan data yang mendasari menyelaraskan data antara pangkalan data yang digunakan di seluruh wilayah.

Makmal Redis

Model ketekalan data

Model konsistensi adalah kontrak antara pangkalan data yang diedarkan dan aplikasi yang menentukan seberapa bersih data antara operasi tulis dan baca.

Sebagai contoh, dalam model konsistensi yang kuat, pangkalan data menjamin bahawa aplikasi akan selalu membaca tulisan terakhir. Dengan konsistensi berurutan, pangkalan data memastikan bahawa susunan data yang anda baca sesuai dengan urutan penulisan data ke pangkalan data. Dalam model konsistensi akhirnya, pangkalan data yang diedarkan berjanji untuk menyegerakkan dan menggabungkan data antara replika pangkalan data di belakang tabir. Oleh itu, jika anda menulis data anda ke satu replika pangkalan data dan membacanya dari yang lain, ada kemungkinan anda tidak akan membaca salinan data terbaru.

Ketekalan yang kuat

Komitmen dua fasa adalah teknik biasa untuk mencapai konsistensi yang kuat. Di sini, untuk setiap operasi tulis (tambah, kemas kini, hapus) di simpul pangkalan data tempatan, simpul pangkalan data menyebarkan perubahan ke semua node pangkalan data dan menunggu semua node mengakui. Node tempatan kemudian menghantar komit ke semua node dan menunggu pengakuan lain. Aplikasi akan dapat membaca data hanya selepas komit kedua. Pangkalan data yang diedarkan tidak akan tersedia untuk operasi tulis apabila rangkaian terputus antara pangkalan data.

Konsistensi akhirnya

Kelebihan utama model konsistensi akhirnya ialah pangkalan data tersedia untuk anda melakukan operasi menulis walaupun sambungan rangkaian antara replika pangkalan data yang diedarkan terputus. Secara umum, model ini mengelakkan masa perjalanan pergi balik yang dilakukan oleh komitmen dua fasa, dan oleh itu menyokong operasi menulis lebih banyak sesaat daripada model lain. Satu masalah yang mesti ditangani oleh konsistensi akhirnya adalah konflik - penulisan serentak pada item yang sama di dua lokasi yang berbeza. Berdasarkan bagaimana mereka mengelakkan atau menyelesaikan konflik, pangkalan data yang akhirnya konsisten dikelaskan dalam kategori berikut:

  1. Penulis terakhir menang (LWW).  Dalam strategi ini, pangkalan data yang diedarkan bergantung pada penyelarasan cap waktu antara pelayan. Pangkalan data menukar cap waktu setiap operasi tulis bersama dengan data itu sendiri. Sekiranya terdapat konflik, operasi menulis dengan cap waktu terkini akan menang.

    Kelemahan teknik ini ialah menganggap semua jam sistem diselaraskan. Dalam praktiknya, sukar dan mahal untuk menyegerakkan semua jam sistem.

  2. Konsistensi akhirnya berdasarkan kuorum: Teknik ini serupa dengan komitmen dua fasa. Walau bagaimanapun, pangkalan data tempatan tidak menunggu pengakuan dari semua pangkalan data; ia hanya menunggu pengakuan dari sebilangan besar pangkalan data. Pengakuan dari majoriti mewujudkan kuorum. Sekiranya terdapat konflik, operasi penulisan yang telah menetapkan korum akan menang.

    Di sisi lain, teknik ini menambahkan latensi rangkaian pada operasi penulisan, yang menjadikan aplikasi kurang berskala. Juga, pangkalan data tempatan tidak akan tersedia untuk penulisan sekiranya terpencil dari replika pangkalan data lain dalam topologi.

  3. Penggabungan penggabungan : Dalam pendekatan tradisional ini, yang biasa berlaku di dalam pangkalan data hubungan, ejen gabungan berpusat menggabungkan semua data. Kaedah ini juga menawarkan sedikit kelonggaran dalam melaksanakan peraturan anda sendiri untuk menyelesaikan konflik.

    Penggabungan penggabungan terlalu perlahan untuk menyokong aplikasi masa nyata dan menarik. Ia juga mempunyai satu titik kegagalan. Oleh kerana kaedah ini tidak mendukung peraturan yang telah ditetapkan untuk penyelesaian konflik, metode ini sering kali mengarah pada implementasi kereta untuk penyelesaian konflik.

  4. Jenis data yang direplikasi tanpa konflik (CRDT): Anda akan mengetahui mengenai CRDT secara terperinci dalam beberapa bahagian seterusnya. Ringkasnya, pangkalan data berasaskan CRDT menyokong jenis data dan operasi yang memberikan konsistensi akhirnya tanpa konflik. Pangkalan data berasaskan CRDT tersedia walaupun replika pangkalan data yang diedarkan tidak dapat menukar data. Mereka selalu memberikan latensi tempatan untuk operasi membaca dan menulis.

    Batasan? Tidak semua kes penggunaan pangkalan data mendapat manfaat daripada CRDT. Juga, semantik penyelesaian konflik untuk pangkalan data berasaskan CRDT sudah ditentukan sebelumnya dan tidak boleh diganti.

Apa itu CRDT?

CRDT adalah jenis data khas yang menyatukan data dari semua replika pangkalan data. CRDT yang popular adalah Kaunter G (kaunter pertumbuhan hanya), Kaunter PN (kaunter positif-negatif), daftar, set G (set tumbuh sahaja), set 2P (set dua fasa), set OR ( set yang diperhatikan-hapus), dll. Di belakang tabir, mereka bergantung pada sifat matematik berikut untuk menyatukan data:

  1. Harta komutatif: a ☆ b = b ☆ a
  2. Harta bersekutu: a ☆ (b ☆ c) = (a ☆ b) ☆ c
  3. Idempotensi:  a ☆ a = a

G-counter adalah contoh sempurna CRDT operasi yang menggabungkan operasi. Di sini, a + b = b + a dan a + (b + c) = (a + b) + c. Replika hanya bertukar kemas kini (penambahan) antara satu sama lain. CRDT akan menggabungkan kemas kini dengan menambahkannya. Satu set G, misalnya, menerapkan idempotence ({a, b, c} U {c} = {a, b, c}) untuk menggabungkan semua elemen. Idempotence mengelakkan pertindihan elemen yang ditambahkan pada struktur data ketika mereka bergerak dan berkumpul melalui jalan yang berbeza.

Jenis data CRDT dan semantik penyelesaian konfliknya

Struktur data tanpa konflik: G-counter, PN-counter, G-Sets

Semua struktur data ini bebas daripada reka bentuk. Jadual di bawah menunjukkan bagaimana data diselaraskan antara replika pangkalan data.

Makmal Redis Makmal Redis

Kaunter G dan PN-counter popular untuk kes penggunaan seperti pengundian global, kiraan aliran, penjejakan aktiviti, dan sebagainya. G-set banyak digunakan untuk menerapkan teknologi blockchain. Contohnya, bitcoin menggunakan entri blockchain yang hanya dilampirkan.

Daftar: String, Hashes

Daftar tidak bebas konflik secara semula jadi. Mereka biasanya mengikuti kebijakan LWW atau penyelesaian konflik berdasarkan kuorum. Gambar 4 menunjukkan contoh bagaimana daftar menyelesaikan konflik dengan mengikuti dasar LWW.

Makmal Redis

Daftar digunakan terutamanya untuk menyimpan data cache dan sesi, maklumat profil pengguna, katalog produk, dll.

2P-set

Set dua fasa mengekalkan dua set G-set - satu untuk item tambahan dan satu lagi untuk item yang dikeluarkan. Replika menukar penambahan G-set apabila diselaraskan. Konflik timbul apabila elemen yang sama dijumpai di kedua set tersebut. Dalam beberapa pangkalan data berasaskan CRDT seperti Redis Enterprise, ini dikendalikan oleh kebijakan, "Tambah kemenangan atas penghapusan."

Makmal Redis

Set 2P adalah struktur data yang baik untuk menyimpan data sesi bersama seperti keranjang belanja, dokumen bersama, atau spreadsheet.

Cara membina aplikasi untuk menggunakan pangkalan data berasaskan CRDT

Menyambungkan aplikasi anda ke pangkalan data berasaskan CRDT tidak berbeza dengan menghubungkan aplikasi anda ke pangkalan data lain. Namun, kerana akhirnya terdapat kebijakan konsistensi, aplikasi anda harus mengikuti sekumpulan peraturan tertentu untuk memberikan pengalaman pengguna yang konsisten. Tiga kunci: 

  1. Buat permohonan anda tanpa kewarganegaraan. Aplikasi tanpa status biasanya berdasarkan API. Setiap panggilan ke API menghasilkan penyusunan semula mesej lengkap dari awal. Ini memastikan bahawa anda selalu menarik salinan data yang bersih pada bila-bila masa. Latensi tempatan yang rendah yang ditawarkan oleh pangkalan data berasaskan CRDT menjadikan penyusunan semula mesej lebih cepat dan mudah. 

  2. Pilih CRDT yang betul yang sesuai dengan kes penggunaan anda. Kaunter adalah yang paling mudah bagi CRDT. Ini dapat digunakan untuk kes penggunaan seperti pengundian global, pelacakan sesi aktif, pengukuran, dll. Namun, jika anda ingin menggabungkan keadaan objek yang diedarkan, maka anda juga harus mempertimbangkan struktur data lain. Sebagai contoh, untuk aplikasi yang membolehkan pengguna mengedit dokumen bersama, anda mungkin ingin menyimpan bukan hanya pengeditan, tetapi juga urutan pelaksanaannya. Dalam kes itu, menyimpan suntingan dalam daftar berdasarkan CRDT atau struktur data antrian akan menjadi penyelesaian yang lebih baik daripada menyimpannya dalam daftar. Anda juga perlu memahami semantik penyelesaian konflik yang diberlakukan oleh CRDT, dan penyelesaian anda mematuhi peraturan.
  3. CRDT bukanlah satu penyelesaian yang sesuai untuk semua. Walaupun CRDT memang alat yang bagus untuk banyak kes penggunaan, ini mungkin bukan yang terbaik untuk semua kes penggunaan (contohnya transaksi ACID). Pangkalan data berasaskan CRDT umumnya sesuai dengan seni bina perkhidmatan mikro di mana anda mempunyai pangkalan data khusus untuk setiap perkhidmatan mikro.

Hasil utama di sini ialah aplikasi anda harus memusatkan perhatian pada logik dan menyerahkan kerumitan pengurusan data dan penyegerakan ke pangkalan data yang mendasari.

Menguji aplikasi dengan pangkalan data multi-master yang diedarkan

Untuk mencapai pasaran yang lebih pantas, kami mengesyorkan agar anda mempunyai perkembangan, pengujian, pementasan, dan penyediaan pengeluaran yang konsisten. Antara lain, itu bermaksud pembangunan dan penyediaan ujian anda mesti mempunyai model miniatur pangkalan data diedarkan anda. Periksa sama ada pangkalan data berasaskan CRDT anda tersedia sebagai wadah Docker atau alat maya. Terapkan replika pangkalan data anda pada subnet yang berbeza sehingga anda dapat mensimulasikan penyediaan kluster yang terhubung dan terputus.

Aplikasi pengujian dengan pangkalan data multi-master yang diedarkan mungkin terdengar rumit. Tetapi yang paling sering Anda uji adalah ketekalan data dan ketersediaan aplikasi dalam dua situasi: Ketika pangkalan data yang diedarkan disambungkan, dan ketika ada partisi jaringan antara pangkalan data.

Dengan menyediakan pangkalan data edaran tiga nod di persekitaran pengembangan anda, anda dapat merangkumi (dan bahkan mengotomatisasi) sebahagian besar senario pengujian dalam pengujian unit. Berikut adalah panduan asas untuk menguji aplikasi anda: