Melayani basis pengguna yang besar dengan data yang andal, konsisten, dan latensi rendah merupakan tantangan yang sangat sulit bagi tim backend mana pun. Di Ledger, kami membuat pilihan strategis untuk menghosting layanan data inti blockchain kami sendiri. Dengan tidak bergantung pada pihak ketiga, kami dapat mengelola sendiri data klien kami, memastikan bahwa proses yang mendasarinya mematuhi pedoman keamanan kami dan Sasaran Tingkat Layanan (SLO) yang berorientasi pada kinerja.
Namun strategi ini juga membawa tantangan tersendiri.
Tantangan pertama kami adalah memigrasikan layanan penyedia data inti ini dari alat noSQL yang keren dan keren. Dalam artikel ini, saya akan menjelaskan alasan kami mengambil keputusan sulit ini, kompleksitas yang kami hadapi, dan manfaat yang kami peroleh.
Tujuan artikel ini adalah untuk menunjukkan aspek teknis yang membuat kami memilih PostgreSQL sebagai lapisan penyimpanan dasar baru untuk data blockchain.
Selami lebih dalam Data Blockchain
Data Blockchain memiliki beberapa fitur utama.
Pertama, ia terus berkembang, dan tidak ada satupun yang terhapus darinya. Namun dalam praktiknya, meskipun sebagian besar blockchain tidak dapat diubah, bagian termuda dari blockchain dapat berubah karena adanya konflik yang perlu diselesaikan. Memang benar, karena rantai tersebut adalah jaringan peer to peer, beberapa blok yang sah mungkin hidup berdampingan untuk sementara waktu. Biasanya, yang lama dihapus, sehingga terjadi apa yang kita sebut reorganisasi. Singkat cerita, data terbagi antara cold tail yang tidak dapat diubah dan head state yang jarang berubah.
Masalah yang kami coba selesaikan adalah bahwa meskipun blockchain sangat bagus dalam memiliki data yang toleran terhadap kesalahan, mereka kurang efektif untuk membaginya ke banyak sumbu. Yaitu, sangat sulit mendapatkan daftar operasi yang memengaruhi akun. Bahkan mendapatkan saldo akun di blockchain seperti bitcoin adalah sebuah tantangan ketika Anda belum memiliki daftar transaksinya.
Untuk mengatasi tantangan ini, Ledger Explorer Services mengindeks seluruh blockchain. Ini adalah layanan besar, kritis, dan sensitif terhadap kinerja yang sepenuhnya ditulis dalam Scala, menggunakan efek kucing waktu proses berkinerja tinggi. Kami memiliki lebih dari 10rb rps pada bitcoin, sambil mempertahankan latensi tail p95 di bawah 100 md. Kami juga sedang merekrut 😊.
Sedikit sejarah
Pada awal cerita kami, jauh sebelum saya bergabung dengan perusahaan, lapisan layanan data Ledger ditangani oleh database Neo4j yang tertanam. Setiap kotak penyajian mengindeks datanya sendiri dan menyajikannya secara lokal, yang menyebabkan banyak masalah.
Konsistensi data antar instance tidak dijamin, dan besarnya ukuran status yang perlu diindeks, dikombinasikan dengan penggunaan disk dan ram neo4j, tidak dapat diskalakan. Masalah ini semakin memburuk seiring pertumbuhan perusahaan, sehingga semakin sulit untuk memunculkan kasus baru.
Cassandra kemudian dipilih sebagai pendorong utama pengaturan baru ini: ini adalah database yang berkerumun dan dapat diskalakan secara horizontal yang berada di sisi AP dari teorema CAP. Ini memecahkan masalah yang berkaitan dengan berbagi data dan memungkinkan pemisahan yang jelas antara pengindeksan, komponen sadar blockchain dan server API tanpa kepala.
Namun apa gunanya menyediakan seluruh sejarah jika kita tidak pernah benar-benar membacanya?
Mengenai kasus penggunaan kami, data historis mentah jarang diperlukan karena status akun pengguna kami dapat dikumpulkan dari data tersebut. Hal ini mendorong kami untuk menantang solusi penyimpanan data yang ada yang didasarkan pada database terdistribusi Cassandra.
Volume data yang perlu kita simpan per blockchain, meskipun dalam kisaran terabyte, bukanlah apa yang disebut “data besar”. Selain itu, bagian if yang akan digunakan untuk menjawab sebagian besar pertanyaan (alias jalur panas) bahkan lebih kecil. Saat ini orang dapat dengan mudah menemukan server perangkat keras komoditas dengan penyimpanan NVMe SSD lebih dari 16TB. Penskalaan vertikal adalah alat yang sangat ampuh, begitu pula database relasional.
Terakhir, masalah utama yang kami hadapi dengan penyiapan cassandra saat ini bukanlah model penyimpanan yang boros atau kasus penggunaan data yang tidak sesuai, namun kurangnya keramahan pengembang. Mengembangkan fitur berbasis data baru di cassandra terbukti memakan waktu yang tidak perlu. Kami berupaya keras untuk mengimplementasikan setiap poros baru yang kami perlukan untuk menyediakan data.
Mengingat keahlian tim kami dalam keterampilan pemodelan data dan kemahiran SQL, PostgreSQL adalah kandidat yang sempurna. Solusi ini telah teruji dalam pertempuran, kuat, mudah diperluas, menjadikannya pilihan ideal.
Mengapa kami memilih SQL daripada NoSQL:
- Membaca / Menulis saldo: kasus penggunaan data blockchain sangat condong pada pembacaan daripada penulisan (blockchain menulis sangat sedikit data dengan kecepatan yang sangat wajar, bahkan untuk blockchain seperti Polygon). Cassandra memiliki kemampuan menyerap jumlah penulisan yang sangat tinggi – sebenarnya jalur baca lagi daripada jalur tulis.
- Dukungan pengindeksan: Indeks adalah komponen kunci DBMS untuk menjawab pertanyaan dan kasus atau peluang bisnis baru. Cassandra memiliki dukungan terbatas untuk pengindeksan. Indeks hanya efektif jika kueri sudah menentukan cara untuk membatasi partisi tempat kueri akan dijalankan. Kami membayar di sini biaya untuk memiliki didistribusikan secara sewenang-wenang basis data. Dukungan PostgreSQL untuk indeks efisien, dapat diperluas, dan terdepan.
- Dukungan agregasi: Kasus yang sama untuk agregasi; karena Cassandra tidak mengizinkan agregasi multi-partisi dan tidak menoleransi klausa GROUP BY dalam bahasa kuerinya, dukungannya agak kurang. PostgreSQL mengusulkan dukungan agregasi yang luas, bahkan pada tipe data eksotik seperti rentang dan blob jsonb.
- Pemodelan data: Cassandra sangat, sangat membatasi kemungkinan pemodelan data. Sebuah tabel harus dibuat untuk hampir setiap permintaan yang ingin Anda jawab, dan data harus didenormalisasi menjadi baris-baris besar (menggunakan sepenuhnya toko kolom lebar aspek C* dan juga fakta bahwa penulis itu murahan). PostgreSQL memungkinkan kita memanfaatkan aspek relasional dari blockchain (panggilan, transaksi, blok) dan menghemat ruang disk, sehingga mendorong penggunaan kembali data.
- Kueri dan audit ad-hoc: Mampu menggunakan standar penuh SQL dan melakukan kueri sewenang-wenang berarti kita dapat menjelajahi dan mencari potensi akar penyebab bug atau memiliki data eksplorasi untuk kasus penggunaan di masa mendatang. Kita benar-benar dapat menggunakan database sebagai alat yang interaktif dan cerdas, bukan sebagai tempat penyimpanan yang bodoh. Melakukan hal ini di Cassandra tanpa cluster komputasi analitik yang ekstensif dan mahal seperti Presto, Spark, dll. (dan karena kami menjalankan server bare metal, kami tidak memiliki akses ke alat analisis data terdistribusi yang mudah dikembangkan seperti EMR).
- Penggunaan Penyimpanan: Asumsi Cassandra adalah penyimpanannya sangat murah dan cluster dapat dengan mudah diperluas dengan mesin baru. Itu artinya semua batasan pada indeks dan agregasi harus dibayar dengan penyimpanan. Tidak ada indeks yang efisien secara global dan dukungan gabungan berarti kita harus mendenormalisasi dan menyimpan salinan seluruh tabel untuk setiap sumbu yang ingin kita kueri. PostgreSQL menghemat ruang penyimpanan sebesar terabyte.
- Konsistensi: Karena Cassandra adalah database terdistribusi dan berorientasi AP (komunikasi dilakukan dengan bergosip antar node), konsistensi hanya bersifat akhir dalam hal penulisan. Anda dapat menyesuaikan kebijakan konsistensi setiap pernyataan untuk membaca dan menulis, namun tujuan dari database ini bukanlah untuk memiliki konsistensi yang kuat. PostgreSQL memiliki sejarah yang kuat dalam digunakan untuk misi-misi penting dan sangat tangguh. Terpusat juga berarti tidak ada jaringan yang terlibat dalam jalur penulisan.
- Transaksi dan MVCC:
- Transaksi: Mendukung Cassandra hanya transaksi ringan pada kueri DML. Beberapa batching dapat diterapkan (dermaga) tetapi ada banyak peringatan, yaitu baris-baris tersebut harus berada di server (= partisi) yang sama agar kinerjanya tidak buruk.
- MVCC: Cassandra mendukung stempel waktu baris tetapi MVCC penuh tidak dijamin. Pemadatan dapat menghapus data yang sudah usang dan tidak ada cara untuk mengatakan bahwa C* seharusnya tidak menghapusnya (seperti misalnya transaksi di PG).
- PostgreSQL mendukung model MVCC yang kuat yang memastikan jalur baca yang konsisten bagi pengguna kami.
- Tooling: PostgreSQL memiliki lebih banyak tools yang banyak digunakan untuk mengoperasikan database dengan mudah. Apalagi alat seperti itu jalur terbang memastikan kami mempertahankan versi skema database yang kuat. Kami telah berhasil mengintegrasikannya dengan basis kode kami. Tidak ada yang setara dengan tingkat kedewasaan Cassandra.
- Skalabilitas horizontal: Ini adalah nilai jual utama Cassandra. Tambahkan saja lebih banyak mesin seiring bertambahnya data Anda. Tidak ada yang setara dengan PostgreSQL karena sharding dan partisi harus dilakukan secara manual.
Bagaimana kami berencana untuk melakukan penskalaan
Seperti yang telah kita lihat, satu-satunya kelemahan menggunakan pengaturan Postgres adalah penskalaan pada pembacaan dan penyimpanan. Apa yang bisa kita lakukan untuk mengatasi keterbatasan ini?
Alat efektif pertama yang kami miliki adalah memisahkan setiap protokol atau blockchain yang kami dukung ke dalam basis datanya sendiri, sehingga dapat diskalakan dengan tepat berdasarkan volume dan lalu lintas. Segmentasi berdasarkan domain bisnis memastikan penskalaan lapisan pertama.
Dengan mengambil konsep ini lebih jauh, kita juga dapat mengelompokkan data historis yang dingin ke dalam partisi temporal. Versi terbaru Postgres telah meningkatkan banyak kegunaan tabel yang dipartisi, yang memungkinkan pemindahan data dengan lancar melintasi sekelompok mesin. Misalnya, kita dapat menggunakan mesin yang lebih murah dengan daya komputasi yang lebih kecil untuk menghosting sebagian besar data historis, sekaligus mempertahankan raksasa RAM yang melayani pengguna untuk menghosting tabel gabungan dan operasi terbaru pengguna.
Pendekatan ini bekerja sangat baik dalam kasus penggunaan kami karena tidak ada kunci asing lintas partisi dalam penyimpanan historis (semuanya pada akhirnya melekat pada blok). Dari perspektif server utama, data historis bahkan dapat diakses secara transparan menggunakan partisi dan ekstensi postgres_fdw.
Untuk membantu menerapkan semua ini, kami juga telah melihat ekstensi TimescaleDB. Ekstensi ini menambahkan banyak fungsi ke postgres dasar, dan sebagian besar di antaranya sangat cocok untuk kasus penggunaan kami:
- Partisi otomatis tabel berdasarkan kolom seperti waktu (dalam kasus kami, kami mengadaptasinya dengan mengambil ketinggian blockchain sebagai referensi kami).
- Otomatis, sadar tipe data dan kompresi berbasis kolom dari potongan lama. Hal ini memastikan rasio kompresi yang hampir sempurna dengan menggunakan algoritma canggih pada data yang sangat mirip.
- Agregasi berbasis waktu yang efisien untuk menghitung saldo historis dan grafik data pasar dengan mudah.
Kami baru saja memulai eksperimen terkait penyimpanan, dan hal ini membuka banyak kasus penggunaan. Pembuktian konsep menggunakan sejumlah kecil data (~10 ribu blok di mainnet ethereum, jadi sekitar 2 hari data) menunjukkan pengurangan ruang disk hingga 40%.
Seperti yang telah kita lihat, volume data, asalkan kita menggunakan strategi yang tepat, tidak menjadi masalah. Namun bagaimana cara menskalakannya dengan ukuran basis pengguna kami?
Kami sudah memiliki keuntungan bagus di sini: kami mengindeks seluruh data blockchain. Oleh karena itu, penyimpanan yang dibutuhkan tidak akan bertambah seiring dengan bertambahnya jumlah pengguna, namun seiring dengan bertambahnya ukuran total blockchain. Optimalisasi penyimpanan dan pembacaan benar-benar ortogonal dalam resolusinya.
Penyiapan ini, dikombinasikan dengan kebutuhan tulis yang sangat rendah sebanding dengan volume baca yang perlu dilayani, merupakan penyiapan impian untuk pola replika pemimpin-pengikut pengelompokan. Untuk meningkatkan kinerja dan throughput lebih lanjut, kita juga dapat menempatkan replika baca postgres pada mesin yang sama dengan server API dan memanfaatkan soket domain UNIX untuk melewati perjalanan bolak-balik jaringan.
Berikut adalah contoh strategi replikasi data yang dapat kita gunakan untuk menskalakan pembacaan kita. Kotak abu-abu terang mewakili server tunggal. Kita dapat melihat di sini bahwa pod API ditempatkan secara langsung bersama dengan replika data terpanas untuk memastikan waktu transfer minimal antara penyimpanan dan pengguna. Contoh arsip yang dijelaskan sebelumnya tidak direpresentasikan agar skema tidak terlalu rumit.
Catatan Penutup
Sebagai pengguna jangka panjang Cassandra, saya ingin menekankan bahwa ini adalah database yang bagus dalam desainnya, yang sesuai dengan beragam aplikasi. Sayangnya, pilihan yang dibuat di Ledger untuk menggunakannya dibuat berdasarkan kasus penggunaan data yang tidak pernah terwujud.
Produktivitas tim kami terkena dampaknya, dan menantikan tantangan yang harus kami selesaikan, kami memilih untuk mengambil tindakan dan tidak terjebak dalam kekeliruan biaya.
Dalam banyak kasus, data Anda bukanlah data besar. Mengelola distribusi data bukanlah tugas yang sulit dalam banyak kasus, dan keuntungan dari database terdistribusi yang lengkap benar-benar perlu dipertimbangkan dengan cermat. Pertimbangan utamanya adalah pengalaman pengembang karena ini memberikan waktu berharga untuk membangun hal lain. Ini adalah kasus penggunaan nyata yang perlu kita investasikan secara besar-besaran.
- Konten Bertenaga SEO & Distribusi PR. Dapatkan Amplifikasi Hari Ini.
- PlatoAiStream. Kecerdasan Data Web3. Pengetahuan Diperkuat. Akses Di Sini.
- Mencetak Masa Depan bersama Adryenn Ashley. Akses Di Sini.
- Beli dan Jual Saham di Perusahaan PRE-IPO dengan PREIPO®. Akses Di Sini.
- Sumber: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :memiliki
- :adalah
- :bukan
- $NAIK
- 10
- 10K
- 20
- a
- kemampuan
- Sanggup
- mengakses
- diakses
- Akun
- di seluruh
- sebenarnya
- menyesuaikan
- menambahkan
- Menambahkan
- mengikuti
- Keuntungan
- pengumpulan
- algoritma
- Semua
- mengizinkan
- memungkinkan
- sudah
- juga
- Meskipun
- jumlah
- an
- analisis
- analisis
- dan
- menjawab
- Apa pun
- apa saja
- api
- aplikasi
- terapan
- pendekatan
- tepat
- arsip
- ADALAH
- sekitar
- Seni
- artikel
- AS
- penampilan
- aspek
- anggapan
- At
- tersedia
- sadar
- jauh
- kapak
- Sumbu
- Backend
- Saldo
- saldo
- mendasarkan
- berdasarkan
- Dasar
- BE
- karena
- menjadi
- sebelum
- Awal
- raksasa
- makhluk
- Manfaat
- antara
- Besar
- Big data
- Bit
- Bitcoin
- Memblokir
- blockchain
- data blockchain
- blockchains
- Blok
- kedua
- Kotak
- kotak
- Membawa
- Bug
- membangun
- bisnis
- tapi
- by
- panggilan
- Panggilan
- CAN
- calon
- topi
- hati-hati
- kasus
- kasus
- Menyebabkan
- disebabkan
- terpusat
- rantai
- menantang
- tantangan
- menantang
- perubahan
- mengubah
- murah
- murah
- mesin lebih murah
- pilihan
- Pilih
- memilih
- terpilih
- jelas
- Kelompok
- kode
- basis kode
- dingin
- Kolom
- bergabung
- komoditi
- Komunikasi
- perusahaan
- kompleksitas
- komponen
- menghitung
- konsep
- konsep
- pertimbangan
- dianggap
- konsisten
- dingin
- Core
- Biaya
- bisa
- dibuat
- kritis
- terbaru
- data
- analisis data
- berbagi data
- penyimpanan data
- Basis Data
- Hari
- keputusan
- dijelaskan
- Mendesain
- Pengembang
- berkembang
- sulit
- langsung
- kotoran
- didistribusikan
- distribusi
- Terbagi
- do
- tidak
- melakukan
- domain
- Dont
- Kelemahan
- mimpi
- pengemudi
- dua
- e
- setiap
- mudah
- Mudah
- Tepi
- Efektif
- efisien
- lain
- tertanam
- menekankan
- aktif
- mendorong
- mempertinggi
- memastikan
- Memastikan
- memastikan
- Setara
- dll
- ethereum
- MAINNET ETHEREUM
- Bahkan
- akhirnya
- pERNAH
- Setiap
- segala sesuatu
- contoh
- ada
- Eksotik
- mengembang
- pengalaman
- keahlian
- menyelidiki
- penjelajah
- memperpanjang
- perpanjangan
- luas
- fakta
- Jatuh
- Fitur
- Fitur
- beberapa
- Menemukan
- Pertama
- cocok
- Untuk
- asing
- Depan
- keramahan
- dari
- penuh
- lengkap
- sepenuhnya
- fungsionalitas
- lebih lanjut
- masa depan
- mendapatkan
- diberikan
- Secara global
- tujuan
- akan
- grafik
- abu-abu
- besar
- Kelompok
- Tumbuh
- Pertumbuhan
- terjamin
- pedoman
- memiliki
- Sulit
- Perangkat keras
- Memiliki
- memiliki
- kepala
- berat
- tinggi
- membantu
- di sini
- High
- sangat
- historis
- tuan rumah
- PANAS
- terpanas
- Seterpercayaapakah Olymp Trade? Kesimpulan
- How To
- Namun
- HTML
- HTTPS
- i
- ideal
- if
- abadi
- dampak
- mengimplementasikan
- ditingkatkan
- in
- makin
- indeks
- Indeks
- contoh
- terpadu
- interaktif
- ke
- Menginvestasikan
- terlibat
- isu
- masalah
- IT
- NYA
- ikut
- bergabung
- jpg
- hanya
- pemeliharaan
- kunci
- kunci-kunci
- Jenis
- Kekurangan
- bahasa
- besar
- Latensi
- Terbaru
- lapisan
- Dipimpin
- Buku besar
- sah
- kurang
- Tingkat
- Leverage
- cahaya
- ringan
- 'like'
- pembatasan
- keterbatasan
- Terbatas
- Daftar
- sedikit
- lokal
- Panjang
- tampak
- mencari
- Lot
- Rendah
- Mesin
- terbuat
- Utama
- jaringan utama
- memelihara
- Mayoritas
- Membuat
- mengelola
- pelaksana
- manual
- banyak
- Pasar
- Data pasar
- kematangan
- max-width
- Mungkin..
- cara
- logam
- bermigrasi
- minimal
- misi
- model
- pemodelan
- lebih
- Selain itu
- paling
- pindah
- banyak
- harus
- yaitu
- hampir
- Perlu
- dibutuhkan
- kebutuhan
- juga tidak
- jaringan
- tak pernah
- New
- bagus
- tidak
- node
- tidak ada
- jumlah
- banyak sekali
- target
- of
- on
- ONE
- hanya
- beroperasi
- Operasi
- Peluang
- or
- urutan
- kami
- diri
- lebih
- Mengatasi
- sendiri
- dibayar
- bagian
- pihak
- path
- pola
- Membayar
- buah pir
- rekan rekan
- sempurna
- prestasi
- perspektif
- Tempat
- rencana
- plato
- Kecerdasan Data Plato
- Data Plato
- polong
- Titik
- kebijaksanaan
- Poligon
- mungkin
- Postgresql
- potensi
- kekuasaan
- kuat
- praktek
- Masalah
- proses
- produktifitas
- bukti
- proporsi
- mengusulkan
- protokol
- terbukti
- memberikan
- disediakan
- menempatkan
- query
- RAM
- jarak
- Penilaian
- agak
- perbandingan
- Mentah
- Baca
- nyata
- benar-benar
- masuk akal
- pengurangan
- mengenai
- terkait
- dapat diandalkan
- reorganisasi
- menjawab
- replikasi
- mewakili
- diwakili
- permintaan
- tabah
- Resolusi
- diselesaikan
- dihasilkan
- menggunakan kembali
- benar
- kuat
- akar
- bulat
- BARIS
- Run
- berjalan
- sama
- Scala
- terukur
- Skala
- skala
- mulus
- Pencarian
- keamanan
- melihat
- terlihat
- ruas
- segmentasi
- Penjualan
- titik penjualan
- layanan
- Layanan
- porsi
- set
- penyiapan
- beberapa
- sharding
- berbagi
- Pendek
- Menunjukkan
- sisi
- mirip
- sejak
- tunggal
- Ukuran
- keterampilan
- kecil
- lebih kecil
- pintar
- So
- larutan
- MEMECAHKAN
- Memecahkan
- beberapa
- Space
- percikan
- Menelurkan
- SQL
- standar
- Negara
- Pernyataan
- penyimpanan
- menyimpan
- Cerita
- Strategis
- Penyelarasan
- kuat
- sangat
- berhasil
- mendukung
- Mendukung
- tabel
- Mengambil
- pengambilan
- tugas
- tim
- Teknis
- mengatakan
- istilah
- dari
- bahwa
- Grafik
- The Block
- Negara
- mereka
- kemudian
- Sana.
- Ini
- mereka
- Ketiga
- Pihak ketiga
- ini
- keluaran
- waktu
- untuk
- terlalu
- alat
- alat
- Total
- SAMA SEKALI
- lalu lintas
- .
- Transaksi
- transfer
- transparan
- mengetik
- jenis
- Akhirnya
- bawah
- pokok
- sayangnya
- unix
- membuka kunci
- tidak perlu
- us
- kegunaan
- penggunaan
- menggunakan
- gunakan case
- bekas
- Pengguna
- Pengguna
- menggunakan
- biasanya
- Berharga
- variasi
- vertikal
- sangat
- volume
- ingin
- adalah
- Cara..
- we
- Web2
- Web3
- BAIK
- Apa
- Apa itu
- ketika
- yang
- sementara
- Sementara
- seluruh
- mengapa
- lebar
- sangat
- akan
- dengan
- tanpa
- bekerja
- menulis
- tertulis
- kamu
- Termuda
- Anda
- zephyrnet.dll