تمزيق JSONCompatible with Milvus 2.6.2+

يعمل تمزيق JSON على تسريع استعلامات JSON من خلال تحويل التخزين التقليدي القائم على الصفوف إلى تخزين عمودي محسّن. مع الحفاظ على مرونة JSON لنمذجة البيانات، يقوم Milvus بتحسين الأعمدة من وراء الكواليس مما يحسن بشكل كبير من كفاءة الوصول والاستعلام.

يعتبر تمزيق JSON فعالاً لمعظم سيناريوهات استعلام JSON. تصبح فوائد الأداء أكثر وضوحًا مع:

  • مستندات JSON الأكبر حجماً والأكثر تعقيداً - مكاسب أكبر في الأداء مع زيادة حجم المستند

  • أعباء عمل القراءة الثقيلة - التصفية المتكررة أو الفرز أو البحث على مفاتيح JSON

  • أنماط الاستعلامات المختلطة - تستفيد الاستعلامات عبر مفاتيح JSON المختلفة من نهج التخزين المختلط

كيف يعمل

تتم عملية تمزيق JSON على ثلاث مراحل متميزة لتحسين البيانات لاسترجاعها بسرعة.

المرحلة 1: الاستيعاب وتصنيف المفاتيح

عندما تتم كتابة مستندات JSON جديدة، تقوم Milvus باستمرار بأخذ عينات منها وتحليلها لبناء إحصائيات لكل مفتاح JSON. يتضمن هذا التحليل نسبة تكرار المفتاح واستقرار النوع (ما إذا كان نوع بياناته متناسقًا عبر المستندات).

استنادًا إلى هذه الإحصائيات، يتم تصنيف مفاتيح JSON إلى ما يلي للتخزين الأمثل.

فئات مفاتيح JSON

نوع المفتاح

الوصف

المفاتيح المكتوبة

مفاتيح موجودة في معظم المستندات ولها دائمًا نفس نوع البيانات (على سبيل المثال، جميع الأعداد الصحيحة أو جميع السلاسل).

مفاتيح ديناميكية

المفاتيح التي تظهر بشكل متكرر ولكن لها نوع بيانات مختلط (على سبيل المثال، أحيانًا سلسلة وأحيانًا عدد صحيح).

المفاتيح المشتركة

مفاتيح تظهر بشكل غير متكرر أو مفاتيح متداخلة تقل عن عتبة تكرار قابلة للتكوين.

مثال على التصنيف

انظر إلى نموذج بيانات JSON الذي يحتوي على مفاتيح JSON التالية:

{"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

بناءً على هذه البيانات، سيتم تصنيف المفاتيح على النحو التالي:

  • المفاتيح المكتوبة: a و f (دائماً عدد صحيح)

  • المفاتيح الديناميكية: b (سلسلة مختلطة/عدد صحيح)

  • المفاتيحالمشتركة: e (مفتاح نادر الظهور)

المرحلة 2: تحسين التخزين

يحدد التصنيف من المرحلة 1 تخطيط التخزين. يستخدم Milvus تنسيقًا عموديًا محسّنًا للاستعلامات.

Json Shredding Flow تدفق تمزيق Json

  • الأعمدة المقطعة: بالنسبة للمفاتيح المكتوبة والديناميكية، تتم كتابة البيانات إلى أعمدة مخصصة. يسمح هذا التخزين العمودي بإجراء عمليات مسح سريعة ومباشرة أثناء الاستعلامات، حيث يمكن لـ Milvus قراءة البيانات المطلوبة لمفتاح معين فقط دون معالجة المستند بأكمله.

  • العمود المشترك: يتم تخزين جميع المفاتيح المشتركة معًا في عمود JSON ثنائي واحد مضغوط. يتم بناء فهرس مقلوب للمفتاح المشترك على هذا العمود. هذا الفهرس مهم لتسريع الاستعلامات على المفاتيح منخفضة التردد من خلال السماح لـ Milvus بتهذيب البيانات بسرعة، مما يؤدي إلى تضييق مساحة البحث بشكل فعال إلى تلك الصفوف التي تحتوي على المفتاح المحدد فقط.

المرحلة 3: تنفيذ الاستعلام

تستفيد المرحلة الأخيرة من تخطيط التخزين المحسّن لتحديد أسرع مسار بذكاء لكل مسند استعلام.

  • المسار السريع: تصل الاستعلامات على المفاتيح المكتوبة/الديناميكية (على سبيل المثال، json['a'] < 100) إلى الأعمدة المخصصة مباشرةً

  • المسار الأمثل: الاستعلامات على المفاتيح المشتركة (على سبيل المثال، json['e'] = 'rare') تستخدم الفهرس المقلوب لتحديد موقع المستندات ذات الصلة بسرعة

تمكين تمزيق JSON

لتفعيل الميزة، قم بتعيين common.enabledJSONShredding إلى true في ملف التكوين milvus.yaml الخاص بك. ستؤدي البيانات الجديدة تلقائيًا إلى تشغيل عملية التمزيق.

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

بمجرد التمكين، سيبدأ ميلفوس في تحليل بيانات JSON وإعادة هيكلتها عند الاستيعاب دون أي تدخل يدوي آخر.

ضبط المعلمة

بالنسبة لمعظم المستخدمين، بمجرد تمكين تمزيق JSON، تكون الإعدادات الافتراضية للمعلمات الأخرى كافية. ومع ذلك، يمكنك ضبط سلوك تمزيق JSON باستخدام هذه المعلمات في milvus.yaml.

اسم المعلمة

الوصف

القيمة الافتراضية

نصيحة الضبط

common.enabledJSONShredding

يتحكم فيما إذا كانت عمليات بناء وتحميل تمزيق JSON ممكّنة أم لا.

خطأ

يجب تعيينها إلى صواب لتفعيل الميزة.

common.usingjsonShreddingForQuery

يتحكم فيما إذا كان Milvus يستخدم البيانات الممزقة للتسريع.

صواب

يتم تعيينه إلى خطأ كإجراء استرداد في حالة فشل الاستعلامات، والعودة إلى مسار الاستعلام الأصلي.

queryNode.mmap.jsonShredding

يحدد ما إذا كان Milvus يستخدم mmap عند تحميل بيانات التقطيع.

لمزيد من التفاصيل، راجع استخدام mmap.

صحيح

يتم تحسين هذا الإعداد بشكل عام للأداء. اضبطه فقط إذا كانت لديك احتياجات أو قيود محددة لإدارة الذاكرة على نظامك.

dataCoord.jsonShreddingMaxColumns

الحد الأقصى لعدد مفاتيح JSON التي سيتم تخزينها في الأعمدة المقطوعة.

إذا تجاوز عدد المفاتيح التي تظهر بشكل متكرر هذا الحد، فسيقوم Milvus بإعطاء الأولوية للمفاتيح الأكثر تكراراً للتقطيع، وسيتم تخزين المفاتيح المتبقية في العمود المشترك.

1024

هذا يكفي لمعظم السيناريوهات. بالنسبة ل JSON التي تحتوي على آلاف المفاتيح التي تظهر بشكل متكرر، قد تحتاج إلى زيادة هذا الحد، ولكن راقب استخدام التخزين.

dataCoord.jsonShreddingRatioThreshold

يجب أن يكون الحد الأدنى لنسبة التكرار لمفتاح JSON لكي يتم اعتباره للتقطيع في عمود ممزق.

يعتبر المفتاح متكرر الظهور إذا كانت نسبته أعلى من هذا الحد.

0.3

زيادة (على سبيل المثال، إلى 0.5) إذا تجاوز عدد المفاتيح التي تستوفي معايير التقطيع الحد dataCoord.jsonShreddingMaxColumns. هذا يجعل العتبة أكثر صرامة، مما يقلل من عدد المفاتيح المؤهلة للتمزيق.

قلل (على سبيل المثال، إلى 0.1) إذا كنت ترغب في تمزيق المزيد من المفاتيح التي تظهر بشكل أقل من الحد الافتراضي البالغ 30%.

معايير الأداء

يُظهر اختبارنا تحسينات كبيرة في الأداء عبر أنواع مفاتيح JSON وأنماط استعلام مختلفة.

بيئة الاختبار والمنهجية

  • الأجهزة: 1 نواة/مجموعة عنقودية بسعة 8 جيجابايت

  • مجموعة البيانات: 1 مليون مستند من JSONBench

  • متوسط حجم المستند: 478.89 بايت

  • مدة الاختبار: 100 ثانية لقياس سرعة الاستجابة في الثانية ووقت الاستجابة

النتائج: المفاتيح المكتوبة

يقيس هذا الاختبار الأداء عند الاستعلام عن مفتاح موجود في معظم المستندات.

تعبير الاستعلام

نوع قيمة المفتاح

QPS (بدون تمزيق)

QPS (مع التقطيع)

تعزيز الأداء

json['time_us'] > 0

عدد صحيح

8.69

287.50

33x

json['kind'] == 'commit'

سلسلة

8.42

126.1

14.9x

النتائج: المفاتيح المشتركة

ركز هذا الاختبار على الاستعلام عن المفاتيح المتفرقة والمتداخلة التي تندرج ضمن فئة "المشتركة".

تعبير الاستعلام

نوع قيمة المفتاح

QPS (بدون تمزيق)

QPS (مع التقطيع)

تعزيز الأداء

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

الأعداد الصحيحة المتداخلة

4.33

385

88.9x

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

سلسلة متداخلة

7.6

352

46.3x

الرؤى الرئيسية

  • تُظهر استعلاماتالمفاتيح المشتركة التحسينات الأكثر دراماتيكية (أسرع بما يصل إلى 89 ضعفًا)

  • توفر استعلاماتالمفاتيح المكتوبة مكاسب ثابتة في الأداء تتراوح بين 15 و30 ضعفًا

  • تستفيدجميع أنواع الاستعلامات من تقطيع JSON Shredding دون أي تراجع في الأداء

الأسئلة الشائعة

  • كيف أتحقق مما إذا كان تمزيق JSON يعمل بشكل صحيح؟

    1. أولاً، تحقق مما إذا كانت البيانات قد تم إنشاؤها باستخدام الأمر show segment --format table في أداة Birdwatcher. إذا نجحت، سيحتوي الإخراج على shredding_data/ و shared_key_index/ تحت حقل إحصائيات مفاتيح Json.

      Birdwatcher Output مخرجات أداة مراقبة الطيور

    2. بعد ذلك، تحقق من تحميل البيانات عن طريق تشغيل show loaded-json-stats على عقدة الاستعلام. سيعرض الإخراج تفاصيل حول البيانات المقطوعة المحملة لكل عقدة استعلام.

  • ماذا لو واجهت خطأ؟

    في حالة فشل عملية الإنشاء أو التحميل، يمكنك تعطيل الميزة بسرعة عن طريق الإعداد common.enabledJSONShredding=false. لمسح أي مهام متبقية، استخدم الأمر remove stats-task <task_id> في Birdwatcher. في حالة فشل الاستعلام، قم بتعيين common.usingjsonShreddingForQuery=false للعودة إلى مسار الاستعلام الأصلي، متجاوزاً البيانات الممزقة.

  • كيف يمكنني الاختيار بين تمزيق JSON وفهرسة JSON؟

    • يُعتبرتمزيق J SON مثاليًا للمفاتيح التي تظهر بشكل متكرر في مستنداتك، خاصةً بالنسبة لهياكل JSON المعقدة. فهو يجمع بين مزايا التخزين العمودي والفهرسة المقلوبة، مما يجعله مناسبًا تمامًا لسيناريوهات القراءة الثقيلة حيث تستعلم عن العديد من المفاتيح المختلفة. ومع ذلك، لا يوصى باستخدامه مع مستندات JSON الصغيرة جدًا لأن مكسب الأداء يكون ضئيلًا. كلما قلت نسبة قيمة المفتاح إلى الحجم الكلي لمستند JSON، كلما كان تحسين الأداء من التقطيع أفضل.

    • تُعدفهرسة JSON أفضل للتحسين المستهدف للاستعلامات المستندة إلى مفاتيح محددة ولها نفقات تخزين أقل. إنه مناسب لهياكل JSON الأبسط. لاحظ أن تمزيق JSON لا يغطي الاستعلامات على المفاتيح داخل المصفوفات، لذا فأنت بحاجة إلى فهرس JSON لتسريع تلك الاستعلامات.

    للحصول على التفاصيل، ارجع إلى نظرة عامة على حقل JSON.