Configurare gruppi di disponibilità Always On in macchine virtuali di Azure con PowerShellConfigure the Always On availability group on an Azure VM with PowerShell

Prima di iniziare, considerare che ora è possibile completare questa attività nel modello di gestione risorse di Azure.Before you begin, consider that you can now complete this task in Azure resource manager model. Per le nuove distribuzioni è consigliabile usare il modello di Azure Resource Manager.We recommend Azure resource manager model for new deployments. Vedere gruppi di disponibilità Always On di SQL Server in macchine virtuali di Azure.See SQL Server Always On availability groups on Azure virtual machines.

Importante

Per le distribuzioni più recenti si consiglia di usare il modello di Resource Manager.We recommend that most new deployments use the Resource Manager model. Azure offre due diversi modelli di distribuzione per creare e usare le risorse: Gestione risorse e la distribuzione classica.Azure has two different deployment models for creating and working with resources: Resource Manager and classic. Questo articolo illustra l'uso del modello di distribuzione classica.This article covers using the classic deployment model.

Le macchine virtuali di Azure possono consentire agli amministratori di database di abbassare i costi di un sistema di SQL Server a disponibilità elevata.Azure virtual machines (VMs) can help database administrators to lower the cost of a high-availability SQL Server system. Questa esercitazione illustra come implementare un gruppo di disponibilità tramite un end-to-end di SQL Server Always On in un ambiente Azure.This tutorial shows you how to implement an availability group by using SQL Server Always On end-to-end inside an Azure environment. Al termine dell'esercitazione la soluzione SQL Server AlwaysOn in Azure sarà composta dagli elementi seguenti:At the end of the tutorial, your SQL Server Always On solution in Azure will consist of the following elements:

  • Una rete virtuale contenente più subnet, tra cui una subnet front-end e una back-end.A virtual network that contains multiple subnets, including a front-end and a back-end subnet.
  • Un controller di dominio con un dominio di Active Directory.A domain controller with an Active Directory domain.
  • Due macchine virtuali di SQL Server distribuite nella subnet di back-end e aggiunte al dominio di Active Directory.Two SQL Server VMs that are deployed to the back-end subnet and joined to the Active Directory domain.
  • Un cluster di failover di Windows a 3 nodi con il modello di quorum Maggioranza dei nodi.A three-node Windows failover cluster with the Node Majority quorum model.
  • Un gruppo di disponibilità con due repliche con commit sincrono di un database di disponibilità.An availability group with two synchronous-commit replicas of an availability database.

Questo scenario viene scelto per la semplicità, non per la convenienza o altri fattori di Azure.This scenario is a good choice for its simplicity on Azure, not for its cost-effectiveness or other factors. È possibile, ad esempio, ridurre il numero di macchine virtuali per un gruppo di disponibilità con due repliche per risparmiare ore di calcolo in Azure, usando il controller di dominio come condivisione file di controllo del quorum in un cluster di failover a 2 nodi.For example, you can minimize the number of VMs for a two-replica availability group to save on compute hours in Azure by using the domain controller as the quorum file share witness in a two-node failover cluster. Questo metodo consente di ridurre di un'unità il numero di macchine virtuali rispetto alla configurazione precedente.This method reduces the VM count by one from the above configuration.

Questa esercitazione ha lo scopo di illustrare la procedura necessaria per configurare la soluzione descritta in precedenza senza approfondire i dettagli di ogni passaggio.This tutorial is intended to show you the steps that are required to set up the described solution above, without elaborating on the details of each step. Pertanto, anziché illustrare i passaggi di configurazione a livello di interfaccia utente grafica, vengono usati gli script di PowerShell per eseguire rapidamente ogni passaggio.Therefore, instead of providing the GUI configuration steps, it uses PowerShell scripting to take you quickly through each step. Nell’esercitazione si presuppongono le condizioni seguenti:This tutorial assumes the following:

Connettersi alla sottoscrizione di Azure e creare la rete virtualeConnect to your Azure subscription and create the virtual network

  1. In una finestra di PowerShell nel computer locale importare il modulo Azure, scaricare il file di impostazioni di pubblicazione nel computer e connettere la sessione di PowerShell alla sottoscrizione di Azure importando le impostazioni di pubblicazione scaricate.In a PowerShell window on your local computer, import the Azure module, download the publishing settings file to your machine, and connect your PowerShell session to your Azure subscription by importing the downloaded publishing settings.

     Import-Module "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\Azure\Azure.psd1"
     Get-AzurePublishSettingsFile
     Import-AzurePublishSettingsFile <publishsettingsfilepath>
    

    Il comando Get-AzurePublishSettingsFile genera automaticamente un certificato di gestione con Azure e lo scarica nel computer.The Get-AzurePublishSettingsFile command automatically generates a management certificate with Azure and downloads it to your machine. Viene aperto un browser in automatico e viene richiesto di immettere le credenziali dell'account Microsoft per la sottoscrizione di Azure.A browser is automatically opened, and you're prompted to enter the Microsoft account credentials for your Azure subscription. Il file .publishsettings scaricato contiene tutte le informazioni necessarie per gestire la sottoscrizione di Azure.The downloaded .publishsettings file contains all the information that you need to manage your Azure subscription. Dopo aver salvato il file in una directory locale, importarlo usando il comando Import-AzurePublishSettingsFile.After saving this file to a local directory, import it by using the Import-AzurePublishSettingsFile command.

    Nota

    Il file .publishsettings contiene le credenziali (non codificate) usate per amministrare le sottoscrizioni e i servizi di Azure.The .publishsettings file contains your credentials (unencoded) that are used to administer your Azure subscriptions and services. La procedura consigliata di sicurezza per questo file consiste nell'archiviarlo temporaneamente all'esterno delle directory di origine, ad esempio nella cartella Raccolte\Documenti, e quindi eliminarlo al termine dell'importazione.The security best practice for this file is to store it temporarily outside your source directories (for example, in the Libraries\Documents folder), and then delete it after the import has finished. Un utente malintenzionato che riesce ad accedere al file .publishsettings può modificare, creare ed eliminare i servizi di Azure.A malicious user who gains access to the .publishsettings file can edit, create, and delete your Azure services.

  2. Definire una serie di variabili con cui si creerà l'infrastruttura IT cloud.Define a series of variables that you'll use to create your cloud IT infrastructure.

     $location = "West US"
     $affinityGroupName = "ContosoAG"
     $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
     $affinityGroupLabel = "IaaS BI Affinity Group"
     $networkConfigPath = "C:\scripts\Network.netcfg"
     $virtualNetworkName = "ContosoNET"
     $storageAccountName = "<uniquestorageaccountname>"
     $storageAccountLabel = "Contoso SQL HADR Storage Account"
     $storageAccountContainer = "https://" + $storageAccountName + ".blob.core.windows.net/vhds/"
     $winImageName = (Get-AzureVMImage | where {$_.Label -like "Windows Server 2008 R2 SP1*"} | sort PublishedDate -Descending)[0].ImageName
     $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
     $dcServerName = "ContosoDC"
     $dcServiceName = "<uniqueservicename>"
     $availabilitySetName = "SQLHADR"
     $vmAdminUser = "AzureAdmin"
     $vmAdminPassword = "Contoso!000"
     $workingDir = "c:\scripts\"
    

    Prestare attenzione a quanto segue per assicurarsi che i comandi funzionino correttamente in un secondo momento:Pay attention to the following to ensure that your commands will succeed later:

    • Le variabili $storageAccountName e $dcServiceName devono essere univoche perché vengono usate per identificare rispettivamente l'account di archiviazione cloud e il server cloud su Internet.Variables $storageAccountName and $dcServiceName must be unique because they're used to identify your cloud storage account and cloud server, respectively, on the Internet.
    • I nomi specificati per le variabili $affinityGroupName e $virtualNetworkName sono configurati nel documento di configurazione della rete virtuale che verrà usato in seguito.The names that you specify for variables $affinityGroupName and $virtualNetworkName are configured in the virtual network configuration document that you'll use later.
    • $sqlImageName viene specificato il nome aggiornato dell'immagine della macchina virtuale in cui è contenuto SQL Server 2012 Service Pack 1 Enterprise Edition.$sqlImageName specifies the updated name of the VM image that contains SQL Server 2012 Service Pack 1 Enterprise Edition.
    • Per semplicità, Contoso!000 corrisponde alla stessa password usata nel corso dell'esercitazione.For simplicity, Contoso!000 is the same password that's used throughout the entire tutorial.
  3. Creare un set di affinità.Create an affinity group.

     New-AzureAffinityGroup `
         -Name $affinityGroupName `
         -Location $location `
         -Description $affinityGroupDescription `
         -Label $affinityGroupLabel
    
  4. Creare una rete virtuale importando un file di configurazione.Create a virtual network by importing a configuration file.

     Set-AzureVNetConfig `
         -ConfigurationPath $networkConfigPath
    

    Il file di configurazione contiene il documento XML seguente.The configuration file contains the following XML document. In breve, specifica una rete virtuale denominata ContosoNET nel gruppo di affinità denominato ContosoAG.In brief, it specifies a virtual network called ContosoNET in the affinity group called ContosoAG. Include lo spazio degli indirizzi 10.10.0.0/16 e dispone di due subnet, 10.10.1.0/24 e 10.10.2.0/24, che sono rispettivamente la subnet anteriore e la subnet posteriore.It has the address space 10.10.0.0/16 and has two subnets, 10.10.1.0/24 and 10.10.2.0/24, which are the front subnet and back subnet, respectively. Nella subnet anteriore è possibile inserire applicazioni client quali Microsoft SharePoint.The front subnet is where you can place client applications such as Microsoft SharePoint. Nella subnet posteriore è possibile inserire le macchine virtuali di SQL Server.The back subnet is where you'll place the SQL Server VMs. Se si modificano le variabili $affinityGroupName e $virtualNetworkName, è necessario modificare anche i nomi corrispondenti.If you change the $affinityGroupName and $virtualNetworkName variables earlier, you must also change the corresponding names below.

     <NetworkConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
       <VirtualNetworkConfiguration>
         <Dns />
         <VirtualNetworkSites>
           <VirtualNetworkSite name="ContosoNET" AffinityGroup="ContosoAG">
             <AddressSpace>
               <AddressPrefix>10.10.0.0/16</AddressPrefix>
             </AddressSpace>
             <Subnets>
               <Subnet name="Front">
                 <AddressPrefix>10.10.1.0/24</AddressPrefix>
               </Subnet>
               <Subnet name="Back">
                 <AddressPrefix>10.10.2.0/24</AddressPrefix>
               </Subnet>
             </Subnets>
           </VirtualNetworkSite>
         </VirtualNetworkSites>
       </VirtualNetworkConfiguration>
     </NetworkConfiguration>
    
  5. Creare un account di archiviazione associato al gruppo di affinità creato e impostarlo come account di archiviazione corrente nella sottoscrizione.Create a storage account that's associated with the affinity group that you created, and set it as the current storage account in your subscription.

     New-AzureStorageAccount `
         -StorageAccountName $storageAccountName `
         -Label $storageAccountLabel `
         -AffinityGroup $affinityGroupName
     Set-AzureSubscription `
         -SubscriptionName (Get-AzureSubscription).SubscriptionName `
         -CurrentStorageAccount $storageAccountName
    
  6. Creare il server controller di dominio nel nuovo servizio cloud e nel set di disponibilità.Create the domain controller server in the new cloud service and availability set.

     New-AzureVMConfig `
         -Name $dcServerName `
         -InstanceSize Medium `
         -ImageName $winImageName `
         -MediaLocation "$storageAccountContainer$dcServerName.vhd" `
         -DiskLabel "OS" |
         Add-AzureProvisioningConfig `
             -Windows `
             -DisableAutomaticUpdates `
             -AdminUserName $vmAdminUser `
             -Password $vmAdminPassword |
             New-AzureVM `
                 -ServiceName $dcServiceName `
                 –AffinityGroup $affinityGroupName `
                 -VNetName $virtualNetworkName
    

    Questi comandi inoltrati tramite pipe consente di eseguire le operazioni seguenti:These piped commands do the following things:

    • New-AzureVMConfig consente di creare una configurazione di macchina virtuale.New-AzureVMConfig creates a VM configuration.
    • Add-AzureProvisioningConfig fornisce i parametri di configurazione di un server Windows autonomo.Add-AzureProvisioningConfig gives the configuration parameters of a standalone Windows server.
    • Add-AzureDataDisk consente di aggiungere il disco dati che verrà usato per l'archiviazione dei dati di Active Directory, con l'opzione di memorizzazione nella cache impostata su Nessuna.Add-AzureDataDisk adds the data disk that you'll use for storing Active Directory data, with the caching option set to None.
    • New-AzureVM consente di creare un nuovo servizio cloud e la nuova macchina virtuale di Azure nel nuovo servizio cloud.New-AzureVM creates a new cloud service and creates the new Azure VM in the new cloud service.
  7. Al termine del provisioning della nuova macchina virtuale, scaricare il file del desktop remoto nella directory di lavoro.Wait for the new VM to be fully provisioned, and download the remote desktop file to your working directory. Poiché il provisioning della nuova macchina virtuale di Azure richiede molto tempo, tramite il ciclo while verrà continuata l'esecuzione del polling della nuova macchina virtuale finché non è pronta per l'uso.Because the new Azure VM takes a long time to provision, the while loop continues to poll the new VM until it's ready for use.

     $VMStatus = Get-AzureVM -ServiceName $dcServiceName -Name $dcServerName
    
     While ($VMStatus.InstanceStatus -ne "ReadyRole")
     {
         write-host "Waiting for " $VMStatus.Name "... Current Status = " $VMStatus.InstanceStatus
         Start-Sleep -Seconds 15
         $VMStatus = Get-AzureVM -ServiceName $dcServiceName -Name $dcServerName
     }
    
     Get-AzureRemoteDesktopFile `
         -ServiceName $dcServiceName `
         -Name $dcServerName `
         -LocalPath "$workingDir$dcServerName.rdp"
    

A questo punto, il provisioning del server del controller di dominio è completato.The domain controller server is now successfully provisioned. Si configurerà quindi il dominio di Active Directory nel server del controller di dominio.Next, you'll configure the Active Directory domain on this domain controller server. Uscire dalla finestra di PowerShell aperta nel computer locale,Leave the PowerShell window open on your local computer. che verrà usata di nuovo in un secondo momento per creare le due macchine virtuali di SQL Server.You'll use it again later to create the two SQL Server VMs.

Configurare il controller di dominioConfigure the domain controller

  1. Connettersi al server del controller di dominio avviando il file del desktop remoto.Connect to the domain controller server by launching the remote desktop file. Usare il nome utente dell'amministratore della macchina, AzureAdmin e la password Contoso!000specificata durante la creazione della nuova macchina virtuale.Use the machine administrator’s username AzureAdmin and password Contoso!000, which you specified when you created the new VM.
  2. Aprire una finestra di PowerShell in modalità amministratore.Open a PowerShell window in administrator mode.
  3. Eseguire il comando DCPROMO.EXE per installare il dominio corp.contoso.com, con le directory dei dati nell'unità M.Run the following DCPROMO.EXE command to set up the corp.contoso.com domain, with the data directories on drive M.

     dcpromo.exe `
         /unattend `
         /ReplicaOrNewDomain:Domain `
         /NewDomain:Forest `
         /NewDomainDNSName:corp.contoso.com `
         /ForestLevel:4 `
         /DomainNetbiosName:CORP `
         /DomainLevel:4 `
         /InstallDNS:Yes `
         /ConfirmGc:Yes `
         /CreateDNSDelegation:No `
         /DatabasePath:"C:\Windows\NTDS" `
         /LogPath:"C:\Windows\NTDS" `
         /SYSVOLPath:"C:\Windows\SYSVOL" `
         /SafeModeAdminPassword:"Contoso!000"
    

    Al termine dell'esecuzione del comando, la macchina virtuale viene riavviata automaticamente.After the command finishes, the VM restarts automatically.

  4. Connettersi di nuovo al server del controller di dominio avviando il file del desktop remoto.Connect to the domain controller server again by launching the remote desktop file. Questa volta accedere come CORP\Administrator.This time, sign in as CORP\Administrator.

  5. Aprire una finestra di PowerShell in modalità amministratore e importare il modulo Active Directory PowerShell usando il comando seguente:Open a PowerShell window in administrator mode, and import the Active Directory PowerShell module by using the following command:

     Import-Module ActiveDirectory
    
  6. Eseguire i comandi indicati di seguito per aggiungere tre utenti al dominio.Run the following commands to add three users to the domain.

     $pwd = ConvertTo-SecureString "Contoso!000" -AsPlainText -Force
     New-ADUser `
         -Name 'Install' `
         -AccountPassword  $pwd `
         -PasswordNeverExpires $true `
         -ChangePasswordAtLogon $false `
         -Enabled $true
     New-ADUser `
         -Name 'SQLSvc1' `
         -AccountPassword  $pwd `
         -PasswordNeverExpires $true `
         -ChangePasswordAtLogon $false `
         -Enabled $true
     New-ADUser `
         -Name 'SQLSvc2' `
         -AccountPassword  $pwd `
         -PasswordNeverExpires $true `
         -ChangePasswordAtLogon $false `
         -Enabled $true
    

    CORP\Install viene usato per configurare tutti gli elementi correlati alle istanze del servizio SQL Server, al cluster di failover e al gruppo di disponibilità.CORP\Install is used to configure everything related to the SQL Server service instances, the failover cluster, and the availability group. CORP\SQLSvc1 e CORP\SQLSvc2 vengono usati come account del servizio SQL Server per le due macchine virtuali di SQL Server.CORP\SQLSvc1 and CORP\SQLSvc2 are used as the SQL Server service accounts for the two SQL Server VMs.

  7. Eseguire quindi i comandi indicati di seguito per concedere a CORP\Install le autorizzazioni per creare oggetti computer nel dominio.Next, run the following commands to give CORP\Install the permissions to create computer objects in the domain.

     Cd ad:
     $sid = new-object System.Security.Principal.SecurityIdentifier (Get-ADUser "Install").SID
     $guid = new-object Guid bf967a86-0de6-11d0-a285-00aa003049e2
     $ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $sid,"CreateChild","Allow",$guid,"All"
     $corp = Get-ADObject -Identity "DC=corp,DC=contoso,DC=com"
     $acl = Get-Acl $corp
     $acl.AddAccessRule($ace1)
     Set-Acl -Path "DC=corp,DC=contoso,DC=com" -AclObject $acl
    

    Il GUID specificato in precedenza è il GUID per il tipo di oggetto computer.The GUID specified above is the GUID for the computer object type. L'account CORP\Install deve disporre delle autorizzazioni Leggi tutte le proprietà e Crea oggetti computer per creare gli oggetti Active Directory per il cluster di failover.The CORP\Install account needs the Read All Properties and Create Computer Objects permission to create the Active Direct objects for the failover cluster. L'autorizzazione Leggi tutte le proprietà è già assegnata a CORP\Install per impostazione predefinita, quindi non è necessario concederla in modo esplicito.The Read All Properties permission is already given to CORP\Install by default, so you don't need to grant it explicitly. Per altre informazioni sulle autorizzazioni necessarie per creare il cluster di failover, vedere Failover Cluster Step-by-Step Guide: Configuring Accounts in Active Directory (Guida dettagliata del cluster di failover relativa alla configurazione di account in Active Directory).For more information on permissions that are needed to create the failover cluster, see Failover Cluster Step-by-Step Guide: Configuring Accounts in Active Directory.

    Dopo aver completato la configurazione di Active Directory e degli oggetti utente, si procederà alla creazione di due macchine virtuali di SQL Server che verranno aggiunte al dominio.Now that you've finished configuring Active Directory and the user objects, you'll create two SQL Server VMs and join them to this domain.

Creare le macchine virtuali di SQL ServerCreate the SQL Server VMs

  1. Continuare a usare la finestra di PowerShell aperta sul computer locale.Continue to use the PowerShell window that's open on your local computer. Definire le variabili aggiuntive seguenti:Define the following additional variables:

     $domainName= "corp"
     $FQDN = "corp.contoso.com"
     $subnetName = "Back"
     $sqlServiceName = "<uniqueservicename>"
     $quorumServerName = "ContosoQuorum"
     $sql1ServerName = "ContosoSQL1"
     $sql2ServerName = "ContosoSQL2"
     $availabilitySetName = "SQLHADR"
     $dataDiskSize = 100
     $dnsSettings = New-AzureDns -Name "ContosoBackDNS" -IPAddress "10.10.0.4"
    

    L'indirizzo IP 10.10.0.4 viene in genere assegnato alla prima macchina virtuale creata nella subnet 10.10.0.0/16 della rete virtuale di Azure.The IP address 10.10.0.4 is typically assigned to the first VM that you create in the 10.10.0.0/16 subnet of your Azure virtual network. È necessario verificare che corrisponda all'indirizzo del server del controller di dominio eseguendo IPCONFIG.You should verify that this is the address of your domain controller server by running IPCONFIG.

  2. Eseguire i comandi seguenti inoltrati tramite pipe per creare la prima VM nel cluster di failover, denominata ContosoQuorum:Run the following piped commands to create the first VM in the failover cluster, named ContosoQuorum:

     New-AzureVMConfig `
         -Name $quorumServerName `
         -InstanceSize Medium `
         -ImageName $winImageName `
         -MediaLocation "$storageAccountContainer$quorumServerName.vhd" `
         -AvailabilitySetName $availabilitySetName `
         -DiskLabel "OS" |
         Add-AzureProvisioningConfig `
             -WindowsDomain `
             -AdminUserName $vmAdminUser `
             -Password $vmAdminPassword `
             -DisableAutomaticUpdates `
             -Domain $domainName `
             -JoinDomain $FQDN `
             -DomainUserName $vmAdminUser `
             -DomainPassword $vmAdminPassword |
             Set-AzureSubnet `
                 -SubnetNames $subnetName |
                 New-AzureVM `
                     -ServiceName $sqlServiceName `
                     –AffinityGroup $affinityGroupName `
                     -VNetName $virtualNetworkName `
                     -DnsSettings $dnsSettings
    

    Si noti quanto segue riguardo al comando precedente:Note the following regarding the command above:

    • New-AzureVMConfig consente di creare una configurazione di macchina virtuale con il nome del set di disponibilità desiderato.New-AzureVMConfig creates a VM configuration with the desired availability set name. Le macchine virtuali successive verranno create con lo stesso nome del set di disponibilità, affinché siano aggiunte allo stesso set di disponibilità.The subsequent VMs will be created with the same availability set name so that they're joined to the same availability set.
    • Add-AzureProvisioningConfig consente di aggiungere la macchina virtuale al dominio di Active Directory creato.Add-AzureProvisioningConfig joins the VM to the Active Directory domain that you created.
    • Set AzureSubnet consente di inserire la macchina virtuale nella subnet posteriore.Set-AzureSubnet places the VM in the back subnet.
    • New-AzureVM consente di creare un nuovo servizio cloud e la nuova macchina virtuale di Azure nel nuovo servizio cloud.New-AzureVM creates a new cloud service and creates the new Azure VM in the new cloud service. Il parametro DnsSettings specifica che l'indirizzo IP del server DNS per i server nel nuovo servizio cloud è 10.10.0.4,The DnsSettings parameter specifies that the DNS server for the servers in the new cloud service has the IP address 10.10.0.4. ovvero l'indirizzo IP del server del controller di dominio.This is the IP address of the domain controller server. Questo parametro è necessario per consentire di aggiungere correttamente le nuove macchine virtuali nel servizio cloud al dominio di Active Directory.This parameter is needed to enable the new VMs in the cloud service to join to the Active Directory domain successfully. Senza questo parametro, è necessario configurare manualmente le impostazioni IPv4 nella macchina virtuale per usare il server del controller di dominio come server DNS primario dopo il provisioning della macchina virtuale e aggiungere quindi tale macchina virtuale al dominio di Active Directory.Without this parameter, you must manually set the IPv4 settings in your VM to use the domain controller server as the primary DNS server after the VM is provisioned, and then join the VM to the Active Directory domain.
  3. Eseguire i comandi inoltrati tramite pipe indicati di seguito per creare le macchine virtuali di SQL Server, denominate ContosoSQL1 e ContosoSQL2.Run the following piped commands to create the SQL Server VMs, named ContosoSQL1 and ContosoSQL2.

     # Create ContosoSQL1...
     New-AzureVMConfig `
         -Name $sql1ServerName `
         -InstanceSize Large `
         -ImageName $sqlImageName `
         -MediaLocation "$storageAccountContainer$sql1ServerName.vhd" `
         -AvailabilitySetName $availabilitySetName `
         -HostCaching "ReadOnly" `
         -DiskLabel "OS" |
         Add-AzureProvisioningConfig `
             -WindowsDomain `
             -AdminUserName $vmAdminUser `
             -Password $vmAdminPassword `
             -DisableAutomaticUpdates `
             -Domain $domainName `
             -JoinDomain $FQDN `
             -DomainUserName $vmAdminUser `
             -DomainPassword $vmAdminPassword |
             Set-AzureSubnet `
                 -SubnetNames $subnetName |
                 Add-AzureEndpoint `
                     -Name "SQL" `
                     -Protocol "tcp" `
                     -PublicPort 1 `
                     -LocalPort 1433 |
                     New-AzureVM `
                         -ServiceName $sqlServiceName
    
     # Create ContosoSQL2...
     New-AzureVMConfig `
         -Name $sql2ServerName `
         -InstanceSize Large `
         -ImageName $sqlImageName `
         -MediaLocation "$storageAccountContainer$sql2ServerName.vhd" `
         -AvailabilitySetName $availabilitySetName `
         -HostCaching "ReadOnly" `
         -DiskLabel "OS" |
         Add-AzureProvisioningConfig `
             -WindowsDomain `
             -AdminUserName $vmAdminUser `
             -Password $vmAdminPassword `
             -DisableAutomaticUpdates `
             -Domain $domainName `
             -JoinDomain $FQDN `
             -DomainUserName $vmAdminUser `
             -DomainPassword $vmAdminPassword |
             Set-AzureSubnet `
                 -SubnetNames $subnetName |
                 Add-AzureEndpoint `
                     -Name "SQL" `
                     -Protocol "tcp" `
                     -PublicPort 2 `
                     -LocalPort 1433 |
                     New-AzureVM `
                         -ServiceName $sqlServiceName
    

    Si noti quanto segue riguardo i comandi precedenti:Note the following regarding the commands above:

    • New-AzureVMConfig usa lo stesso nome del set di disponibilità del server del controller di dominio e l'immagine di SQL Server 2012 Service Pack 1 Enterprise Edition nella raccolta di macchine virtuali.New-AzureVMConfig uses the same availability set name as the domain controller server, and uses the SQL Server 2012 Service Pack 1 Enterprise Edition image in the virtual machine gallery. Consente inoltre di impostare il disco del sistema operativo sulla modalità sola lettura della cache (scrittura non consentita).It also sets the operating system disk to read-caching only (no write caching). È consigliabile eseguire la migrazione dei file di database in un disco dati separato collegato alla macchina virtuale e configurarlo senza lettura né scrittura nella cache.We recommend that you migrate the database files to a separate data disk that you attach to the VM, and configure it with no read or write caching. Il passaggio successivo consigliato consiste tuttavia nel rimuovere la scrittura nella cache sul disco del sistema operativo, non essendo possibile rimuovere la lettura della cache su tale disco.However, the next best thing is to remove write caching on the operating system disk because you can't remove read caching on the operating system disk.
    • Add-AzureProvisioningConfig consente di aggiungere la macchina virtuale al dominio di Active Directory creato.Add-AzureProvisioningConfig joins the VM to the Active Directory domain that you created.
    • Set AzureSubnet consente di inserire la macchina virtuale nella subnet posteriore.Set-AzureSubnet places the VM in the back subnet.
    • Add-AzureEndpoint consente di aggiungere endpoint di accesso in modo da consentire alle applicazioni client di accedere a tali istanze dei servizi SQL Server su Internet.Add-AzureEndpoint adds access endpoints so that client applications can access these SQL Server services instances on the Internet. A ContosoSQL1 e ContosoSQL2 vengono assegnate porte diverse.Different ports are given to ContosoSQL1 and ContosoSQL2.
    • New-AzureVM consente di creare la nuova macchina virtuale di SQL Server nello stesso servizio cloud di ContosoQuorum.New-AzureVM creates the new SQL Server VM in the same cloud service as ContosoQuorum. È necessario inserire le macchine virtuali nello stesso servizio cloud se si desidera includerle nello stesso set di disponibilità.You must place the VMs in the same cloud service if you want them to be in the same availability set.
  4. Attendere il provisioning di ogni macchina virtuale e per ciascuna macchina virtuale scaricare il relativo file del desktop remoto nella directory di lavoro.Wait for each VM to be fully provisioned and for each VM to download its remote desktop file to your working directory. Il ciclo for si ripete nelle tre nuove macchine virtuali ed esegue i comandi all'interno delle parentesi graffe di livello principale per ognuna di esse.The for loop cycles through the three new VMs and executes the commands inside the top-level curly brackets for each of them.

     Foreach ($VM in $VMs = Get-AzureVM -ServiceName $sqlServiceName)
     {
         write-host "Waiting for " $VM.Name "..."
    
         # Loop until the VM status is "ReadyRole"
         While ($VM.InstanceStatus -ne "ReadyRole")
         {
             write-host "  Current Status = " $VM.InstanceStatus
             Start-Sleep -Seconds 15
             $VM = Get-AzureVM -ServiceName $VM.ServiceName -Name $VM.InstanceName
         }
    
         write-host "  Current Status = " $VM.InstanceStatus
    
         # Download remote desktop file
         Get-AzureRemoteDesktopFile -ServiceName $VM.ServiceName -Name $VM.InstanceName -LocalPath "$workingDir$($VM.InstanceName).rdp"
     }
    

    Completato il provisioning, le macchine virtuali di SQL Server sono in esecuzione, ma vengono installate con SQL Server usando le opzioni predefinite.The SQL Server VMs are now provisioned and running, but they're installed with SQL Server with default options.

Inizializzare le macchine virtuali del cluster di failoverInitialize the failover cluster VMs

In questa sezione è necessario modificare i tre server da usare nel cluster di failover e nell'installazione di SQL Server.In this section, you need to modify the three servers that you'll use in the failover cluster and the SQL Server installation. In particolare:Specifically:

  • Tutti i server: è necessario installare la funzionalità Failover Clustering.All servers: You need to install the Failover Clustering feature.
  • Tutti i server: è necessario aggiungere CORP\Install come amministratore del computer.All servers: You need to add CORP\Install as the machine administrator.
  • Solo ContosoSQL1 e ContosoSQL2: è necessario aggiungere CORP\Install come ruolo sysadmin nel database predefinito.ContosoSQL1 and ContosoSQL2 only: You need to add CORP\Install as a sysadmin role in the default database.
  • Solo ContosoSQL1 e ContosoSQL2: è necessario aggiungere NT AUTHORITY\System come account di accesso con le autorizzazioni seguenti:ContosoSQL1 and ContosoSQL2 only: You need to add NT AUTHORITY\System as a sign-in with the following permissions:

    • Alterare eventuali gruppi di disponibilitàAlter any availability group
    • Connettersi a SQLConnect SQL
    • Visualizzare lo stato del serverView server state
  • Solo ContosoSQL1 e ContosoSQL2: l protocollo TCP è già abilitato nella VM di SQL Server.ContosoSQL1 and ContosoSQL2 only: The TCP protocol is already enabled on the SQL Server VM. Sarà tuttavia necessario aprire il firewall per l'accesso remoto di SQL Server.However, you still need to open the firewall for remote access of SQL Server.

A questo punto è possibile iniziare.Now, you're ready to start. A partire da ContosoQuorum, seguire questa procedura:Beginning with ContosoQuorum, follow the steps below:

  1. Connettersi a ContosoQuorum avviando i file desktop remoto.Connect to ContosoQuorum by launching the remote desktop files. Usare il nome utente dell'amministratore della macchina, AzureAdmin e la password Contoso!000 specificata durante la creazione della macchina virtuale.Use the machine administrator’s username AzureAdmin and password Contoso!000, which you specified when you created the VMs.
  2. Verificare che i computer siano stati aggiunti correttamente a corp.contoso.com.Verify that the computers have been successfully joined to corp.contoso.com.
  3. Prima di procedere, attendere la fine dell'esecuzione delle attività di inizializzazione automatiche nell'ambito dell'installazione di SQL Server.Wait for the SQL Server installation to finish running the automated initialization tasks before proceeding.
  4. Aprire una finestra di PowerShell in modalità amministratore.Open a PowerShell window in administrator mode.
  5. Installare la funzionalità Clustering di failover di Windows.Install the Windows Failover Clustering feature.

     Import-Module ServerManager
     Add-WindowsFeature Failover-Clustering
    
  6. Aggiungere CORP\Install come amministratore locale.Add CORP\Install as a local administrator.

     net localgroup administrators "CORP\Install" /Add
    
  7. Disconnettersi da ContosoQuorum.Sign out of ContosoQuorum. Le operazioni relative a questo server sono state completate.You're done with this server now.

     logoff.exe
    

Inizializzare quindi ContosoSQL1 e ContosoSQL2.Next, initialize ContosoSQL1 and ContosoSQL2. Seguire la procedura descritta di seguito, che è identica per entrambe le macchine virtuali di SQL Server.Follow the steps below, which are identical for both SQL Server VMs.

  1. Connettersi alle due macchine virtuali di SQL Server avviando i file del desktop remoto.Connect to the two SQL Server VMs by launching the remote desktop files. Usare il nome utente dell'amministratore della macchina, AzureAdmin e la password Contoso!000 specificata durante la creazione della macchina virtuale.Use the machine administrator’s username AzureAdmin and password Contoso!000, which you specified when you created the VMs.
  2. Verificare che i computer siano stati aggiunti correttamente a corp.contoso.com.Verify that the computers have been successfully joined to corp.contoso.com.
  3. Prima di procedere, attendere la fine dell'esecuzione delle attività di inizializzazione automatiche nell'ambito dell'installazione di SQL Server.Wait for the SQL Server installation to finish running the automated initialization tasks before proceeding.
  4. Aprire una finestra di PowerShell in modalità amministratore.Open a PowerShell window in administrator mode.
  5. Installare la funzionalità Clustering di failover di Windows.Install the Windows Failover Clustering feature.

     Import-Module ServerManager
     Add-WindowsFeature Failover-Clustering
    
  6. Aggiungere CORP\Install come amministratore locale.Add CORP\Install as a local administrator.

     net localgroup administrators "CORP\Install" /Add
    
  7. Importare il provider PowerShell per SQL Server.Import the SQL Server PowerShell Provider.

     Set-ExecutionPolicy -Execution RemoteSigned -Force
     Import-Module -Name "sqlps" -DisableNameChecking
    
  8. Aggiungere CORP\Install come ruolo sysadmin per l'istanza predefinita di SQL Server.Add CORP\Install as the sysadmin role for the default SQL Server instance.

     net localgroup administrators "CORP\Install" /Add
     Invoke-SqlCmd -Query "EXEC sp_addsrvrolemember 'CORP\Install', 'sysadmin'" -ServerInstance "."
    
  9. Aggiungere NT AUTHORITY\System come account di accesso con le tre autorizzazioni descritte in precedenza.Add NT AUTHORITY\System as a sign-in with the three permissions described above.

     Invoke-SqlCmd -Query "CREATE LOGIN [NT AUTHORITY\SYSTEM] FROM WINDOWS" -ServerInstance "."
     Invoke-SqlCmd -Query "GRANT ALTER ANY AVAILABILITY GROUP TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
     Invoke-SqlCmd -Query "GRANT CONNECT SQL TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
     Invoke-SqlCmd -Query "GRANT VIEW SERVER STATE TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
    
  10. Aprire il firewall per l'accesso remoto di SQL Server.Open the firewall for remote access of SQL Server.

     netsh advfirewall firewall add rule name='SQL Server (TCP-In)' program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' dir=in action=allow protocol=TCP
    
  11. Disconnettersi da entrambe le macchine virtuali.Sign out of both VMs.

     logoff.exe
    

A questo punto, è possibile procedere con la configurazione del gruppo di disponibilità.Finally, you're ready to configure the availability group. Il provider PowerShell per SQL Server verrà usato per eseguire tutte le operazioni in ContosoSQL1.You'll use the SQL Server PowerShell Provider to perform all of the work on ContosoSQL1.

Configurare il gruppo di disponibilitàConfigure the availability group

  1. Connettersi di nuovo a ContosoSQL1 avviando i file del desktop remoto.Connect to ContosoSQL1 again by launching the remote desktop files. Anziché accedere con l'account del computer, eseguire l'accesso con CORP\Install.Instead of signing in by using the machine account, sign in by using CORP\Install.
  2. Aprire una finestra di PowerShell in modalità amministratore.Open a PowerShell window in administrator mode.
  3. Definire le variabili seguenti:Define the following variables:

     $server1 = "ContosoSQL1"
     $server2 = "ContosoSQL2"
     $serverQuorum = "ContosoQuorum"
     $acct1 = "CORP\SQLSvc1"
     $acct2 = "CORP\SQLSvc2"
     $password = "Contoso!000"
     $clusterName = "Cluster1"
     $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
     $db = "MyDB1"
     $backupShare = "\\$server1\backup"
     $quorumShare = "\\$server1\quorum"
     $ag = "AG1"
    
  4. Importare il provider PowerShell per SQL Server.Import the SQL Server PowerShell Provider.

     Set-ExecutionPolicy RemoteSigned -Force
     Import-Module "sqlps" -DisableNameChecking
    
  5. Modificare l'account del servizio SQL Server per ContosoSQL1 in CORP\SQLSvc1.Change the SQL Server service account for ContosoSQL1 to CORP\SQLSvc1.

     $wmi1 = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $server1
     $wmi1.services | where {$_.Type -eq 'SqlServer'} | foreach{$_.SetServiceAccount($acct1,$password)}
     $svc1 = Get-Service -ComputerName $server1 -Name 'MSSQLSERVER'
     $svc1.Stop()
     $svc1.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
     $svc1.Start();
     $svc1.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  6. Modificare l'account del servizio SQL Server per ContosoSQL2 in CORP\SQLSvc2.Change the SQL Server service account for ContosoSQL2 to CORP\SQLSvc2.

     $wmi2 = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $server2
     $wmi2.services | where {$_.Type -eq 'SqlServer'} | foreach{$_.SetServiceAccount($acct2,$password)}
     $svc2 = Get-Service -ComputerName $server2 -Name 'MSSQLSERVER'
     $svc2.Stop()
     $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
     $svc2.Start();
     $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  7. Scaricare CreateAzureFailoverCluster.ps1 dalla pagina Create Failover Cluster for Always On Availability Groups in Azure VM (Creare il cluster di failover per i gruppi di disponibilità AlwaysOn in una VM di Azure) nella directory di lavoro locale.Download CreateAzureFailoverCluster.ps1 from Create Failover Cluster for Always On Availability Groups in Azure VM to the local working directory. Usare lo script per creare un cluster di failover funzionale.You'll use this script to help you create a functional failover cluster. Per informazioni importanti sull'interazione del servizio Clustering di failover di Windows con la rete di Azure, vedere Disponibilità elevata e ripristino di emergenza per SQL Server nelle macchine virtuali di Azure.For important information on how Windows Failover Clustering interacts with the Azure network, see High availability and disaster recovery for SQL Server in Azure Virtual Machines.
  8. Passare alla directory di lavoro e creare il cluster di failover con lo script scaricato.Change to your working directory and create the failover cluster with the downloaded script.

     Set-ExecutionPolicy Unrestricted -Force
     .\CreateAzureFailoverCluster.ps1 -ClusterName "$clusterName" -ClusterNode "$server1","$server2","$serverQuorum"
    
  9. Abilitare i gruppi di disponibilità Always On per le istanze predefinite di SQL Server in ContosoSQL1 e ContosoSQL2.Enable Always On availability groups for the default SQL Server instances on ContosoSQL1 and ContosoSQL2.

     Enable-SqlAlwaysOn `
         -Path SQLSERVER:\SQL\$server1\Default `
         -Force
     Enable-SqlAlwaysOn `
         -Path SQLSERVER:\SQL\$server2\Default `
         -NoServiceRestart
     $svc2.Stop()
     $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
     $svc2.Start();
     $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  10. Creare una directory di backup e concedere le autorizzazioni per gli account del servizio SQL Server.Create a backup directory and grant permissions for the SQL Server service accounts. Usare questa directory per preparare il database di disponibilità nella replica secondaria.You'll use this directory to prepare the availability database on the secondary replica.

     $backup = "C:\backup"
     New-Item $backup -ItemType directory
     net share backup=$backup "/grant:$acct1,FULL" "/grant:$acct2,FULL"
     icacls.exe "$backup" /grant:r ("$acct1" + ":(OI)(CI)F") ("$acct2" + ":(OI)(CI)F")
    
  11. Creare un database in ContosoSQL1 denominato MyDB1, eseguire un backup completo e un backup dei log e ripristinarli in ContosoSQL2 con l'opzione WITH NORECOVERY.Create a database on ContosoSQL1 called MyDB1, take both a full backup and a log backup, and restore them on ContosoSQL2 with the WITH NORECOVERY option.

     Invoke-SqlCmd -Query "CREATE database $db"
     Backup-SqlDatabase -Database $db -BackupFile "$backupShare\db.bak" -ServerInstance $server1
     Backup-SqlDatabase -Database $db -BackupFile "$backupShare\db.log" -ServerInstance $server1 -BackupAction Log
     Restore-SqlDatabase -Database $db -BackupFile "$backupShare\db.bak" -ServerInstance $server2 -NoRecovery
     Restore-SqlDatabase -Database $db -BackupFile "$backupShare\db.log" -ServerInstance $server2 -RestoreAction Log -NoRecovery
    
  12. Creare gli endpoint dei gruppi di disponibilità nelle macchine virtuali di SQL Server e impostare le autorizzazioni appropriate negli endpoint.Create the availability group endpoints on the SQL Server VMs and set the proper permissions on the endpoints.

     $endpoint =
         New-SqlHadrEndpoint MyMirroringEndpoint `
         -Port 5022 `
         -Path "SQLSERVER:\SQL\$server1\Default"
     Set-SqlHadrEndpoint `
         -InputObject $endpoint `
         -State "Started"
     $endpoint =
         New-SqlHadrEndpoint MyMirroringEndpoint `
         -Port 5022 `
         -Path "SQLSERVER:\SQL\$server2\Default"
     Set-SqlHadrEndpoint `
         -InputObject $endpoint `
         -State "Started"
    
     Invoke-SqlCmd -Query "CREATE LOGIN [$acct2] FROM WINDOWS" -ServerInstance $server1
     Invoke-SqlCmd -Query "GRANT CONNECT ON ENDPOINT::[MyMirroringEndpoint] TO [$acct2]" -ServerInstance $server1
     Invoke-SqlCmd -Query "CREATE LOGIN [$acct1] FROM WINDOWS" -ServerInstance $server2
     Invoke-SqlCmd -Query "GRANT CONNECT ON ENDPOINT::[MyMirroringEndpoint] TO [$acct1]" -ServerInstance $server2
    
  13. Creare le repliche di disponibilità.Create the availability replicas.

     $primaryReplica =
         New-SqlAvailabilityReplica `
         -Name $server1 `
         -EndpointURL "TCP://$server1.corp.contoso.com:5022" `
         -AvailabilityMode "SynchronousCommit" `
         -FailoverMode "Automatic" `
         -Version 11 `
         -AsTemplate
     $secondaryReplica =
         New-SqlAvailabilityReplica `
         -Name $server2 `
         -EndpointURL "TCP://$server2.corp.contoso.com:5022" `
         -AvailabilityMode "SynchronousCommit" `
         -FailoverMode "Automatic" `
         -Version 11 `
         -AsTemplate
    
  14. Creare infine il gruppo di disponibilità e creare un join tra la replica secondaria e il gruppo di disponibilità.Finally, create the availability group and join the secondary replica to the availability group.

     New-SqlAvailabilityGroup `
         -Name $ag `
         -Path "SQLSERVER:\SQL\$server1\Default" `
         -AvailabilityReplica @($primaryReplica,$secondaryReplica) `
         -Database $db
     Join-SqlAvailabilityGroup `
         -Path "SQLSERVER:\SQL\$server2\Default" `
         -Name $ag
     Add-SqlAvailabilityDatabase `
         -Path "SQLSERVER:\SQL\$server2\Default\AvailabilityGroups\$ag" `
         -Database $db
    

Passaggi successiviNext steps

SQL Server Always On è stato correttamente implementato mediante la creazione di un gruppo di disponibilità in Azure.You've now successfully implemented SQL Server Always On by creating an availability group in Azure. Per configurare un listener per questo gruppo di disponibilità, vedere Configurare un listener ILB per gruppi di disponibilità Always On in Azure.To configure a listener for this availability group, see Configure an ILB listener for Always On availability groups in Azure.

Per altre informazioni sull'uso di SQL Server in Azure, vedere Panoramica di SQL Server in macchine virtuali di Azure.For other information about using SQL Server in Azure, see SQL Server on Azure virtual machines.