فرض الدمج بالقوةCompatible with Milvus 3.0.x
تم تصميم "فرض الدمج" لدمج المقاطع الصغيرة والمجزأة في مقاطع أقل وأكبر لتحسين أداء الاستعلام وكفاءة التخزين. يشرح هذا الدليل كيفية استخدام الدمج القسري للدمج.
هذه الميزة في المعاينة العامة. لا تستخدمها في بيئات الإنتاج.
نظرة عامة
يحافظ الدمج القياسي على أحجام المقاطع بالقرب من maxSize المكوّنة من خلال عمليات الدمج من واحد إلى واحد، ولكن لا يزال بإمكانه ترك أجزاء متوسطة الحجم لا يمكن دمجها أكثر دون تجاوز الحدود. على سبيل المثال، كما هو موضح أدناه، إذا كانت المجموعة تحتوي على خمسة مقاطع بحجم 2 ميغابايت و maxSize 3 ميغابايت، فإن دمج أي مقطعين سيتجاوز الحد، لذلك لا يمكن للضغط القياسي تقليل عدد المقاطع بشكل أكبر ويبقى التخطيط المجزأ.
تضيف فرض الدمج معلمة target_size وتدعم إعادة تنظيم المقاطع نحو الحجم المطلوب في حدود تفاوت ضيق عندما يكون ذلك ممكنًا. كما هو موضح أدناه، إذا كان الحجم المحدد target_size هو 4 ميغابايت، يمكن دمج المقاطع الخمسة الصغيرة بحجم 2 ميغابايت في عدد أقل من المقاطع الأكبر. يقلل هذا من عدد المقاطع الزائد، ويدعم أهدافًا أكبر من الإعدادات الافتراضية maxSize ، وعندما يكون الهدف كبيرًا جدًا، يتيح للنظام اختيار حجم الإخراج العملي وعدد المقاطع للأجهزة الحالية وطوبولوجيا QueryNode.
لفهم طريقة الضغط التي يجب استخدامها، راجع الأسئلة الشائعة.
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.
المعلمة |
القيمة الافتراضية |
الوصف |
|---|---|---|
|
512 |
الحد الأقصى الافتراضي لحجم المقطع الافتراضي بالميجابايت. يُستخدم كهدف عندما يكون |
|
100 |
عتبة عدد المقاطع لاختيار الخوارزمية. عندما يتجاوز عدد المقاطع هذه القيمة، يستخدم Milvus خوارزمية جشعة أسرع لتخطيط الدمج.
|
|
4.0 |
يتم تقسيم ذاكرة DataNode على هذا العامل لحساب أكبر حجم مقطع يمكن أن يسمح به النظام.
|
|
4.0 |
يتم تقسيم الحد الأدنى لذاكرة QueryNode على هذا العامل. يُستخدم أثناء حساب الحجم التلقائي (
|
لتطبيق التغييرات المذكورة أعلاه على مجموعة 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
)
مرجع المعلمة
يشرح الجدول التالي المعلمات.
المعلمة |
النوع |
الوصف |
|---|---|---|
|
شريحة |
مطلوب. اسم المجموعة المراد ضغطها. |
|
int |
اختياري. حجم المقطع المستهدف بالميجابايت. هناك 3 خيارات لقيمة المعلمة:
|
إذا كان 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.