Pengolahan Data
Artikel ini memberikan penjelasan rinci mengenai implementasi penyisipan data, pembuatan indeks, dan kueri data di Milvus.
Penyisipan data
Anda dapat memilih berapa banyak pecahan yang digunakan oleh sebuah koleksi di Milvus-setiap pecahan dipetakan ke sebuah saluran virtual(vchannel). Seperti yang diilustrasikan di bawah ini, Milvus kemudian menetapkan setiap vchannel ke saluran fisik(pchannel), dan setiap pchannel terikat ke Streaming Node tertentu.
VChannel PChannel dan StreamingNode
Setelah verifikasi data, proxy akan membagi pesan tertulis menjadi berbagai paket data pecahan sesuai dengan aturan perutean pecahan yang ditentukan.
Saluran 1
Kemudian data tertulis dari satu pecahan(vchannel) dikirim ke Streaming Node pchannel yang sesuai.
aliran tulis
Streaming Node memberikan Timestamp Oracle (TSO) ke setiap paket data untuk menetapkan urutan total operasi. Ini melakukan pemeriksaan konsistensi pada payload sebelum menuliskannya ke dalam write-ahead log (WAL) yang mendasarinya. Setelah data disimpan dalam jangka waktu yang lama di WAL, data tersebut dijamin tidak akan hilang-bahkan jika terjadi kerusakan, Streaming Node dapat memutar ulang WAL untuk memulihkan semua operasi yang tertunda.
Sementara itu, StreamingNode juga secara asinkron memotong entri WAL yang telah dikomitmenkan ke dalam segmen-segmen terpisah. Ada dua jenis segmen:
- Segmen yang sedang tumbuh: semua data yang belum dimasukkan ke dalam penyimpanan objek.
- Segmen tertutup: semua data telah dimasukkan ke dalam penyimpanan objek, data segmen tertutup tidak dapat diubah.
Transisi dari segmen yang sedang tumbuh menjadi segmen tertutup disebut flush. Streaming Node memicu flush segera setelah ia menelan dan menulis semua entri WAL yang tersedia untuk segmen itu - yaitu, ketika tidak ada lagi catatan yang tertunda dalam log tulis-depan yang mendasarinya - pada saat itu segmen tersebut diselesaikan dan dioptimalkan untuk dibaca.
Pembuatan indeks
Pembuatan indeks dilakukan oleh simpul data. Untuk menghindari pembuatan 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: Simpul data 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
Sebuah koleksi di Milvus dibagi menjadi beberapa segmen; Streaming Node memuat segmen yang sedang berkembang dan menyimpan data real-time, sementara Query Node memuat segmen yang disegel.
Ketika permintaan kueri/pencarian tiba, proksi menyiarkan permintaan tersebut ke semua Streaming Node yang bertanggung jawab atas pecahan terkait untuk pencarian bersamaan.
Ketika permintaan kueri tiba, proxy secara bersamaan meminta Streaming Node yang menyimpan pecahan terkait untuk menjalankan pencarian.
Setiap Streaming Node membuat rencana kueri, mencari data lokal yang berkembang, dan secara bersamaan menghubungi Query Node jarak jauh untuk mengambil hasil historis, kemudian menggabungkannya menjadi satu hasil pecahan.
Terakhir, proxy mengumpulkan semua hasil pecahan, menggabungkannya ke dalam hasil akhir, dan mengembalikannya ke klien.
Serah terima
Ketika segmen yang berkembang pada Streaming Node disiram menjadi segmen tertutup - atau ketika Node Data menyelesaikan pemadatan - Koordinator memulai operasi handoff untuk mengubah data yang berkembang menjadi data historis. Koordinator kemudian mendistribusikan segmen tersegel secara merata ke semua Query Node, menyeimbangkan penggunaan memori, overhead CPU, dan jumlah segmen, dan melepaskan segmen yang berlebihan.
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 di Milvus.