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

milvus-logo
LFAI
  • Home
  • Blog
  • Penyisipan Data dan Persistensi Data dalam Basis Data Vektor

Penyisipan Data dan Persistensi Data dalam Basis Data Vektor

  • Engineering
April 06, 2022
Bingyi Sun

Cover image Gambar sampul depan

Artikel ini ditulis oleh Bingyi Sun dan diterjemahkan oleh Angela Ni.

Pada artikel sebelumnya dalam seri Deep Dive, kami telah memperkenalkan bagaimana data diproses di Milvus, database vektor paling canggih di dunia. Dalam artikel ini, kita akan terus memeriksa komponen-komponen yang terlibat dalam penyisipan data, mengilustrasikan model data secara detail, dan menjelaskan bagaimana persistensi data dicapai di Milvus.

Langsung ke:

Rekap arsitektur Milvus

Milvus architecture. Arsitektur Milvus.

SDK mengirimkan permintaan data ke proxy, portal, melalui load balancer. Kemudian proxy berinteraksi dengan layanan koordinator untuk menulis permintaan DDL (bahasa definisi data) dan DML (bahasa manipulasi data) ke dalam penyimpanan pesan.

Node pekerja, termasuk node kueri, node data, dan node indeks, mengkonsumsi permintaan dari penyimpanan pesan. Lebih khusus lagi, simpul kueri bertanggung jawab atas kueri data; simpul data bertanggung jawab atas penyisipan data dan persistensi data; dan simpul indeks terutama berurusan dengan pembuatan indeks dan akselerasi kueri.

Lapisan paling bawah adalah penyimpanan objek, yang terutama memanfaatkan MinIO, S3, dan AzureBlob untuk menyimpan log, delta binlog, dan file indeks.

Portal permintaan penyisipan data

Proxy in Milvus. Proxy di Milvus.

Proxy berfungsi sebagai portal permintaan penyisipan data.

  1. Awalnya, proxy menerima permintaan penyisipan data dari SDK, dan mengalokasikan permintaan tersebut ke dalam beberapa bucket dengan menggunakan algoritma hash.
  2. Kemudian proxy meminta data coord untuk menetapkan segmen, unit terkecil dalam Milvus untuk penyimpanan data.
  3. Setelah itu, proxy memasukkan informasi dari segmen yang diminta ke dalam penyimpanan pesan agar informasi tersebut tidak hilang.

Koordinat data dan simpul data

Fungsi utama dari data coord adalah untuk mengatur alokasi channel dan segmen, sedangkan fungsi utama dari data node adalah untuk mengkonsumsi dan menyimpan data yang telah disisipkan.

Data coord and data node in Milvus. Data coord dan data node dalam Milvus.

Fungsi

Data coord berfungsi dalam beberapa aspek berikut:

  • Mengalokasikanruang segmenData coord mengalokasikan ruang dalam segmen yang sedang tumbuh ke proxy sehingga proxy dapat menggunakan ruang kosong dalam segmen untuk menyisipkan data.

  • Mencatatalokasi segmen dan waktu berakhirnya ruang yang dialokasikan dalam segmenRuang dalam setiap segmen yang dialokasikan oleh data coord tidak permanen, oleh karena itu, data coord juga perlu mencatat waktu berakhirnya setiap alokasi segmen.

  • Secara otomatis menghapus data segmenJika segmen penuh, data coord secara otomatis memicu penghapusan data.

  • Mengalokasikan saluran ke node dataSebuah koleksi dapat memiliki beberapa vchannel. Data coord menentukan vchannel mana yang dikonsumsi oleh node data yang mana.

Simpul data berfungsi dalam aspek-aspek berikut:

  • Mengkonsumsi dataNode data mengkonsumsi data dari saluran yang dialokasikan oleh data coord dan membuat urutan untuk data.

  • Persistensi dataCache data yang dimasukkan ke dalam memori dan secara otomatis mem-flush data yang dimasukkan tersebut ke disk ketika volume data mencapai ambang batas tertentu.

Alur kerja

One vchannel can only be assigned to one data node. Satu vchannel hanya dapat ditetapkan ke satu simpul data .

Seperti yang ditunjukkan pada gambar di atas, koleksi memiliki empat vchannel (V1, V2, V3, dan V4) dan ada dua node data. Sangat mungkin bahwa data coord akan menetapkan satu node data untuk mengonsumsi data dari V1 dan V2, dan node data lainnya dari V3 dan V4. Satu vchannel tunggal tidak dapat ditetapkan ke beberapa node data dan ini untuk mencegah pengulangan konsumsi data, yang jika tidak akan menyebabkan kumpulan data yang sama dimasukkan ke dalam segmen yang sama secara berulang-ulang.

Koordinat akar dan Detak Waktu

Root coord mengelola TSO (timestamp Oracle), dan menerbitkan pesan time tick secara global. Setiap permintaan penyisipan data memiliki stempel waktu yang ditetapkan oleh root coord. Time Tick adalah landasan Milvus yang bertindak seperti jam di Milvus dan menandakan pada titik waktu mana sistem Milvus berada.

Ketika data ditulis dalam Milvus, setiap permintaan penyisipan data membawa cap waktu. Selama konsumsi data, setiap kali node data mengkonsumsi data yang cap waktunya berada dalam rentang tertentu.

An example of data insertion and data consumption based on timestamp. Contoh penyisipan data dan konsumsi data berdasarkan cap waktu .

Gambar di atas adalah proses penyisipan data. Nilai dari timestamp diwakili oleh angka 1,2,6,5,7,8. Data dituliskan ke dalam sistem oleh dua proksi: p1 dan p2. Selama konsumsi data, jika waktu saat ini dari Time Tick adalah 5, node data hanya dapat membaca data 1 dan 2. Kemudian selama pembacaan kedua, jika waktu saat ini dari Time Tick menjadi 9, data 6,7,8 dapat dibaca oleh node data.

Organisasi data: koleksi, partisi, pecahan (saluran), segmen

Data organization in Milvus. Organisasi data di Milvus.

Baca artikel ini terlebih dahulu untuk memahami model data di Milvus dan konsep koleksi, pecahan, partisi, dan segmen.

Secara ringkas, unit data terbesar di Milvus adalah collection yang dapat diibaratkan sebagai sebuah tabel di dalam database relasional. Sebuah koleksi dapat memiliki beberapa pecahan (masing-masing sesuai dengan saluran) dan beberapa partisi di dalam setiap pecahan. Seperti yang ditunjukkan pada ilustrasi di atas, saluran (pecahan) adalah batang vertikal sedangkan partisi adalah batang horizontal. Pada setiap persimpangan terdapat konsep segmen, unit terkecil untuk alokasi data. Dalam Milvus, indeks dibangun di atas segmen. Selama kueri, sistem Milvus juga menyeimbangkan beban kueri di node kueri yang berbeda dan proses ini dilakukan berdasarkan unit segmen. Segmen berisi beberapa binlog, dan ketika data segmen dikonsumsi, file binlog akan dihasilkan.

Segmen

Ada tiga jenis segmen dengan status yang berbeda di Milvus: segmen tumbuh, tertutup, dan memerah.

Segmen yang sedang tumbuh

Segmen yang sedang tumbuh adalah segmen yang baru dibuat yang dapat dialokasikan ke proksi untuk penyisipan data. Ruang internal segmen dapat digunakan, dialokasikan, atau bebas.

Three status in a growing segment Tiga status dalam segmen yang sedang tumbuh

  • Digunakan: bagian ruang dari segmen yang sedang tumbuh ini telah dikonsumsi oleh simpul data.
  • Dialokasikan: bagian ruang dari segmen yang sedang tumbuh ini telah diminta oleh proxy dan dialokasikan oleh data coord. Ruang yang dialokasikan akan berakhir setelah periode waktu tertentu.
  • Free: bagian ruang dari segmen yang sedang tumbuh ini belum digunakan. Nilai ruang bebas sama dengan keseluruhan ruang segmen dikurangi dengan nilai ruang yang digunakan dan dialokasikan. Jadi ruang kosong suatu segmen bertambah seiring dengan habisnya ruang yang dialokasikan.

Segmen tertutup

Segmen tertutup adalah segmen tertutup yang tidak dapat lagi dialokasikan ke proxy untuk penyisipan data.

Sealed segment in Milvus Segmen tertutup di Milvus

Segmen yang sedang tumbuh disegel dalam keadaan berikut:

  • Jika ruang yang digunakan dalam segmen yang sedang tumbuh mencapai 75% dari total ruang, segmen tersebut akan disegel.
  • Flush() dipanggil secara manual oleh pengguna Milvus untuk mempertahankan semua data dalam sebuah koleksi.
  • Segmen-segmen yang tumbuh yang tidak disegel setelah jangka waktu yang lama akan disegel karena terlalu banyak segmen yang tumbuh menyebabkan simpul-simpul data menggunakan memori secara berlebihan.

Segmen yang memerah

Segmen yang disiram adalah segmen yang telah ditulis ke dalam disk. Flush mengacu pada penyimpanan data segmen ke penyimpanan objek demi persistensi data. Segmen hanya dapat di-flush ketika ruang yang dialokasikan dalam segmen yang disegel habis masa berlakunya. Ketika di-flush, segmen yang disegel berubah menjadi segmen yang disiram.

Flushed segment in Milvus Segmen yang dibilas di Milvus

Saluran

Sebuah saluran dialokasikan:

  • Ketika simpul data dimulai atau dimatikan; atau
  • Ketika ruang segmen yang dialokasikan diminta oleh proxy.

Kemudian ada beberapa strategi alokasi saluran. Milvus mendukung 2 dari strategi tersebut:

  1. Hash yang konsisten

Consistency hashing in Milvus Hashing konsistensi di Milvus

Strategi default di Milvus. Strategi ini memanfaatkan teknik hashing untuk memberikan posisi pada setiap saluran pada ring, kemudian mencari searah jarum jam untuk menemukan simpul data terdekat dengan saluran. Dengan demikian, dalam ilustrasi di atas, saluran 1 dialokasikan ke simpul data 2, sedangkan saluran 2 dialokasikan ke simpul data 3.

Namun, salah satu masalah dengan strategi ini adalah bahwa peningkatan atau penurunan jumlah node data (mis. Node data baru dimulai atau node data tiba-tiba mati) dapat mempengaruhi proses alokasi saluran. Untuk mengatasi masalah ini, data coord memonitor status dari data node melalui etcd sehingga data coord dapat segera diberitahu jika terjadi perubahan status dari data node. Kemudian data coord selanjutnya menentukan ke node data mana yang akan mengalokasikan saluran dengan benar.

  1. Penyeimbangan beban

Strategi kedua adalah mengalokasikan saluran dari koleksi yang sama ke node data yang berbeda, memastikan saluran dialokasikan secara merata. Tujuan dari strategi ini adalah untuk mencapai keseimbangan beban.

Alokasi data: kapan dan bagaimana

The process of data allocation in Milvus Proses alokasi data di Milvus

Proses alokasi data dimulai dari klien. Pertama-tama klien mengirimkan permintaan penyisipan data dengan stempel waktu t1 ke proxy. Kemudian proxy mengirimkan permintaan ke data coord untuk alokasi segmen.

Setelah menerima permintaan alokasi segmen, data coord memeriksa status segmen dan mengalokasikan segmen. Jika ruang saat ini dari segmen yang dibuat cukup untuk baris data yang baru dimasukkan, data coord mengalokasikan segmen yang dibuat tersebut. Namun, jika ruang yang tersedia di segmen saat ini tidak mencukupi, data coord akan mengalokasikan segmen baru. Data coord dapat mengembalikan satu atau beberapa segmen pada setiap permintaan. Sementara itu, data coord juga menyimpan segmen yang dialokasikan di meta server untuk persistensi data.

Selanjutnya, data coord mengembalikan informasi segmen yang dialokasikan (termasuk ID segmen, jumlah baris, waktu kedaluwarsa t2, dll.) ke proxy. Proxy mengirimkan informasi segmen yang dialokasikan tersebut ke penyimpanan pesan sehingga informasi ini dicatat dengan benar. Perhatikan bahwa nilai t1 harus lebih kecil dari pada t2. Nilai default dari t2 adalah 2.000 milidetik dan dapat diubah dengan mengkonfigurasi parameter segment.assignmentExpiration dalam file data_coord.yaml.

Struktur file binlog dan persistensi data

Data node flush Penyiraman simpul data

Simpul data berlangganan ke penyimpan pesan karena permintaan penyisipan data disimpan di penyimpan pesan dan simpul data dengan demikian dapat mengkonsumsi pesan penyisipan. Simpul data pertama-tama menempatkan permintaan penyisipan dalam buffer penyisipan, dan ketika permintaan terakumulasi, permintaan tersebut akan dibuang ke penyimpanan objek setelah mencapai ambang batas.

Struktur file binlog

Binlog file structure. Struktur file binlog.

Struktur file binlog di Milvus mirip dengan yang ada di MySQL. Binlog digunakan untuk melayani dua fungsi: pemulihan data dan pembangunan indeks.

Sebuah binlog berisi banyak peristiwa. Setiap kejadian memiliki tajuk kejadian dan data kejadian.

Metadata termasuk waktu pembuatan binlog, ID simpul tulis, panjang event, dan NextPosition (offset dari event berikutnya), dan lain-lain ditulis dalam header event.

Data peristiwa dapat dibagi menjadi dua bagian: tetap dan variabel.

File structure of an insert event. Struktur file dari sebuah event penyisipan .

Bagian tetap dalam data event dari sebuah INSERT_EVENT berisi StartTimestamp, EndTimestamp, dan reserved.

Bagian variabel sebenarnya menyimpan data yang disisipkan. Data yang disisipkan diurutkan ke dalam format parket dan disimpan dalam file ini.

Persistensi data

Jika ada beberapa kolom dalam skema, Milvus akan menyimpan binlog dalam kolom-kolom.

Binlog data persistence. Persistensi data binlog.

Seperti yang diilustrasikan pada gambar di atas, kolom pertama adalah primary key binlog. Kolom kedua adalah kolom timestamp. Sisanya adalah kolom-kolom yang didefinisikan dalam skema. Jalur file binlog di MinIO juga ditunjukkan pada gambar di atas.

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