البرنامج التعليمي: قياس مجموعة Service Fabric في Azure

هذا البرنامج التعليمي هو الجزء الثالث من السلسلة، ويظهر لك كيفية توسيع نطاق المجموعة الموجودة وخارجها. يمكنك عند الانتهاء التعرف على كيفية تحجيم المجموعة وكيفية تنظيف أي موارد متبقية. لمزيد من المعلومات حول تحجيم المجموعة قيد التشغيل في Azure، يرجى الاطلاع على تحجيم أنظمة مجموعة Service Fabric.

في هذا البرنامج التعليمي، تتعلم كيفية:

  • إضافة العقد وإزالتها (توسيع النطاق وتضييقه)
  • إضافة أنواع العقد وإزالتها (توسيع النطاق وتحجيمه)
  • زيادة موارد العقد (توسيع نطاقها)

ستتعلم في سلسلة البرامج التعليمية هذه كيفية:

إشعار

نوصي باستخدام الوحدة النمطية Azure Az PowerShell للتفاعل مع Azure. للبدء، راجع تثبيت Azure PowerShell. لمعرفة كيفية الترحيل إلى الوحدة النمطية Az PowerShell، راجع ترحيل Azure PowerShell من AzureRM إلى Az.

المتطلبات الأساسية

قبل أن تبدأ هذا البرنامج التعليمي:

اعتبارات ومبادئ توجيهية هامة

تتغير أحمال العمل للتطبيق مع مرور الوقت، هل تحتاج خدماتك الحالية إلى موارد أكثر (أو أقل)؟ إضافة العقد أو إزالتها من نوع العقد لزيادة موارد نظام المجموعة أو تقليلها.

هل تحتاج إلى إضافة أكثر من 100 عقدة إلى نظام المجموعة؟ لا يمكن أن تحتوي مجموعة عقد/ مقاييسService Fabric الأحادية على أكثر من 100 عقدة/ جهاز ظاهر. لتوسيع نطاق مجموعة تتجاوز 100 عقدة، يرجى إضافة أنواع إضافية من العقد.

هل تطبيقك لديه خدمات متعددة، وهل يحتاج أي منها إلى أن يكون عمومياً أو مواجهاً للإنترنت؟ تحتوي التطبيقات النموذجية على خدمة بوابة أمامية تتلقى إدخالاً من العميل وخدمات خلفية واحدة أو أكثر تتصل بخدمات الواجهة الأمامية. نوصي في هذه الحالة بإضافة نوعين من العقد على الأقل إلى نظام المجموعة.

هل خدماتك لديها احتياجات مختلفة للبنية التحتية مثل ذاكرة وصول عشوائي أكبر أو دورات وحدة المعالجة المركزية أعلى؟ على سبيل المثال، يحتوي التطبيق على خدمة الواجهة الأمامية وخدمة الواجهة الخلفية. يمكن تشغيل الخدمة الأمامية على أجهزة ظاهرية أصغر (VMs) (أحجام الجهاز الظاهري مثل D2) التي تحتوي على منافذ مفتوحة للإنترنت. ومع ذلك، فإن الخدمة الخلفية هي حساب مكثف وتحتاج إلى التشغيل على أجهزة VMs أكبر (مع أحجام الجهاز الظاهري مثل D4 وD6 وD15) التي لا تواجه الإنترنت. نوصي في هذه الحالة بإضافة نوعين أو أكثر من العقد إلى نظام المجموعة. يسمح هذا لكل نوع عقدة أن تكون لديه خصائص مميزة مثل الاتصال بالإنترنت أو أن يكون بحجم الجهاز الظاهري. ويمكن أيضاً تحجيم عدد الأجهزة الظاهرية بشكل مستقل.

عند تغيير حجم مجموعة Azure، ضع الإرشادات التالية في الاعتبار:

  • لا يمكن أن تحتوي مجموعة عقد/ مقاييسService Fabric الأحادية على أكثر من 100 عقدة/ جهاز ظاهر. لتوسيع نطاق مجموعة تتجاوز 100 عقدة، يرجى إضافة أنواع إضافية من العقد.
  • يجب أن يكون لأنواع العقدة الأساسية التي تتضمن تشغيل أحمال العمل الإنتاجية مستوى متانة من الذهب أو الفضة وأن يكون لها دائماً خمس عقد أو أكثر.
  • أنواع العقد غير الأساسية التي تتضمن تشغيل أحمال العمل الإنتاجية الحالة يجب أن تتضمن دائماً خمس عقد أو أكثر.
  • يجب أن تتضمن دائماً أنواع العقد غير الأساسية التي تشغل أحمال عمل عديمة الحالة للإنتاج عقدتين أو أكثر.
  • يجب أن يتضمن دائماً أي نوع عقدة بمستوى متانة الذهب أو الفضة خمس أو أكثر من عقدة.
  • إذا كان التحجيم في (إزالة العقد من) نوع العقدة الأساسية، يجب ألا تقلل عدد المثيلات إلى أقل مما يتطلبه مستوى الموثوقية.

لمزيد من المعلومات الإضافية، يرجى الاطلاع على الإرشادات المتعلقة بسعة المجموعة.

تصدير القالب لمجموعة الموارد

بعد إنشاء مجموعة Windows آمنة وإعداد مجموعة الموارد بنجاح، يمكن تصدير قالب إدارة الموارد لمجموعة الموارد. تصدير القالب يسمح لك بأتمتة عمليات النشر المستقبلية للمجموعة ومواردها لأن القالب يحتوي على جميع البنية التحتية الكاملة. لمزيد من المعلومات حول تصدير القوالب، يرجى الاطلاع على إدارة مجموعات موارد إدارة موارد Azure باستخدام مدخل Microsoft Azure.

  1. في مدخل Microsoft Azure، يرجى الانتقال إلى مجموعة الموارد التي تحتوي على مجموعة (sfclustertutorialgroup، إذا كنت تتبع هذا البرنامج التعليمي).

  2. في الجزء الأيمن، يرجى تحديد Deploymentsأو تحديد الارتباط أسفل Deployments.

  3. تحديد أحدث عملية نشر ناجحة من القائمة.

  4. في الجزء الأيمن، يرجى تحديد Template ثم تحديد Download لتصدير القالب كملف ZIP. حفظ القالب والمعلمات في جهاز الكمبيوتر المحلي.

إضافة عقد إلى العقد أو إزالتها من نوع العقدة

التحجيم والتوسيع أو التحجيم الأفقي عدد العقد في الكتلة يغير عدد العقد في نظام المجموعة. عند التحجيم أو التوسيع يمكنك إضافة المزيد من مثيلات الجهاز الظاهري إلى مجموعة المقياس. تصبح هذه المثيلات بمثابة عقد يستخدمها "Service Fabric". يعرف Service Fabric متى تحتوي مجموعة المقياس على المزيد من المثيلات المضافة (عن طريق التحجيم) ويتفاعل تلقائياً. يمكنك قياس المجموعة في أي وقت، حتى عندما يتم تشغيل أحمال العمل بالمجموعة.

تحديث القالب

تصدير ملف قالب ومعلمات من مجموعة الموارد لأحدث عملية نشر. فتح ملف parameters.json. إذا قمت بنشر نظام المجموعة باستخدام نموذج القالب في هذا البرنامج التعليمي، ثمة ثلاثة أنواع للعقد في نظام المجموعة والمعلمات الثلاثة التي تحدد عدد العقد لكل نوع عقدة: nt0InstanceCount، nt1InstanceCount، وnt2InstanceCount. المعلمة nt1InstanceCount، على سبيل المثال تحدد عدد المثيلات لنوع العقدة الثاني وتحدد عدد الأجهزة الظاهرية في مجموعة مقاييس الأجهزة الظاهرية المقترنة.

لذلك، بتحديث قيمة nt1InstanceCount يمكنك تغيير عدد العقد في نوع العقدة الثاني. تذكر أنه لا يمكنك قياس نوع عقدة إلى أكثر من 100 عقدة. أنواع العقد غير الأساسية التي تتضمن تشغيل أحمال العمل الإنتاجية الحالة يجب أن تتضمن دائماً خمس عقد أو أكثر. يجب أن تتضمن دائماً أنواع العقد غير الأساسية التي تشغل أحمال عمل عديمة الحالة للإنتاج عقدتين أو أكثر.

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

نشر القالب المحدّث

حفظ أي تغييرات على ملفات template.json وparameters.json. لنشر القالب المحدث، يتم تشغيل الأمر التالي:

New-AzResourceGroupDeployment -ResourceGroupName sfclustertutorialgroup -TemplateFile c:\temp\template.json -TemplateParameterFile c:\temp\parameters.json -Name "ChangingInstanceCount"

أو أمر Azure CLI التالي:

az deployment group create --resource-group sfclustertutorialgroup --template-file c:\temp\template.json --parameters c:\temp\parameters.json

إضافة نوع عقدة إلى نظام المجموعة

يتم إعداد كل نوع عقدة معرف في نظام مجموعة "Service Fabric" قيد التشغيل في Azure كمقياس جهاز ظاهري منفصل. يمكن بعد ذلك إدارة كل نوع عقدة بشكل منفصل. يمكنك قياس كل نوع عقدة بشكل مستقل لأعلى أو لأسفل، وفتح مجموعات مختلفة من المنافذ، واستخدام مقاييس ذات سعة مختلفة. يمكنك أيضاً تغيير OS SKU بشكل مستقل والذي يعمل على كل عقدة بنظام المجموعة، ولكن لاحظ أنه لا يمكن أن يكون لديك مزيج من Windows وLinux قيد التشغيل في نموذج نظام المجموعة. لا يمكن أن تحتوي مجموعة العقد/ المقاييس الأحادية على أكثر من 100 عقدة. يمكنك قياس المجموعة أفقياً إلى أكثر من 100 عقدة بإضافة أنواع عقد/ مجموعات مقاييس إضافية. يمكنك قياس المجموعة في أي وقت، حتى عندما يتم تشغيل أحمال العمل بالمجموعة.

تحديث القالب

تصدير ملف قالب ومعلمات من مجموعة الموارد لأحدث عملية نشر. فتح ملف parameters.json. إذا قمت بنشر المجموعة باستخدام نموذج قالب في هذا البرنامج التعليمي، هناك ثلاثة أنواع من العقد في المجموعة. إضافة نوع العقدة الرابعة في هذا المقطع عن طريق تحديث قالب Resource Manager ونشره.

بالإضافة إلى نوع العقدة الجديدة، يمكنك أيضاً إضافة مجموعة مقاييس الجهاز الظاهري المقترنة (التي تعمل في شبكة فرعية منفصلة عن الشبكة الظاهرية) ومجموعة أمان الشبكة. يمكنك اختيار إضافة عنوان IP عام جديد أو موجود وموارد موازن تحميل Azure لمجموعة المقاييس الجديدة. نوع العقدة الجديدة يتميز بمستوى متانة من الفضة وحجم "Standard_D2_V2".

يمكنك في ملف template.json إضافة المعلمات الجديدة التالية:

"nt3InstanceCount": {
    "defaultValue": 5,
    "type": "Int",
    "metadata": {
        "description": "Instance count for node type"
    }
},
"vmNodeType3Size": {
    "defaultValue": "Standard_D2_V2",
    "type": "String"
},

يمكنك في ملف template.json إضافة المعلمات الجديدة التالية:

"lbID3": "[resourceId('Microsoft.Network/loadBalancers',concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType3Name')))]",
"lbIPConfig3": "[concat(variables('lbID3'),'/frontendIPConfigurations/LoadBalancerIPConfig')]",
"lbPoolID3": "[concat(variables('lbID3'),'/backendAddressPools/LoadBalancerBEAddressPool')]",
"lbProbeID3": "[concat(variables('lbID3'),'/probes/FabricGatewayProbe')]",
"lbHttpProbeID3": "[concat(variables('lbID3'),'/probes/FabricHttpGatewayProbe')]",
"lbNatPoolID3": "[concat(variables('lbID3'),'/inboundNatPools/LoadBalancerBEAddressNatPool')]",
"vmNodeType3Name": "[toLower(concat('NT4', variables('vmName')))]",
"vmStorageAccountName3": "[toLower(concat(uniqueString(resourceGroup().id), '1', '3' ))]",
"nt3applicationStartPort": "20000",
"nt3applicationEndPort": "30000",
"nt3ephemeralStartPort": "49152",
"nt3ephemeralEndPort": "65534",
"nt3fabricTcpGatewayPort": "19000",
"nt3fabricHttpGatewayPort": "19080",
"nt3reverseProxyEndpointPort": "19081",
"subnet3Name": "Subnet-3",
"subnet3Prefix": "10.0.3.0/24",
"subnet3Ref": "[concat(variables('vnetID'),'/subnets/',variables('subnet3Name'))]",

يمكنك في ملف template.json إضافة شبكة فرعية جديدة إلى مورد شبكة الاتصال الظاهرية:

{
    "type": "Microsoft.Network/virtualNetworks",
    "name": "[variables('virtualNetworkName')]",
    "apiVersion": "2018-08-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "addressSpace": {
            "addressPrefixes": [
                "[variables('addressPrefix')]"
            ]
        },
        "subnets": [
            ...
            {
                "name": "[variables('subnet3Name')]",
                "properties": {
                    "addressPrefix": "[variables('subnet3Prefix')]",
                    "networkSecurityGroup": {
                        "id": "[resourceId('Microsoft.Network/networkSecurityGroups', concat('nsg', variables('subnet3Name')))]"
                    }
                }
            }
        ]
    },
    "dependsOn": [
        ...
        "[concat('Microsoft.Network/networkSecurityGroups/', concat('nsg', variables('subnet3Name')))]"
    ]
},

يمكنك في ملف template.json إضافة عنوان IP عام جديد وموارد موازن للتحميل:

{
    "type": "Microsoft.Network/publicIPAddresses",
    "name": "[concat(variables('lbIPName'),'-',variables('vmNodeType3Name'))]",
    "apiVersion": "2018-08-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "dnsSettings": {
            "domainNameLabel": "[concat(variables('dnsName'),'-','nt4')]"
        },
        "publicIPAllocationMethod": "Dynamic"
    }
},
        {
    "type": "Microsoft.Network/loadBalancers",
    "name": "[concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType3Name'))]",
    "apiVersion": "2018-08-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "frontendIPConfigurations": [
            {
                "name": "LoadBalancerIPConfig",
                "properties": {
                    "publicIPAddress": {
                        "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(variables('lbIPName'),'-',variables('vmNodeType3Name')))]"
                    }
                }
            }
        ],
        "backendAddressPools": [
            {
                "name": "LoadBalancerBEAddressPool",
                "properties": {}
            }
        ],
        "loadBalancingRules": [
            {
                "name": "LBRule",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[variables('nt3fabricTcpGatewayPort')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[variables('nt3fabricTcpGatewayPort')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[variables('lbProbeID3')]"
                    },
                    "protocol": "tcp"
                }
            },
            {
                "name": "LBHttpRule",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[variables('nt3fabricHttpGatewayPort')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[variables('nt3fabricHttpGatewayPort')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[variables('lbHttpProbeID3')]"
                    },
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortLBRule1",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[parameters('loadBalancedAppPort1')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[parameters('loadBalancedAppPort1')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[concat(variables('lbID3'),'/probes/AppPortProbe1')]"
                    },
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortLBRule2",
                "properties": {
                    "backendAddressPool": {
                        "id": "[variables('lbPoolID3')]"
                    },
                    "backendPort": "[parameters('loadBalancedAppPort2')]",
                    "enableFloatingIP": "false",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPort": "[parameters('loadBalancedAppPort2')]",
                    "idleTimeoutInMinutes": "5",
                    "probe": {
                        "id": "[concat(variables('lbID3'),'/probes/AppPortProbe2')]"
                    },
                    "protocol": "tcp"
                }
            }
        ],
        "probes": [
            {
                "name": "FabricGatewayProbe",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[variables('nt3fabricTcpGatewayPort')]",
                    "protocol": "tcp"
                }
            },
            {
                "name": "FabricHttpGatewayProbe",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[variables('nt3fabricHttpGatewayPort')]",
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortProbe1",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[parameters('loadBalancedAppPort1')]",
                    "protocol": "tcp"
                }
            },
            {
                "name": "AppPortProbe2",
                "properties": {
                    "intervalInSeconds": 5,
                    "numberOfProbes": 2,
                    "port": "[parameters('loadBalancedAppPort2')]",
                    "protocol": "tcp"
                }
            }
        ],
        "inboundNatPools": [
            {
                "name": "LoadBalancerBEAddressNatPool",
                "properties": {
                    "backendPort": "3389",
                    "frontendIPConfiguration": {
                        "id": "[variables('lbIPConfig3')]"
                    },
                    "frontendPortRangeEnd": "4500",
                    "frontendPortRangeStart": "3389",
                    "protocol": "tcp"
                }
            }
        ]
    },
    "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/',concat(variables('lbIPName'),'-',variables('vmNodeType3Name')))]"
    ]
},

يمكنك في ملف template.json، إضافة مجموعة أمان شبكة الاتصال الجديدة وموارد مجموعة مقياس الجهاز الظاهري. تحدد خاصية NodeTypeRef ضمن خصائص ملحق "Service Fabric" من تعيين مقياس الجهاز الظاهري نوع العقدة المحددة من تعيين المقياس.

{
    "type": "Microsoft.Network/networkSecurityGroups",
    "name": "[concat('nsg', variables('subnet3Name'))]",
    "apiVersion": "2018-08-01",
    "location": "[resourceGroup().location]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "securityRules": [
            {
                "name": "allowSvcFabSMB",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "445",
                    "direction": "Inbound",
                    "priority": 3950,
                    "protocol": "*",
                    "sourceAddressPrefix": "VirtualNetwork",
                    "sourcePortRange": "*",
                    "description": "allow SMB traffic within the net, used by fabric to move packages around"
                }
            },
            {
                "name": "allowSvcFabCluser",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "1025-1027",
                    "direction": "Inbound",
                    "priority": 3920,
                    "protocol": "*",
                    "sourceAddressPrefix": "VirtualNetwork",
                    "sourcePortRange": "*",
                    "description": "allow ports within vnet that are used by the fabric to talk between nodes"
                }
            },
            {
                "name": "allowSvcFabEphemeral",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[concat(variables('nt3ephemeralStartPort'), '-', variables('nt3ephemeralEndPort'))]",
                    "direction": "Inbound",
                    "priority": 3930,
                    "protocol": "*",
                    "sourceAddressPrefix": "VirtualNetwork",
                    "sourcePortRange": "*",
                    "description": "allow fabric ephemeral ports within the vnet"
                }
            },
            {
                "name": "allowSvcFabPortal",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[variables('nt3fabricHttpGatewayPort')]",
                    "direction": "Inbound",
                    "priority": 3900,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow port used to access the fabric cluster web portal"
                }
            },
            {
                "name": "allowSvcFabClient",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[variables('nt3fabricTcpGatewayPort')]",
                    "direction": "Inbound",
                    "priority": 3910,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow port used by the fabric client (includes powershell)"
                }
            },
            {
                "name": "allowSvcFabApplication",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[concat(variables('nt3applicationStartPort'), '-', variables('nt3applicationEndPort'))]",
                    "direction": "Inbound",
                    "priority": 3940,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow fabric application ports within the vnet"
                }
            },
            {
                "name": "blockAll",
                "properties": {
                    "access": "Deny",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "*",
                    "direction": "Inbound",
                    "priority": 4095,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "block all traffic except what we've explicitly allowed"
                }
            },
            {
                "name": "allowVNetRDP",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "3389",
                    "direction": "Inbound",
                    "priority": 3960,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow RDP within the net"
                }
            },
            {
                "name": "allowSvcFabReverseProxy",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[variables('nt3reverseProxyEndpointPort')]",
                    "direction": "Inbound",
                    "priority": 3980,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow port used to access the fabric cluster using reverse proxy"
                }
            },
            {
                "name": "allowAppPort1",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[parameters('loadBalancedAppPort1')]",
                    "direction": "Inbound",
                    "priority": 2001,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow public application port 1"
                }
            },
            {
                "name": "allowAppPort2",
                "properties": {
                    "access": "Allow",
                    "destinationAddressPrefix": "*",
                    "destinationPortRange": "[parameters('loadBalancedAppPort2')]",
                    "direction": "Inbound",
                    "priority": 2002,
                    "protocol": "*",
                    "sourceAddressPrefix": "*",
                    "sourcePortRange": "*",
                    "description": "allow public application port 2"
                }
            }
        ]
    }
},
{
    "type": "Microsoft.Compute/virtualMachineScaleSets",
    "sku": {
        "name": "[parameters('vmNodeType3Size')]",
        "capacity": "[parameters('nt3InstanceCount')]",
        "tier": "Standard"
    },
    "name": "[variables('vmNodeType3Name')]",
    "apiVersion": "2018-10-01",
    "location": "[variables('computeLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "overprovision": "[variables('overProvision')]",
        "upgradePolicy": {
            "mode": "Automatic"
        },
        "virtualMachineProfile": {
            "extensionProfile": {
                "extensions": [
                    {
                        "name": "[concat(variables('vmNodeType3Name'),'OMS')]",
                        "properties": {
                            "publisher": "Microsoft.EnterpriseCloud.Monitoring",
                            "type": "MicrosoftMonitoringAgent",
                            "typeHandlerVersion": "1.0",
                            "autoUpgradeMinorVersion": true,
                            "settings": {
                                "workspaceId": "[reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspacename')), '2015-11-01-preview').customerId]"
                            },
                            "protectedSettings": {
                                "workspaceKey": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspacename')),'2015-11-01-preview').primarySharedKey]"
                            }
                        }
                    },
                    {
                        "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType3Name')]",
                        "properties": {
                            "type": "ServiceFabricNode",
                            "autoUpgradeMinorVersion": true,
                            "protectedSettings": {
                                "StorageAccountKey1": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key1]",
                                "StorageAccountKey2": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key2]"
                            },
                            "publisher": "Microsoft.Azure.ServiceFabric",
                            "settings": {
                                "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
                                "nodeTypeRef": "[variables('vmNodeType3Name')]",
                                "dataPath": "D:\\SvcFab",
                                "durabilityLevel": "Silver",
                                "enableParallelJobs": true,
                                "nicPrefixOverride": "[variables('subnet3Prefix')]",
                                "certificate": {
                                    "thumbprint": "[parameters('certificateThumbprint')]",
                                    "x509StoreName": "[parameters('certificateStoreValue')]"
                                }
                            },
                            "typeHandlerVersion": "1.0"
                        }
                    },
                    {
                        "name": "[concat('VMDiagnosticsVmExt','_vmNodeType3Name')]",
                        "properties": {
                            "type": "IaaSDiagnostics",
                            "autoUpgradeMinorVersion": true,
                            "protectedSettings": {
                                "storageAccountName": "[variables('applicationDiagnosticsStorageAccountName')]",
                                "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('applicationDiagnosticsStorageAccountName')),'2015-05-01-preview').key1]",
                                "storageAccountEndPoint": "https://core.windows.net/"
                            },
                            "publisher": "Microsoft.Azure.Diagnostics",
                            "settings": {
                                "WadCfg": {
                                    "DiagnosticMonitorConfiguration": {
                                        "overallQuotaInMB": "50000",
                                        "EtwProviders": {
                                            "EtwEventSourceProviderConfiguration": [
                                                {
                                                    "provider": "Microsoft-ServiceFabric-Actors",
                                                    "scheduledTransferKeywordFilter": "1",
                                                    "scheduledTransferPeriod": "PT5M",
                                                    "DefaultEvents": {
                                                        "eventDestination": "ServiceFabricReliableActorEventTable"
                                                    }
                                                },
                                                {
                                                    "provider": "Microsoft-ServiceFabric-Services",
                                                    "scheduledTransferPeriod": "PT5M",
                                                    "DefaultEvents": {
                                                        "eventDestination": "ServiceFabricReliableServiceEventTable"
                                                    }
                                                }
                                            ],
                                            "EtwManifestProviderConfiguration": [
                                                {
                                                    "provider": "cbd93bc2-71e5-4566-b3a7-595d8eeca6e8",
                                                    "scheduledTransferLogLevelFilter": "Information",
                                                    "scheduledTransferKeywordFilter": "4611686018427387904",
                                                    "scheduledTransferPeriod": "PT5M",
                                                    "DefaultEvents": {
                                                        "eventDestination": "ServiceFabricSystemEventTable"
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                },
                                "StorageAccount": "[variables('applicationDiagnosticsStorageAccountName')]"
                            },
                            "typeHandlerVersion": "1.5"
                        }
                    },
                    {
                        "name": "[concat('VMIaaSAntimalware','_vmNodeType3Name')]",
                        "properties": {
                            "publisher": "Microsoft.Azure.Security",
                            "type": "IaaSAntimalware",
                            "typeHandlerVersion": "1.5",
                            "settings": {
                                "AntimalwareEnabled": "true",
                                "Exclusions": {
                                    "Paths": "D:\\SvcFab;D:\\SvcFab\\Log;C:\\Program Files\\Microsoft Service Fabric",
                                    "Processes": "Fabric.exe;FabricHost.exe;FabricInstallerService.exe;FabricSetup.exe;FabricDeployer.exe;ImageBuilder.exe;FabricGateway.exe;FabricDCA.exe;FabricFAS.exe;FabricUOS.exe;FabricRM.exe;FileStoreService.exe"
                                },
                                "RealtimeProtectionEnabled": "true",
                                "ScheduledScanSettings": {
                                    "isEnabled": "true",
                                    "scanType": "Quick",
                                    "day": "7",
                                    "time": "120"
                                }
                            },
                            "protectedSettings": null
                        }
                    }
                ]
            },
            "networkProfile": {
                "networkInterfaceConfigurations": [
                    {
                        "name": "[concat(variables('nicName'), '-2')]",
                        "properties": {
                            "ipConfigurations": [
                                {
                                    "name": "[concat(variables('nicName'),'-',2)]",
                                    "properties": {
                                        "loadBalancerBackendAddressPools": [
                                            {
                                                "id": "[variables('lbPoolID3')]"
                                            }
                                        ],
                                        "loadBalancerInboundNatPools": [
                                            {
                                                "id": "[variables('lbNatPoolID3')]"
                                            }
                                        ],
                                        "subnet": {
                                            "id": "[variables('subnet3Ref')]"
                                        }
                                    }
                                }
                            ],
                            "primary": true
                        }
                    }
                ]
            },
            "osProfile": {
                "adminPassword": "[parameters('adminPassword')]",
                "adminUsername": "[parameters('adminUsername')]",
                "computernamePrefix": "[variables('vmNodeType3Name')]",
                "secrets": [
                    {
                        "sourceVault": {
                            "id": "[parameters('sourceVaultValue')]"
                        },
                        "vaultCertificates": [
                            {
                                "certificateStore": "[parameters('certificateStoreValue')]",
                                "certificateUrl": "[parameters('certificateUrlValue')]"
                            }
                        ]
                    }
                ]
            },
            "storageProfile": {
                "imageReference": {
                    "publisher": "[parameters('vmImagePublisher')]",
                    "offer": "[parameters('vmImageOffer')]",
                    "sku": "[parameters('vmImageSku')]",
                    "version": "[parameters('vmImageVersion')]"
                },
                "osDisk": {
                    "caching": "ReadOnly",
                    "createOption": "FromImage",
                    "managedDisk": {
                        "storageAccountType": "[parameters('storageAccountType')]"
                    }
                }
            }
        }
    },
    "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
        "[concat('Microsoft.Network/loadBalancers/', concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType3Name')))]",
        "[concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName'))]",
        "[concat('Microsoft.Storage/storageAccounts/', variables('applicationDiagnosticsStorageAccountName'))]"
    ]
},

يمكنك في ملف template.json تحديث مورد نظام المجموعة وإضافة نوع عقد جديدة:

{
    "type": "Microsoft.ServiceFabric/clusters",
    "name": "[parameters('clusterName')]",
    "apiVersion": "2018-02-01",
    "location": "[parameters('clusterLocation')]",
    "tags": {
        "resourceType": "Service Fabric",
        "clusterName": "[parameters('clusterName')]"
    },
    "properties": {
        "nodeTypes": [
            ...
            {
                "name": "[variables('vmNodeType3Name')]",
                "applicationPorts": {
                    "endPort": "[variables('nt3applicationEndPort')]",
                    "startPort": "[variables('nt3applicationStartPort')]"
                },
                "clientConnectionEndpointPort": "[variables('nt3fabricTcpGatewayPort')]",
                "durabilityLevel": "Silver",
                "ephemeralPorts": {
                    "endPort": "[variables('nt3ephemeralEndPort')]",
                    "startPort": "[variables('nt3ephemeralStartPort')]"
                },
                "httpGatewayEndpointPort": "[variables('nt3fabricHttpGatewayPort')]",
                "isPrimary": false,
                "reverseProxyEndpointPort": "[variables('nt3reverseProxyEndpointPort')]",
                "vmInstanceCount": "[parameters('nt3InstanceCount')]"
            }
        ],    
    }
}                

يمكنك في ملف parameters.json إضافة القيم والمعلمات الجديدة التالية:

"nt3InstanceCount": {
    "Value": 5    
},
"vmNodeType3Size": {
    "Value": "Standard_D2_V2"
},

نشر القالب المحدّث

حفظ أي تغييرات على ملفات template.json وparameters.json. لنشر القالب المحدث، يتم تشغيل الأمر التالي:

New-AzResourceGroupDeployment -ResourceGroupName sfclustertutorialgroup -TemplateFile c:\temp\template.json -TemplateParameterFile c:\temp\parameters.json -Name "AddingNodeType"

أو أمر Azure CLI التالي:

az deployment group create --resource-group sfclustertutorialgroup --template-file c:\temp\template.json --parameters c:\temp\parameters.json

إزالة نوع عقدة من نظام المجموعة

بعد إنشاء مجموعة Service Fabric، يمكنك قياس مجموعة أفقياً عن طريق إزالة نوع عقدة (مجموعة مقياس الجهاز الظاهري) وجميع العقد الخاصة به. يمكنك قياس المجموعة في أي وقت، حتى عندما يتم تشغيل أحمال العمل بالمجموعة. مع تغيير حجم نظام المجموعة، تتغير تطبيقاتك تلقائياً أيضاً.

تحذير

لا ينصح باستخدام Remove-AzServiceFabricNodeType لإزالة نوع عقدة من كتلة إنتاج لاستخدامها على أساس متكرر. وهو أمر خطير لأنه يحذف مورد مجموعات مقياس الجهاز الظاهري خلف نوع العقدة.

لإزالة نوع العقدة، قم بتشغيل Remove-AzServiceFabricNodeType cmdlet. نوع العقدة يجب أن يكون بمستوى المتانة الفضية أو الذهبية يقوم cmdlet بحذف مجموعة المقاييس المقترنة بنوع العقدة ويستغرق بعض الوقت لإكماله. ثم قم بتشغيل Remove-ServiceFabricNodeState cmdlet على كل من العقد المراد إزالتها، مما يحذف حالة العقدة ويزيل العقد من المجموعة. تُنقل الخدمات أولاً إلى عقدة أخرى في حالة وجود خدمات بالعقد. إذا لم يتمكن مدير نظام المجموعة من العثور على عقدة للنسخة المتماثلة/ الخدمة، يتم بعد ذلك تأخير العملية/ حظرها.

$groupname = "sfclustertutorialgroup"
$nodetype = "nt4vm"
$clustername = "mysfcluster123"

Remove-AzServiceFabricNodeType -Name $clustername  -NodeType $nodetype -ResourceGroupName $groupname

Connect-ServiceFabricCluster -ConnectionEndpoint mysfcluster123.eastus.cloudapp.azure.com:19000 `
          -KeepAliveIntervalInSec 10 `
          -X509Credential -ServerCertThumbprint <thumbprint> `
          -FindType FindByThumbprint -FindValue <thumbprint> `
          -StoreLocation CurrentUser -StoreName My

$nodes = Get-ServiceFabricNode | Where-Object {$_.NodeType -eq $nodetype} | Sort-Object { $_.NodeName.Substring($_.NodeName.LastIndexOf('_') + 1) } -Descending

Foreach($node in $nodes)
{
    Remove-ServiceFabricNodeState -NodeName $node.NodeName -TimeoutSec 300 -Force 
}

زيادة موارد العقد

بعد إنشاء مجموعة "Service Fabric"، يمكنك تغيير نوع عقدة نظام المجموعة عمودياً (تغيير موارد العقد) أو ترقية نظام التشغيل من نوع العقدة للأجهزة الظاهرية عن طريق استبدال نوع العقدة الأصلية بنوع عقدة جديدة (مع تحديث صورة وحدة VM SKU أو OS). لمزيد من التفاصيل، يرجى الرجوع لتوسيع نطاق نوع عقدة Azure Service Fabric.

هام

لا تحاول أبداً تغيير صورة VM SKU أو OS من مكانها، وهي عملية خطيرة وغير مدعومة.

إذا لم يكن ذلك ممكناً، يمكنك إنشاء نظام مجموعة جديدة واستعادة حالة التطبيق (إذا كان ذلك ممكناً) من مجموعتك القديمة. لن تحتاج إلى استعادة أي حالة خدمة النظام، ويُعاد إنشاؤها عند نشر تطبيقاتك بالمجموعة الجديدة. إذا كنت تقوم بتشغيل تطبيقات عديمة الحالة على نظام المجموعة، فإن كل ما عليك فعله هو نشر التطبيقات بالمجموعة الجديدة، فليس لديك أي شيء لاستعادته.

تحديث القالب

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

يتم تعيين حجم الأجهزة الظاهرية في نوع العقدة الثاني في معلمة vmNodeType1Size. تغيير قيمة المعلمة vmNodeType1Size من Standard_D2_V2 إلى Standard_D3_V2، الذي يضاعف موارد كل مثيل للجهاز الظاهري.

يتم تعيين وحدة SKU VM لأنواع العقد الثلاثة في المعلمة vmImageSku. يجب أن يقترب مرة أخرى تغيير SKU VM من نوع العقدة بعناية ولا يُوصى به لنوع العقدة الأساسية.

نشر القالب المحدّث

حفظ أي تغييرات على ملفات template.json وparameters.json. لنشر القالب المحدث، يتم تشغيل الأمر التالي:

New-AzResourceGroupDeployment -ResourceGroupName sfclustertutorialgroup -TemplateFile c:\temp\template.json -TemplateParameterFile c:\temp\parameters.json -Name "ScaleUpNodeType"

أو أمر Azure CLI التالي:

az deployment group create --resource-group sfclustertutorialgroup --template-file c:\temp\template.json --parameters c:\temp\parameters.json

الخطوات التالية

في هذا البرنامج التعليمي، نتعلم طريقة القيام بما يأتي:

  • إضافة العقد وإزالتها (توسيع النطاق وتضييقه)
  • إضافة أنواع العقد وإزالتها (توسيع النطاق وتحجيمه)
  • زيادة موارد العقد (توسيع نطاقها)

بعد ذلك، تقدم إلى البرنامج التعليمي التالي لمعرفة كيفية تحديث وقت تشغيل المجموعة.