Penghancuran JSONCompatible with Milvus 2.6.2+

Penghancuran JSON mempercepat kueri JSON dengan mengubah penyimpanan berbasis baris tradisional menjadi penyimpanan kolom yang dioptimalkan. Sambil mempertahankan fleksibilitas JSON untuk pemodelan data, Milvus melakukan pengoptimalan kolom di belakang layar yang secara dramatis meningkatkan akses dan efisiensi kueri.

Penghancuran JSON efektif untuk sebagian besar skenario kueri JSON. Manfaat kinerja menjadi lebih jelas dengan:

  • Dokumen JSON yang lebih besar dan lebih kompleks - Peningkatan kinerja yang lebih besar seiring bertambahnya ukuran dokumen

  • Beban kerja yang berat untuk dibaca - Pemfilteran, penyortiran, atau pencarian yang sering dilakukan pada kunci JSON

  • Pola kueri campuran - Kueri di berbagai kunci JSON yang berbeda mendapatkan manfaat dari pendekatan penyimpanan hibrida

Bagaimana cara kerjanya

Proses penghancuran JSON terjadi dalam tiga fase yang berbeda untuk mengoptimalkan data agar dapat diambil dengan cepat.

Fase 1: Pencernaan & klasifikasi kunci

Ketika dokumen JSON baru ditulis, Milvus secara terus menerus mengambil sampel dan menganalisisnya untuk membangun statistik untuk setiap kunci JSON. Analisis ini mencakup rasio kemunculan kunci dan stabilitas tipe (apakah tipe datanya konsisten di seluruh dokumen).

Berdasarkan statistik ini, kunci JSON dikategorikan ke dalam beberapa kategori berikut ini untuk penyimpanan yang optimal.

Kategori kunci JSON

Jenis Kunci

Deskripsi

Kunci yang diketik

Kunci yang ada di sebagian besar dokumen dan selalu memiliki tipe data yang sama (misalnya, semua bilangan bulat atau semua string).

Kunci dinamis

Kunci yang sering muncul namun memiliki tipe data campuran (misalnya, terkadang berupa string, terkadang berupa bilangan bulat).

Tombol bersama

Kunci yang jarang muncul atau kunci bersarang yang berada di bawah ambang batas frekuensi yang dapat dikonfigurasi.

Contoh klasifikasi

Pertimbangkan contoh data JSON yang berisi kunci JSON berikut ini:

{"a": 10, "b": "str1", "f": 1}
{"a": 20, "b": "str2", "f": 2}  
{"a": 30, "b": "str3", "f": 3}
{"a": 40, "b": 1, "f": 4}       // b becomes mixed type
{"a": 50, "b": 2, "e": "rare"}  // e appears infrequently

Berdasarkan data ini, kunci-kunci tersebut akan diklasifikasikan sebagai berikut:

  • Kunci yang diketik: a dan f (selalu berupa bilangan bulat)

  • Kunci dinamis: b (string campuran/bilangan bulat)

  • Kunci bersama: e (kunci yang jarang muncul)

Tahap 2: Optimalisasi penyimpanan

Klasifikasi dari Fase 1 menentukan tata letak penyimpanan. Milvus menggunakan format kolom yang dioptimalkan untuk kueri.

Json Shredding Flow Alur Penghancuran Json

  • Kolom-kolom yangdiparut: Untuk kunci yang diketik dan dinamis, data ditulis ke kolom khusus. Penyimpanan kolom ini memungkinkan pemindaian yang cepat dan langsung selama kueri, karena Milvus hanya dapat membaca data yang diperlukan untuk kunci yang diberikan tanpa memproses seluruh dokumen.

  • Kolom bersama: Semua kunci bersama disimpan bersama dalam satu kolom JSON biner yang ringkas. Indeks terbalik kunci bersama dibangun di atas kolom ini. Indeks ini sangat penting untuk mempercepat kueri pada kunci-kunci berfrekuensi rendah dengan memungkinkan Milvus memangkas data dengan cepat, yang secara efektif mempersempit ruang pencarian menjadi hanya baris-baris yang berisi kunci yang ditentukan.

Fase 3: Eksekusi kueri

Fase terakhir memanfaatkan tata letak penyimpanan yang dioptimalkan untuk memilih jalur tercepat secara cerdas untuk setiap predikat kueri.

  • Jalur cepat: Kueri dengan kunci yang diketik/dinamis (misalnya, json['a'] < 100) mengakses kolom khusus secara langsung

  • Jalur yangdioptimalkan: Kueri pada kunci bersama (misalnya, json['e'] = 'rare') menggunakan indeks terbalik untuk menemukan dokumen yang relevan dengan cepat

Mengaktifkan penghancuran JSON

Untuk mengaktifkan fitur ini, setel common.enabledJSONShredding ke true di file konfigurasi milvus.yaml Anda. Data baru akan secara otomatis memicu proses penghancuran.

# milvus.yaml
...
common:
  enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...

Setelah diaktifkan, Milvus akan mulai menganalisis dan merestrukturisasi data JSON Anda saat dikonsumsi tanpa intervensi manual lebih lanjut.

Penyetelan parameter

Untuk sebagian besar pengguna, setelah penghancuran JSON diaktifkan, pengaturan default untuk parameter lainnya sudah cukup. Namun, Anda dapat menyempurnakan perilaku penghancuran JSON menggunakan parameter-parameter ini di milvus.yaml.

Nama Parameter

Deskripsi

Nilai Default

Saran Penyetelan

common.enabledJSONShredding

Mengontrol apakah proses pembuatan dan pemuatan penghancuran JSON diaktifkan.

false

Harus disetel ke true untuk mengaktifkan fitur ini.

common.usingjsonShreddingForQuery

Mengontrol apakah Milvus menggunakan data yang diparut untuk akselerasi.

true

Diatur ke false sebagai langkah pemulihan jika kueri gagal, kembali ke jalur kueri asli.

queryNode.mmap.jsonShredding

Menentukan apakah Milvus menggunakan mmap saat memuat data yang diparut.

Untuk detailnya, lihat Gunakan mmap.

true

Pengaturan ini umumnya dioptimalkan untuk kinerja. Hanya sesuaikan jika Anda memiliki kebutuhan atau batasan manajemen memori tertentu pada sistem Anda.

dataCoord.jsonShreddingMaxColumns

Jumlah maksimum kunci JSON yang akan disimpan dalam kolom cacahan.

Jika jumlah kunci yang sering muncul melebihi batas ini, Milvus akan memprioritaskan kunci yang paling sering muncul untuk dihancurkan, dan kunci yang tersisa akan disimpan di kolom bersama.

1024

Ini cukup untuk sebagian besar skenario. Untuk JSON dengan ribuan kunci yang sering muncul, Anda mungkin perlu meningkatkannya, tetapi tetap pantau penggunaan penyimpanan.

dataCoord.jsonShreddingRatioThreshold

Rasio kemunculan minimum yang harus dimiliki oleh kunci JSON harus dipertimbangkan untuk dicacah menjadi kolom cacahan.

Sebuah kunci dianggap sering muncul jika rasionya di atas ambang batas ini.

0.3

Naikkan (misalnya, menjadi 0,5) jika jumlah kunci yang memenuhi kriteria penghancuran melebihi batas dataCoord.jsonShreddingMaxColumns. Hal ini membuat ambang batas menjadi lebih ketat, mengurangi jumlah kunci yang memenuhi syarat untuk penghancuran.

Kurangi (misalnya, menjadi 0,1) jika Anda ingin menghancurkan lebih banyak kunci yang lebih jarang muncul daripada ambang batas default 30%.

Tolok ukur kinerja

Pengujian kami menunjukkan peningkatan performa yang signifikan di berbagai jenis kunci JSON dan pola kueri.

Lingkungan dan metodologi pengujian

  • Perangkat keras: 1 inti / 8GB cluster

  • Dataset: 1 juta dokumen dari JSONBench

  • Ukuran dokumen rata-rata: 478,89 byte

  • Durasi pengujian: 100 detik untuk mengukur QPS dan latensi

Hasil: kunci yang diketik

Pengujian ini mengukur performa saat melakukan kueri terhadap kunci yang ada di sebagian besar dokumen.

Ekspresi Kueri

Jenis Nilai Kunci

QPS (tanpa penghancuran)

QPS (dengan penghancuran)

Peningkatan Kinerja

json['time_us'] > 0

Bilangan bulat

8.69

287.50

33x

json['kind'] == 'commit'

String

8.42

126.1

14.9x

Hasil: kunci bersama

Pengujian ini berfokus pada kueri kunci bersarang yang jarang yang termasuk dalam kategori "bersama".

Ekspresi Kueri

Jenis Nilai Kunci

QPS (tanpa penghancuran)

QPS (dengan penghancuran)

Peningkatan Kinerja

json['identity']['seq'] > 0

Bilangan Bulat Bersarang

4.33

385

88.9x

json['identity']['did'] == 'xxxxx'

String Bersarang

7.6

352

46.3x

Wawasan utama

  • Kueri kunci bersama menunjukkan peningkatan paling dramatis (hingga 89x lebih cepat)

  • Kueri kunci yang diketik memberikan peningkatan kinerja 15-30x yang konsisten

  • Semua jenis kueri mendapatkan manfaat dari JSON Shredding tanpa regresi kinerja

PERTANYAAN UMUM

  • Bagaimana cara memverifikasi apakah penghancuran JSON berfungsi dengan baik?

    1. Pertama, periksa apakah data telah dibuat dengan menggunakan perintah show segment --format table di alat Birdwatcher. Jika berhasil, output akan berisi shredding_data/ dan shared_key_index/ di bawah bidang Json Key Stats.

      Birdwatcher Output Keluaran Birdwatcher

    2. Selanjutnya, verifikasi bahwa data telah dimuat dengan menjalankan show loaded-json-stats pada node kueri. Keluaran akan menampilkan rincian tentang data yang telah dimuat untuk setiap node kueri.

  • Bagaimana jika saya menemukan kesalahan?

    Jika proses build atau pemuatan gagal, Anda dapat dengan cepat menonaktifkan fitur tersebut dengan mengatur common.enabledJSONShredding=false. Untuk menghapus tugas yang tersisa, gunakan perintah remove stats-task <task_id> di Birdwatcher. Jika kueri gagal, atur common.usingjsonShreddingForQuery=false untuk kembali ke jalur kueri asli, melewati data yang diparut.

  • Bagaimana cara memilih antara penghancuran JSON dan pengindeksan JSON?

    • Penghancuran JSON ideal untuk kunci yang sering muncul dalam dokumen Anda, terutama untuk struktur JSON yang kompleks. Proses ini menggabungkan manfaat penyimpanan kolumnar dan pengindeksan terbalik, sehingga sangat cocok untuk skenario pembacaan yang berat di mana Anda melakukan kueri terhadap banyak kunci yang berbeda. Namun, ini tidak disarankan untuk dokumen JSON yang sangat kecil karena peningkatan kinerjanya minimal. Semakin kecil proporsi nilai kunci terhadap ukuran total dokumen JSON, semakin baik pengoptimalan kinerja dari penghancuran.

    • Pengindeksan JSON lebih baik untuk pengoptimalan yang ditargetkan untuk kueri berbasis kunci tertentu dan memiliki overhead penyimpanan yang lebih rendah. Ini cocok untuk struktur JSON yang lebih sederhana. Perhatikan bahwa penghancuran JSON tidak mencakup kueri pada kunci di dalam larik, jadi Anda memerlukan indeks JSON untuk mempercepatnya.

    Untuk detailnya, lihat Ikhtisar Bidang JSON.