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

milvus-logo
LFAI

Penggunaan

  • Engineering
February 07, 2022
Lichen Wang

Dengan menampilkan pemrosesan batch-and-stream terpadu dan arsitektur cloud-native, Milvus 2.0 memberikan tantangan yang lebih besar dibandingkan pendahulunya dalam pengembangan fungsi DELETE. Berkat desain pemilahan komputasi penyimpanan yang canggih dan mekanisme publikasi/langganan yang fleksibel, kami dengan bangga mengumumkan bahwa kami berhasil mewujudkannya. Di Milvus 2.0, anda dapat menghapus sebuah entitas di dalam koleksi tertentu dengan kunci utamanya sehingga entitas yang dihapus tidak akan lagi terdaftar di dalam hasil pencarian atau kueri.

Harap dicatat bahwa operasi DELETE di Milvus mengacu pada penghapusan logis, sedangkan pembersihan data secara fisik terjadi selama Pemadatan Data. Penghapusan logis tidak hanya meningkatkan kinerja pencarian yang dibatasi oleh kecepatan I/O, tetapi juga memfasilitasi pemulihan data. Data yang dihapus secara logis masih dapat diambil dengan bantuan fungsi Time Travel.

Penggunaan

Mari kita coba fungsi DELETE di Milvus 2.0 terlebih dahulu. (Contoh berikut ini menggunakan PyMilvus 2.0.0 pada Milvus 2.0.0).

from pymilvus import connections, utility, Collection, DataType, FieldSchema, CollectionSchema
# Connect to Milvus
connections.connect(
    alias="default", 
    host='x.x.x.x', 
    port='19530'
)
# Create a collection with Strong Consistency level
pk_field = FieldSchema(
    name="id", 
    dtype=DataType.INT64, 
    is_primary=True, 
)
vector_field = FieldSchema(
    name="vector", 
    dtype=DataType.FLOAT_VECTOR, 
    dim=2
)
schema = CollectionSchema(
    fields=[pk_field, vector_field], 
    description="Test delete"
)
collection_name = "test_delete"
collection = Collection(
    name=collection_name, 
    schema=schema, 
    using='default', 
    shards_num=2,
    consistency_level="Strong"
)
# Insert randomly generated vectors
import random
data = [
    [i for i in range(100)],
    [[random.random() for _ in range(2)] for _ in range(100)],
]
collection.insert(data)
# Query to make sure the entities to delete exist
collection.load()
expr = "id in [2,4,6,8,10]"
pre_del_res = collection.query(
    expr,
    output_fields = ["id", "vector"]
)
print(pre_del_res)
# Delete the entities with the previous expression
collection.delete(expr)
# Query again to check if the deleted entities exist
post_del_res = collection.query(
    expr,
    output_fields = ["id", "vector"]
)
print(post_del_res)

Implementasi

Dalam sebuah instance Milvus, sebuah simpul data terutama bertanggung jawab untuk mengemas data streaming (log di log broker) sebagai data historis (snapshot log) dan secara otomatis mem-flush mereka ke penyimpanan objek. Sebuah node kueri mengeksekusi permintaan pencarian pada data lengkap, yaitu data streaming dan data historis.

Untuk memaksimalkan kapasitas penulisan data dari node paralel dalam sebuah cluster, Milvus mengadopsi strategi sharding berdasarkan hashing kunci utama untuk mendistribusikan operasi penulisan secara merata ke node pekerja yang berbeda. Dengan kata lain, proxy akan merutekan pesan-pesan Data Manipulation Language (DML) (yaitu permintaan) dari sebuah entitas ke node data dan node kueri yang sama. Pesan-pesan ini dipublikasikan melalui DML-Channel dan dikonsumsi oleh node data dan node kueri secara terpisah untuk menyediakan layanan pencarian dan kueri secara bersamaan.

Simpul data

Setelah menerima pesan INSERT data, simpul data menyisipkan data di segmen yang sedang tumbuh, yang merupakan segmen baru yang dibuat untuk menerima data streaming dalam memori. Jika jumlah baris data atau durasi segmen yang sedang tumbuh mencapai ambang batas, simpul data akan menyegelnya untuk mencegah masuknya data. Simpul data kemudian membuang segmen yang disegel, yang berisi data historis, ke penyimpanan objek. Sementara itu, simpul data menghasilkan filter bloom berdasarkan kunci utama dari data baru, dan membuangnya ke penyimpanan objek bersama dengan segmen yang disegel, menyimpan filter bloom sebagai bagian dari log biner statistik (binlog), yang berisi informasi statistik segmen.

Bloom filter adalah struktur data probabilistik yang terdiri dari vektor biner panjang dan serangkaian fungsi pemetaan acak. Filter ini dapat digunakan untuk menguji apakah sebuah elemen merupakan anggota dari sebuah himpunan, tetapi mungkin menghasilkan kecocokan positif palsu. -Wikipedia

Ketika pesan DELETE data masuk, simpul data menyangga semua filter mekar di pecahan yang sesuai, dan mencocokkannya dengan kunci utama yang disediakan dalam pesan untuk mengambil semua segmen (dari yang tumbuh dan yang disegel) yang mungkin menyertakan entitas yang akan dihapus. Setelah menentukan segmen yang sesuai, simpul data menyangganya di memori untuk menghasilkan binlog Delta untuk merekam operasi penghapusan, dan kemudian membuang binlog tersebut bersama dengan segmen kembali ke penyimpanan objek.

Data Node Simpul Data

Karena satu pecahan hanya ditugaskan dengan satu DML-Channel, node kueri tambahan yang ditambahkan ke klaster tidak akan dapat berlangganan ke DML-Channel. Untuk memastikan bahwa semua node kueri dapat menerima pesan DELETE, node data menyaring pesan DELETE dari DML-Channel, dan meneruskannya ke Delta-Channel untuk memberi tahu semua node kueri tentang operasi penghapusan.

Node kueri

Ketika memuat koleksi dari penyimpanan objek, node kueri pertama-tama mendapatkan titik pemeriksaan setiap pecahan, yang menandai operasi DML sejak operasi flush terakhir. Berdasarkan checkpoint tersebut, simpul kueri memuat semua segmen yang disegel bersama dengan binlog delta dan filter bloom. Dengan semua data dimuat, simpul kueri kemudian berlangganan ke DML-Channel, Delta-Channel, dan Query-Channel.

Jika lebih banyak pesan INSERT data datang setelah koleksi dimuat ke memori, simpul kueri pertama-tama menentukan segmen yang tumbuh sesuai dengan pesan, dan memperbarui filter bloom yang sesuai di memori untuk tujuan kueri saja. Filter bloom yang dikhususkan untuk kueri tersebut tidak akan dibuang ke penyimpanan objek setelah kueri selesai.

Query Node Simpul Kueri

Seperti disebutkan di atas, hanya sejumlah node kueri tertentu yang dapat menerima pesan DELETE dari DML-Channel, yang berarti hanya mereka yang dapat mengeksekusi permintaan DELETE di segmen yang sedang berkembang. Untuk node kueri yang telah berlangganan DML-Channel, mereka pertama-tama menyaring pesan DELETE di segmen yang sedang berkembang, menemukan entitas dengan mencocokkan kunci utama yang disediakan dengan filter bloom khusus kueri di segmen yang sedang berkembang, dan kemudian mencatat operasi penghapusan di segmen yang sesuai.

Node kueri yang tidak dapat berlangganan ke DML-Channel hanya diizinkan untuk memproses permintaan pencarian atau kueri pada segmen yang disegel karena mereka hanya dapat berlangganan ke Delta-Channel, dan menerima pesan-pesan HAPUS yang diteruskan oleh node data. Setelah mengumpulkan semua pesan DELETE di segmen tertutup dari Delta-Channel, node kueri menemukan entitas dengan mencocokkan kunci utama yang disediakan dengan filter mekar dari segmen tertutup, dan kemudian mencatat operasi penghapusan di segmen yang sesuai.

Pada akhirnya, dalam pencarian atau kueri, node kueri menghasilkan bitset berdasarkan catatan yang dihapus untuk menghilangkan entitas yang dihapus, dan mencari di antara entitas yang tersisa dari semua segmen, terlepas dari status segmen. Terakhir, tingkat konsistensi mempengaruhi visibilitas data yang dihapus. Di bawah Tingkat Konsistensi Kuat (seperti yang ditunjukkan pada contoh kode sebelumnya), entitas yang dihapus langsung tidak terlihat setelah dihapus. Sementara Tingkat Konsistensi Terbatas diadopsi, akan ada beberapa detik latensi sebelum entitas yang dihapus menjadi tidak terlihat.

Apa selanjutnya?

Dalam blog seri fitur baru 2.0, kami bertujuan untuk menjelaskan desain dari fitur-fitur baru. Baca lebih lanjut dalam seri blog ini!

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Terus Baca