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

milvus-logo
LFAI
Beranda
  • Konsep

Tingkat Konsistensi

Sebagai basis data vektor terdistribusi, Milvus menawarkan beberapa tingkat konsistensi untuk memastikan bahwa setiap node atau replika dapat mengakses data yang sama selama operasi baca dan tulis. Saat ini, tingkat konsistensi yang didukung meliputi Strong, Bounded, Eventually, dan Session, dengan Bounded sebagai tingkat konsistensi default yang digunakan.

Gambaran Umum

Milvus adalah sebuah sistem yang memisahkan penyimpanan dan komputasi. Dalam sistem ini, DataNodes bertanggung jawab atas persistensi data dan pada akhirnya menyimpannya dalam penyimpanan objek terdistribusi seperti MinIO/S3. QueryNodes menangani tugas-tugas komputasi seperti Pencarian. Tugas-tugas ini melibatkan pemrosesan data batch dan data streaming. Sederhananya, data batch dapat dipahami sebagai data yang telah disimpan dalam penyimpanan objek sementara data streaming mengacu pada data yang belum disimpan dalam penyimpanan objek. Karena latensi jaringan, QueryNode sering kali tidak menyimpan data streaming terbaru. Tanpa perlindungan tambahan, melakukan Pencarian secara langsung pada data streaming dapat mengakibatkan hilangnya banyak titik data yang tidak tersimpan, sehingga mempengaruhi akurasi hasil pencarian.

Milvus adalah sebuah sistem yang memisahkan penyimpanan dan komputasi. Dalam sistem ini, DataNodes bertanggung jawab atas persistensi data dan pada akhirnya menyimpannya dalam penyimpanan objek terdistribusi seperti MinIO/S3. QueryNodes menangani tugas-tugas komputasi seperti Pencarian. Tugas-tugas ini melibatkan pemrosesan data batch dan data streaming. Secara sederhana, data batch dapat dipahami sebagai data yang telah disimpan dalam penyimpanan objek, sedangkan data streaming mengacu pada data yang belum disimpan dalam penyimpanan objek. Karena latensi jaringan, QueryNode sering kali tidak menyimpan data streaming terbaru. Tanpa perlindungan tambahan, melakukan Pencarian secara langsung pada data streaming dapat mengakibatkan hilangnya banyak titik data yang belum tersimpan, sehingga memengaruhi keakuratan hasil pencarian.

Batch data and streaming data Data batch dan data streaming

Seperti yang ditunjukkan pada gambar di atas, QueryNode dapat menerima data streaming dan data batch secara bersamaan setelah menerima permintaan Pencarian. Namun, karena latensi jaringan, data streaming yang diperoleh QueryNodes mungkin tidak lengkap.

Untuk mengatasi masalah ini, Milvus memberi stempel waktu pada setiap catatan dalam antrean data dan secara terus menerus memasukkan stempel waktu sinkronisasi ke dalam antrean data. Setiap kali cap waktu sinkronisasi (syncTs) diterima, QueryNodes menetapkannya sebagai ServiceTime, yang berarti bahwa QueryNodes dapat melihat semua data sebelum Service Time tersebut. Berdasarkan ServiceTime, Milvus dapat memberikan stempel waktu jaminan (GuaranteeTs) untuk memenuhi kebutuhan pengguna yang berbeda untuk konsistensi dan ketersediaan. Pengguna dapat memberi tahu QueryNodes tentang kebutuhan untuk memasukkan data sebelum titik waktu tertentu dalam cakupan pencarian dengan menentukan GuaranteeTs dalam permintaan Pencarian mereka.

ServiceTime and GuaranteeTs ServiceTime dan GuaranteeTs

Seperti yang ditunjukkan pada gambar di atas, jika GuaranteeTs kurang dari ServiceTime, itu berarti bahwa semua data sebelum titik waktu yang ditentukan telah sepenuhnya ditulis ke disk, yang memungkinkan QueryNodes untuk segera melakukan operasi Pencarian. Ketika GuaranteeTs lebih besar dari ServiceTime, QueryNodes harus menunggu sampai ServiceTime melebihi GuaranteeTs sebelum dapat menjalankan operasi Pencarian.

Pengguna harus membuat trade-off antara akurasi kueri dan latensi kueri. Jika pengguna memiliki persyaratan konsistensi yang tinggi dan tidak sensitif terhadap latensi kueri, mereka dapat mengatur GuaranteeTs ke nilai sebesar mungkin; jika pengguna ingin menerima hasil pencarian dengan cepat dan lebih toleran terhadap akurasi kueri, maka GuaranteeTs dapat diatur ke nilai yang lebih kecil.

Consistency Levels Illustrated Ilustrasi Tingkat Konsistensi

Milvus menyediakan empat jenis tingkat konsistensi dengan nilai GuaranteeT yang berbeda.

  • Kuat

    Cap waktu terbaru digunakan sebagai GuaranteeTs, dan QueryNode harus menunggu hingga ServiceTime memenuhi GuaranteeTs sebelum mengeksekusi permintaan Pencarian.

  • Akhirnya

    GuaranteeTs disetel ke nilai yang sangat kecil, seperti 1, untuk menghindari pemeriksaan konsistensi sehingga QueryNode dapat segera mengeksekusi permintaan Pencarian pada semua data batch.

  • Keusangan Terbatas

    JaminanTs diatur ke titik waktu yang lebih awal dari stempel waktu terbaru untuk membuat QueryNode melakukan pencarian dengan toleransi kehilangan data tertentu.

  • Sesi

    Titik waktu terakhir di mana klien memasukkan data digunakan sebagai JaminanTs sehingga QueryNodes dapat melakukan pencarian pada semua data yang dimasukkan oleh klien.

Milvus menggunakan Bounded Staleness sebagai tingkat konsistensi default. Jika GuaranteeTs tidak ditentukan, maka ServiceTime terakhir digunakan sebagai GuaranteeTs.

Mengatur Tingkat Konsistensi

Anda dapat mengatur tingkat konsistensi yang berbeda saat membuat koleksi serta melakukan pencarian dan kueri.

Mengatur Tingkat Konsistensi saat Membuat Koleksi

Saat membuat koleksi, Anda dapat mengatur tingkat konsistensi untuk pencarian dan kueri di dalam koleksi. Contoh kode berikut ini menetapkan tingkat konsistensi ke Strong.

client.create_collection(
    collection_name="my_collection",
    schema=schema,
    # highlight-next
    consistency_level="Strong",
)

CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
        .collectionName("my_collection")
        .collectionSchema(schema)
        // highlight-next
        .consistencyLevel(ConsistencyLevel.STRONG)
        .build();
client.createCollection(createCollectionReq);

export schema='{
        "autoId": true,
        "enabledDynamicField": false,
        "fields": [
            {
                "fieldName": "my_id",
                "dataType": "Int64",
                "isPrimary": true
            },
            {
                "fieldName": "my_vector",
                "dataType": "FloatVector",
                "elementTypeParams": {
                    "dim": "5"
                }
            },
            {
                "fieldName": "my_varchar",
                "dataType": "VarChar",
                "isClusteringKey": true,
                "elementTypeParams": {
                    "max_length": 512
                }
            }
        ]
    }'

export params='{
    "consistencyLevel": "Strong"
}'

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
    \"collectionName\": \"my_collection\",
    \"schema\": $schema,
    \"params\": $params
}"

Nilai yang mungkin untuk parameter consistency_level adalah Strong, Bounded, Eventually, dan Session.

Anda selalu dapat mengubah tingkat konsistensi untuk pencarian tertentu. Contoh kode berikut ini menetapkan tingkat konsistensi kembali ke Bounded. Perubahan ini hanya berlaku untuk permintaan pencarian saat ini.

res = client.search(
    collection_name="my_collection",
    data=[query_vector],
    limit=3,
    search_params={"metric_type": "IP"},
    # highlight-start
    consistency_level="Bounded",
    # highlight-next
)

SearchReq searchReq = SearchReq.builder()
        .collectionName("my_collection")
        .data(Collections.singletonList(queryVector))
        .topK(3)
        .searchParams(params)
        .consistencyLevel(ConsistencyLevel.BOUNDED)
        .build();

SearchResp searchResp = client.search(searchReq);

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection",
    "data": [
        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
    ],
    "limit": 3,
    "consistencyLevel": "Bounded"
}'

Parameter ini juga tersedia di pencarian hibrida dan iterator pencarian. Nilai yang memungkinkan untuk parameter consistency_level adalah Strong, Bounded, Eventually, dan Session.

Mengatur Tingkat Konsistensi dalam Kueri

Anda selalu dapat mengubah tingkat konsistensi untuk pencarian tertentu. Contoh kode berikut ini menetapkan tingkat konsistensi ke Akhirnya. Pengaturan ini hanya berlaku untuk permintaan kueri saat ini.

res = client.query(
    collection_name="my_collection",
    filter="color like \"red%\"",
    output_fields=["vector", "color"],
    limit=3,
    # highlight-start
    consistency_level="Eventually",
    # highlight-next
)

QueryReq queryReq = QueryReq.builder()
        .collectionName("my_collection")
        .filter("color like \"red%\"")
        .outputFields(Arrays.asList("vector", "color"))
        .limit(3)
        .consistencyLevel(ConsistencyLevel.EVENTUALLY)
        .build();
        
 QueryResp getResp = client.query(queryReq);

Parameter ini juga tersedia di pengulang kueri. Nilai yang mungkin untuk parameter consistency_level adalah Strong, Bounded, Eventually, dan Session.

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?