🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
  • Home
  • Blog
  • Membangun Basis Data Vektor untuk Pencarian Kemiripan yang Dapat Diskalakan

Membangun Basis Data Vektor untuk Pencarian Kemiripan yang Dapat Diskalakan

  • Engineering
March 14, 2022
Xiaofan Luan

Cover image Gambar sampul depan

Artikel ini ditulis oleh Xiaofan Luan dan disadur oleh Angela Ni dan Claire Yu.

Menurut statistik, sekitar 80%-90% data di dunia tidak terstruktur. Dipicu oleh pertumbuhan Internet yang cepat, ledakan data tidak terstruktur diperkirakan akan terjadi di tahun-tahun mendatang. Oleh karena itu, perusahaan-perusahaan sangat membutuhkan database yang kuat yang dapat membantu mereka menangani dan memahami data semacam itu dengan lebih baik. Namun, mengembangkan database selalu lebih mudah diucapkan daripada dilakukan. Artikel ini bertujuan untuk berbagi proses berpikir dan prinsip-prinsip desain dalam membangun Milvus, sebuah basis data vektor open-source yang berasal dari cloud untuk pencarian kemiripan yang dapat diskalakan. Artikel ini juga menjelaskan arsitektur Milvus secara detail.

Langsung ke:

Data yang tidak terstruktur membutuhkan perangkat lunak dasar yang lengkap

Seiring dengan pertumbuhan dan perkembangan Internet, data yang tidak terstruktur menjadi semakin umum, termasuk email, dokumen, data sensor IoT, foto-foto di Facebook, struktur protein, dan masih banyak lagi. Agar komputer dapat memahami dan memproses data yang tidak terstruktur, data tersebut diubah menjadi vektor dengan menggunakan teknik penyematan.

Milvus menyimpan dan mengindeks vektor-vektor ini, dan menganalisis korelasi antara dua vektor dengan menghitung jarak kemiripannya. Jika dua vektor embedding sangat mirip, itu berarti sumber data asli juga mirip.

The workflow of processing unstructured data. Alur kerja pemrosesan data tidak terstruktur.

Vektor dan skalar

Skalar adalah kuantitas yang hanya dijelaskan dalam satu pengukuran - besaran. Skalar dapat direpresentasikan sebagai angka. Misalnya, sebuah mobil melaju dengan kecepatan 80 km/jam. Di sini, kecepatan (80 km/jam) adalah sebuah skalar. Sementara itu, vektor adalah kuantitas yang dijelaskan dalam setidaknya dua pengukuran - besar dan arah. Jika sebuah mobil melaju ke arah barat dengan kecepatan 80 km/jam, di sini kecepatan (80 km/jam ke arah barat) adalah sebuah vektor. Gambar di bawah ini adalah contoh skalar dan vektor yang umum.

Scalars vs. Vectors Skalar vs. Vektor

Karena sebagian besar data penting memiliki lebih dari satu atribut, kita dapat memahami data ini dengan lebih baik jika kita mengubahnya menjadi vektor. Salah satu cara umum bagi kita untuk memanipulasi data vektor adalah dengan menghitung jarak antar vektor menggunakan metrik seperti jarak Euclidean, inner product, jarak Tanimoto, jarak Hamming, dll. Semakin dekat jaraknya, semakin mirip vektor tersebut. Untuk melakukan kueri terhadap kumpulan data vektor yang sangat besar secara efisien, kita dapat mengatur data vektor dengan membuat indeks. Setelah kumpulan data diindeks, kueri dapat diarahkan ke kluster, atau subset data, yang kemungkinan besar berisi vektor yang mirip dengan kueri masukan.

Untuk mempelajari lebih lanjut tentang indeks, lihat Indeks Vektor.

Dari mesin pencari vektor ke basis data vektor

Sejak awal, Milvus 2.0 dirancang untuk tidak hanya berfungsi sebagai mesin pencari, namun yang lebih penting lagi, sebagai basis data vektor yang kuat.

Salah satu cara untuk membantu Anda memahami perbedaannya adalah dengan membuat analogi antara InnoDB dan MySQL, atau Lucene dan Elasticsearch.

Sama seperti MySQL dan Elasticsearch, Milvus juga dibangun di atas pustaka sumber terbuka seperti Faiss, HNSW, Annoy, yang berfokus pada penyediaan fungsionalitas pencarian dan memastikan kinerja pencarian. Namun, tidak adil jika Milvus hanya menjadi lapisan di atas Faiss karena Milvus menyimpan, mengambil, menganalisis vektor, dan, seperti halnya basis data lainnya, juga menyediakan antarmuka standar untuk operasi CRUD. Selain itu, Milvus juga memiliki fitur-fitur yang membanggakan, antara lain:

  • Pemecahan dan partisi
  • Replikasi
  • Pemulihan bencana
  • Keseimbangan beban
  • Pengurai atau pengoptimal kueri

Vector database Basis data vektor

Untuk pemahaman yang lebih komprehensif tentang apa itu basis data vektor, baca blognya di sini.

Pendekatan pertama yang asli cloud

Could-native approach Pendekatan yang bisa digunakan

Dari tidak ada yang dibagikan, ke penyimpanan bersama, lalu ke sesuatu yang dibagikan

Basis data tradisional biasanya mengadopsi arsitektur "tidak ada yang dibagikan" di mana node dalam sistem terdistribusi bersifat independen namun terhubung dengan jaringan. Tidak ada memori atau penyimpanan yang dibagikan di antara node. Namun, Snowflake merevolusi industri ini dengan memperkenalkan arsitektur "penyimpanan bersama" di mana komputasi (pemrosesan kueri) dipisahkan dari penyimpanan (penyimpanan basis data). Dengan arsitektur penyimpanan bersama, database dapat mencapai ketersediaan yang lebih besar, skalabilitas, dan pengurangan duplikasi data. Terinspirasi dari Snowflake, banyak perusahaan mulai memanfaatkan infrastruktur berbasis cloud untuk persistensi data sambil menggunakan penyimpanan lokal untuk caching. Jenis arsitektur database ini disebut "shared something" dan telah menjadi arsitektur utama di sebagian besar aplikasi saat ini.

Terlepas dari arsitektur "shared something", Milvus mendukung penskalaan yang fleksibel untuk setiap komponen dengan menggunakan Kubernetes untuk mengelola mesin eksekusinya dan memisahkan layanan baca, tulis, dan layanan lainnya dengan layanan mikro.

Basis data sebagai layanan (DBaaS)

Database sebagai layanan adalah tren yang sedang hangat karena banyak pengguna yang tidak hanya peduli dengan fungsionalitas database biasa tetapi juga mendambakan layanan yang lebih bervariasi. Ini berarti bahwa selain dari operasi CRUD tradisional, database kami harus memperkaya jenis layanan yang dapat disediakannya, seperti manajemen database, transportasi data, pengisian daya, visualisasi, dll.

Bersinergi dengan ekosistem sumber terbuka yang lebih luas

Tren lain dalam pengembangan basis data adalah memanfaatkan sinergi antara basis data dan infrastruktur cloud-native lainnya. Dalam kasus Milvus, ini bergantung pada beberapa sistem sumber terbuka. Sebagai contoh, Milvus menggunakan etcd untuk menyimpan metadata. Milvus juga mengadopsi antrean pesan, jenis komunikasi layanan-ke-layanan asinkron yang digunakan dalam arsitektur layanan mikro, yang dapat membantu mengekspor data tambahan.

Di masa mendatang, kami berharap dapat membangun Milvus di atas infrastruktur AI seperti Spark atau Tensorflow, dan mengintegrasikan Milvus dengan mesin streaming sehingga kami dapat mendukung pemrosesan aliran dan batch terpadu dengan lebih baik untuk memenuhi berbagai kebutuhan pengguna Milvus.

Prinsip-prinsip desain Milvus 2.0

Sebagai basis data vektor cloud-native generasi berikutnya, Milvus 2.0 dibangun berdasarkan tiga prinsip berikut.

Log sebagai data

Sebuah log dalam sebuah basis data secara serial mencatat semua perubahan yang dilakukan pada data. Seperti yang ditunjukkan pada gambar di bawah ini, dari kiri ke kanan adalah "data lama" dan "data baru". Dan log berada dalam urutan waktu. Milvus memiliki mekanisme pengatur waktu global yang memberikan satu stempel waktu yang unik secara global dan bertambah secara otomatis.

Logs Log

Dalam Milvus 2.0, log broker berfungsi sebagai tulang punggung sistem: semua operasi penyisipan dan pembaruan data harus melalui log broker, dan node pekerja mengeksekusi operasi CRUD dengan berlangganan dan mengonsumsi log.

Dualitas tabel dan log

Tabel dan log adalah data, dan keduanya hanyalah dua bentuk yang berbeda. Tabel adalah data yang terbatas, sedangkan log tidak terbatas. Log dapat dikonversi menjadi tabel. Dalam kasus Milvus, ia mengumpulkan log menggunakan jendela pemrosesan dari TimeTick. Berdasarkan urutan log, beberapa log digabungkan menjadi satu file kecil yang disebut snapshot log. Kemudian snapshot log ini digabungkan untuk membentuk segmen, yang dapat digunakan secara individual untuk keseimbangan beban.

Persistensi log

Persistensi log adalah salah satu masalah rumit yang dihadapi oleh banyak database. Penyimpanan log dalam sistem terdistribusi biasanya bergantung pada algoritma replikasi.

Tidak seperti basis data seperti Aurora, HBase, Cockroach DB, dan TiDB, Milvus mengambil pendekatan terobosan dan memperkenalkan sistem publish-subscribe (pub/sub) untuk penyimpanan dan persistensi log. Sistem pub/sub analog dengan antrean pesan di Kafka atau Pulsar. Semua node di dalam sistem dapat menggunakan log. Dalam Milvus, sistem semacam ini disebut log broker. Berkat log broker, log dipisahkan dari server, memastikan bahwa Milvus sendiri tidak memiliki status dan diposisikan dengan lebih baik untuk pulih dengan cepat dari kegagalan sistem.

Log broker Pialang log

Dibangun di atas pustaka pencarian vektor populer termasuk Faiss, ANNOY, HNSW, dan banyak lagi, Milvus dirancang untuk pencarian kemiripan pada kumpulan data vektor yang padat yang berisi jutaan, miliaran, atau bahkan triliunan vektor.

Standalone dan cluster

Milvus menawarkan dua cara penerapan - standalone atau cluster. Pada Milvus standalone, karena semua node digunakan bersama-sama, kita dapat melihat Milvus sebagai satu proses tunggal. Saat ini, Milvus standalone bergantung pada MinIO dan etcd untuk persistensi data dan penyimpanan metadata. Dalam rilis mendatang, kami berharap dapat menghilangkan dua ketergantungan pihak ketiga ini untuk memastikan kesederhanaan sistem Milvus. Milvus cluster mencakup delapan komponen layanan mikro dan tiga ketergantungan pihak ketiga: MinIO, etcd, dan Pulsar. Pulsar berfungsi sebagai perantara log dan menyediakan layanan log pub/sub.

Standalone and cluster Standalone dan cluster

Kerangka sederhana dari arsitektur Milvus

Milvus memisahkan aliran data dari aliran kontrol, dan dibagi menjadi empat lapisan yang independen dalam hal skalabilitas dan pemulihan bencana.

Milvus architecture Arsitektur Milvus

Lapisan akses

Lapisan akses bertindak sebagai wajah sistem, mengekspos titik akhir koneksi klien ke dunia luar. Lapisan ini bertanggung jawab untuk memproses koneksi klien, melakukan verifikasi statis, pemeriksaan dinamis dasar untuk permintaan pengguna, meneruskan permintaan, dan mengumpulkan serta mengembalikan hasil ke klien. Proksi itu sendiri tidak memiliki kewarganegaraan dan menyediakan alamat akses dan layanan terpadu ke dunia luar melalui komponen penyeimbang beban (Nginx, Kubernetess Ingress, NodePort, dan LVS). Milvus menggunakan arsitektur pemrosesan paralel masif (MPP), di mana proksi mengembalikan hasil yang dikumpulkan dari node pekerja setelah agregasi global dan pasca-pemrosesan.

Layanan koordinator

Layanan koordinator adalah otak dari sistem, yang bertanggung jawab atas manajemen node topologi cluster, penyeimbangan beban, pembuatan stempel waktu, deklarasi data, dan manajemen data. Untuk penjelasan rinci tentang fungsi setiap layanan koordinator, baca dokumentasi teknis Milvus.

Node pekerja

Node pekerja, atau eksekusi, bertindak sebagai anggota tubuh sistem, mengeksekusi instruksi yang dikeluarkan oleh layanan koordinator dan perintah bahasa manipulasi data (DML) yang diinisiasi oleh proksi. Node pekerja di Milvus mirip dengan node data di Hadoop, atau server wilayah di HBase. Setiap jenis simpul pekerja berhubungan dengan sebuah layanan coord. Untuk penjelasan rinci tentang fungsi setiap node pekerja, baca dokumentasi teknis Milvus.

Penyimpanan

Penyimpanan adalah landasan Milvus, yang bertanggung jawab atas persistensi data. Lapisan penyimpanan dibagi menjadi tiga bagian:

  • Penyimpanan meta: Bertanggung jawab untuk menyimpan snapshot dari meta data seperti skema koleksi, status node, pos pemeriksaan konsumsi pesan, dll. Milvus mengandalkan etcd untuk fungsi-fungsi ini dan Etcd juga mengemban tanggung jawab untuk registrasi layanan dan pemeriksaan kesehatan.
  • Pialang log: Pub/sub sistem yang mendukung pemutaran dan bertanggung jawab untuk persistensi data streaming, eksekusi kueri asinkron yang andal, pemberitahuan peristiwa, dan mengembalikan hasil kueri. Ketika node melakukan pemulihan waktu henti, log broker memastikan integritas data tambahan melalui pemutaran log broker. Cluster Milvus menggunakan Pulsar sebagai log broker, sedangkan mode mandiri menggunakan RocksDB. Layanan penyimpanan streaming seperti Kafka dan Pravega juga dapat digunakan sebagai log broker.
  • Penyimpanan objek: Menyimpan file snapshot dari log, file indeks skalar/vektor, dan hasil pemrosesan kueri perantara. Milvus mendukung AWS S3 dan Azure Blob, serta MinIO, sebuah layanan penyimpanan objek sumber terbuka yang ringan. Karena latensi akses yang tinggi dan penagihan per kueri dari layanan penyimpanan objek, Milvus akan segera mendukung kumpulan cache berbasis memori/SSD dan pemisahan data panas/dingin untuk meningkatkan kinerja dan mengurangi biaya.

Model Data

Model data mengatur data dalam database. Di Milvus, semua data diatur berdasarkan koleksi, pecahan, partisi, segmen, dan entitas.

Data model 1 Model data 1

Koleksi

Koleksi dalam Milvus dapat diibaratkan sebagai sebuah tabel dalam sistem penyimpanan relasional. Collection adalah unit data terbesar dalam Milvus.

Shard

Untuk mengambil keuntungan penuh dari kekuatan komputasi paralel dari cluster ketika menulis data, koleksi di Milvus harus menyebarkan operasi penulisan data ke node yang berbeda. Secara default, satu koleksi berisi dua pecahan. Bergantung pada volume kumpulan data Anda, Anda dapat memiliki lebih banyak pecahan dalam sebuah koleksi. Milvus menggunakan metode hashing kunci utama untuk sharding.

Partisi

Ada juga beberapa partisi dalam sebuah pecahan. Partisi dalam Milvus mengacu pada sekumpulan data yang ditandai dengan label yang sama dalam sebuah koleksi. Metode partisi yang umum termasuk partisi berdasarkan tanggal, jenis kelamin, usia pengguna, dan banyak lagi. Membuat partisi dapat menguntungkan proses kueri karena data yang sangat banyak dapat disaring berdasarkan tag partisi.

Sebagai perbandingan, sharding lebih pada kemampuan penskalaan saat menulis data, sedangkan partisi lebih pada peningkatan kinerja sistem saat membaca data.

Data model 2 Model data 2

Segmen

Di dalam setiap partisi, terdapat beberapa segmen kecil. Segmen adalah unit terkecil untuk penjadwalan sistem di Milvus. Ada dua jenis segmen, yaitu segmen yang sedang tumbuh dan segmen yang tertutup. Segmen yang tumbuh dilanggan oleh simpul-simpul kueri. Pengguna Milvus terus menulis data ke dalam segmen yang sedang tumbuh. Ketika ukuran segmen yang sedang tumbuh mencapai batas atas (512 MB secara default), sistem tidak akan mengizinkan penulisan data tambahan ke dalam segmen yang sedang tumbuh ini, dan karenanya menyegel segmen ini. Indeks dibangun di atas segmen yang disegel.

Untuk mengakses data secara real time, sistem membaca data di segmen yang sedang tumbuh dan segmen yang disegel.

Entitas

Setiap segmen berisi sejumlah besar entitas. Entitas di Milvus setara dengan sebuah baris dalam database tradisional. Setiap entitas memiliki bidang kunci utama yang unik, yang juga dapat dibuat secara otomatis. Entitas juga harus mengandung timestamp (ts), dan bidang vektor - inti dari Milvus.

Tentang Seri Deep Dive

Dengan pengumuman resmi ketersediaan umum Milvus 2.0, kami menyusun seri blog Milvus Deep Dive ini untuk memberikan interpretasi mendalam tentang arsitektur dan kode sumber Milvus. Topik-topik yang dibahas dalam seri blog ini meliputi:

Like the article? Spread the word

Terus Baca