إدارة مجموعات الموارد
في Milvus، يمكنك استخدام مجموعة الموارد لعزل بعض عقد الاستعلام فعليًا عن غيرها. يرشدك هذا الدليل إلى كيفية إنشاء وإدارة مجموعات الموارد المخصصة، بالإضافة إلى نقل العقد بينها.
ما هي مجموعة الموارد
يمكن لمجموعة الموارد أن تحتوي على عدد من عقد الاستعلام أو جميعها في مجموعة Milvus. أنت تقرر كيف تريد توزيع عقد الاستعلام بين مجموعات الموارد بناءً على ما يناسبك أكثر. على سبيل المثال، في سيناريو متعدد المجموعات، يمكنك تخصيص عدد مناسب من عقد الاستعلام لكل مجموعة موارد وتحميل المجموعات في مجموعات موارد مختلفة، بحيث تكون العمليات داخل كل مجموعة مستقلة فعليًا عن تلك الموجودة في المجموعات الأخرى.
لاحظ أن مثيل Milvus يحتفظ بمجموعة موارد افتراضية لتضم جميع عقد الاستعلام عند بدء التشغيل ويسميها __default_resource_group.
بدءًا من الإصدار 2.4.1، يوفر Milvus واجهة برمجة تطبيقات (API) تعريفية لمجموعات الموارد، في حين تم إهمال واجهة برمجة التطبيقات القديمة لمجموعات الموارد. تتيح واجهة برمجة التطبيقات التعريفية الجديدة للمستخدمين تحقيق خاصية التبسيط (idempotency)، مما يسهل إجراء التطوير الثانوي في البيئات السحابية الأصلية.
مفاهيم مجموعة الموارد
يتم وصف مجموعة الموارد من خلال تكوين مجموعة الموارد:
{
"requests": { "nodeNum": 1 },
"limits": { "nodeNum": 1 },
"transfer_from": [{ "resource_group": "rg1" }],
"transfer_to": [{ "resource_group": "rg2" }]
}
- تحدد السمة requests الشروط التي يجب أن تستوفيها مجموعة الموارد.
- تحدد السمة limits الحدود القصوى لمجموعة الموارد.
- تصف السمتان transfer_from و transfer_to مجموعات الموارد التي يُفضل أن تحصل منها مجموعة الموارد على الموارد، ومجموعات الموارد التي يجب أن تنقل إليها الموارد، على التوالي.
بمجرد تغيير تكوين مجموعة الموارد، سيقوم Milvus بتعديل موارد عقدة الاستعلام الحالية قدر الإمكان وفقًا للتكوين الجديد، مما يضمن أن تستوفي جميع مجموعات الموارد في النهاية الشرط التالي:
.requests.nodeNum < nodeNumOfResourceGroup < .limits.nodeNum.
باستثناء الحالات التالية:
- عندما يكون عدد عقد الاستعلام (QueryNodes) في مجموعة Milvus غير كافٍ، أي عندما تكون قيمة
NumOfQueryNode < sum(.requests.nodeNum)، فستكون هناك دائمًا مجموعات موارد تفتقر إلى عدد كافٍ من عقد الاستعلام. - عندما يكون عدد عقد الاستعلام (QueryNodes) في مجموعة Milvus زائدًا عن الحاجة، أي
NumOfQueryNode > sum(.limits.nodeNum)، فسيتم دائمًا وضع عقد الاستعلام الزائدة في __default_resource_group أولًا.
وبالطبع، إذا تغير عدد عقد الاستعلام (QueryNodes) في المجموعة، فسيحاول Milvus باستمرار التكيف لتلبية الشروط النهائية. لذلك، يمكنك أولاً تطبيق تغييرات تكوين مجموعة الموارد ثم تنفيذ توسيع نطاق عقد الاستعلام (QueryNode).
استخدم واجهة برمجة التطبيقات (API) التصريحية لإدارة مجموعة الموارد
جميع أمثلة الكود في هذه الصفحة مكتوبة بلغة PyMilvus 3.0.2. قم بترقية إصدار PyMilvus المثبت لديك قبل تشغيلها.
إنشاء مجموعة موارد.
لإنشاء مجموعة موارد، قم بتشغيل ما يلي بعد الاتصال بمثيل Milvus. يفترض المقتطف التالي أن
defaultهو الاسم المستعار لاتصال Milvus الخاص بك.import pymilvus # A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_). name = "rg" node_num = 0 # create a resource group that exactly hold no query node. try: milvus_client.create_resource_group(name, config=ResourceGroupConfig( requests={"node_num": node_num}, limits={"node_num": node_num}, )) print(f"Succeeded in creating resource group {name}.") except Exception: print("Failed to create the resource group.")سرد مجموعات الموارد.
بمجرد إنشاء مجموعة موارد، يمكنك رؤيتها في قائمة مجموعات الموارد.
لعرض قائمة مجموعات الموارد في مثيل Milvus، قم بما يلي:
rgs = milvus_client.list_resource_groups() print(f"Resource group list: {rgs}") # Resource group list: ['__default_resource_group', 'rg']وصف مجموعة موارد.
يمكنك جعل Milvus يصف مجموعة الموارد المعنية على النحو التالي:
info = milvus_client.describe_resource_group(name) print(f"Resource group description: {info}") # Resource group description: # ResourceGroupInfo: # <name:rg1>, // resource group name # <capacity:0>, // resource group capacity # <num_available_node:1>, // resource group node num # <num_loaded_replica:{}>, // collection loaded replica num in resource group # <num_outgoing_node:{}>, // node num which still in use by replica in other resource group # <num_incoming_node:{}>, // node num which is in use by replica but belong to other resource group # <config:{}>, // resource group config # <nodes:[]> // node detail infoنقل العقد بين مجموعات الموارد.
قد تلاحظ أن مجموعة الموارد الموصوفة لا تحتوي على أي عقدة استعلام حتى الآن. انقل بعض العقد من مجموعة الموارد الافتراضية إلى المجموعة التي أنشأتها كما يلي: بافتراض وجود عقدة استعلام واحدة حاليًا في __default_resource_group الخاصة بالمجموعة، ونريد نقل عقدة واحدة إلى مجموعة الموارد التي تم إنشاؤها. يضمن الأمر
update_resource_groupsالترابطية للتغييرات المتعددة في التكوين، وبالتالي لن تظهر أي حالات وسيطة لـ Milvus.source = '__default_resource_group' target = 'rg' expected_num_nodes_in_default = 0 expected_num_nodes_in_rg = 1 try: milvus_client.update_resource_groups({ source: ResourceGroupConfig( requests={"node_num": expected_num_nodes_in_default}, limits={"node_num": expected_num_nodes_in_default}, ), target: ResourceGroupConfig( requests={"node_num": expected_num_nodes_in_rg}, limits={"node_num": expected_num_nodes_in_rg}, ) }) print(f"Succeeded in move 1 node(s) from {source} to {target}.") except Exception: print("Something went wrong while moving nodes.") # After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.تحميل المجموعات والأقسام إلى مجموعة موارد.
بمجرد وجود عقد استعلام في مجموعة الموارد، يمكنك تحميل المجموعات إلى مجموعة الموارد هذه. يفترض المقتطف التالي وجود مجموعة باسم
demoبالفعل.from pymilvus import Collection collection_name = "demo" # Milvus loads the collection to the default resource group. milvus_client.load_collection(collection_name, replica_number=2) # Or, you can ask Milvus load the collection to the desired resource group. # make sure that query nodes num should be greater or equal to replica_number resource_groups = ['rg'] milvus_client.load_collection(replica_number=2, _resource_groups=resource_groups)كما يمكنك ببساطة تحميل قسم إلى مجموعة موارد وتوزيع نسخه المتماثلة على عدة مجموعات موارد. يفترض ما يلي وجود مجموعة باسم
Booksبالفعل وأنها تحتوي على قسم باسمNovels.collection = "Books" partition = "Novels" # Use the load method of a collection to load one of its partition milvus_client.load_partitions(collection, [partition], replica_number=2, _resource_groups=resource_groups)لاحظ أن
_resource_groupsهي معلمة اختيارية، وإذا لم يتم تحديدها، فسيقوم Milvus بتحميل النسخ المتماثلة على عقد الاستعلام في مجموعة الموارد الافتراضية.لجعل Milvus يقوم بتحميل كل نسخة متماثلة من مجموعة في مجموعة موارد منفصلة، تأكد من أن عدد مجموعات الموارد يساوي عدد النسخ المتماثلة.
نقل النسخ المتماثلة بين مجموعات الموارد.
يستخدم Milvus النسخ المتماثلة لتحقيق توازن الحمل بين المقاطع الموزعة عبر عدة عقد استعلام. يمكنك نقل نسخ متماثلة معينة من مجموعة ما من مجموعة موارد إلى أخرى على النحو التالي:
source = '__default_resource_group' target = 'rg' collection_name = 'c' num_replicas = 1 try: milvus_client.transfer_replica(source, target, collection_name, num_replicas) print(f"Succeeded in moving {num_replicas} replica(s) of {collection_name} from {source} to {target}.") except Exception: print("Something went wrong while moving replicas.") # Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.إزالة مجموعة موارد.
يمكنك حذف مجموعة موارد لا تحتوي على أي عقدة استعلام (
limits.node_num = 0) في أي وقت. في هذا الدليل، تحتوي مجموعة المواردrgالآن على عقدة استعلام واحدة. تحتاج أولاً إلى تغيير التكوينlimits.node_numلمجموعة الموارد إلى صفر.resource_group = "rg try: milvus_client.update_resource_groups({ resource_group: ResourceGroupConfig( requests={"node_num": 0}, limits={"node_num": 0}, ), }) milvus_client.drop_resource_group(resource_group) print(f"Succeeded in dropping {resource_group}.") except Exception: print(f"Something went wrong while dropping {resource_group}.")
لمزيد من التفاصيل، يرجى الرجوع إلى الأمثلة ذات الصلة في pymilvus
ممارسة جيدة لإدارة توسيع نطاق الكتلة
حاليًا، لا يمكن لـ Milvus توسيع نطاقه وتقليصه بشكل مستقل في البيئات السحابية الأصلية. ومع ذلك، باستخدام واجهة برمجة تطبيقات مجموعة الموارد التصريحية (Declarative Resource Group API) بالاقتران مع تنسيق الحاويات، يمكن لـ Milvus تحقيق عزل الموارد وإدارتها بسهولة لعقد الاستعلام (QueryNodes). فيما يلي ممارسة جيدة لإدارة عقد الاستعلام (QueryNodes) في بيئة سحابية:
بشكل افتراضي، يقوم Milvus بإنشاء __default_resource_group. لا يمكن حذف مجموعة الموارد هذه، كما أنها تعمل كمجموعة الموارد الافتراضية للتحميل لجميع المجموعات، ويتم تخصيص عقد الاستعلام الزائدة لها دائمًا. لذلك، يمكننا إنشاء مجموعة موارد معلقة لاحتواء موارد «QueryNode» غير المستخدمة، مما يمنع احتلال موارد «QueryNode» من قبل مجموعة الموارد __default_resource_group.
بالإضافة إلى ذلك، إذا قمنا بفرض القيد
sum(.requests.nodeNum) <= queryNodeNumبصرامة، يمكننا التحكم بدقة في تخصيص عقد QueryNode في المجموعة. لنفترض أن هناك حاليًا عقدة QueryNode واحدة فقط في المجموعة، ثم نقوم بتهيئة المجموعة. فيما يلي مثال على الإعداد:from pymilvus.client.types import ResourceGroupConfig _PENDING_NODES_RESOURCE_GROUP="__pending_nodes" def init_cluster(node_num: int): print(f"Init cluster with {node_num} nodes, all nodes will be put in default resource group") # create a pending resource group, which can used to hold the pending nodes that do not hold any data. milvus_client.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig( requests={"node_num": 0}, # this resource group can hold 0 nodes, no data will be load on it. limits={"node_num": 10000}, # this resource group can hold at most 10000 nodes )) # update default resource group, which can used to hold the nodes that all initial node in it. milvus_client.update_resource_groups({ "__default_resource_group": ResourceGroupConfig( requests={"node_num": node_num}, limits={"node_num": node_num}, transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority. transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority. )}) milvus_client.create_resource_group(name="rg1", config=ResourceGroupConfig( requests={"node_num": 0}, limits={"node_num": 0}, transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], )) milvus_client.create_resource_group(name="rg2", config=ResourceGroupConfig( requests={"node_num": 0}, limits={"node_num": 0}, transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], )) init_cluster(1)باستخدام كود المثال أعلاه، نقوم بإنشاء مجموعة موارد باسم __pending_nodes لاستيعاب عقد QueryNode الإضافية. كما نقوم بإنشاء مجموعتي موارد خاصتين بالمستخدمين باسم rg1 و rg2. بالإضافة إلى ذلك، نضمن أن تمنح مجموعة الموارد الأخرى الأولوية لاستعادة عقد QueryNode المفقودة أو الزائدة عن الحاجة من __pending_nodes.
توسيع نطاق المجموعة
بافتراض أن لدينا دالة التوسع التالية:
def scale_to(node_num: int): # scale the querynode number in Milvus into node_num. passيمكننا استخدام واجهة برمجة التطبيقات (API) لتوسيع نطاق مجموعة موارد محددة إلى عدد معين من عقد الاستعلام (QueryNodes) دون التأثير على أي مجموعات موارد أخرى.
# scale rg1 into 3 nodes, rg2 into 1 nodes milvus_client.update_resource_groups({ "rg1": ResourceGroupConfig( requests={"node_num": 3}, limits={"node_num": 3}, transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], ), "rg2": ResourceGroupConfig( requests={"node_num": 1}, limits={"node_num": 1}, transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], ), }) scale_to(5) # rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.تقليص حجم الكتلة
وبالمثل، يمكننا وضع قواعد لتقليص المجموعة تُعطي الأولوية لاختيار عقد الاستعلام من مجموعة الموارد __pending_nodes. يمكن الحصول على هذه المعلومات من خلال واجهة برمجة التطبيقات (API)
describe_resource_group. تحقيق هدف تقليص مجموعة الموارد المحددة.# scale rg1 from 3 nodes into 2 nodes milvus_client.update_resource_groups({ "rg1": ResourceGroupConfig( requests={"node_num": 2}, limits={"node_num": 2}, transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], ), }) # rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node. scale_to(4) # scale the node in __pending_nodes
كيف تتفاعل مجموعات الموارد مع النسخ المتعددة
- ترتبط النسخ المتماثلة لمجموعة واحدة ومجموعات الموارد بعلاقة N-إلى-N.
- عند تحميل نسخ متماثلة متعددة لمجموعة واحدة في مجموعة موارد واحدة، يتم توزيع عقد الاستعلام (QueryNodes) الخاصة بتلك المجموعة بالتساوي بين النسخ المتماثلة، مما يضمن ألا يتجاوز الفرق في عدد عقد الاستعلام لكل نسخة متماثلة 1.
الخطوة التالية
لنشر مثيل Milvus متعدد المستأجرين، اقرأ ما يلي: