Ulasan YugaByte: Cassandra dan Redis berskala Planet

Selama beberapa dekad saya sebagai pembangun aplikasi pangkalan data, saya tidak pernah membayangkan dalam impian saya yang paling liar bahawa saya akan mempunyai akses ke pangkalan data transaksional, berskala planet, diedarkan, apalagi saya membandingkan banyak dari mereka. Tetapi dengan Google Cloud Spanner, CockroachDB, Azure Cosmos DB, Neo4j Enterprise, dan baru-baru ini YugaByte DB semuanya tersedia dalam pengeluaran, impian paip sekali ini kini menjadi kenyataan.

Secara umum, Google Cloud Spanner menawarkan pangkalan data SQL yang berskala, diedarkan, sangat konsisten sebagai perkhidmatan yang dapat menangani sekitar 2.000 penulisan sesaat dan 10.000 bacaan per saat, setiap node, dengan latensi median sekitar lima milisaat. Untuk mempercepat pembacaan yang tidak memerlukan data yang benar-benar terkini, anda boleh meminta pembacaan basi Spanner, kerana ia menyokong pertanyaan perjalanan waktu. Spanner menggunakan dialek SQL Google dan hanya berjalan di Google Cloud Platform.

CockroachDB adalah pangkalan data SQL sumber terbuka seperti Spanner yang menyokong protokol wayar PostgreSQL dan dialek PostgreSQL SQL. CockroachDB dibina di atas RocksDB, kedai nilai kunci transaksi dan konsisten sumber terbuka. Seperti Spanner, ia menyokong pertanyaan perjalanan masa. CockroachDB boleh berjalan di mana-mana awan, dalam bekas Docker dengan atau tanpa orkestrasi, atau pada pelayan Linux atau VM. Versi perusahaan CockroachDB menambah pemisahan geo, kawalan akses berdasarkan peranan, dan sokongan.

Azure Cosmos DB adalah pangkalan data multimodel yang diedarkan secara global, berpartisipasi secara mendatar sebagai perkhidmatan. Ia menawarkan empat model data (nilai-kunci, keluarga lajur, dokumen, dan grafik) dan lima tahap konsistensi yang dapat disesuaikan (kuat, kebatasan terikat, sesi, awalan konsisten, dan akhirnya). Ia menawarkan lima set API: SQL (dialek), serasi dengan MongoDB, serasi dengan meja Azure, grafik (Gremlin), dan serasi dengan Apache Cassandra. Ia hanya berjalan di awan Microsoft Azure.

Neo4j adalah pangkalan data grafik yang berskala dan dapat bertahan yang menggunakan bahasa pertanyaan Cypher. Anda boleh memasang versi sumber terbuka, tanpa kluster pada Windows, MacOS, dan Linux, dalam bekas Docker, dan di VM. Neo4j Enterprise menyokong kluster ketersediaan dan kausal yang tinggi; kluster kausal membolehkan kumpulan replika baca yang dikemas kini secara asinkron, untuk membolehkan prestasi tinggi untuk penyebaran yang diedarkan secara geografi.

Masukkan DB Yugabyte

YugaByte DB, subjek tinjauan ini, adalah pangkalan data berprestasi terbuka, transaksional, berprestasi tinggi untuk aplikasi skala planet yang menyokong tiga set API: YCQL, serasi dengan Apache Cassandra Query Language (CQL); YEDIS, sesuai dengan Redis; dan PostgreSQL (kini tidak lengkap dan dalam versi beta) YugaWare adalah lapisan orkestrasi untuk YugaByte DB Enterprise Edition. YugaWare membuat kerja pantas untuk memutar dan meruntuhkan kluster yang diedarkan di Perkhidmatan Web Amazon, Google Cloud Platform, dan (Q4 2018) Microsoft Azure. YugaByte DB menerapkan kawalan serentak multiversion (MVCC), tetapi belum menyokong pertanyaan perjalanan masa.

YugaByte DB dibina di atas garpu kedai nilai kunci RocksDB yang dipertingkatkan. YugaByte DB 1.0 dihantar pada Mei 2018.

Dua teknologi utama yang digunakan untuk menjadikan pangkalan data transaksional yang diedarkan tetap dan pantas adalah algoritma konsensus kluster dan penyegerakan jam nod. Google Cloud Spanner dan Azure Cosmos DB kedua-duanya menggunakan algoritma konsensus Paxos yang dicadangkan oleh Leslie Lamport. CockroachDB dan YugaByte DB menggunakan algoritma konsensus Raft yang dicadangkan oleh Diego Ongaro dan John Ousterhout.

Google Cloud Spanner menggunakan API TrueTime milik Google, berdasarkan GPS dan jam atom. Azure Cosmos DB, CockroachDB, dan YugaByte DB menggunakan cap waktu jam logik hibrid (HLC) dan penyegerakan jam Network Time Protocol (NTP).

Matlamat reka bentuk YugaByte

Pengasas YugaByte — Kannan Muthukkaruppan, Karthik Ranganathan, dan Mikhail Bautin — adalah komite Apache HBase, jurutera awal di Apache Cassandra, dan pembangun platform NoSQL Facebook (dikuasakan oleh Apache HBase). Tujuan mereka untuk YugaByte DB adalah pelayan pangkalan data yang diedarkan secara falsafah di antara Azure Cosmos DB dan Google Cloud Spanner; iaitu, mereka ingin menggabungkan atribut multimodel dan berprestasi tinggi Cosmos DB dengan transaksi ACID dan konsistensi global Spanner. Cara lain untuk menerangkan tujuan mereka adalah bahawa mereka mahu YugaByte DB menjadi transaksional, berprestasi tinggi, dan berskala planet, sekaligus.

Mereka membahagikan proses itu kepada lima langkah, yang masing-masing memerlukan masa sekitar enam bulan untuk dibina. Langkah pertama adalah membuat versi RocksDB yang sangat konsisten, sebuah kedai nilai kunci berprestasi tinggi yang ditulis dalam C ++, dengan menambahkan protokol konsensus Raft, sharding, dan load balancing, dan menghapus log transaksi, sandaran point-in-time, dan pemulihan, yang perlu dilaksanakan dalam lapisan yang lebih tinggi.

Langkah seterusnya adalah membina mesin penyimpanan kunci-untuk-dokumen berstruktur log, menambahkan jenis-jenis yang tidak primitif dan bersarang, seperti baris, peta, koleksi, dan JSON. Kemudian mereka menambahkan lapisan API yang dapat dipasang, seperti Azure Cosmos DB, menerapkan API yang kompatibel dengan Cassandra dan Redis, dan menangguhkan API SQL yang serasi dengan PostgreSQL ke tahap selanjutnya. Kemudian muncul bahasa pertanyaan yang diperluaskan.

YugaByte Cloud Query Language (YCQL) meluaskan API Cassandra dengan sokongan untuk transaksi yang diedarkan, indeks sekunder yang sangat konsisten, dan JSON. Perkhidmatan Kamus YugaByte (YEDIS) adalah API yang sesuai dengan Redis dengan penambahan ketekunan terbina dalam, pelindung automatik, dan skalabiliti linear. YEDIS secara opsional membolehkan pembacaan latensi rendah yang selaras dengan garis masa dari pusat data terdekat, sementara operasi penulisan yang kuat mengekalkan konsistensi global. YEDIS juga merangkumi jenis data siri masa baru.

Akhirnya, dengan versi 1.0, YugaByte DB Enterprise menambahkan lapisan untuk mengatur, mengamankan, dan memantau penyebaran kelas pengeluaran di pelbagai kawasan dan banyak awan, dan menyimpan sandaran yang diedarkan ke titik akhir yang dapat dikonfigurasi seperti Amazon S3. Sokongan PostgreSQL tetap tidak lengkap dan pada tahap ujian beta.

Urus niaga ACID yang diedarkan 

Dengan risiko menyederhanakan proses sepenuhnya, izinkan saya mencuba untuk meringkaskan cara YugaByte melakukan transaksi ACID yang diedarkan. ACID (yang bermaksud atomik, konsistensi, pengasingan, dan ketahanan) dulu dianggap sebagai harta yang terbatas pada pangkalan data SQL.

Anggaplah anda mengemukakan pertanyaan YCQL yang mengandungi kemas kini dalam transaksi, misalnya debit dan kredit berpasangan yang keduanya mesti dibatalkan sekiranya salah satu gagal untuk mengekalkan konsistensi pangkalan data kewangan. YugaByte DB menerima urus niaga dalam pengurus transaksi tanpa status, salah satunya berjalan pada setiap simpul dalam kluster. Pengurus transaksi kemudian cuba menjadualkan transaksi di pelayan tablet yang memiliki sebagian besar data yang diakses oleh transaksi, untuk tujuan prestasi.

Pengurus transaksi menambah entri transaksi dengan ID unik ke dalam jadual status transaksi. Kemudian ia menulis catatan sementara untuk semua tablet yang bertanggungjawab untuk kunci yang cuba diubah suai. Sekiranya terdapat konflik, salah satu urus niaga bertentangan akan dikembalikan.

Setelah semua catatan sementara berjaya ditulis, pengurus transaksi meminta tablet status transaksi untuk mengganti semua catatan sementara dengan catatan biasa menggunakan cap waktu entri "transaksi yang dilakukan" dalam log Raftnya. Akhirnya, tablet status transaksi menghantar permintaan pembersihan ke setiap tablet yang mengambil bahagian dalam transaksi.

Untuk meningkatkan prestasi, YugaByte secara agresif menyimpan maklumat untuk urus niaga yang sedang berjalan, melaksanakan kunci yang terperinci, dan menggunakan sewa pemimpin masa hibrid untuk mengelakkan pelanggan membaca nilai basi dari pemimpin lama. Transaksi ACID baris tunggal dioptimumkan untuk mempunyai latensi rendah apabila tidak ada operasi yang bertentangan. Transaksi ACID yang diedarkan mengekalkan kebenaran dengan mengorbankan latensi yang lebih tinggi.

YCQL, YEDIS, dan PostgreSQL

YugaByte merangkumi pelaksanaan CQL yang hampir lengkap, ditambah dengan beberapa sambungan. Satu peningkatan besar berbanding Cassandra ialah YugaByte sangat konsisten, sementara Cassandra akhirnya konsisten. Peningkatan lain adalah untuk urus niaga yang diedarkan, indeks sekunder yang sangat konsisten, dan JSON. YugaByte mengungguli Cassandra untuk setiap operasi kecuali untuk imbasan jarak pendek, sekurang-kurangnya sebahagiannya kerana konsistensinya yang kuat, yang memungkinkan untuk membaca satu dan bukannya bacaan korum yang diperlukan di Cassandra.

Cassandra menyokong empat jenis data primitif yang belum disokong dalam YugaByte: tarikh, waktu, tuple, dan varint. YugaByte juga mempunyai beberapa sekatan terhadap ekspresi. 

Pelaksanaan YugaByte terhadap Redis tidak mempunyai jenis data senarai, tetapi menambahkan jenis data siri masa. Ini menambahkan ketekunan terbina dalam, peleraian automatik, dan skalabilitas linier serta kemampuan membaca dari pusat data terdekat untuk kependaman rendah.

Pelaksanaan PostgreSQL YugaByte tidak begitu jauh. Sekarang ini tidak ada pernyataan UPDATE dan DELETE, pernyataan, dan pernyataan SELECT tidak mempunyai klausa bergabung.

Pemasangan dan ujian YugaByte

Anda boleh memasang YugaByte DB sumber terbuka dari kod sumber, dari tarball pada MacOS, Centos 7, dan Ubuntu 16.04 atau lebih baru, dan dari gambar Docker di Docker atau Kubernetes. Anda kemudian boleh membuat kluster dan menguji tiga API pertanyaan dan beberapa penjana beban kerja sampel.

Saya memilih untuk memasang YugaByte DB Enterprise di Google Cloud Platform. Walaupun terdapat lebih banyak langkah manual yang perlu diambil daripada yang saya mahukan, saya dapat melalui pemasangan dan ujian saya dalam satu petang setelah saya mempunyai kunci lesen Edisi Perusahaan.

Setelah instance YugaWare berjalan pada instance empat-CPU di Google Cloud, saya mengkonfigurasi Google Cloud Platform sebagai penyedia awan untuk kluster pangkalan data saya.

Kemudian saya membuat kluster tiga nod dari lapan CPU-CPU di wilayah AS-Timur.

Saya menjalankan ujian beban menggunakan API CQL dan Redis.

Saya dapat menyoal data CQL dan Redis dari baris arahan.

Saya juga membuat kluster tiga nod di pelbagai kawasan yang tersebar di seluruh dunia (di bawah). Ini memerlukan masa lebih lama untuk dibuat (sekitar 45 minit) dan mempunyai latensi penulisan yang jauh lebih tinggi, seperti yang diharapkan. Sayangnya anda tidak dapat melihat kelajuan cahaya.

Kos YugaByte

Harga lesen YugaByte DB Enterprise edisi tiga nod bermula pada $ 40K setahun. Selain itu, anda perlu mengambil kira kos pelayan. Untuk kluster tiga nod di Google Cloud Platform menggunakan instance VM lapan-CPU, kosnya adalah antara $ 800 hingga $ 900 sebulan ditambah dengan trafik rangkaian, mungkin $ 11K setahun.

Kos saya sendiri untuk ujian pada waktu petang adalah $ 0.38 untuk kejadian, dan $ 0.01 untuk jalan keluar antara zon. Menghapus kluster pangkalan data dari antara muka YugaByte DB Enterprise adalah mudah, dan setelah saya menghentikan contoh VM yang menjalankan antara muka pentadbiran dan orkestrasi, ia tidak lagi dikenakan caj yang besar.

Lebih cepat, lebih baik, diedarkan

Secara keseluruhan, YugaByte DB tampil seperti yang diiklankan. Pada tahap ini perkembangannya berguna sebagai Redis dan Cassandra yang lebih cepat, lebih baik dan diedarkan. Ia semestinya juga menjadi PostgreSQL yang lebih baik, walaupun dalam pengalaman saya memerlukan waktu yang lama (bertahun-tahun dan bukannya bulan), terutama ketika anda sampai pada titik untuk berusaha menyesuaikan hubungan relasional.

YugaByte DB belum bersaing dengan Google Cloud Spanner, CockroachDB, atau antara muka SQL ke Azure Cosmos DB kerana kekurangan antara muka SQL yang lengkap. Itu belum bersaing dengan Neo4j atau antara muka grafik ke Cosmos DB kerana kekurangan sokongan pangkalan data grafik. Ia bersaing dengan Redis, Cassandra, dan antara muka yang serasi dengan Cassandra ke Cosmos DB.

Sekiranya anda mencuba YugaByte DB sendiri? Sekiranya anda memerlukan versi Redis atau Cassandra yang diedarkan, atau anda perlu mengganti MongoDB untuk senario yang diedarkan secara global, maka ya. YugaByte DB juga dapat digunakan untuk menyeragamkan satu pangkalan data untuk beberapa tujuan, seperti menggabungkan pangkalan data Cassandra dengan cache Redis, seperti yang dilakukan oleh pelanggan YugaByte Narvar. YugaByte DB juga menambah indeks sekunder berprestasi tinggi dan jenis JSON ke Cassandra, meningkatkan kegunaannya sebagai pangkalan data transaksi.

Sama ada anda mahu versi sumber terbuka atau perusahaan YugaByte DB bergantung pada anggaran anda. Pada umumnya, jika anda seorang pemula, anda mungkin menginginkan versi sumber terbuka. Sekiranya anda merupakan syarikat global yang mapan dengan banyak aplikasi pangkalan data transaksional, terutamanya jika anda perlu kerap kali menaikkan kluster, anda mungkin mendapat manfaat daripada ciri tambahan dalam versi perusahaan.