我通过Azure门户手动部署了两个高级服务总线示例,它们没有配置地理恢复别名,服务总线示例已经运行了大约一年。
现在,我尝试自动化这些服务总线示例的部署过程,并向其添加georecovery别名资源,如下所示:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"serviceBusNamespaceName": {
"type": "string",
"metadata": {
"description": "Name of the Service Bus namespace"
}
},
"serviceBusQueueName": {
"type": "string",
"metadata": {
"description": "Name of the Queue"
}
},
"serviceBusLocation": {
"type": "string"
},
"sku": {
"type": "object",
"defaultValue": "Standard"
},
"serviceBusTopicName": {
"type": "string"
},
"serviceBusSubscriptionName": {
"type": "string"
},
"isAliasEnabled": {
"type": "bool"
},
"isQueueCreationEnabled": {
"type": "bool"
},
"aliasName": {
"type": "string"
},
"partnerNamespace": {
"type": "string"
}
},
"variables": {
"defaultSASKeyName": "RootManageSharedAccessKey",
"authRuleResourceId": "[resourceId('Microsoft.ServiceBus/namespaces/authorizationRules', parameters('serviceBusNamespaceName'), variables('defaultSASKeyName'))]",
"sbVersion": "2017-04-01"
},
"resources": [
{
"apiVersion": "2018-01-01-preview",
"name": "[parameters('serviceBusNamespaceName')]",
"type": "Microsoft.ServiceBus/Namespaces",
"location": "[parameters('serviceBusLocation')]",
"sku": {
"name": "[parameters('sku').name]",
"tier": "[parameters('sku').tier]",
"capacity": "[parameters('sku').capacity]"
},
"properties": {
"zoneRedundant": false
},
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('aliasName')]",
"type": "disasterRecoveryConfigs",
"condition": "[parameters('isAliasEnabled')]",
"dependsOn": [
"[concat('Microsoft.ServiceBus/namespaces/', parameters('serviceBusNamespaceName'))]"
],
"properties": {
"partnerNamespace": "[parameters('partnerNamespace')]"
}
}
]
}
]
}
我使用相同的模板分别部署主示例和辅助示例。请注意,disasterRecoveryConfigs资源仅在作为主示例时部署。
此模板成功部署了辅助命名空间,但主命名空间部署失败,并出现以下错误:
无法在创建配对之前冻结辅助命名空间,这可能是因为辅助命名空间不为空。
这是正确的,也就是说,辅助命名空间已经创建了一些主题/订阅和队列。我不想删除它们,只想将主命名空间和辅助命名空间配对。
如何才能做到这一点?
2条答案
按热度按时间omvjsjqw1#
我在使用服务总线Geo-Recovery ARM模板时遇到过类似的问题。它的状态是辅助命名空间不为空,这意味着我们必须从辅助命名空间中删除主题和队列,然后再次运行模板。它将工作并基于主命名空间再次创建主题和队列。
但是如果你第二次运行这个模板,你会得到一个不同的异常,那就是第二个命名空间不能被更新(因为它是在地理配对中)。这很奇怪,但是根据设计,当它在地理配对中时,你不能更新第二个命名空间,而且即使你删除了地理配对,你的第二个命名空间应该是空的,没有任何示例,如Topic,Queue等。
让我们考虑一下,现在我想通过使用ARM模板在现有部署中添加主题或队列,然后,当您的模板在管道中或任何地方,需要多次运行并更新现有的主名称空间时,您将遇到这个问题。
单击它。
这将破坏配对&如果不执行此步骤,将出现异常,无法更新辅助命名空间
以上是一次性修复,如果您再次运行模板,则必须再次手动重复上述过程。
大多数情况下,ARM模板在管道中运行,并且可以选择使用Azure CLI或PowerShell中断配对。您应该考虑在YAML文件中添加两个任务
Azure客户端
动力 shell
动力 shell
要删除主题或队列而不是名称空间,请参阅以下文档。
Azure Service Bus Management Common PowerShell commands
此外,如果您在本地运行模板,则可以在运行模板之前添加小脚本或CLI命令。
它的有效问题,连接字符串或数据会发生什么,因为一些客户端已经在使用它,答案是连接字符串不会改变,如果我们删除辅助命名空间,因为在地理恢复方案中,我们应该使用别名连接字符串,所以对现有客户没有影响。
关于数据的第二个问题,答案是辅助命名空间不会存储任何数据,它只有元数据,这意味着在故障切换的情况下辅助命名空间开始工作。
因此,在部署过程中,删除辅助命名空间示例或命名空间不会对任何事情产生影响。
也许你在想,为什么我要遵循这么长的过程,但上述问题,因为地理恢复设计(服务总线,事件集线器,事件网格等),并没有其他选择。
我希望微软将来能想出一些更好的办法。
c2e8gylq2#
如果尝试在具有私有终结点的主命名空间和没有私有终结点的辅助命名空间之间执行create a pairing,配对将失败。
您可以参考此template,它允许您配置Service Bus地理灾难恢复别名。