• نبذة عن ميلفوس
  • ابدأ الآن
  • المفاهيم
  • دليل المستخدم
  • استيراد البيانات
  • أدوات الذكاء الاصطناعي
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • البرامج التعليمية
  • الأسئلة الشائعة
  • API Reference

فرض الدمج بالقوةCompatible with Milvus 3.0.x

تم تصميم "فرض الدمج" لدمج المقاطع الصغيرة والمجزأة في مقاطع أقل وأكبر لتحسين أداء الاستعلام وكفاءة التخزين. يشرح هذا الدليل كيفية استخدام الدمج القسري للدمج.

هذه الميزة في المعاينة العامة. لا تستخدمها في بيئات الإنتاج.

نظرة عامة

يحافظ الدمج القياسي على أحجام المقاطع بالقرب من maxSize المكوّنة من خلال عمليات الدمج من واحد إلى واحد، ولكن لا يزال بإمكانه ترك أجزاء متوسطة الحجم لا يمكن دمجها أكثر دون تجاوز الحدود. على سبيل المثال، كما هو موضح أدناه، إذا كانت المجموعة تحتوي على خمسة مقاطع بحجم 2 ميغابايت و maxSize 3 ميغابايت، فإن دمج أي مقطعين سيتجاوز الحد، لذلك لا يمكن للضغط القياسي تقليل عدد المقاطع بشكل أكبر ويبقى التخطيط المجزأ.

تضيف فرض الدمج معلمة target_size وتدعم إعادة تنظيم المقاطع نحو الحجم المطلوب في حدود تفاوت ضيق عندما يكون ذلك ممكنًا. كما هو موضح أدناه، إذا كان الحجم المحدد target_size هو 4 ميغابايت، يمكن دمج المقاطع الخمسة الصغيرة بحجم 2 ميغابايت في عدد أقل من المقاطع الأكبر. يقلل هذا من عدد المقاطع الزائد، ويدعم أهدافًا أكبر من الإعدادات الافتراضية maxSize ، وعندما يكون الهدف كبيرًا جدًا، يتيح للنظام اختيار حجم الإخراج العملي وعدد المقاطع للأجهزة الحالية وطوبولوجيا QueryNode.

لفهم طريقة الضغط التي يجب استخدامها، راجع الأسئلة الشائعة.

R8eow3kaqhktokblcmocnvxmnee R8eow3kaqqhkktokblockcmocnvxmnee

يعمل فرض ضغط الدمج على توسيع واجهة برمجة التطبيقات الحالية Compaction الحالي باستخدام معلمة target_size. وهو متوافق تمامًا مع الإصدارات السابقة: تستمر مكالمات الدمج الحالية بدون target_size في العمل كما كانت من قبل.

يعمل فرض الدمج بشكل غير متزامن. لا يمنع عمليات البحث أو الاستعلام، على الرغم من أنه يستهلك موارد الإدخال/الإخراج وموارد الذاكرة أثناء التنفيذ.

استخدام فرض الدمج الإجباري

المتطلبات الأساسية

  • الإصدار 3.0 من ميلفوس أو أحدث

  • PyMilvus 3.0 أو أحدث

التكوين العام

تتحكم معلمات التكوين التالية في سلوك فرض الدمج. قم بتعيينها في ملف تكوين Milvus أو عبر متغيرات البيئة.

dataCoord:
  segment:
    maxSize: 512         # Default segment max size (MB).
                         # Used when target_size is 0 or omitted.
  compaction:
    maxFullSegmentThreshold: 100
                         # When segment count exceeds this threshold,
                         # a faster greedy algorithm is used instead
                         # of the standard merge algorithm.
    forceMerge:
      datanodeMemoryFactor: 4.0
                         # DataNode memory divided by this factor
                         # determines the the largest segment
                         # size the system can allow.
      querynodeMemoryFactor: 4.0
                         # Minimum QueryNode memory divided by this
                         # factor. Used in automatic size calculation
                         # to ensure merged segments can be loaded.

المعلمة

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

الوصف

dataCoord.segment.maxSize

512

الحد الأقصى الافتراضي لحجم المقطع الافتراضي بالميجابايت. يُستخدم كهدف عندما يكون target_size هو 0 أو تم حذفه. يُستخدم أيضًا كحد أدنى للقيمة المسموح بها للقيمة الصريحة target_size.

dataCoord.compaction.maxFullSegmentThreshold

100

عتبة عدد المقاطع لاختيار الخوارزمية. عندما يتجاوز عدد المقاطع هذه القيمة، يستخدم Milvus خوارزمية جشعة أسرع لتخطيط الدمج.

  • خوارزميةقياسية (تُستخدم عندما يكون عدد المقاطع <= dataCoord.compaction.maxFullSegmentThreshold): تنتج نتائج دمج أكثر مثالية ولكنها تستغرق وقتًا أطول في الحساب.

  • الخوارزمية الجشعة (تُستخدم عندما يكون عدد المقاطع > dataCoord.compaction.maxFullSegmentThreshold): تكمل التخطيط بشكل أسرع بكثير على حساب تجميع أقل قليلاً من تجميع المقاطع الأمثل.

dataCoord.compaction.forceMerge.datanodeMemoryFactor

4.0

يتم تقسيم ذاكرة DataNode على هذا العامل لحساب أكبر حجم مقطع يمكن أن يسمح به النظام.

  • تخصص القيمة الأكبر ذاكرة أقل للدمج ولكنها تترك المزيد لعمليات DataNode الأخرى، مما يحسن استقرار العقدة.

  • القيمة الأصغر تسمح بعمليات دمج أكبر ولكنها تزيد من ضغط الذاكرة.

  • على سبيل المثال، باستخدام العامل الافتراضي 4.0 وعقدة بيانات ذات ذاكرة 16 جيجابايت، تكون ميزانية الدمج 4 جيجابايت. وهذا يعني أن الحجم الإجمالي للمقاطع التي يتم دمجها في عملية واحدة لا يمكن أن يتجاوز 4 جيجابايت.

dataCoord.compaction.forceMerge.querynodeMemoryFactor

4.0

يتم تقسيم الحد الأدنى لذاكرة QueryNode على هذا العامل. يُستخدم أثناء حساب الحجم التلقائي (target_size=max_int64) لضمان إمكانية تحميل المقاطع المدمجة بواسطة QueryNodes.

  • تنتج القيمة الأكبر مقاطع أصغر يسهل تحميلها بواسطة QueryNodes.

  • أما القيمة الأصغر فتسمح بمقاطع أكبر ولكنها قد تتسبب في فشل التحميل على عقد الاستعلام المقيدة بالذاكرة.

  • على سبيل المثال، مع وجود العامل الافتراضي 4.0 وأصغر عقدة استعلام تحتوي على ذاكرة 16 جيجابايت، لن يتجاوز حجم الهدف المحسوب تلقائيًا 4 جيجابايت. يمنع هذا الأمر فرض الدمج من إنتاج مقاطع كبيرة جدًا بحيث لا تستطيع عقد الاستعلام تحميلها.

لتطبيق التغييرات المذكورة أعلاه على مجموعة Milvus الخاصة بك، يُرجى اتباع الخطوات الواردة في تكوين Milvus مع Helm وتكوين Milvus مع مشغلي Milvus.

تشغيل ضغط الدمج القسري

يمكنك تشغيل فرض الدمج بالقوة عن طريق استدعاء compact() باستخدام المعلمة target_size. للحصول على تفاصيل المعلمة، انظر مرجع المعلمة أدناه.

تتوفر ثلاثة أوضاع لضغط الدمج القسري:

compact("my_collection", target_size=?)
│
├─ Mode 1: target_size = 0 (or omitted)
│  Uses config maxSize (default 512 MB)
│  Equivalent to standard compaction
│
├─ Mode 2: target_size = 2048
│  Merges segments to ~2 GB each
│  Must be >= config maxSize
│
└─ Mode 3: target_size = max_int64
   Auto-calculates optimal size based on
   segment distribution and node memory

فيما يلي أمثلة لتوضيح كيفية استخدام كل وضع من أوضاع ضغط الدمج القسري.

افتراضي (ضغط قياسي)

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

# Standard compaction — uses config maxSize (default 512 MB)
job_id = client.compact("target_collection")

الحجم المستهدف الصريح

# Merge segments to approximately 2 GB each
job_id = client.compact(
    "target_collection",
    target_size="2048"  # The unit is MB
)

حساب الحجم التلقائي

# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
    "target_collection",
    target_size=max_int64
)

مرجع المعلمة

يشرح الجدول التالي المعلمات.

المعلمة

النوع

الوصف

collection_name

شريحة

مطلوب. اسم المجموعة المراد ضغطها.

target_size

int

اختياري. حجم المقطع المستهدف بالميجابايت. هناك 3 خيارات لقيمة المعلمة:

  • 0 أو محذوف: يستخدم dataCoord.segment.maxSize الذي تم تكوينه (افتراضي: 512 ميغابايت). مكافئ للضغط القياسي.

  • القيمة الصريحة: يدمج المقاطع بالحجم المحدد تقريبًا بالميجابايت (على سبيل المثال: 2048). يجب أن يكون أكبر من أو يساوي dataCoord.segment.maxSize.

  • max_int64 ((1 <<63) - 1): يحسب الحجم الأمثل تلقائيًا استنادًا إلى توزيع المقطع الحالي وموارد العقدة المتاحة.

إذا كان target_size المحدد أقل من المكوّن dataCoord.segment.maxSize ، يتم رفض الطلب مع ظهور خطأ.

التحقق من تقدم الدمج

يعمل ضغط الدمج القسري بشكل غير متزامن. استخدم معرف المهمة التي تم إرجاعها للتحقق من التقدم:

# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")

أفضل الممارسات

  • لا تستخدم ضغط الدمج القسري في بيئات الإنتاج.

  • استخدم وضع حساب الحجم التلقائي لمعظم الحالات. يتيح الإعداد target_size إلى max_int64 لـ Milvus تحليل توزيع المقطع وموارد العقدة لتحديد أفضل حجم. هذا هو النهج الموصى به ما لم يكن لديك متطلبات تحجيم محددة.

  • ضع في اعتبارك مفاضلة الأداء. يعد ضغط الدمج القسري عملية كثيفة الاستخدام للموارد. فهي تقوم بقراءة بيانات المقطع ودمجها وإعادة كتابتها. قم بجدولتها خلال فترات انخفاض حركة المرور لتقليل التأثير على زمن انتقال الاستعلام.

  • راقب عدد المقاطع قبل وبعد. استخدم get_compaction_state() و list_persistent_segments للتحقق من أن عملية الدمج أنتجت مقاطع أقل وأكبر كما هو متوقع.

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

كيف تختلف عملية الدمج القسري عن الضغط القياسي؟

يخدم هذان النوعان من عمليات الضغط أغراضًا مختلفة.

  • الدمج القياسي (targetSize=0 أو محذوف) هو مسار تنظيف تدريجي بأفضل جهد ممكن.

  • أما الدمج القسري (targetSize>0) فهو مسار إعادة تجميع على مستوى المجموعة لإنتاج مقاطع أقل وأكبر وقريبة من الهدف.

يتمثل الاختلاف الرئيسي في شكل الدمج: الدمج القياسي هو فعليًا م → 1 لكل مهمة، بينما الدمج القسري هو م → ن عبر المدخلات المجمعة. هذا هو السبب في أن دمج القوة يمكن أن يحل تخطيطات المقاطع التي لا يستطيع الدمج القياسي حلها. يقارن الجدول التالي بين نوعي العمليات.

البُعد

الدمج القياسي (افتراضي)

فرض الدمج

مشغل واجهة برمجة التطبيقات

TargetSize=0 (أو لم يتم تعيينه)، لا توجد علامة Major/L0

حجم الهدف>0 (ميغابايت)

الهدف الأساسي

التنظيف التدريجي للأجزاء الواضحة؛ الصيانة الروتينية

الدمج على مستوى المجموعة للبحث والتوازن

مصدر حجم المقطع

البيانات الثابتة dataCoord.segment.maxSize (تكوين الخادم)

الحجم المستهدف للمستخدم، ثم مثبت بأمان بواسطة maxSafeSafeSize

صلاحية المعلمة

لا يوجد ضبط لحجم المستخدم

يجب أن يكون حجم المستخدم المستهدف >= dataCoord.segment.maxSize؛ وإلا تم رفضه

الحد الأعلى للأمان

سقف التكوين فقط

maxSafeSafeSize = الحد الأدنى (ميم عقدة الاستعلام، ميم عقدة البيانات) / عامل_الذاكرة (مستقل غير مجمّع: مزيد من النصف)

دمج الشكل

م → 1 لكل مهمة، الإخراج <= configMaxSize

م → ن، مخرجات قريبة من حجم الهدف

سلوك المقطع المتوسط

يمكن أن تتعطل بشكل دائم (على سبيل المثال، لا يمكن أن يصبح مقطعان بنسبة 60% قانونيًا مقطعًا واحدًا بنسبة 120%)

إعادة التجميع + التقسيم يعمل؛ لا يوجد نمط "عالق عند 60%"

قدرة تسطيح المجموعة

محدودة؛ قد تظل عمليات التشغيل المتكررة تترك العديد من المقاطع المتوسطة

قوي؛ مصمم لتقليل عدد المقاطع ودفع الامتلاء إلى أعلى

وعي الطوبولوجيا

لا يوجد

نعم؛ يستخدم تخطيط QueryNode/نسخة طبق الأصل/التخطيط الشارد

ضبط توازي مسار القراءة

لا يوجد

يضبط عدد المخرجات باستخدام queryNodeCount / (النسخ المتماثلة × الأجزاء) عندما يكون صالحًا

حالة الاستخدام النموذجية

التنظيف اليومي عالي الوتيرة بعد عمليات الكتابة/الحذف

الإعداد المعياري، وتحسين البحث، ومواءمة توازي التحميل

توقع النطاق

لا تتوقع إعادة حزم المجموعة الكاملة

مخصص لنتائج إعادة الحزمة على مستوى المجموعة

إرشادات الاختيار:

  • اختر الدمج القياسي للتنظيف التدريجي منخفض المخاطر.

  • اختر الدمج القسري عندما تريد صراحةً إعادة تشكيل المجموعة إلى شرائح أقل وأكبر تتماشى مع سلوك البحث والتحميل.

كيف يختلف فرض الدمج عن ضغط التجميع؟

يعملضغط التجميع (is_clustering=True) على إعادة تنظيم البيانات داخل المقاطع استنادًا إلى مفتاح تجميع لتحسين تقليم البحث. يعمل الدمج القسري (target_size=N) على تحسين أحجام المقاطع دون تغيير توزيع البيانات. يخدمان أغراضًا مختلفة ويمكن استخدامهما معًا - قم بتشغيل ضغط التجميع أولاً لتنظيم البيانات، ثم فرض الدمج لدمج المقاطع الناتجة.

هل يمكنني تشغيل فرض الدمج على مجموعة يتم الاستعلام عنها؟

نعم. يعمل فرض الدمج بشكل غير متزامن ولا يحظر الاستعلامات. ومع ذلك، فإنه يستهلك موارد DataNode وموارد الإدخال/الإخراج على القرص، لذلك قد يزيد زمن انتقال الاستعلام أثناء الدمج. قم بجدولة فرض الدمج خلال فترات انخفاض حركة المرور للحصول على أفضل النتائج.

ماذا يحدث إذا قمت بتعيين حجم_هدف أصغر من الحد الأقصى للحجم؟

يتم رفض الطلب مع ظهور خطأ. يجب أن يكون الحجم المستهدف أكبر من أو يساوي الحجم الذي تم تكوينه dataCoord.segment.maxSize.

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟