إدارة مجموعات الموارد
في Milvus، يمكنك استخدام مجموعة الموارد لعزل بعض عقد الاستعلام فعليًا عن غيرها. يرشدك هذا الدليل إلى كيفية إنشاء وإدارة مجموعات الموارد المخصصة، بالإضافة إلى نقل العقد بينها.
ما هي مجموعة الموارد
يمكن لمجموعة الموارد أن تحتوي على عدد من عقد الاستعلام أو جميعها في مجموعة Milvus. أنت تقرر كيف تريد توزيع عقد الاستعلام بين مجموعات الموارد بناءً على ما يناسبك بشكل أفضل. على سبيل المثال، في سيناريو متعدد المجموعات، يمكنك تخصيص عدد مناسب من عقد الاستعلام لكل مجموعة موارد وتحميل المجموعات في مجموعات موارد مختلفة، بحيث تكون العمليات داخل كل مجموعة مستقلة فعليًا عن تلك الموجودة في المجموعات الأخرى.
لاحظ أن مثيل Milvus يحتفظ بمجموعة موارد افتراضية لتضم جميع عقد الاستعلام عند بدء التشغيل ويطلق عليها اسم __default_resource_group.
بدءًا من الإصدار 2.4.1، يوفر Milvus واجهة برمجة تطبيقات (API) تعريفية لمجموعات الموارد، في حين تم إهمال واجهة برمجة التطبيقات القديمة لمجموعات الموارد. تتيح واجهة برمجة التطبيقات التعريفية الجديدة للمستخدمين تحقيق خاصية الإيدمبوتنس، مما يسهل إجراء التطوير الثانوي في البيئات السحابية الأصلية.
مفاهيم مجموعة الموارد
يتم وصف مجموعة الموارد من خلال تكوين مجموعة الموارد:
{
"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.1. قم بترقية إصدار 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بصرامة، يمكننا التحكم بدقة في تخصيص عقدات الاستعلام (QueryNodes) في المجموعة. لنفترض أن هناك حاليًا عقدة استعلام واحدة فقط في المجموعة، ثم نقوم بتهيئة المجموعة. فيما يلي مثال على الإعداد: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-to-N.
- عند تحميل نسخ متماثلة متعددة لمجموعة واحدة في مجموعة موارد واحدة، يتم توزيع عقد الاستعلام (QueryNodes) لتلك المجموعة بالتساوي بين النسخ المتماثلة، مما يضمن ألا يتجاوز الفرق في عدد عقد الاستعلام لكل نسخة متماثلة 1.
الخطوة التالية
لنشر مثيل Milvus متعدد المستأجرين، اقرأ ما يلي: