Exportar (0) Imprimir
Expandir todo

Tutorial: Creación de reflejo de la base de datos para la recuperación ante desastres en entornos informáticos híbridos

Actualizado: abril de 2014

Este tutorial muestra cómo implementar la creación de reflejo de la base de datos de SQL Server para la recuperación ante desastres integral en un entorno informático híbrido. En esta configuración, el servidor de bases de datos principal se ejecuta de forma local y el servidor de base de datos reflejada se ejecuta en Azure. Puede implementar este escenario sin una conexión VPN entre Azure y la red local si emplea certificados de servidor. Además, es posible que el servidor de bases de datos principal se ejecute detrás de un dispositivo NAT local si reenvía los puertos adecuados del dispositivo NAT al servidor.

En este tutorial, implementará la creación de reflejo de la base de datos asincrónica como una solución de recuperación ante desastres mediante una máquina virtual (VM) de SQL Server en Azure y en un servidor de bases de datos principal. Al final del tutorial, la solución de alta disponibilidad de SQL Server constará de los elementos siguientes:

  • Una red virtual que se ejecuta en el centro de datos US West (Oeste de EE. UU.)

  • Un equipo con SQL Server (SQLOnPrem) implementado en la red local, que se ejecuta detrás de un dispositivo NAT

  • Una VM de SQL Server (SQLInCloud) implementada en el centro de datos US West de Azure

  • SQLOnPrem es el servidor de bases de datos principal

  • SQLInCloud es el servidor de bases de datos reflejadas

Este tutorial está concebido para mostrarle los pasos necesarios para configurar la solución descrita anteriormente sin profundizar en los detalles de cada paso. Por tanto, en lugar de mostrar los pasos de configuración de la GUI, usa scripting PowerShell y Transact-SQL (T-SQL) para guiarle rápidamente por cada paso. Se supone lo siguiente:

  1. Instale Windows Server 2008 R2 en un equipo local que usará para el servidor de bases de datos principal.

  2. Conecte el equipo a Internet e instale todas las actualizaciones.

  3. Desconecte el equipo de Internet y conéctelo a la misma subred que el dispositivo VPN.

  4. Abra una ventana de Windows PowerShell en modo de administrador.

  5. Si no lo ha hecho todavía esto, cambie el nombre del equipo a SQLOnPRem.

    $computerName = "SQLOnPrem"
    netdom renamecomputer $env:COMPUTERNAME /newname:$computerName /force /reboot
    

    Los equipos se reinician automáticamente después de que se ejecutan estos comandos.

  6. Una vez que los equipos terminen de reiniciarse, inicie sesión como administrador local de nuevo y abra una ventana de Windows PowerShell en modo de administrador.

  7. Especifique el directorio que contiene los archivos de instalación de SQL Server en $installDir e instale SQL Server 2012 y SQL Server Management Studio (SSMS) en el equipo. Al especificar la característica SSMS durante la instalación se instalarán las herramientas de línea de comandos y los proveedores de PowerShell.

    $installDir = "<Directory of SQL Server Setup.exe>"
    
    cd $installDir
    .\Setup.exe `
        /q `
        /ACTION=Install `
        /FEATURES=SQL,SSMS `
        /INSTANCENAME=MSSQLSERVER `
        /SQLSYSADMINACCOUNTS="Administrator" `
        /IACCEPTSQLSERVERLICENSETERMS
    
  8. Abra el firewall para el acceso remoto de 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
    
  9. Habilite el protocolo TCP en la instancia predeterminada y reinicie el servicio SQL Server.

    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")
    $wmi = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $env:COMPUTERNAME
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].IsEnabled = "True"
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].Alter()
    $svc = Get-Service -Name 'MSSQLSERVER'
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $svc.Stop(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc.Start(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout) 
    
  10. Salga de la ventana actual de PowerShell. La próxima vez que abra una ventana de PowerShell, las rutas de acceso binarias de SQL Server se incluirán en la variable de entorno PATH de forma que pueda usar las herramientas de línea de comandos y el proveedor de SQL Server PowerShell para configurar la creación de reflejo de la base de datos.

    Exit
    
  11. Inicie sesión en el dispositivo NAT local como administrador y agregue una regla de reenvío de puerto que envíe todo el tráfico de entrada en el puerto 5022 al puerto 5022 de SQLOnPrem. Para obtener instrucciones acerca de la configuración del dispositivo NAT, consulte el manual del usuario del fabricante correspondiente.

    La configuración del reenvío para el puerto 5022 del dispositivo NAT permite que el tráfico de creación de reflejo de la base de datos fluya desde la VM de Azure hasta el servidor de bases de datos local.

Ha terminado con la configuración de SQL Server local. Después, configurará la VM de SQL Server en Azure.

  1. En una ventana de PowerShell en un equipo que está conectado a Internet, defina una serie de variables que se utilizarán para crear la infraestructura TI en la nube.

    $workingDir = "C:\workingDirectory\"
    $location = "West US"
    $affinityGroupName = "ContosoAG"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $virtualNetworkName = "ContosoNET" 
    $localNetworkName = "ContosoNETLocal"
    $networkConfigPath = $workingDir + "NetworkConfig.xml"
    $storageAccountName = "<uniquestorageaccountname>"
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer = "https://$storageAccountName.blob.core.windows.net/vhds/"
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $serviceName = "<uniqueservicename>"
    $sqlServerName = "SQLInCloud"
    $vmAdminUser = "AzureAdmin" 
    $vmAdminPassword = "Contoso!000"
    $subnetName = "Back"
    

    Preste atención a lo siguiente para asegurarse de que los comandos se ejecutarán correctamente después:

    • Las variables $storageAccountName y $serviceName deben ser únicas porque se usan para identificar la cuenta de almacenamiento en la nube y el servidor en la nube, respectivamente, en Internet. Además, tendrá que usar el valor de $serviceName al configurar la sesión de reflejo de base de datos más adelante.

    • Los nombres especificados para las variables $affinityGroupName, $virtualNetworkName y $subnetName se configuran en el documento de configuración de red virtual que usará más adelante.

    • $sqlImageName especifica el nuevo nombre de la imagen de VM que contiene SQL Server 2012 Service Pack 1 Enterprise Edition.

  2. Importe el módulo de Azure, descargue un archivo de configuración de publicación en el equipo y conecte la sesión de PowerShell a la suscripción de Azure importando la configuración de publicación descargada.

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

    El comando Get-AzurePublishgSettingsFile genera automáticamente un certificado de administración con las descargas de Azure en el equipo. Se abrirá un explorador automáticamente y se le solicitará que escriba las credenciales de la cuenta de Microsoft para su suscripción de Azure. El archivo descargado .publishsettings contiene toda la información que necesita para administrar la suscripción de Azure. Cuando guarde este archivo en un directorio local, impórtelo mediante el comando Import-AzurePublishSettingsFile.

    securityNota de seguridad
    El archivo publishsettings contiene las credenciales (sin codificar) que se usan para administrar sus servicios y suscripciones de Azure. Por seguridad, se recomienda almacenar este archivo temporalmente fuera de los directorios de origen (por ejemplo, en la carpeta Bibliotecas\Documentos) y eliminarlo una vez completada la importación. Un usuario malintencionado que tenga acceso al archivo publishsettings puede editar, crear y eliminar sus servicios de Azure.

  3. Cree un grupo de afinidad.

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. Cree una red virtual importando un archivo de configuración denominado NetworkConfig.xml..

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    El archivo de configuración contiene el siguiente documento XML. En resumen, especifica una red virtual denominada ContosoNET en el grupo de afinidad denominado ContosoAG y tiene el espacio de direcciones 10.10.0.0/16. La subred Back, o 10.1.1.0/24, es donde colocará la VM de SQL Server. Si cambia las variables $affinityGroupName, $virtualNetworkName y $subnetName anteriores, debe cambiar también los nombres correspondientes siguientes.

    <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="Back">
                <AddressPrefix>10.10.1.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration>
    
  5. Cree una cuenta de almacenamiento asociada al grupo de afinidad que creó y establézcalo como cuenta de almacenamiento actual para la suscripción.

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName
    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName
    
  6. Cree la VM de SQL Server en un nuevo servicio en la nube.

    New-AzureVMConfig `
        -Name $sqlServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sqlServerName.vhd" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -Password $vmAdminPassword `
            -AdminUserName $vmAdminUser `
            -DisableAutomaticUpdates ` |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1433 `
                    -LocalPort 1433 | 
                    Add-AzureEndpoint `
                        -Name "SQL" `
                        -Protocol "mirroring" `
                        -PublicPort 5022 `
                        -LocalPort 5022 | 
                        New-AzureVM `
                            -ServiceName $serviceName `
                            –AffinityGroup $affinityGroupName `
                            -VNetName $virtualNetworkName
    

    Esta serie de comandos canalizados hacen lo siguiente:

    • New-AzureVMConfig crea una configuración de VM con la imagen de SQL Server 2012 Service Pack 1 Enterprise Edition en la galería de la máquina virtual. También establece el disco del sistema operativo en solo Caching de lectura (sin Caching de escritura). Se recomienda migrar los archivos de base de datos a un disco de datos independiente que exponga a la VM y configurarlo sin Caching de lectura o escritura. Sin embargo, puesto que el servidor de bases de datos local usa la unidad C para los archivos de base de datos, renunciará a mover los archivos de la base de datos. De esta manera, la VM de Azure puede ser idéntica al servidor local en la configuración.

    • Add-AzureProvisioningConfig especifica un equipo independiente con Windows, establece la contraseña de administrador y deshabilita las actualizaciones automáticas.

    • Add-AzureEndpoint agrega dos extremos de acceso: el puerto 1433 para la conectividad desde las aplicaciones cliente locales y el puerto 5022 para la creación de reflejo de la base de datos a través de Internet.

    • New-AzureVM crea un nuevo servicio en la nube y una nueva VM de Windows en el nuevo servicio en la nube.

  7. Espere a que la nueva VM esté completamente aprovisionada y descargue el archivo de escritorio remoto en el directorio de trabajo. El bucle de tiempo while sigue sondeando la nueva VM de Azure hasta que está lista para usarse.

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

En esta sección, necesita modificar la instalación predeterminada de SQL Server en cada uno de los tres servidores. En concreto, el protocolo TCP ya está habilitado en la VM de SQL Server. Sin embargo, todavía necesita abrir el firewall para el acceso remoto de SQL Server.

Ahora ya puede iniciar. Siga los pasos descritos a continuación, que son idénticos para los tres servidores salvo que se indique lo contrario:

  1. Conéctese a la VM iniciando el archivo de escritorio remoto. Use el nombre de usuario AzureAdmin y la contraseña Contoso!000 del administrador del equipo, que especificó al crear la VM.

  2. Espere a que instalación de SQL Server termine de ejecutar las tareas automatizadas de inicialización antes de continuar.

  3. Abra una ventana de PowerShell en modo de administrador.

  4. Abra el firewall para el acceso remoto de 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
    

Ya puede configurar la creación de reflejo de la base de datos en los dos servidores. Deje abierta la ventana de PowerShell para realizar los pasos siguientes.

  1. En SQLOnPrem, ejecute SQLCMD.EXE en la ventana de PowerShell, y cree y haga copia de seguridad de un certificado de servidor.

    SQLCMD -S SQLOnPrem
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#1>';
    GO
    
    CREATE CERTIFICATE SQLOnPrem_cert WITH SUBJECT = 'SQLOnPrem certificate';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQLOnPrem_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQLOnPrem_cert TO FILE = 'SQLOnPrem_cert.cer';
    GO 
    
  2. En SQLInCloud, ejecute SQLCMD.EXE en la ventana de PowerShell, y cree y haga copia de seguridad de un certificado de servidor.

    SQLCMD -S SQLInCloud
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#2>';
    GO
    
    CREATE CERTIFICATE SQLInCloud_cert WITH SUBJECT = 'SQLInCloud certificate for database mirroring';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQLInCloud_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQLInCloud_cert TO FILE = 'SQLInCloud_cert.cer';
    GO
    
  3. Los certificados se guardan en el directorio de datos predeterminado: C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA. Copie los certificados en el mismo directorio en los dos servidores de forma que cada servidor tenga los certificados de los otros dos servidores. Puesto que las dos VM de SQL Server residen en dos redes virtuales diferentes y no pueden compartir archivos con rapidez, la manera más fácil de copiar archivos a través de las VM consiste en conectar una unidad de disco del equipo local a las sesiones de escritorio remoto y copiar los certificados hacia y desde esa unidad de disco conectada.

  4. En SQLOnPrem, conceda permisos de inicio de sesión a SQLInCloud usando su certificado.

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQLInCloud_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQLInCloud_cert.cer';
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  5. En SQLInCloud, conceda permisos de inicio de sesión a SQLOnPrem usando su certificado.

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQLOnPrem_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQLOnPrem_cert.cer'
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  6. En SQLOnPrem, cree una base de datos y realice una copia de seguridad completa y una copia de seguridad de registros.

    CREATE database MyDB1
    GO
    
    BACKUP DATABASE MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak';
    GO
    
    BACKUP LOG MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log';
    GO 
    
    
  7. Copia los archivos de copia de seguridad a SQLInCloud en el directorio siguiente: C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP.

  8. En SQLInCloud, restaure las copias de seguridad de la base de datos con la opción WITH NORECOVERY y habilítelo como asociado de creación de reflejo.

    RESTORE DATABASE MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak' WITH NORECOVERY;
    GO
    
    RESTORE LOG MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log' WITH NORECOVERY;
    GO
    
    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://<NAT_PUBLIC_IP_ADDRESS>:5022';
    GO
     
    
    

    Tenga en cuenta que debe proporcionar la dirección IP pública para el dispositivo NAT local en lugar del nombre de host de SQLOnPrem. SQLInCloud no puede conectarse a SQLOnPrem directamente y se debe enviar el tráfico a SQLOnPrem desde el dispositivo NAT. Ya ha configurado el reenvío de puerto en el dispositivo NAT local para el puerto 5022, por lo que el comando ALTER DATABASE debe ejecutarse correctamente.

  9. En SQLOnPrem, habilite SQLOnPrem como un asociado de creación de reflejo.

    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://<uniqueservicename>.cloudapp.net:5022';
    GO
    

    Observe que se usa el nombre del servicio en la nube único,<uniqueservicename>.cloudapp.net, en lugar del nombre de host de SQLInCloud. Ya ha abierto el extremo de creación de reflejo de la base de datos predeterminado, el puerto 5022, al crear SQLInCloud.

Enhorabuena. Has configurado correctamente la creación de reflejo de la base de datos en un entorno informático híbrido mediante certificados. Tenga en cuenta que como los servidores tienen acceso uno a otro usando el nombre de servicio en la nube y el dispositivo NAT en lugar de los nombres de instancia, el monitor de creación de reflejo de la base de datos no se puede conectar al nombre de instancia del servidor remoto para consultar el estado. Para supervisar la sesión de creación de reflejo de la base de datos en el monitor de creación de reflejo de la base de datos, siga las instrucciones que se indican a continuación:

  1. En SQLInCloud, habilite la autenticación de SQL Server. Para obtener más información, vea Modo de autenticación del servidor de cambios.

  2. En SQLInCloud, cree un usuario sysadmin que use la autenticación de SQL Server. Para obtener más información, vea Crear un inicio de sesión.

  3. En SQLOnPrem, en SSMS, conéctese a SQLInCloud usando <uniqueservicename>.cloudapp.net como nombre de servidor y Autenticación de SQL Server como el modo de autenticación.

  4. Desde la conexión del motor de base de datos establecida con SQLInCloud, inicie el monitor de creación de reflejo de la base de datos. Para obtener más información, vea Iniciar el Monitor de creación de reflejo de la base de datos (SQL Server Management Studio).

Mostrar:
© 2014 Microsoft