Ulasan CockroachDB: Pangkalan data SQL skala besar yang dibina untuk kelangsungan hidup

Sehingga baru-baru ini, semasa anda membeli pangkalan data anda harus memilih: Skalabiliti atau konsistensi? Pangkalan data SQL seperti MySQL menjamin ketekalan yang kuat, tetapi tidak skala dengan mendatar. (Pengambilan manual untuk skalabilitas bukanlah idea yang menyeronokkan.) Pangkalan data NoSQL seperti skala MongoDB dengan indah, tetapi hanya menawarkan konsistensi akhirnya. ("Tunggu cukup lama, dan anda dapat membaca jawapan yang tepat" - yang bukan merupakan cara untuk melakukan transaksi kewangan.)

Google Cloud Spanner, perkhidmatan pangkalan data hubungan yang dikendalikan sepenuhnya yang dijalankan di Google Compute Engine (GCE) yang dikeluarkan pada bulan Februari 2017, mempunyai skalabilitas pangkalan data NoSQL sambil mengekalkan keserasian SQL, skema hubungan, transaksi ACID, dan konsistensi luaran yang kuat. Spanner adalah pangkalan data perhubungan yang tersusun, diedarkan secara global dan direplikasi yang menggunakan algoritma Paxos untuk mencapai kata sepakat di antara nodnya.

Salah satu alternatif untuk Spanner, dan subjek kajian ini, adalah CockroachDB, sumber terbuka, pangkalan data SQL yang diedarkan secara mendatar yang dikembangkan oleh bekas Googler yang biasa dengan Spanner. CockroachDB meminjam dari Google Spanner untuk reka bentuk sistem penyimpanan datanya, dan ia menggunakan algoritma Raft untuk mencapai kata sepakat di antara nodnya.

Seperti Cloud Spanner, CockroachDB adalah pangkalan data SQL yang diedarkan yang dibina di atas kedai nilai kunci transaksi dan konsisten, dalam kes CockroachDB di RocksDB. Matlamat reka bentuk utama CockroachDB adalah sokongan untuk urus niaga ACID, skalabiliti mendatar, dan (yang paling penting) kelangsungan hidup, oleh itu namanya.

CockroachDB dirancang untuk bertahan dalam kegagalan cakera, mesin, rak, dan bahkan pusat data dengan gangguan latensi minimum dan tanpa campur tangan manual. Sudah tentu, untuk mencapai itu, anda perlu menjalankan sekumpulan banyak node simetri CockroachDB, menggunakan pelbagai cakera, mesin, rak, dan pusat data.

Tidak seperti Cloud Spanner, yang menggunakan TrueTime API yang tersedia untuk penyegerakan waktu di pusat data Google, CockroachDB tidak dapat mengandalkan kehadiran jam atom dan jam satelit GPS untuk menyegerakkan waktu dengan tepat di seluruh nod dan pusat data. Itu mempunyai sejumlah implikasi. Sebagai permulaan, Google TrueTime memberikan batas atas untuk ofset jam antara nod dalam sekelompok tujuh milisaat. Itu cukup kecil sehingga simpul Spanner hanya menunggu tujuh milisaat setelah menulis sebelum melaporkan bahawa transaksi telah dilakukan, untuk menjamin konsistensi luaran.

Tanpa TrueTime atau kemudahan serupa, CockroachDB mesti kembali ke NTP, yang memberikan batas atas pada penyegerakan jam antara 100 milisaat dan 250 milisaat. Memandangkan jangka masa yang lebih besar, CockroachDB tidak menunggu selepas menulis. Sebaliknya kadang-kadang menunggu sebelum dibaca, pada dasarnya memulakan semula transaksi jika membaca nilai dengan cap waktu yang lebih besar daripada permulaan transaksi, sekali lagi untuk menjamin konsistensi.

Apabila semua node dalam kluster CockroachDB mempunyai batas atas kecil untuk offset jam yang anda dapat dari GPS atau jam atom, yang merupakan sesuatu yang baru tersedia di awan awam utama, masuk akal untuk menjalankannya dengan --linearizable bendera. Itu membuat mereka menunggu pengimbangan jam maksimum sebelum mengembalikan komitmen yang berjaya, seperti Spanner.

Bagaimana CockroachDB berfungsi

Setiap simpul CockroachDB terdiri daripada lima lapisan:

  • SQL, yang menerjemahkan pertanyaan SQL pelanggan kepada operasi nilai-kunci
  • Transaksi, yang membolehkan perubahan atom ke banyak entri nilai kunci
  • Pembahagian, yang menampilkan julat nilai-kunci yang direplikasi sebagai satu entiti
  • Replikasi, yang secara konsisten dan serentak meniru julat nilai-kunci di banyak nod, dan membolehkan pembacaan secara konsisten melalui pajakan
  • Penyimpanan, yang menulis dan membaca data nilai kunci pada cakera

Lapisan SQL menguraikan pertanyaan terhadap fail Yacc dan mengubahnya menjadi pohon sintaks abstrak. Dari pohon sintaks abstrak, CockroachDB menghasilkan sebilangan nod rancangan, yang mengandungi kod nilai-kunci. Nod pelan kemudian dijalankan, berkomunikasi dengan lapisan transaksi.

Lapisan transaksi mengimplementasikan semantik transaksi ACID dengan komitmen dua fasa di seluruh kelompok termasuk urus niaga rentas dan jadual silang, memperlakukan penyata tunggal sebagai transaksi (juga disebut mod auto-komit). Komitmen dua fasa dicapai dengan mencatat catatan transaksi dan niat menulis, melaksanakan operasi baca, dan memperlakukan setiap niat menulis yang dihadapi sebagai konflik transaksi.

Lapisan pengedaran menerima permintaan dari lapisan transaksi pada simpul yang sama. Ini kemudian mengenal pasti node mana yang harus menerima permintaan, dan mengirimkan permintaan ke lapisan replikasi node yang tepat.

Lapisan replikasi menyalin data antara nod dan memastikan konsistensi antara salinan ini dengan menerapkan algoritma konsensus Raft. Anda boleh mengawal faktor replikasi di kluster, pangkalan data, dan tingkat meja menggunakan zon replikasi. Algoritma konsensus hanya digunakan untuk penulisan, dan memerlukan korum replika untuk menyetujui sebarang perubahan pada julat sebelum perubahan tersebut dilakukan.

Lapisan simpanan menyimpan data sebagai pasangan nilai-kunci pada cakera menggunakan RocksDB. CockroachDB sangat bergantung pada kawalan serentak multi-versi (MVCC) untuk memproses permintaan serentak dan menjamin konsistensi. Sebilangan besar kerja ini dilakukan dengan menggunakan cap waktu jam logik hibrid (HLC).

Seperti Spanner, CockroachDB menyokong pertanyaan perjalanan masa (diaktifkan oleh MVCC). Ini boleh dilakukan sejauh pengumpulan sampah pangkalan data terbaru anda, yang dilakukan secara lalai setiap hari.

Pemasangan dan penggunaan CockroachDB

CockroachDB dijalankan pada sistem operasi Mac, Linux, dan Windows, sekurang-kurangnya untuk pembangunan dan ujian. Pangkalan data Kecoa Pengeluaran biasanya dijalankan pada Linux VM atau bekas yang diatur, sering dihoskan di awan awam di beberapa pusat data. Binari Windows CockroachDB masih dalam fasa beta dan tidak digalakkan untuk pengeluaran, dan Apple tidak lagi membuat perkakasan pelayan.

Makmal Lipas

Seperti yang anda lihat dalam tangkapan skrin di atas, terdapat empat pilihan untuk memasang CockroachDB pada Mac. Saya memilih Homebrew sebagai yang termudah dari empat.

Ngomong-ngomong, Cockroach Labs menyiarkan amaran di laman web yang mengatakan bahawa menjalankan aplikasi bernegara seperti CockroachDB di Docker memang sukar, tidak digalakkan untuk penggunaan produksi, dan menggunakan alat orkestrasi seperti Kubernetes atau Docker Swarm untuk menjalankan kluster. Saya akan membincangkan pilihan orkestrasi kontena di bahagian seterusnya.

Pemasangan pada Mac semudah yang brew install cockroachditunjukkan di atas. Dalam kes saya, kemas kini automatik Homebrew memerlukan lebih lama (cukup masa untuk menyeduh teh) daripada pemasangan CockroachDB yang sebenarnya, yang hanya memerlukan beberapa saat.

Sebaik sahaja anda memasang CockroachDB, cukup mudah untuk membuat kluster tempatan, walaupun ada langkah tambahan untuk menghasilkan sijil keselamatan dengan cockroach certarahan jika anda mahu kluster itu selamat. Setelah anda menjalankan kluster (menggunakan cockroach startperintah sekali untuk setiap node, dengan node berikutnya ditetapkan untuk bergabung dengan kluster node pertama), anda boleh menyambung ke halaman pentadbiran web di mana-mana node dengan penyemak imbas, dan menggunakan cockroach sqlklien terbenam untuk mengirim SQL pertanyaan ke sebarang nod. Sebilangan besar penyemak imbas akan mengadu tentang laman web dengan sijil yang dihasilkan oleh CockroachDB, tetapi anda seharusnya dapat mengeklik amaran mengerikan itu dan terus ke laman web tersebut.

Tetapan pengeluaran CockroachDB yang disyorkan berbeza daripada lalai, yang disediakan untuk pembangunan dan contoh ujian. Anda boleh mengembangkan kluster satu simpul jika anda mahu. Untuk pengeluaran, anda harus mempunyai minimum tiga nod, jalankan setiap nod pada mesin, VM, atau bekas yang berasingan, dan berikan setiap cache tambahan dan memori SQL. Tetapan lalai masing-masing adalah 128 MB untuk cache dan memori SQL; tetapan pengeluaran yang disyorkan adalah memberi setiap 25 peratus RAM:

cockroach start --cache=25% --max-sql-memory=25%

Semakin banyak nod yang anda jalankan, semakin baik ketahanannya. Semakin besar dan cepat nod, semakin baik prestasinya. Sekiranya anda ingin mempunyai node dengan prestasi yang hampir setanding dengan node Google Cloud Spanner, yang memberikan 2.000 penulisan sesaat dan 10.000 bacaan sesaat, maka anda menginginkan sesuatu seperti contoh NCE-highcpu-8 GCE, yang mempunyai lapan CPU dan RAM 8 GB , dengan cakera SSD tempatan (bukan berputar cakera).

Semakin banyak anda mengedarkan nod anda ke pusat data yang berlainan, semakin baik anda dapat memastikan kekebalan terhadap kegagalan tahap pusat data. Terdapat kos, bagaimanapun: Latensi perjalanan pergi balik antara pusat data akan memberi kesan langsung kepada prestasi pangkalan data anda, dengan kluster lintas benua berkinerja lebih buruk daripada kluster di mana semua nod berdekatan secara geografi.

Cockroach Labs membekalkan arahan terperinci untuk penggunaan di AWS, Lautan Digital, GCE, dan Azure. Konfigurasi yang disyorkan menggunakan pengimbang beban, sama ada perkhidmatan pengimbangan beban yang diuruskan asli atau pengimbang beban sumber terbuka seperti HAProxy.

Orkestrasi dapat menurunkan overhead operasi kluster CockroachDB hampir tidak ada. Cockroach Labs mendokumentasikan bagaimana melakukan ini untuk pengeluaran dengan Kubernetes dan Docker Swarm. Repositori CockroachDB-CloudFormation di GitHub menunjukkan cara menggunakan AWS CloudFormation dan Kubernetes dalam zon ketersediaan tunggal untuk pembangunan dan ujian. Mengadaptasi ini untuk pengeluaran akan melibatkan pengubahsuaian templat CloudFormation untuk menggunakan banyak zon ketersediaan.

Pengaturcaraan dan ujian CockroachDB

CockroachDB menyokong protokol wayar PostgreSQL, jadi anda menulis kod anda seolah-olah anda sedang memprogram terhadap Postgres, atau sekurang-kurangnya subkumpulan Postgres. Halaman ini menyenaraikan pemacu yang diuji untuk pelbagai pengikatan bahasa pengaturcaraan, termasuk bahasa sisi pelayan yang paling popular. Halaman ini menyenaraikan sampel dalam 10 bahasa pengaturcaraan dan lima ORM. Saya tidak mengalami kejutan besar ketika membaca kod tersebut, walaupun saya melihat beberapa bug kecil yang mungkin terdapat dalam senarai dalam dokumentasi. Anda juga boleh menjalankan SQL anda menggunakan klien interaktif yang cockroachboleh dilaksanakan.

Walaupun terdapat repo yang dikhaskan untuk generator beban CockroachDB dan yang lain untuk ujian prestasi, penanda aras kluster CockroachDB tidak mudah, terutamanya jika anda ingin membandingkan CockroachDB dengan pangkalan data lain dengan cara yang bermakna. Satu masalah adalah bahawa rangkaian di antara node boleh menjadi langkah pembatasan kadar dalam kelompok CockroachDB.

Fakta lain yang perlu dipertimbangkan adalah bahawa kebanyakan pangkalan data SQL konvensional tidak berjalan dalam mod pengasingan SERIALISABLE secara lalai; sebaliknya mereka menggunakan mod yang kurang ketat dengan prestasi yang lebih baik. CockroachDB menggunakan mod pengasingan bersiri secara lalai. Selain itu, agak tidak adil untuk menguji prestasi penyertaan Sock CockroachDB, yang masih dalam proses, dengan rangkaian TPC-C.

Namun anda dapat melihat kekuatan operasi CockroachDB dengan mudah. Sebagai contoh, banyak pangkalan data perlu dihentikan dan dimulakan semula untuk meningkatkannya. Menambah node dalam beban di CockroachDB sangat mudah, terutamanya jika anda menggunakan alat orkestrasi. Contohnya, tangkapan skrin di atas menunjukkan arahan untuk menukar dan memaparkan node dalam kluster Kubernetes, dan tangkapan skrin di bawah menunjukkan kluster yang dipantau semasa node ditambahkan. Alat penjanaan beban terus berjalan sepanjang proses.

Demonstrasi yang lebih mengagumkan menunjukkan penghijrahan awan silang automatik dalam kelompok CockroachDB. Ia sangat memerlukan video untuk melakukannya dengan adil; video dihoskan dalam catatan blog yang dipautkan.

CockroachDB SQL 

SQL di CockroachDB lebih kurang standard, tidak seperti SQL di Cloud Spanner, yang menggunakan sintaks bukan standard untuk manipulasi data. CockroachDB SQL masih kehilangan banyak ciri, namun.

Sebagai contoh, V1.1 tidak mempunyai sokongan JSON, yang dirancang untuk V1.2. Ia juga tidak mempunyai penguraian XML, yang tidak terdapat dalam peta jalan. Ia tidak mempunyai lata peringkat baris, dirancang untuk V1.2, dan tidak mempunyai kursor dan pemicu, yang tidak ada di peta jalan. Indeks geospatial adalah penambahan "berpotensi" yang dapat membuatnya menjadi peta jalan di masa depan.

Terutama, pelaksanaan SQL CockroachDB awal bergabung pada tahun 2016 sengaja sederhana dan menunjukkan penskalaan kuadratik, menjadikannya tidak berguna untuk meminta set data yang besar. Versi dalam V1.0, yang dilakukan oleh pelajar koperasi, melaksanakan hash bergabung, menjadikan banyak operasi bergabung skala secara linear; yang membuat CockroachDB hampir ke tahap SQLite. Kadang-kadang pada tahun 2018, dengan adanya pendanaan baru-baru ini, CockroachDB seharusnya mempunyai prestasi bergabung yang lebih besar seperti PostgreSQL bergabung, dan juga pemprosesan SQL join yang diedarkan di kluster.