Intro Youtube • Obrolan perselisihan • Dokumentasi lengkap
Menginstal UStore sangat mudah, dan penggunaannya sesederhana dict
Python.
$ pip install ukv
$ python
from ukv import umem
db = umem . DataBase ()
db . main [ 42 ] = 'Hi'
Kami baru saja membuat database transaksional yang tertanam dalam memori dan menambahkan satu entri dalam koleksi main
. Apakah Anda lebih suka data di disk? Ubah satu baris.
from ukv import rocksdb
db = rocksdb . DataBase ( '/some-folder/' )
Apakah Anda lebih suka terhubung ke server UStore jarak jauh? UStore hadir dengan antarmuka RPC Penerbangan Apache Arrow!
from ukv import flight_client
db = flight_client . DataBase ( 'grpc://0.0.0.0:38709' )
Apakah Anda menyimpan MultiDiGraph
seperti NetworkX? Atau DataFrame
seperti Panda?
db = rocksdb . DataBase ()
users_table = db [ 'users' ]. table
users_table . merge ( pd . DataFrame ([
{ 'id' : 1 , 'name' : 'Lex' , 'lastname' : 'Fridman' },
{ 'id' : 2 , 'name' : 'Joe' , 'lastname' : 'Rogan' },
]))
friends_graph = db [ 'friends' ]. graph
friends_graph . add_edge ( 1 , 2 )
assert friends_graph . has_edge ( 1 , 2 ) and
friends_graph . has_node ( 1 ) and
friends_graph . number_of_edges ( 1 , 2 ) == 1
Pemanggilan fungsi mungkin terlihat sama, namun implementasi yang mendasarinya dapat menangani ratusan terabyte data yang ditempatkan di suatu tempat dalam memori persisten pada mesin jarak jauh.
Apakah ada orang lain yang secara bersamaan memperbarui koleksi tersebut? Gabungkan operasi Anda untuk menjamin konsistensi!
db = rocksdb . DataBase ()
with db . transact () as txn :
txn [ 'users' ]. table . merge (...)
txn [ 'friends' ]. graph . add_edge ( 1 , 2 )
Sejauh ini kami hanya membahas bagian atas USstore. Anda dapat menggunakannya untuk...
Tapi UStore bisa lebih dari itu. Ini petanya:
## Penggunaan Dasar
UStore dimaksudkan tidak hanya sebagai basis data, tetapi sebagai perangkat "bangun basis data Anda" dan standar terbuka untuk basis data transaksional NoSQL, yang mendefinisikan antarmuka biner tanpa salinan untuk operasi "Buat, Baca, Perbarui, Hapus", atau disingkat CRUD.
Beberapa header C99 sederhana dapat menghubungkan hampir semua mesin penyimpanan yang mendasarinya ke berbagai driver bahasa tingkat tinggi, memperluas dukungannya untuk nilai string biner ke grafik, dokumen skema fleksibel, dan modalitas lainnya, yang bertujuan untuk menggantikan MongoDB, Neo4J, Pinecone, dan ElasticSearch dengan sistem transaksional ACID tunggal.
Redis, misalnya, menyediakan RediSearch, RedisJSON, dan RedisGraph dengan tujuan serupa. UStore melakukannya dengan lebih baik, memungkinkan Anda menambahkan Key-Value Stores (KVS) favorit Anda, tertanam, mandiri, atau dipecah, seperti FoundationDB, sehingga melipatgandakan fungsinya.
Objek Besar Biner dapat ditempatkan di dalam UStore. Performanya akan sangat bervariasi tergantung pada teknologi dasar yang digunakan. UCSet dalam memori akan menjadi yang tercepat, tetapi paling tidak cocok untuk objek yang lebih besar. UDisk yang persisten, jika dikonfigurasi dengan benar, dapat sepenuhnya melewati kernel Linux, termasuk lapisan sistem file, dan secara langsung menangani perangkat blok.
IO persisten modern pada server kelas atas dapat melebihi 100 GB/dtk per soket bila dibangun pada driver ruang pengguna seperti SPDK. Hal ini mendekati throughput RAM kelas atas di dunia nyata dan membuka kasus penggunaan database baru yang tidak biasa. Seseorang sekarang dapat meletakkan file video berukuran Gigabyte dalam database transaksional ACID, tepat di sebelah metadatanya, daripada menggunakan penyimpanan objek terpisah, seperti MinIO.
JSON adalah format dokumen yang paling umum digunakan saat ini. Koleksi dokumen UStore mendukung JSON, serta MessagePack, dan BSON, yang digunakan oleh MongoDB.
UStore belum melakukan skala secara horizontal, tetapi memberikan kinerja node tunggal yang jauh lebih tinggi, dan memiliki skalabilitas vertikal yang hampir linier pada sistem banyak inti berkat perpustakaan simdjson
dan yyjson
sumber terbuka. Selain itu, untuk berinteraksi dengan data, Anda tidak memerlukan bahasa kueri khusus seperti MQL. Sebaliknya kami memprioritaskan standar RFC terbuka untuk benar-benar menghindari kunci vendor:
Database Graph modern, seperti Neo4J, kesulitan menghadapi beban kerja yang besar. Mereka membutuhkan terlalu banyak RAM, dan algoritme mereka mengamati data satu entri dalam satu waktu. Kami mengoptimalkan di kedua sisi:
Toko Fitur dan Database Vektor, seperti Pinecone, Milvus, dan USearch menyediakan indeks mandiri untuk pencarian vektor. UStore mengimplementasikannya sebagai modalitas terpisah, setara dengan Dokumen dan Grafik. Fitur:
UStore untuk Python dan C++ terlihat sangat berbeda. SDK Python kami meniru pustaka Python lainnya - Pandas dan NetworkX. Demikian pula, pustaka C++ menyediakan antarmuka yang diharapkan pengembang C++.
Seperti yang kita ketahui, orang menggunakan bahasa yang berbeda untuk tujuan yang berbeda. Beberapa fungsi tingkat C tidak diterapkan untuk beberapa bahasa. Entah karena belum ada peminatnya, atau karena kami belum mendapatkannya.
Nama | Melakukan transaksi | Koleksi | kumpulan | dokumen | Grafik | Salinan |
---|---|---|---|---|---|---|
Standar C99 | ✓ | ✓ | ✓ | ✓ | ✓ | 0 |
C++SDK | ✓ | ✓ | ✓ | ✓ | ✓ | 0 |
SDK Python | ✓ | ✓ | ✓ | ✓ | ✓ | 0-1 |
SDK GoLang | ✓ | ✓ | ✓ | ✗ | ✗ | 1 |
SDK Jawa | ✓ | ✓ | ✗ | ✗ | ✗ | 1 |
API Penerbangan Panah | ✓ | ✓ | ✓ | ✓ | ✓ | 0-2 |
Beberapa frontend di sini memiliki seluruh ekosistem di sekitarnya! Apache Arrow Flight API, misalnya, memiliki drivernya sendiri untuk C, C++, C#, Go, Java, JavaScript, Julia, MATLAB, Python, R, Ruby, dan Rust.
Mesin berikut dapat digunakan hampir secara bergantian. Secara historis, LevelDB adalah yang pertama. RocksDB kemudian meningkatkan fungsionalitas dan kinerja. Sekarang ini menjadi fondasi bagi setengah dari startup DBMS.
TingkatDB | BatuDB | UDisk | UCSet | |
---|---|---|---|---|
Kecepatan | 1x | 2x | 10x | 30x |
Gigih | ✓ | ✓ | ✓ | ✗ |
Transaksional | ✗ | ✓ | ✓ | ✓ |
Blokir Dukungan Perangkat | ✗ | ✗ | ✓ | ✗ |
Enkripsi | ✗ | ✗ | ✓ | ✗ |
Jam tangan | ✗ | ✓ | ✓ | ✓ |
Jepretan | ✓ | ✓ | ✓ | ✗ |
Pengambilan Sampel Acak | ✗ | ✗ | ✓ | ✓ |
Pencacahan Massal | ✗ | ✗ | ✓ | ✓ |
Koleksi Bernama | ✗ | ✓ | ✓ | ✓ |
Sumber Terbuka | ✓ | ✓ | ✗ | ✓ |
Kesesuaian | Setiap | Setiap | Linux | Setiap |
Pemelihara | Unum | Unum |
UCSet dan UDisk dirancang dan dikelola oleh Unum. Keduanya memiliki fitur yang lengkap, namun fitur terpenting yang disediakan alternatif kami adalah kinerja. Menjadi cepat dalam ingatan itu mudah. Logika inti UCSet dapat ditemukan di pustaka ucset
khusus header yang diberi template.
Merancang UDisk merupakan upaya yang jauh lebih menantang selama 7 tahun. Hal ini termasuk menciptakan struktur mirip pohon baru, menerapkan bypass kernel parsial dengan io_uring
, bypass lengkap dengan SPDK
, akselerasi GPU CUDA, dan bahkan sistem file internal khusus. UDisk adalah mesin pertama yang dirancang dari awal dengan mempertimbangkan arsitektur paralel dan bypass kernel .
Atomicity selalu terjamin. Bahkan pada penulisan non-transaksional - semua pembaruan berhasil atau semuanya gagal.
Konsistensi diterapkan dalam bentuk yang paling ketat - "Kemampuan Serialisasi Ketat" yang berarti:
Namun, perilaku default dapat diubah pada tingkat operasi tertentu. Untuk itu ::ustore_option_transaction_dont_watch_k
dapat diteruskan ke ustore_transaction_init()
atau operasi baca/tulis transaksional apa pun, untuk mengontrol pemeriksaan konsistensi selama staging.
Membaca | Menulis | |
---|---|---|
Kepala | Serial Ketat | Serial Ketat |
Transaksi melalui Snapshots | Serial | Serial Ketat |
Transaksi tanpa Snapshot | Serial Ketat | Serial Ketat |
Transaksi tanpa Jam Tangan | Serial Ketat | Berurutan |
Jika topik ini baru bagi Anda, silakan periksa blog Jepsen.io untuk mengetahui konsistensinya.
Membaca | Menulis | |
---|---|---|
Transaksi melalui Snapshots | ✓ | ✓ |
Transaksi tanpa Snapshot | ✗ | ✓ |
Daya tahan tidak berlaku untuk sistem dalam memori menurut definisinya. Dalam sistem hibrid atau persisten, kami memilih untuk menonaktifkannya secara default. Hampir setiap DBMS yang dibangun di atas KVS lebih memilih untuk menerapkan mekanisme ketahanannya sendiri. Terlebih lagi dalam database terdistribusi, di mana mungkin terdapat tiga Write Ahead Log yang terpisah:
Jika Anda masih membutuhkan daya tahan, siram tulis pada komit dengan tanda opsional. Di driver C Anda akan memanggil ustore_transaction_commit()
dengan flag ::ustore_option_write_flush_k
.
Seluruh DBMS cocok dengan image Docker sub 100 MB. Jalankan skrip berikut untuk menarik dan menjalankan kontainer, memperlihatkan server Apache Arrow Flight pada port 38709
. SDK Klien juga akan berkomunikasi melalui port yang sama, secara default.
docker run -d --rm --name ustore-test -p 38709:38709 unum/ustore
File konfigurasi default dapat diambil dengan:
cat /var/lib/ustore/config.json
Cara paling sederhana untuk menghubungkan dan menguji adalah dengan perintah berikut:
python ...
Gambar UStore yang dikemas sebelumnya tersedia di berbagai platform:
Jangan ragu untuk mengkomersialkan dan mendistribusikan ulang UStore.
Menyetel basis data adalah seni sekaligus sains. Proyek seperti RocksDB menyediakan lusinan tombol untuk mengoptimalkan perilaku. Kami mengizinkan penerusan file konfigurasi khusus ke mesin yang mendasarinya.
{
"version" : " 1.0 " ,
"directory" : " ./tmp/ "
}
Kami juga memiliki prosedur yang lebih sederhana, yang cukup untuk 80% pengguna. Itu dapat diperluas untuk memanfaatkan beberapa perangkat atau direktori, atau untuk meneruskan konfigurasi mesin khusus.
{
"version" : " 1.0 " ,
"directory" : " /var/lib/ustore " ,
"data_directories" : [
{
"path" : " /dev/nvme0p0/ " ,
"max_size" : " 100GB "
},
{
"path" : " /dev/nvme1p0/ " ,
"max_size" : " 100GB "
}
],
"engine" : {
"config_file_path" : " ./engine_rocksdb.ini " ,
}
}
Koleksi database juga dapat dikonfigurasi dengan file JSON.
Pada versi saat ini, bilangan bulat bertanda 64-bit digunakan. Ini memungkinkan kunci unik dalam rentang dari [0, 2^63)
. Build 128-bit dengan UUID akan segera hadir, tetapi kunci dengan panjang variabel sangat tidak disarankan. Mengapa demikian?
Penggunaan kunci dengan panjang variabel memaksa banyak batasan pada desain penyimpanan Nilai-Kunci. Pertama, ini menyiratkan perbandingan karakter yang lambat — sebuah pembunuh kinerja pada CPU hiperskalar modern. Kedua, ini memaksa kunci dan nilai untuk digabungkan pada disk untuk meminimalkan metadata yang diperlukan untuk navigasi. Terakhir, ini melanggar pandangan logis sederhana kita tentang KVS sebagai "pengalokasi memori persisten", yang memberikan lebih banyak tanggung jawab padanya.
Pendekatan yang disarankan untuk menangani kunci string adalah:
Hal ini akan menghasilkan satu titik konversi dari representasi string ke integer dan akan menjaga sebagian besar sistem tetap tajam dan antarmuka tingkat C lebih sederhana dari yang seharusnya.
Kami hanya dapat menangani nilai 4 GB atau lebih kecil saat ini. Mengapa? Penyimpanan Nilai Kunci umumnya ditujukan untuk operasi frekuensi tinggi. Seringkali (ribuan kali setiap detik), mengakses dan memodifikasi file berukuran 4 GB atau lebih besar tidak mungkin dilakukan pada perangkat keras modern. Jadi kami tetap menggunakan tipe yang panjangnya lebih kecil, membuat penggunaan representasi Apache Arrow sedikit lebih mudah dan memungkinkan KVS mengompresi indeks dengan lebih baik.
Peta jalan pengembangan kami bersifat publik dan dihosting dalam repositori GitHub. Tugas yang akan datang meliputi:
Baca peta jalan selengkapnya di dokumen kami di sini.