🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI
الصفحة الرئيسية
  • دليل الإدارة
  • Home
  • Docs
  • دليل الإدارة

  • مجموعات الموارد

  • إدارة مجموعات الموارد

إدارة مجموعات الموارد

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

ما هي مجموعة الموارد

يمكن أن تحتوي مجموعة الموارد على عدة أو كل عقد الاستعلام في مجموعة Milvus. يمكنك تحديد الطريقة التي تريد بها تخصيص عقد الاستعلام بين مجموعات الموارد بناءً على ما هو الأكثر منطقية بالنسبة لك. على سبيل المثال، في سيناريو متعدد المجموعات، يمكنك تخصيص عدد مناسب من عقد الاستعلام لكل مجموعة موارد وتحميل المجموعات في مجموعة موارد مختلفة، بحيث تكون العمليات داخل كل مجموعة مستقلة فعليًا عن تلك الموجودة في المجموعات الأخرى.

لاحظ أن مثيل Milvus يحتفظ بمجموعة موارد افتراضية لاحتواء جميع عقد الاستعلام عند بدء التشغيل ويسميها __default_resource_group.

بدءًا من الإصدار 2.4.1، يوفر Milvus واجهة برمجة تطبيقات مجموعة الموارد التوضيحية، بينما تم إهمال واجهة برمجة تطبيقات مجموعة الموارد القديمة. تُمكِّن واجهة برمجة التطبيقات التوضيحية الجديدة المستخدمين من تحقيق الخصوصية في بيئات السحابة الأصلية بشكل أسهل.

مفاهيم مجموعة الموارد

يتم وصف مجموعة الموارد من خلال تكوين مجموعة الموارد:

{
    "requests": { "nodeNum": 1 },
    "limits": { "nodeNum": 1 },
    "transfer_from": [{ "resource_group": "rg1" }],
    "transfer_to": [{ "resource_group": "rg2" }]
}
  • تحدد سمة الطلبات الشروط التي يجب أن تستوفيها مجموعة الموارد.
  • تحدد سمة الحدود الحدود الحدود القصوى لمجموعة الموارد.
  • تصف السمتان Transfer_from و Transfer_to مجموعات الموارد التي يفضل أن تحصل منها مجموعة الموارد على الموارد وإلى أي مجموعات الموارد يجب أن تنقل الموارد، على التوالي.

بمجرد أن يتغير تكوين مجموعة الموارد، يقوم الميلفوس بتعديل موارد عقدة الاستعلام الحالية قدر الإمكان وفقاً للتكوين الجديد، مما يضمن أن جميع مجموعات الموارد تستوفي في النهاية الشرط التالي

.requests.nodeNum < nodeNumOfResourceGroup < .limits.nodeNum.

باستثناء الحالات التالية:

  • عندما يكون عدد عُقَد الاستعلام في مجموعة Milvus غير كافٍ، أي NumOfQueryNode < sum(.requests.nodeNum) ، ستكون هناك دائمًا مجموعات موارد بدون عدد كافٍ من عُقَد الاستعلام.
  • عندما يكون عدد عُقد الاستعلام في مجموعة Milvus زائدًا، أي NumOfQueryNode > sum(.limits.nodeNum) ، سيتم دائمًا وضع عُقد الاستعلام الزائدة في مجموعة الموارد __المجموعة_الافتراضية_الموارد أولاً.

وبالطبع، إذا تغير عدد عُقد الاستعلام في المجموعة، سيحاول الميلفوس باستمرار تعديلها لتلبية الشروط النهائية. لذلك، يمكنك أولًا تطبيق تغييرات تكوين مجموعة الموارد ثم إجراء تحجيم QueryNode.

استخدم واجهة برمجة التطبيقات التوضيحية لإدارة مجموعة الموارد

جميع نماذج التعليمات البرمجية في هذه الصفحة موجودة في PyMilvus 2.5.4. قم بترقية تثبيت PyMilvus قبل تشغيلها.

  1. إنشاء مجموعة موارد.

    لإنشاء مجموعة موارد، قم بتشغيل ما يلي بعد الاتصال بمثيل 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.")
    
  2. سرد مجموعات الموارد.

    بمجرد إنشاء مجموعة موارد، يمكنك رؤيتها في قائمة مجموعات الموارد.

    لعرض قائمة مجموعات الموارد في مثيل ميلفوس، قم بما يلي:

    rgs = milvus_client.list_resource_groups()
    print(f"Resource group list: {rgs}")
    
    # Resource group list: ['__default_resource_group', 'rg']
    
  3. وصف مجموعة موارد.

    يمكنك جعل ميلفوس يصف مجموعة موارد في قلق على النحو التالي:

    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
    
  4. نقل العقد بين مجموعات الموارد.

    قد تلاحظ أن مجموعة الموارد الموصوفة لا تحتوي على أي عقدة استعلام بعد. انقل بعض العُقد من مجموعة الموارد الافتراضية إلى المجموعة التي تقوم بإنشائها على النحو التالي: بافتراض وجود عقدة استعلام واحدة حاليًا في _مجموعة الموارد _المجموعة_الافتراضية_المجموعة_المجموعة_الموارد، ونريد نقل عقدة واحدة إلى rg المنشأة.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.
    
  5. تحميل المجموعات والأقسام إلى مجموعة موارد.

    بمجرد وجود عقد الاستعلام في مجموعة موارد، يمكنك تحميل المجموعات إلى مجموعة الموارد هذه. يفترض المقتطف التالي وجود مجموعة باسم 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 هو معلمة اختيارية، وتركه غير محدد يجعل ميلفوس يقوم بتحميل النسخ المتماثلة على عقد الاستعلام في مجموعة الموارد الافتراضية.

    لجعل ميلفوس يقوم بتحميل كل نسخة متماثلة من المجموعة في مجموعة موارد منفصلة، تأكد من أن عدد مجموعات الموارد يساوي عدد النسخ المتماثلة.

  6. نقل النسخ المتماثلة بين مجموعات الموارد.

    يستخدم ميلفوس النسخ المتماثلة لتحقيق موازنة التحميل بين المجموعات الموزعة عبر عدة عقد استعلام. يمكنك نقل نسخ متماثلة معينة من مجموعة ما من مجموعة موارد إلى أخرى على النحو التالي:

    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.
    
  7. إسقاط مجموعة موارد.

    يمكنك إسقاط مجموعة موارد لا تحتوي على عقدة استعلام (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 التوسع بشكل مستقل في البيئات السحابية الأصلية. ومع ذلك، باستخدام واجهة برمجة تطبيقات مجموعة الموارد التوضيحية بالاقتران مع تنسيق الحاويات، يمكن لـ Milvus تحقيق عزل الموارد وإدارتها بسهولة لـ QueryNodes. فيما يلي ممارسة جيدة لإدارة QueryNodes في بيئة سحابية:

  1. بشكل افتراضي، ينشئ Milvus مجموعة_موارد_افتراضية. لا يمكن حذف مجموعة الموارد هذه وتعمل أيضًا كمجموعة موارد التحميل الافتراضية لجميع المجموعات ويتم دائمًا تعيين QueryNodes الزائدة عن الحاجة إليها. لذلك، يمكننا إنشاء مجموعة موارد معلقة للاحتفاظ بموارد QueryNode غير المستخدمة، مما يمنع موارد QueryNode من أن تشغلها _مجموعة_الموارد_الافتراضية_المجموعة.

    بالإضافة إلى ذلك، إذا فرضنا القيد بصرامة sum(.requests.nodeNum) <= queryNodeNum ، يمكننا التحكم بدقة في تخصيص 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)
    

    باستخدام كود المثال أعلاه، ننشئ مجموعة موارد باسم __عُقد_معلقة_للاحتفاظ بعُقد استعلام إضافية. نقوم أيضًا بإنشاء مجموعتي موارد خاصة بالمستخدم باسم rg1 و rg2. بالإضافة إلى ذلك، نتأكد من أن مجموعة الموارد الأخرى تعطي الأولوية لاستعادة عقد الاستعلام المفقودة أو الزائدة عن الحاجة من __عقد_انتظار_نود.

  2. توسيع نطاق المجموعة

    بافتراض أن لدينا وظيفة القياس التالية:

    
    def scale_to(node_num: int):
        # scale the querynode number in Milvus into node_num.
        pass
    

    يمكننا استخدام واجهة برمجة التطبيقات لتوسيع نطاق مجموعة موارد محددة إلى عدد معين من عُقد الاستعلام دون التأثير على أي مجموعات موارد أخرى.

    # 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.
    
  3. توسيع نطاق المجموعة إلى الداخل

    وبالمثل، يمكننا إنشاء قواعد توسيع نطاق في التي تعطي الأولوية لاختيار QueryNodes من مجموعة الموارد _pending_nodes. يمكن الحصول على هذه المعلومات من خلال واجهة برمجة التطبيقات 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 من مجموعة الموارد تلك بالتساوي بين النسخ المتماثلة، مما يضمن ألا يتجاوز الفرق في عدد QueryNodes لكل نسخة متماثلة 1.

ما التالي

لنشر مثيل Milvus متعدد المستأجرين، اقرأ ما يلي:

جرب Managed Milvus مجاناً

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

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

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