ضغط التجميع
تم تصميم ضغط التجميع لتحسين أداء البحث وتقليل التكاليف في المجموعات الكبيرة. سيساعدك هذا الدليل على فهم ضغط التجميع وكيف يمكن لهذه الميزة تحسين أداء البحث.
نظرة عامة
يقوم Milvus بتخزين الكيانات الواردة في مقاطع داخل مجموعة ويغلق المقطع عندما يمتلئ. إذا حدث ذلك، يتم إنشاء مقطع جديد لاستيعاب كيانات إضافية. ونتيجة لذلك، يتم توزيع الكيانات بشكل اعتباطي عبر المقاطع. يتطلب هذا التوزيع من Milvus البحث في مقاطع متعددة للعثور على أقرب الجيران إلى متجه استعلام معين.
بدون ضغط التجميع
إذا كان بإمكان Milvus توزيع الكيانات بين المقاطع بناءً على القيم الموجودة في حقل معين، يمكن تقييد نطاق البحث داخل مقطع واحد، وبالتالي تحسين أداء البحث.
ضغط التجميع هو ميزة في Milvus تقوم بإعادة توزيع الكيانات بين المقاطع في مجموعة بناءً على القيم الموجودة في حقل قياسي. لتمكين هذه الميزة، تحتاج أولاً إلى تحديد حقل قياسي كمفتاح تجميع. وهذا يسمح ل Milvus بإعادة توزيع الكيانات في مقطع عندما تقع قيم مفتاح التجميع الخاصة بها ضمن نطاق محدد. عندما تقوم بتشغيل ضغط التجميع، يقوم Milvus بإنشاء/تحديث فهرس عام يسمى PartitionStats، والذي يسجل علاقة التعيين بين المقاطع وقيم مفاتيح التجميع.
ضغط التجميع
باستخدام PartitionStats كمرجع، يمكن ل Milvus تشذيب البيانات غير ذات الصلة عند تلقي طلب بحث/استعلام يحمل قيمة مفتاح تجميع وتقييد نطاق البحث داخل المقاطع التي تم تعيينها إلى القيمة، وبالتالي تحسين أداء البحث. للحصول على تفاصيل حول تحسين الأداء، راجع الاختبارات المعيارية.
استخدام ضغط التجميع
ميزة ضغط التجميع في Milvus قابلة للتكوين بدرجة كبيرة. يمكنك اختيار تشغيله يدويًا أو تعيينه ليتم تشغيله تلقائيًا على فترات بواسطة Milvus. لتمكين ضغط التجميع، قم بما يلي:
التكوين العام
تحتاج إلى تعديل ملف تكوين Milvus كما هو موضح أدناه.
dataCoord:
compaction:
clustering:
enable: true
autoEnable: false
triggerInterval: 600
minInterval: 3600
maxInterval: 259200
newDataSizeThreshold: 512m
timeout: 7200
queryNode:
enableSegmentPrune: true
datanode:
clusteringCompaction:
memoryBufferRatio: 0.1
workPoolSize: 8
common:
usePartitionKeyAsClusteringKey: true
تكوين العنصر |
الوصف |
القيمة الافتراضية |
|---|---|---|
|
||
|
تحديد ما إذا كان سيتم تمكين ضغط التجميع أم لا. تعيين هذا إلى |
خطأ |
|
تحديد ما إذا كنت تريد تمكين الضغط الذي يتم تشغيله تلقائياً. يشير تعيين هذا إلى |
خطأ |
|
تحديد الفاصل الزمني بالمللي ثانية الذي يبدأ عنده Milvus في ضغط التجميع. ينطبق هذا فقط عند تعيين |
|
|
يحدد الحد الأدنى للفاصل الزمني بالمللي ثانية. ينطبق هذا فقط عند تعيين يساعد تعيين هذا إلى عدد صحيح أكبر من |
|
|
يحدد الحد الأقصى للفاصل الزمني بالمللي ثانية. ينطبق هذا فقط عند تعيين بمجرد أن يكتشف Milvus أن المجموعة لم يتم تجميعها-مضغوطة لمدة أطول من هذه القيمة، فإنه يفرض عملية ضغط تجميع. |
|
|
يحدد العتبة العليا لتشغيل ضغط التجميع. ينطبق هذا فقط عندما تقوم بتعيين بمجرد أن يكتشف Milvus أن حجم البيانات في مجموعة ما يتجاوز هذه القيمة، فإنه يبدأ عملية ضغط التجميع. |
|
|
تحديد مدة المهلة لضغط التجميع. تفشل عملية ضغط التجميع إذا تجاوز وقت تنفيذها هذه القيمة. |
|
|
||
|
يحدد ما إذا كان Milvus يقوم بتخفيض البيانات بالرجوع إلى PartitionStats عند تلقي طلبات البحث/الاستعلام. تعيين هذا إلى |
|
|
||
|
تحديد نسبة المخزن المؤقت للذاكرة لمهام ضغط التجميع. يقوم Milvus بمسح البيانات عندما يتجاوز حجم البيانات حجم المخزن المؤقت المخصص المحسوب باستخدام هذه النسبة. |
|
|
يحدد حجم تجمع العاملين لمهمة ضغط التجميع. |
|
|
||
|
تحديد ما إذا كان سيتم استخدام مفتاح التقسيم في المجموعات كمفتاح تجميع. تعيين هذا إلى صواب يجعل Milvus يعامل مفاتيح التقسيم في المجموعات كمفتاح التجميع. يمكنك دائمًا تجاوز هذا الإعداد في المجموعة عن طريق تعيين مفتاح التجميع بشكل صريح. |
|
لتطبيق التغييرات المذكورة أعلاه على مجموعة Milvus الخاصة بك، يرجى اتباع الخطوات الواردة في تكوين Milvus مع Helm وتكوين Milvus مع مشغلي Milvus.
تكوين التجميع
لضغط التجميع في مجموعة معينة، يجب عليك تحديد حقل قياسي من المجموعة كمفتاح التجميع.
from pymilvus import MilvusClient, DataType
CLUSTER_ENDPOINT="http://localhost:19530"
TOKEN="root:Milvus"
client = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN
)
schema = MilvusClient.create_schema()
schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
schema.add_field("key", DataType.INT64, is_clustering_key=True)
schema.add_field("var", DataType.VARCHAR, max_length=1000)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=5)
client.create_collection(
collection_name="clustering_test",
schema=schema
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.token("root:Milvus")
.build());
CreateCollectionReq.CollectionSchema schema = client.createSchema();
schema.addField(AddFieldReq.builder()
.fieldName("id")
.dataType(DataType.Int64)
.isPrimaryKey(true)
.autoID(false)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("key")
.dataType(DataType.Int64)
.isClusteringKey(true)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("var")
.dataType(DataType.VarChar)
.maxLength(1000)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("vector")
.dataType(DataType.FloatVector)
.dimension(5)
.build());
CreateCollectionReq requestCreate = CreateCollectionReq.builder()
.collectionName("clustering_test")
.collectionSchema(schema)
.build();
client.createCollection(requestCreate);
// go
import { MilvusClient, DataType } from '@zilliz/milvus2-sdk-node';
const CLUSTER_ENDPOINT = 'http://localhost:19530';
const TOKEN = 'root:Milvus';
const client = new MilvusClient({
address: CLUSTER_ENDPOINT,
token: TOKEN,
});
const schema = [
{
name: 'id',
type: DataType.Int64,
is_primary_key: true,
autoID: false,
},
{
name: 'key',
type: DataType.Int64,
is_clustering_key: true,
},
{
name: 'var',
type: DataType.VarChar,
max_length: 1000,
is_primary_key: false,
},
{
name: 'vector',
type: DataType.FloatVector,
dim: 5,
},
];
await client.createCollection({
collection_name: 'clustering_test',
schema: schema,
});
# restful
يمكنك استخدام الحقول القياسية لأنواع البيانات التالية كمفتاح التجميع: Int8 و Int16 و و Int32 و Int64 و Float و Double و VarChar.
تشغيل ضغط التجميع التجميعي
إذا قمت بتمكين الضغط التجميعي التلقائي للتجميع، يقوم برنامج Milvus تلقائيًا بتشغيل الضغط في الفاصل الزمني المحدد. بدلاً من ذلك، يمكنك تشغيل الضغط يدويًا على النحو التالي:
# trigger a manual compaction
job_id = client.compact(
collection_name="clustering_test",
is_clustering=True
)
# get the compaction state
client.get_compaction_state(
job_id=job_id,
)
import io.milvus.v2.service.utility.request.CompactReq;
import io.milvus.v2.service.utility.request.GetCompactionStateReq;
import io.milvus.v2.service.utility.response.CompactResp;
import io.milvus.v2.service.utility.response.GetCompactionStateResp;
CompactResp compactResp = client.compact(CompactReq.builder()
.collectionName("clustering_test")
.isClustering(true)
.build());
GetCompactionStateResp stateResp = client.getCompactionState(GetCompactionStateReq.builder()
.compactionID(compactResp.getCompactionID())
.build());
System.out.println(stateResp.getState());
// go
// trigger a manual compaction
const {compactionID} = await client.compact({
collection_name: "clustering_test",
is_clustering: true
});
// get the compaction state
await client.getCompactionState({
compactionID: compactionID,
});
# restful
اختبار معياري
يحدد حجم البيانات وأنماط الاستعلام مجتمعةً تحسين الأداء الذي يمكن أن يحققه ضغط التجميع. يُظهر اختبار معياري داخلي أن ضغط التجميع يؤدي إلى تحسين يصل إلى 25 ضعفًا في الاستعلامات في الثانية (QPS).
يتم إجراء الاختبار المعياري على مجموعة تحتوي على كيانات من مجموعة بيانات LAION ذات 20 مليونًا و768 بُعدًا مع تعيين الحقل key كمفتاح تجميع. بعد تشغيل ضغط التجميع في المجموعة، يتم إرسال عمليات البحث المتزامنة حتى يصل استخدام وحدة المعالجة المركزية إلى مستوى عالٍ من وحدة المعالجة المركزية.
مرشح البحث |
نسبة التقليم |
الكمون |
الطلبات/الثانية |
||||
|---|---|---|---|---|---|---|---|
متوسط متوسط |
الحد الأدنى |
الحد الأقصى |
المتوسط |
TP99 |
|||
غير متاح |
0% |
1685 |
672 |
2294 |
1710 |
2291 |
17.75 |
مفتاح> 200 ومفتاح < 800 |
40.2% |
1045 |
47 |
1828 |
1085 |
1617 |
28.38 |
مفتاح> 200 ومفتاح < 600 |
59.8% |
829 |
45 |
1483 |
882 |
1303 |
35.78 |
مفتاح> 200 ومفتاح < 400 |
79.5% |
550 |
100 |
985 |
584 |
898 |
54.00 |
المفتاح==1000 |
99% |
68 |
24 |
1273 |
70 |
246 |
431.41 |
كلما ضاق نطاق البحث في مرشحات البحث، تزداد نسبة التقليم. هذا يعني أنه يتم تخطي المزيد من الكيانات أثناء عملية البحث. عند مقارنة الإحصائيات في الصفين الأول والأخير، يمكنك أن ترى أن عمليات البحث بدون ضغط التجميع تتطلب مسح المجموعة بأكملها. من ناحية أخرى، يمكن لعمليات البحث مع ضغط التجميع باستخدام مفتاح محدد أن تحقق تحسنًا يصل إلى 25 ضعفًا.
أفضل الممارسات
إليك بعض النصائح لاستخدام ضغط التجميع بكفاءة:
قم بتمكين ذلك للمجموعات ذات أحجام البيانات الكبيرة.
يتحسن أداء البحث مع وجود أحجام بيانات أكبر في المجموعة. من الجيد تمكين هذه الميزة للمجموعات التي تحتوي على أكثر من مليون كيان.
اختر مفتاح تجميع مناسب.
يمكنك استخدام الحقول القياسية المستخدمة عادةً كشروط تصفية كمفتاح تجميع. بالنسبة للمجموعات التي تحتوي على بيانات من مستأجرين متعددين، يمكنك استخدام الحقل الذي يميز مستأجر عن آخر كمفتاح تجميع.
استخدم مفتاح التقسيم كمفتاح التجميع.
يمكنك تعيين
common.usePartitionKeyAsClusteringKeyعلىtrueإذا كنت ترغب في تمكين هذه الميزة لجميع المجموعات في مثيل Milvus الخاص بك أو إذا كنت لا تزال تواجه مشكلات في الأداء في مجموعة كبيرة بمفتاح التقسيم. من خلال القيام بذلك، سيكون لديك مفتاح تجميع ومفتاح تقسيم عندما تختار حقلاً قياسيًا في مجموعة كمفتاح تقسيم.لاحظ أن هذا الإعداد لا يمنعك من اختيار حقل قياسي آخر كمفتاح تجميع. تكون الأولوية دائمًا لمفتاح التجميع المعين صراحةً.