分享方式:


虛擬機器的可靠性

本文針對虛擬機器提供具體的可靠性建議,並詳細說明虛擬機器區域復原與可用性區域,以及跨區域災害復原和商務持續性

有關 Azure 可靠性的結構概觀,請參閱 Azure 可靠性

可靠性建議

本節內含成功復原和可用性的建議。 每個建議都屬以下其中一類(共兩類):

  • 健康情況項目涵蓋的領域包括設定項目,以及構成 Azure 工作負載(例如 Azure 資源組態設定、與其他服務的相依性等)的主要元件的正確函式。

  • 風險項目涵蓋的領域包括可用性和復原需求、測試、監視、部署等其他項目,若不解決,環境將經常出現問題。

可靠性建議優先順序矩陣

每個建議都根據以下優先順序矩陣標記:

映像 優先順序 描述
需要立即修正。
在 3-6 個月內修正。
需要檢閱。

可靠性建議摘要

類別 優先順序 建議
高可用性 使用 Azure 虛擬機器擴展集 Flex,在兩個以上的 VM 上執行生產工作負載
跨可用性區域部署 VM,或將虛擬機器擴展集 Flex 與區域搭配使用
使用可用性設定組,將 VM 移轉到虛擬機器擴展集 Flex
將受控磁碟用於 VM 磁碟
災害復原 使用 Azure Site Recovery 複寫 VM
使用 Azure 備份服務,備份 VM 的資料
效能 資料磁碟上的主應用程式和資料庫資料
生產 VM 應使用固態硬碟
啟用加速網路(AccelNet)
若啟用 AccelNet,您必須手動更新 GuestOS NIC 磁碟
管理 VM-9:監看處於停止狀態的 VM
使用 VM 的維修設定
安全性 VVM 不應有直接關聯的公用 IP
虛擬網路介面有關聯的 NSG
只應為網路虛擬設備啟用 IP 轉接
VM 磁碟的網路存取應設為「停用公用存取並啟用私人存取」
預設啟用磁碟加密和待用資料加密
網路功能 應在虛擬網路等級設定客戶 DNS 伺服器
Storage 共用磁碟只能在叢集伺服器中啟用
合規性 確認 VM 符合 Azure 原則
監視 啟用 VM 深入解析
為所有 Azure 資源設定診斷設定

高可用性

使用虛擬機器擴展集 Flex 在兩個以上的 VM 上執行生產工作負載

為了防止應用程式工作負載因磁碟或 VM 暫時無法使用而停機,建議使用虛擬機器擴展集 Flex 在兩個以上的 VM 上執行生產工作負載。

若要執行生產工作負載,您可以使用:

  • Azure 虛擬機器擴展集用於建立和管理一組負載平衡的 VM。 VM 執行個體的數目可以自動增加或減少,以因應需求或已定義的排程。

  • 可用性區域。 如需可用性區域和 VM 的詳細資訊,請參閱可用性區域支援

// Azure Resource Graph Query
// Find all VMs that are not associated with a VMSS Flex instance
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(properties.virtualMachineScaleSet.id)
| project recommendationId="vm-1", name, id, tags

跨可用性區域部署 VM,或將虛擬機器擴展集 Flex 與區域搭配使用*

建立 VM 時,請使用可用性區域保護應用程式和資料,以免資料中心突然故障。 如需 VM 可用性區域的詳細資訊,請參閱本文件的可用性區域支援

如需瞭解如何在建立 VM 時啟用可用性區域支援,請參閱建立可用性區域支援

如需瞭解如何將現有 VM 移轉到可用性區域支援,請參閱移轉到可用性區域支援

// Azure Resource Graph Query
// Find all VMs that are not assigned to a Zone
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(zones)
| project recommendationId="vm-2", name, id, tags, param1="No Zone"

使用可用性設定組將 VM 移轉到虛擬機器擴展集 Flex

將工作負載從 VM 移轉到虛擬機擴展集 Flex,讓工作負載現代化。

使用虛擬機器擴展集 Flex,可以透過以下兩種方式部署 VM:

  • 跨區域
  • 在同一區域中,但自動跨容錯網域(FD)和更新網域(UD)。

在多層式架構(N-Tier)應用程式中,建議將每個應用程式層放入自己的虛擬機器擴展集 Flex 中。

// Azure Resource Graph Query
// Find all VMs using Availability Sets
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.availabilitySet)
| project recommendationId = "vm-3", name, id, tags, param1=strcat("availabilitySet: ",properties.availabilitySet.id)

將受控磁碟用於 VM 磁碟*

若要讓可用性設定組中的 VM 具更高的可靠性,請使用受控磁碟。 各受控磁碟已充分隔離,以避免單一失敗點。 此外受控磁碟不受儲存體帳戶中 VHD 的 IOPS 限制所約束。

// Azure Resource Graph Query
// Find all VMs that are not using Managed Disks
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(properties.storageProfile.osDisk.managedDisk)
| project recommendationId = "vm-5", name, id, tags

災害復原

使用 Azure Site Recovery 複寫 VM

若使用 Site Recovery 複寫 Azure VM,會持續以非同步方式將所有 VM 磁碟複寫到目標區域。 每隔幾分鐘建立一次復原點,讓您依分鐘順序完成復原點目標(RPO)。 您可以依需求執行不限次數的災害復原演練,而不會影響生產應用程式或進行中的複寫。

若要瞭解如何執行災害復原演練,請參閱執行測試容錯移轉

// Azure Resource Graph Query
// Find all VMs that do NOT have replication with ASR enabled
// Run query to see results.
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| project name, id, tags
| join kind=leftouter (
    recoveryservicesresources
    | where type =~ 'Microsoft.RecoveryServices/vaults/replicationFabrics/replicationProtectionContainers/replicationProtectedItems'
    | where properties.providerSpecificDetails.dataSourceInfo.datasourceType =~ 'AzureVm'
    | project id=properties.providerSpecificDetails.dataSourceInfo.resourceId
    | extend name=strcat_array(array_slice(split(id, '/'), 8, -1), '/')
) on name
| where isnull(id1)
| project-away id1
| project-away name1
| project recommendationId = "vm-4", name, id, tags
| order by id asc

使用 Azure 備份服務,備份 VM 的資料

Azure 備份服務提供簡單、安全且符合成本效益的解決方案來備份您的資料,並從 Microsoft Azure 雲端進行復原。 如需詳細資訊,請參閱何謂 Azure 備份服務

// Azure Resource Graph Query
// Find all VMs that do NOT have Backup enabled
// Run query to see results.
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| project name, id, tags
| join kind=leftouter (
    recoveryservicesresources
    | where type =~ 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems'
    | where properties.dataSourceInfo.datasourceType =~ 'Microsoft.Compute/virtualMachines'
    | project idBackupEnabled=properties.sourceResourceId
    | extend name=strcat_array(array_slice(split(idBackupEnabled, '/'), 8, -1), '/')
) on name
| where isnull(idBackupEnabled)
| project-away idBackupEnabled
| project-away name1
| project recommendationId = "vm-7", name, id, tags
| order by id asc

效能

資料磁碟上的主應用程式和資料庫資料

資料磁碟是連結到 VM 的受控磁碟。 使用資料磁碟儲存應用程式資料,或您需要保留的其他資料。 資料磁碟註冊為 SCSI 磁碟機,並以您選擇的字母標示。 將資料裝載在資料磁碟上,可以輕鬆備份或還原資料。 您也可以移轉磁碟,這樣就不需移動整個 VM 和作業系統。 此外您也可以視需求,選取不同型別、大小和效能的不同磁碟 SKU。 如需資料磁碟的詳細資訊,請參閱資料磁碟

// Azure Resource Graph Query
// Find all VMs that only have OS Disk
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where array_length(properties.storageProfile.dataDisks) < 1
| project recommendationId = "vm-6", name, id, tags

生產 VM 應使用固態硬碟

進階 SSD 磁碟為 I/O 密集型應用程式和生產工作負載提供高效能、低延遲的磁碟支援。 標準 SSD 是符合成本效益的儲存體選項,已針對需要在較低 IOPS 等級中保持一致效能的工作負載最佳化。

建議您:

  • 以最低成本將標準 HDD 磁碟用於開發/測試情節及較不重要的工作負載。
  • 使用進階 SSD 磁碟(而不是標準 HDD 磁碟)搭配具進階功能的 VM。 若有任何單一執行個體 VM 針對所有作業系統磁碟和資料磁碟使用進階儲存體,Azure 保證 VM 連線能力至少達 99.9%。

如果您想從標準 HDD 升級到進階 SSD 磁碟,請思考以下問題:

  • 升級需要重新啟動 VM,此程序需要 3 至 5 分鐘才能完成。
  • 如果是任務關鍵性生產 VM,請針對進階磁碟的成本,評估改進的可用性。

如需 Azure 受控磁碟和磁碟型別的詳細資訊,請參閱 Azure 受控磁碟型別

// Azure Resource Graph Query
// Find all disks with StandardHDD sku attached to VMs
Resources
| where type =~ 'Microsoft.Compute/disks'
| where sku.name == 'Standard_LRS' and sku.tier == 'Standard'
| where managedBy != ""
| project recommendationId = "vm-8", name, id, tags, param1=strcat("managedBy: ", managedBy)

啟用加速網路(AccelNet)

AccelNet 可以對 VM 啟用單一根 I/O 虛擬化(SR-IOV),大幅提升其網路效能。 這個高效能路徑會略過資料路徑中的主機,進而減少延遲、抖動和 CPU 使用率,供支援的 VM 類型中最嚴苛的網路工作負載使用。

如需加速網路的詳細資訊,請參閱加速網路

// Azure Resource Graph Query
// Find all VM NICs that do not have Accelerated Networking enabled
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| mv-expand nic = properties.networkProfile.networkInterfaces
| project name, id, tags, lowerCaseNicId = tolower(nic.id), vmSize = tostring(properties.hardwareProfile.vmSize)
| join kind = inner (
    resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where properties.enableAcceleratedNetworking == false
    | project nicName = split(id, "/")[8], lowerCaseNicId = tolower(id)
    )
    on lowerCaseNicId
| summarize nicNames = make_set(nicName) by name, id, tostring(tags), vmSize
| extend param1 = strcat("NicName: ", strcat_array(nicNames, ", ")), param2 = strcat("VMSize: ", vmSize)
| project recommendationId = "vm-10", name, id, tags, param1, param2
| order by id asc

若啟用 AccelNet,您必須手動更新 GuestOS NIC 驅動程式

若啟用了 AccelNet,Mellanox 介面會取代 GuestOS 中的預設 Azure 虛擬網路介面。 因此 GuestOS NIC 驅動程式由第三方供應商 Mellanox 提供。 Microsoft 維護的 Marketplace 映像隨附 Mellanox 驅動程式最新版本,但您部署 VM 後,需要每六個月手動更新一次 GuestOS NIC 驅動程式。

// cannot-be-validated-with-arg

管理

檢閱處於停止狀態的 VM

VM 執行個體經歷了不同的狀態,包括佈建和各種電源狀態。 如果 VM 處於停止狀態,表示 VM 可能發生問題或不再被需要,您可以將其刪除以降低成本。

// Azure Resource Graph Query
// Find all VMs that are NOT running
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where properties.extended.instanceView.powerState.displayStatus != 'VM running'
| project recommendationId = "vm-9", name, id, tags

使用 VM 的維修設定

為了確保在規劃的時間範圍內完成 VM 更新/中斷,請使用維修組態設定來排程和管理更新。 如需深入瞭解如何使用維修設定管理 VM 更新,請參閱使用維修設定管理 VM 更新

// Azure Resource Graph Query
// Find VMS that do not have maintenance configuration assigned
Resources
| extend resourceId = tolower(id)
| project name, location, type, id, tags, resourceId, properties
| where type =~ 'Microsoft.Compute/virtualMachines'
| join kind=leftouter (
maintenanceresources
| where type =~ "microsoft.maintenance/configurationassignments"
| project planName = name, type, maintenanceProps = properties
| extend resourceId = tostring(maintenanceProps.resourceId)
) on resourceId
| where isnull(maintenanceProps)
| project recommendationId = "vm-22",name, id, tags
| order by id asc

安全性

VM 不應有直接關聯的公用 IP

如果 VM 需要輸出網際網路連線能力,建議使用 NAT 網路閘道或 Azure 防火牆。 NAT 網路閘道或 Azure 防火牆有助於提高服務的安全性和復原,因為這兩種服務都具高可用性和來源網路位址轉譯(SNAT)連接埠。 對於輸出網際網路連線能力,建議使用負載平衡解決方案,例如 Azure Load Balancer 和應用程式閘道。

// Azure Resource Graph Query
// Find all VMs with PublicIPs directly associated with them
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where isnotnull(properties.ipConfigurations)
    | mv-expand ipconfig=properties.ipConfigurations
    | extend publicIp = tostring(ipconfig.properties.publicIPAddress.id)
    | where publicIp != ""
    | project name, nicId = tostring(id), publicIp
) on nicId
| project recommendationId = "vm-12", name, id, tags
| order by id asc

VM 網路介面具有關聯的網路安全性群組(NSG)*

建議將 NSG 與子網或網路介面建立關聯,但不能同時將兩者建立關聯。 與子網路相關聯的 NSG,以及與網路介面相關聯的 NSG 如果都存在規則,這兩個規則可能發生衝突,導致通訊方面的意外問題,需要疑難排解。 如需詳細資訊,請參閱子網路內部流量

// Azure Resource Graph Query
// Provides a list of virtual machines and associated NICs that do have an NSG associated to them and also an NSG associated to the subnet.
Resources
| where type =~ 'Microsoft.Network/networkInterfaces'
| where isnotnull(properties.networkSecurityGroup)
| mv-expand ipConfigurations = properties.ipConfigurations, nsg = properties.networkSecurityGroup
| project nicId = tostring(id), subnetId = tostring(ipConfigurations.properties.subnet.id), nsgName=split(nsg.id, '/')[8]
| parse kind=regex subnetId with '/virtualNetworks/' virtualNetwork '/subnets/' subnet
    | join kind=inner (
        Resources
        | where type =~ 'Microsoft.Network/NetworkSecurityGroups' and isnotnull(properties.subnets)
        | project name, resourceGroup, subnet=properties.subnets
        | mv-expand subnet
        | project subnetId=tostring(subnet.id)
    ) on subnetId
    | project nicId
| join kind=leftouter (
    Resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | where isnotnull(properties.networkProfile.networkInterfaces)
    | mv-expand nic=properties.networkProfile.networkInterfaces
    | project vmName = name, vmId = id, tags, nicId = nic.id, nicName=split(nic.id, '/')[8]
    | extend nicId = tostring(nicId)
) on nicId
| project recommendationId = "vm-13", name=vmName, id = vmId, tags, param1 = strcat("nic-name=", nicName)

只應為網路虛擬設備啟用 IP 轉接

IP 轉送可讓虛擬機器網路介面能夠:

  • 接收以下網路流量:其目的地不是指派給任何 IP 組態 (已指派給網路介面) 的其中一個 IP 位址。

  • 來源 IP 位址若與指派給網路介面 IP 設定的 IP 位址相同,請使用不同的來源 IP 位址傳送網路流量。

有個 VM 負責接收流量並轉接,每個已連結該 VM 的網路介面,必須啟用 IP 轉接設定。 不論 VM 有多個網路介面或連結了單一網路介面,都可以轉接流量。 IP 轉接雖然是 Azure 設定,但 VM 也必須執行能夠轉接流量的應用程式,例如防火牆、WAN 最佳化及負載平衡應用程式。

若要瞭解如何啟用或停用 IP 轉接,請參閱啟用或停用 IP 轉接

// Azure Resource Graph Query
// Find all VM NICs that have IPForwarding enabled. This feature is usually only required for Network Virtual Appliances
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where properties.enableIPForwarding == true
    | project nicId = tostring(id)
) on nicId
| project recommendationId = "vm-14", name, id, tags
| order by id asc

VM 磁碟的網路存取應設為「停用公用存取並啟用私人存取」

建議將 VM 磁碟網路存取設為「停用公用存取並啟用私人存取」,並建立私人端點。 若要瞭解如何建立私人端點,請參閱建立私人端點

// Azure Resource Graph Query
// Find all Disks with "Enable public access from all networks" enabled
resources
| where type =~ 'Microsoft.Compute/disks'
| where properties.publicNetworkAccess == "Enabled"
| project id, name, tags, lowerCaseDiskId = tolower(id)
| join kind = leftouter (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project osDiskVmName = name, lowerCaseOsDiskId = tolower(properties.storageProfile.osDisk.managedDisk.id)
    | join kind = fullouter (
        resources
        | where type =~ 'Microsoft.Compute/virtualMachines'
        | mv-expand dataDisks = properties.storageProfile.dataDisks
        | project dataDiskVmName = name, lowerCaseDataDiskId = tolower(dataDisks.managedDisk.id)
        )
        on $left.lowerCaseOsDiskId == $right.lowerCaseDataDiskId
    | project lowerCaseDiskId = coalesce(lowerCaseOsDiskId, lowerCaseDataDiskId), vmName = coalesce(osDiskVmName, dataDiskVmName)
    )
    on lowerCaseDiskId
| summarize vmNames = make_set(vmName) by name, id, tostring(tags)
| extend param1 = iif(isempty(vmNames[0]), "VMName: n/a", strcat("VMName: ", strcat_array(vmNames, ", ")))
| project recommendationId = "vm-17", name, id, tags, param1
| order by id asc

預設啟用磁碟加密和待用資料加密

受控磁碟有數個可用的加密類型,包括 Azure 磁碟加密 (ADE)、伺服器端加密 (SSE),以及主機加密。

  • Azure 磁碟加密可協助您保護資料安全,以符合您組織的安全性和合規性承諾。
  • Azure 磁碟儲存體伺服器端加密(也稱為待用加密或 Azure 儲存體加密)會在資料儲存在儲存體叢集時,為存放在 Azure 受控磁碟(OS 和資料磁碟)上的資料自動加密。
  • 主機加密可確保存放在 VM 主機(裝載了 VM)上的資料在待用時加密,並以加密方式傳輸到儲存體叢集。
  • 機密磁碟加密將磁碟加密金鑰繫結到 VM 的 TPM,並只讓該 VM 存取受保護的磁碟內容。

如需深入瞭解受控磁碟加密選項,請參閱受控磁碟加密選項概觀

// under-development

網路

應在虛擬網路等級設定 DNS 伺服器

請在虛擬網路中設定 DNS 伺服器,以免整個環境的名稱解析不一致。 如需深入了解 Azure 虛擬網路的名稱解析,請參閱 VM 和雲端服務的名稱解析

// Azure Resource Graph Query
// Find all VM NICs that have DNS Server settings configured in any of the NICs
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | project name, id, dnsServers = properties.dnsSettings.dnsServers
    | extend hasDns = array_length(dnsServers) >= 1
    | where hasDns != 0
    | project name, nicId = tostring(id)
) on nicId
| project recommendationId = "vm-15", name, id, tags
| order by id asc

儲存體

共用磁碟只能在叢集伺服器中啟用

Azure 共用磁碟Azure 受控磁碟的功能,讓您將受控磁碟同時連結到多個 VM。 若將受控磁碟連結到多部 VM,可將新的叢集應用程式部署到 Azure,也可以將現有的叢集應用程式移轉到 Azure。 共用磁碟只適用於將磁碟指派給叢集中多個 VM 成員的情況。

若要深入瞭解如何啟用受控磁碟的共用磁碟,請參閱啟用共用磁碟

// Azure Resource Graph Query
// Find all Disks configured to be Shared. This is not an indication of an issue, but if a disk with this configuration is assigned to two or more VMs without a proper disk control mechanism (like a WSFC) it can lead to data loss
resources
| where type =~ 'Microsoft.Compute/disks'
| where isnotnull(properties.maxShares)
| project id, name, tags, lowerCaseDiskId = tolower(id), diskState = tostring(properties.diskState)
| join kind = leftouter (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project osDiskVmName = name, lowerCaseOsDiskId = tolower(properties.storageProfile.osDisk.managedDisk.id)
    | join kind = fullouter (
        resources
        | where type =~ 'Microsoft.Compute/virtualMachines'
        | mv-expand dataDisks = properties.storageProfile.dataDisks
        | project dataDiskVmName = name, lowerCaseDataDiskId = tolower(dataDisks.managedDisk.id)
        )
        on $left.lowerCaseOsDiskId == $right.lowerCaseDataDiskId
    | project lowerCaseDiskId = coalesce(lowerCaseOsDiskId, lowerCaseDataDiskId), vmName = coalesce(osDiskVmName, dataDiskVmName)
    )
    on lowerCaseDiskId
| summarize vmNames = make_set(vmName) by name, id, tostring(tags), diskState
| extend param1 = strcat("DiskState: ", diskState), param2 = iif(isempty(vmNames[0]), "VMName: n/a", strcat("VMName: ", strcat_array(vmNames, ", ")))
| project recommendationId = "vm-16", name, id, tags, param1, param2
| order by id asc

法規遵循

確認 VM 符合 Azure 原則

務必針對您執行的應用程式,保護虛擬機器 (VM) 的安全。 保護 VM 可包含一或多項 Azure 服務和功能,其中涵蓋保護 VM 的存取權及保護資料的儲存體。 如需深入瞭解如何確保 VM 和應用程式安全,請參閱 Azure VM 的 Azure 原則監管合規性控制

// Azure Resource Graph Query
// Find all VMs in "NonCompliant" state with Azure Policies
PolicyResources
| where type =~ "Microsoft.PolicyInsights/policyStates" and properties.resourceType =~ "Microsoft.Compute/virtualMachines" and properties.complianceState =~ "NonCompliant"
| project
    policyAssignmentName = properties.policyAssignmentName,
    policyDefinitionName = properties.policyDefinitionName,
    lowerCasePolicyDefinitionIdOfPolicyState = tolower(properties.policyDefinitionId),
    lowerCaseVmIdOfPolicyState = tolower(properties.resourceId)
| join kind = leftouter (
    PolicyResources
    | where type =~ "Microsoft.Authorization/policyDefinitions"
    | project lowerCasePolicyDefinitionId = tolower(id), policyDefinitionDisplayName = properties.displayName
    )
    on $left.lowerCasePolicyDefinitionIdOfPolicyState == $right.lowerCasePolicyDefinitionId
| project policyAssignmentName, policyDefinitionName, policyDefinitionDisplayName, lowerCaseVmIdOfPolicyState
| join kind = leftouter (
    Resources
    | where type =~ "Microsoft.Compute/virtualMachines"
    | project vmName = name, vmId = id, vmTags = tags, lowerCaseVmId = tolower(id)
    )
    on $left.lowerCaseVmIdOfPolicyState == $right.lowerCaseVmId
| extend
    param1 = strcat("AssignmentName: ", policyAssignmentName),
    param2 = strcat("DefinitionName: ", policyDefinitionDisplayName),  // Align to Azure portal's term.
    param3 = strcat("DefinitionID: ", policyDefinitionName)            // Align to Azure portal's term.
| project recommendationId = "vm-18", name = vmName, id = vmId, tags = vmTags, param1, param2, param3

監視

啟用 VM 深入解析

啟用 VM 深入解析 可以更清楚了解虛擬機器的健康情況和效能。 VM 深入解析藉由監視 VM 和虛擬機器擴展集的執行流程以及與其他服務的相依性,為您提供效能和健康情況的相關資訊。 VM 深入解析藉由識別效能瓶頸與網路問題,協助提供重要應用程式的可預測效能和可用性。 深入解析也可以協助您了解問題是否與其他相依性相關。

// Azure Resource Graph Query
// Check for VMs without Azure Monitoring Agent extension installed, missing Data Collection Rule or Data Collection Rule without performance enabled.
Resources
| where type == 'microsoft.compute/virtualmachines'
| project idVm = tolower(id), name, tags
| join kind=leftouter (
    InsightsResources
    | where type =~ "Microsoft.Insights/dataCollectionRuleAssociations" and id has "Microsoft.Compute/virtualMachines"
    | project idDcr = tolower(properties.dataCollectionRuleId), idVmDcr = tolower(substring(id, 0, indexof(id, "/providers/Microsoft.Insights/dataCollectionRuleAssociations/"))))
on $left.idVm == $right.idVmDcr
| join kind=leftouter (
    Resources
    | where type =~ "Microsoft.Insights/dataCollectionRules"
    | extend
        isPerformanceEnabled = iif(properties.dataSources.performanceCounters contains "Microsoft-InsightsMetrics" and properties.dataFlows contains "Microsoft-InsightsMetrics", true, false),
        isMapEnabled = iif(properties.dataSources.extensions contains "Microsoft-ServiceMap" and properties.dataSources.extensions contains "DependencyAgent" and properties.dataFlows contains "Microsoft-ServiceMap", true, false)//,
    | where isPerformanceEnabled or isMapEnabled
    | project dcrName = name, isPerformanceEnabled, isMapEnabled, idDcr = tolower(id))
on $left.idDcr == $right.idDcr
| join kind=leftouter (
    Resources
        | where type == 'microsoft.compute/virtualmachines/extensions' and (name contains 'AzureMonitorWindowsAgent' or name contains 'AzureMonitorLinuxAgent')
        | extend idVmExtension = tolower(substring(id, 0, indexof(id, '/extensions'))), extensionName = name)
on $left.idVm == $right.idVmExtension
| where isPerformanceEnabled != 1 or (extensionName != 'AzureMonitorWindowsAgent' and extensionName != 'AzureMonitorLinuxAgent')
| project recommendationId = "vm-20", name, id = idVm, tags, param1 = strcat('MonitoringExtension:', extensionName), param2 = strcat('DataCollectionRuleId:', idDcr), param3 = strcat('isPerformanceEnabled:', isPerformanceEnabled)

為所有 Azure 資源設定診斷設定

平台計量預設會自動傳送至 Azure 監視器計量,且沒有組態。 平台記錄針對 Azure 資源及其依賴的 Azure 平台,提供詳細診斷和稽核資訊,屬於以下其中一個型別:

  • 資源記錄路由到目的地之前,系統不會予以收集。
  • 活動記錄獨立存在,但可以路由到其他位置。

每個 Azure 資源都需要自己的診斷設定,其會定義下列準則:

  • 來源 計量和記錄資料的型別,會傳送到設定所定義的目的地。 可用的類型會因資源類型而有所不同。
  • 目的地:要傳送至的一或多個目的地。

單一診斷設定可以定義每個目的地不超過一個。 如果您想要將資料傳送至一個以上的特定目的地類型 (例如,兩個不同的 Log Analytics 工作區),請建立多個設定。 每個資源最多可以有五個診斷設定。

如需詳細資訊,請參閱 Azure 監視器的診斷設定

// Azure Resource Graph Query
// Find all Virtual Machines without diagnostic settings enabled/with diagnostic settings enabled but not configured both performance counters and event logs/syslogs.
resources
| where type =~ "microsoft.compute/virtualmachines"
| project name, id, tags, lowerCaseVmId = tolower(id)
| join kind = leftouter (
    resources
    | where type =~ "Microsoft.Compute/virtualMachines/extensions" and properties.publisher =~ "Microsoft.Azure.Diagnostics"
    | project
        lowerCaseVmIdOfExtension = tolower(substring(id, 0, indexof(id, "/extensions/"))),
        extensionType = properties.type,
        provisioningState = properties.provisioningState,
        storageAccount = properties.settings.StorageAccount,
        // Windows
        wadPerfCounters = properties.settings.WadCfg.DiagnosticMonitorConfiguration.PerformanceCounters.PerformanceCounterConfiguration,
        wadEventLogs = properties.settings.WadCfg.DiagnosticMonitorConfiguration.WindowsEventLog,
        // Linux
        ladPerfCounters = properties.settings.ladCfg.diagnosticMonitorConfiguration.performanceCounters.performanceCounterConfiguration,
        ladSyslog = properties.settings.ladCfg.diagnosticMonitorConfiguration.syslogEvents
    | extend
        // Windows
        isWadPerfCountersConfigured = iif(array_length(wadPerfCounters) > 0, true, false),
        isWadEventLogsConfigured = iif(isnotnull(wadEventLogs) and array_length(wadEventLogs.DataSource) > 0, true, false),
        // Linux
        isLadPerfCountersConfigured = iif(array_length(ladPerfCounters) > 0, true, false),
        isLadSyslogConfigured = isnotnull(ladSyslog)
    | project
        lowerCaseVmIdOfExtension,
        extensionType,
        provisioningState,
        storageAccount,
        isPerfCountersConfigured = case(extensionType =~ "IaaSDiagnostics", isWadPerfCountersConfigured, extensionType =~ "LinuxDiagnostic", isLadPerfCountersConfigured, false),
        isEventLogsConfigured = case(extensionType =~ "IaaSDiagnostics", isWadEventLogsConfigured, extensionType =~ "LinuxDiagnostic", isLadSyslogConfigured, false)
    )
    on $left.lowerCaseVmId == $right.lowerCaseVmIdOfExtension
| where isempty(lowerCaseVmIdOfExtension) or provisioningState !~ "Succeeded" or not(isPerfCountersConfigured and isEventLogsConfigured)
| extend
    param1 = strcat("DiagnosticSetting: ", iif(isnotnull(extensionType), strcat("Enabled, partially configured (", extensionType, ")"), "Not enabled")),
    param2 = strcat("ProvisioningState: ", iif(isnotnull(provisioningState), provisioningState, "n/a")),
    param3 = strcat("storageAccount: ", iif(isnotnull(storageAccount), storageAccount, "n/a")),
    param4 = strcat("PerformanceCounters: ", case(isnull(isPerfCountersConfigured), "n/a", isPerfCountersConfigured, "Configured", "Not configured")),
    param5 = strcat("EventLogs/Syslogs: ", case(isnull(isEventLogsConfigured), "n/a", isEventLogsConfigured, "Configured", "Not configured"))
| project recommendationId = "vm-21", name, id, tags, param1, param2, param3, param4, param5

可用性區域支援

Azure 可用性區域是每個 Azure 區域內至少三個實體上獨立的資料中心群組。 每個區域內的資料中心都配備了獨立的電源、冷卻和網路基礎結構。 可用性區域的作用是在一個區域受影響時(例如本機區域失敗時),讓其餘兩個區域支援區域服務、容量和高可用性。

這類失敗的範圍可從軟體和硬體故障,擴及到如地震、淹水和火災的事件。 Azure 服務的備援和邏輯隔離功能可以容錯。 如需深入瞭解 Azure 的可用性區域,請參閱區域和可用性區域

支援 Azure 可用性區域的服務,主要提供適度的可靠性和靈活性。 您可以透過兩種方式加以設定。 可採用區域備援(可跨區域自動複寫)或區域性(將執行個體釘選在特定區域)。 兩種方法可以結合使用。 如需區域與區域備援結構的詳細資訊,請參閱使用可用性區域和區域的建議

虛擬機器支援可用性區域,每個受支援的 Azure 區域都有三個可用性區域,虛擬機器也是區域備援且分區。 如需詳細資訊,請參閱可用性區域支援。 客戶負責設定和移轉其虛擬機器以提供可用性。

若要深入瞭解可用性區域整備選項,請參閱:

必要條件

  • 您的虛擬機器 SKU 必須在您所在區域的各個區域中提供使用。 若要檢閱哪些區域支援可用性區域,請參閱支援區域清單

  • 您的 VM SKU 必須在您所在區域的各個區域中提供使用。 若要檢查 VM SKU 可用性,請使用下列其中一種方法:

SLA 調整

可用性區域在實體上是獨立的,提供不同的電源、網路和冷卻,因此 SLA(服務等級協定)增加。 如需相關資訊,請參閱 虛擬機器的 SLA

建立已啟用可用性區域的資源

請先透過以下部署選項,建立啟用了可用性區域的虛擬機器(VM):

分區容錯移轉支援

您可以使用 Site Recovery 服務,將虛擬機器設定為容錯移轉到另一個區域。 如需詳細資訊,請參閱Site Recovery

容錯

虛擬機器可以容錯移轉到叢集的另一台伺服器,VM 的作業系統會在新的伺服器上重新啟動。 您應該參閱災害復原的容錯移轉流程、收集復原規劃中的虛擬機器,以及執行災害復原演練,以確保其容錯解決方案成功。

如需詳細資訊,請參閱站台復原流程

區域關閉體驗

在整個區域中斷期間,您應該預見效能將短暫降低,直到虛擬機器服務自我修復重新平衡了基礎容量,並重回良好區域為止。 自我修復不依賴區域復原; 預計 Microsoft 管理的服務自我修復狀態會使用其他區域的容量,補償遺失的區域。

您也應該為整個區域中斷的可能性做好準備。 如果整個區域服務中斷,將暫時無法使用本機的備援資料複本。 如果啟用了異地複寫,會將Azure 儲存體 blob 和資料表的其他三個副本儲存在不同區域中。 若發生全面性區域中斷或主要區域無法復原的災難,Azure 會將所有 DNS 項目重新對應到異地複寫區域。

區域中斷準備和復原

我們提供以下 Azure 虛擬機器指導,以因應 Azure 虛擬機器應用程式部署所在的整個區域發生服務中斷的情況:

低延遲設計

制定低延遲虛擬機器解決方案時,可以考慮跨區域(次要地區)、跨訂用帳戶(預覽版)和跨分區(預覽版)選項。 如需這些選項的詳細資訊,請參閱支援的還原方法

重要

退出宣告區域感知部署,將放棄因隔離基礎錯誤而獲得的保護。 使用不支援可用性區域的 SKU,或退出可用性區域設定,將強制依賴不遵守區域放置和隔離的資源(包括這些資源的基礎相依性)。 您不應指望這些資源在區域關閉的情節中,還能留存下來。 有效率的調控這類資源的解決方案應定義災害復原策略,並在另一個區域中設定解決方案的復原。

安全部署技術

若選擇使用可用性區域隔離,應使用安全部署技術,為應用程式程式碼和應用程式升級。 除了設定 Azure Site Recovery 之外,也要為 VM 實作以下任一安全部署技術:

雖然 Microsoft 定期執行計劃性維護更新,但在極少數情況下,這些更新可能需要您重新啟動虛擬機器,才能將所需的更新套用到基礎結構。 如需深入瞭解,請參閱排程維護期間的可用性考量

為另一個區域的下一組節點升級之前,應先執行以下工作:

移轉至可用性區域支援

若要瞭解如何將 VM 移轉到可用性區域支援,請參閱將虛擬機器和虛擬機器擴展集移轉到可用性區域支援

跨區域災害復原和商務持續性

災害復原(DR)是指從重大影響事件中復原,例如自然災害或不成功的部署(導致停機和資料遺失)。 無論原因為何,解決災害的最佳辦法是定義完善且經過測試的 DR 方案,以及主動支援 DR 的應用程式設計。 開始制定災害復原方案之前,請參閱設計災害復原策略的建議

Microsoft 在災害復原方面,採取共同責任模型。 在共同責任模型中,Microsoft 確保基準基礎結構和平台服務可供使用。 此時許多 Azure 服務不會自動複寫資料,或從故障區域恢復並交叉複寫到另一個已啟用的區域。 您需要為這些服務制定適合您工作負載的災害復原方案。 在 Azure 平台即服務(PaaS)供應項目上執行的多數服務,都有提供支援災害復原的功能和指導,您可以使用特定服務功能快速復原,制定災害復原方案。

您可以使用跨區域還原,透過配對區域將 Azure VM 還原。 若備份是在次要地區完成,使用跨區域還原可將所有 Azure VM 還原到選取的復原點。 如需跨區域還原的詳細資訊,請參閱我們還原選項中的跨區域表格資料列項目。

多區域地理位置的災害復原

萬一整個區域服務中斷,Microsoft 將努力還原虛擬機器服務。 但您仍須靠其他應用程式專用的備份策略,達到最高可用性。 如需詳細資訊,請參閱 災害復原的資料策略一節。

中斷偵測、通知和管理

虛擬機器的硬體或實體基礎結構可能意外故障。 意外故障可能包括本機網路故障、本機磁碟故障或其他機架等級故障。 若偵測到意外故障,Azure 平台會將虛擬機器自動移轉(修復)到同一資料中心內良好的實體機器。 在修復程序期間,虛擬機器會經歷停機 (重新開機),在某些案例中會遺失暫存磁碟機。 連結的 OS 和資料磁碟一律會予以保留。

如需虛擬機器服務中斷的詳細資訊,請參閱災害復原指導

設定災害復原和中斷偵測

若為虛擬機器設定災害復原,請了解 Azure Site Recovery 提供的功能。 請使用以下方法,為虛擬機器啟用災害復原:

單一區域地理位置的災害復原

設定災害復原後,Azure VM 即可持續複寫到不同目標區域。 如果發生中斷狀況,您可以將 VM 容錯移轉至次要區域,並從該處加以存取。

若使用 Site Recovery 複寫 Azure VM,會以非同步方式將所有 VM 磁碟連續複寫到目標區域。 每隔幾分鐘建立一次復原點,讓您依分鐘順序完成復原點目標(RPO)。 您可以依需求執行不限次數的災害復原演練,而不會影響生產應用程式或進行中的複寫。 如需詳細資訊,請參閱對 Azure 執行災害復原演練

如需詳細資訊,請參閱 Azure VM 結構元件區域配對

容量和主動式災害復原能力

Microsoft 及其客戶在共同責任模型下營運。 共同責任意即,對於客戶應支援的災害復原(客戶應負責的服務),您都必須為他們部署和控制的任何服務,解決災害復原問題。 為確保執行主動式復原,您應該每次都要預先部署次要複本,因為未預先配置的人員在受到影響時不一定有容量可用。

若要部署虛擬機,可以在虛擬機器擴展集上使用靈活的協調流程模式。 各種 VM 大小都可以使用靈活的協調流程模式。 靈活的協調流程將 VM 散布在區域或可用性區域內的容錯網域,因此也提供高可用性(最多 1000 個 VM )。

下一步