Pengolahan Data
Artikel ini memberikan penjelasan rinci mengenai implementasi penyisipan data, pembuatan indeks, dan kueri data di Milvus.
Penyisipan data
Anda dapat menentukan sejumlah pecahan untuk setiap koleksi di Milvus, setiap pecahan berhubungan dengan sebuah saluran virtual(vchannel). Seperti yang ditunjukkan pada gambar berikut, Milvus memberikan setiap vchannel pada log broker sebuah saluran fisik(pchannel). Setiap permintaan sisipkan/hapus yang masuk dirutekan ke shard berdasarkan nilai hash dari kunci utama.
Validasi permintaan DML diteruskan ke proxy karena Milvus tidak memiliki transaksi yang rumit. Proxy akan meminta timestamp untuk setiap permintaan insert/delete dari TSO (Timestamp Oracle), yang merupakan modul waktu yang berada di bawah koordinator root. Dengan cap waktu yang lebih lama ditimpa oleh cap waktu yang lebih baru, cap waktu digunakan untuk menentukan urutan permintaan data yang sedang diproses. Proxy mengambil informasi dalam batch dari koordinator data termasuk segmen entitas dan kunci utama untuk meningkatkan throughput secara keseluruhan dan menghindari pembebanan yang berlebihan pada simpul pusat.
Saluran 1
Operasi DML (bahasa manipulasi data) dan operasi DDL (bahasa definisi data) ditulis ke urutan log, tetapi operasi DDL hanya diberi satu saluran karena frekuensi kemunculannya yang rendah.
Saluran 2
Vchannels dipertahankan di node broker log yang mendasarinya. Setiap saluran secara fisik tidak dapat dibagi dan tersedia untuk semua tetapi hanya satu node. Ketika tingkat konsumsi data mencapai kemacetan, pertimbangkan dua hal: Apakah node log broker kelebihan beban dan perlu diskalakan, dan apakah ada pecahan yang cukup untuk memastikan keseimbangan beban untuk setiap node.
Tulis urutan log
Diagram di atas merangkum empat komponen yang terlibat dalam proses penulisan urutan log: proksi, log broker, simpul data, dan penyimpanan objek. Proses ini melibatkan empat tugas: validasi permintaan DML, publikasi-langganan urutan log, konversi dari log streaming ke snapshot log, dan persistensi snapshot log. Keempat tugas tersebut dipisahkan satu sama lain untuk memastikan setiap tugas ditangani oleh jenis node yang sesuai. Node dengan tipe yang sama dibuat sama dan dapat diskalakan secara elastis dan independen untuk mengakomodasi berbagai beban data, khususnya data streaming yang sangat besar dan sangat berfluktuasi.
Pembuatan indeks
Pembangunan indeks dilakukan oleh simpul indeks. Untuk menghindari pembangunan indeks yang sering untuk pembaruan data, koleksi di Milvus dibagi lebih lanjut menjadi beberapa segmen, masing-masing dengan indeksnya sendiri.
Pembuatan indeks
Milvus mendukung pembangunan indeks untuk setiap bidang vektor, bidang skalar, dan bidang primer. Baik input maupun output dari pembangunan indeks berhubungan dengan penyimpanan objek: Node indeks memuat snapshot log untuk diindeks dari sebuah segmen (yang ada di penyimpanan objek) ke memori, mendeserialisasi data dan metadata yang sesuai untuk membangun indeks, menserialisasi indeks ketika pembangunan indeks selesai, dan menuliskannya kembali ke penyimpanan objek.
Pembuatan indeks terutama melibatkan operasi vektor dan matriks dan karenanya bersifat komputasi dan memori intensif. Vektor tidak dapat diindeks secara efisien dengan indeks berbasis pohon tradisional karena sifatnya yang berdimensi tinggi, tetapi dapat diindeks dengan teknik yang lebih matang dalam hal ini, seperti indeks berbasis kluster atau grafik. Apa pun jenisnya, membangun indeks melibatkan perhitungan berulang yang sangat besar untuk vektor berskala besar, seperti Kmeans atau graph traverse.
Tidak seperti pengindeksan untuk data skalar, membangun indeks vektor harus memanfaatkan sepenuhnya akselerasi SIMD (single instruction, multiple data). Milvus memiliki dukungan bawaan untuk set instruksi SIMD, misalnya, SSE, AVX2, dan AVX512. Mengingat "cegukan" dan sifat intensif sumber daya dari pembangunan indeks vektor, elastisitas menjadi sangat penting bagi Milvus dalam hal ekonomi. Rilis Milvus di masa depan akan mengeksplorasi lebih lanjut dalam komputasi heterogen dan komputasi tanpa server untuk menurunkan biaya terkait.
Selain itu, Milvus juga mendukung pemfilteran skalar dan kueri bidang utama. Milvus memiliki indeks bawaan untuk meningkatkan efisiensi kueri, misalnya indeks filter Bloom, indeks hash, indeks berbasis pohon, dan indeks terbalik, dan berencana untuk memperkenalkan lebih banyak indeks eksternal, misalnya indeks bitmap dan indeks kasar.
Permintaan data
Kueri data mengacu pada proses pencarian koleksi tertentu untuk k jumlah vektor yang terdekat dengan vektor target atau untuk semua vektor dalam rentang jarak tertentu ke vektor. Vektor dikembalikan bersama dengan kunci utama dan bidang yang sesuai.
Permintaan data
Koleksi di Milvus dibagi menjadi beberapa segmen, dan simpul kueri memuat indeks per segmen. Ketika permintaan pencarian tiba, permintaan tersebut disiarkan ke semua node kueri untuk pencarian bersamaan. Setiap node kemudian memangkas segmen lokal, mencari vektor yang memenuhi kriteria, dan mengurangi dan mengembalikan hasil pencarian.
Node kueri tidak bergantung satu sama lain dalam kueri data. Setiap node hanya bertanggung jawab untuk dua tugas: Memuat atau melepaskan segmen mengikuti instruksi dari query coord; melakukan pencarian di dalam segmen lokal. Dan proxy bertanggung jawab untuk mengurangi hasil pencarian dari setiap node kueri dan mengembalikan hasil akhir ke klien.
Serah terima
Ada dua jenis segmen, segmen yang berkembang (untuk data tambahan), dan segmen tertutup (untuk data historis). Node kueri berlangganan ke vchannel untuk menerima pembaruan terbaru (data tambahan) sebagai segmen yang berkembang. Ketika segmen yang berkembang mencapai ambang batas yang telah ditentukan, koordinat data menyegelnya dan pembangunan indeks dimulai. Kemudian operasi handoff yang diprakarsai oleh query coord mengubah data tambahan menjadi data historis. Query coord akan mendistribusikan segmen yang disegel secara merata di antara semua node kueri sesuai dengan penggunaan memori, overhead CPU, dan nomor segmen.
Apa selanjutnya
- Pelajari tentang cara menggunakan basis data vektor Milvus untuk kueri waktu nyata.
- Mempelajari tentang penyisipan data dan persistensi data di Milvus.
- Mempelajari bagaimana data diproses dalam Milvus.