Crear un clúster
En esta sección se describen las tareas de compilación necesarias para crear el clúster de migración tras error de servidor Windows (WSFC) y el grupo de disponibilidad.
Esta guía presupone que:
- Tenga al menos dos servidores que ejecuten Windows 2019 y SQL Server 2019 para el clúster.
- Tener un host bastión con acceso externo a Internet.
- Haber desplegado el directorio activo.
Instalar la característica Failover Clustering
-
RDP al primer servidor SQL utilizando un usuario de la cuenta de grupo de administradores de SQL y abra una sesión de PowerShell.
-
Añada el grupo de administradores de SQL al grupo de usuarios de gestión remota local para que los usuarios de este grupo puedan ejecutar mandatos remotos.
-
Permitir el puerto TCP de entrada 5022 en el servidor ya que este puerto se utiliza para el tráfico de grupo de disponibilidad. Instale la característica Failover Clustering y, a continuación, reinicie el servidor:
$domainnb = "<NB_Domain>" $group = $domainnb + "\SQLAdmins" Add-LocalGroupMember -Group "Remote Management Users" -Member $group New-NetFirewallRule -DisplayName 'SQL-AG-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5022 Install-WindowsFeature –Name Failover-Clustering –IncludeManagementTools Restart-Computer -Force
-
Repita el procedimiento para el segundo servidor SQL.
Crear un WSFC y habilitar SQL siempre activado
-
RDP al primer servidor SQL utilizando un usuario de la cuenta de grupo de administradores de SQL y abra una sesión de PowerShell.
-
Ejecute una prueba de validación de clúster. Ignore los avisos de "un par de interfaces de red", ya que esto es normal para este despliegue.
-
Si no hay errores, cree un clúster WSFC con un nombre de
wsfc01
que incluya los dos servidores SQL<hostname1>
y<hostname2>
. La opción-ManagementPointNetworkType Distributed
utiliza la dirección IP de nodo del servidor virtual, lo que significa que el direccionamiento IP secundario en la interfaz no es necesario. Esta opción crea un nombre de red distribuida (DNN), que direcciona el tráfico al recurso en clúster adecuado. -
A continuación, el quórum de clúster se configura para Node y Mayoría de disco utilizando una compartición de archivos en fs01,
\\fs01\clusterwitness-wsfc01
$sqldb01 = "<hostname1>" $sqldb02 = "<hostname2>" Test-Cluster -Node $sqldb01, $sqldb02 New-Cluster -Name wsfc01 -Node $sqldb01, $sqldb02 -ManagementPointNetworkType Distributed Set-ClusterQuorum -NodeAndFileShareMajority \\fs01\clusterwitness-wsfc01 Enable-SqlAlwaysOn -ServerInstance sqldb01, sqldb02 -Force
Esta actividad no tiene que repetirse en el segundo nodo
Crear los puntos finales
-
RDP al primer servidor SQL utilizando un usuario de la cuenta de grupo de administradores de SQL y abra una sesión de PowerShell.
-
Para participar en grupos de disponibilidad Siempre activado, una instancia de servidor requiere su propio punto final, que utiliza el puerto TCP 5022 para enviar y recibir tráfico entre las instancias de servidor que alojan réplicas de disponibilidad.
-
Los siguientes mandatos PowerShell se utilizan para configurar estos puntos finales,
Hadr_endpoint
en las instancias de SQL predeterminadas (DEFAULT) en los servidores SQL;<hostname1>`` and <hostname2>
y habilita el cifrado entre los puntos finales:$sqldb01 = "<hostname1>" $sqldb02 = "<hostname2>" $domainnb = "<NB_Domain>" $user = $domainnb + "\sqlsvc" $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 + "\DEFAULT" $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb02 + "\DEFAULT" $endpoint1 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb01 -Encryption Required -EncryptionAlgorithm Aes -Owner $user Set-SqlHadrEndpoint -InputObject $endpoint1 -State "Started" $endpoint2 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb02 -Encryption Required -EncryptionAlgorithm Aes -Owner $user Set-SqlHadrEndpoint -InputObject $endpoint2 -State "Started"
Para otorgar permisos de conexión al servicio de dominio utilizado por los puntos finales, son necesarios los pasos siguientes. Si no se realiza este paso, los puertos de punto final no se iniciarán y no aparecerán en un listado de netstat -a
:
- Inicie SQL Server Management Studio (SSMS) en el host de réplica primario y conéctese a la réplica primaria.
- Expanda Seguridad, pulse con el botón derecho del ratón en Inicios de sesión y seleccione Nuevo inicio de sesión.
- Pulse Buscar y especifique la cuenta de usuario \sqlserver\sqlsvc y, a continuación, pulse Aceptar.
- Pulse con el botón derecho del ratón en el inicio de sesión creado y seleccione Propiedades.
- Haga clic en Securables y, a continuación, busque.
- En el diálogo Añadir objetos, seleccione Objetos específicos y haga clic en Aceptar.
- En el diálogo Seleccionar objetos, haga clic en Tipos de objeto y seleccione Puntos finales.
- Pulse Examinar para seleccionar el nombre de objeto.
- Seleccione Hadr_endpoint y pulse Aceptar.
- En el permiso para Hadr_endpoint, otorgue explícitamente permiso de conexión a este objeto.
Crear una base de datos de prueba
Para configurar un grupo de disponibilidad, una base de datos debe estar disponible en el nodo primario y, a continuación, una copia de esta base de datos disponible en el nodo secundario. Esta tarea crea una base de datos de prueba y, a continuación, utiliza una operación de copia de seguridad y restauración, a través de una compartición de archivos, copia la base de datos en el nodo secundario.
-
RDP al primer servidor SQL utilizando un usuario de la cuenta de grupo de administradores de SQL y abra una sesión de PowerShell. Es importante establecer la modalidad de recuperación en
Full
para bases de datos utilizadas en grupos de disponibilidad:$sql = " CREATE DATABASE [TestDatabase] CONTAINMENT = NONE ON PRIMARY ( NAME = N'TestDatabase', FILENAME = N'D:\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 1048576KB , FILEGROWTH = 262144KB ) LOG ON ( NAME = N'MyDatabase_log', FILENAME = N'E:\MSSQL15.MSSQLSERVER\MSSQL\Logs\TestDatabase_log.ldf' , SIZE = 524288KB , FILEGROWTH = 131072KB ) GO USE [master] GO ALTER DATABASE [TestDatabase] SET RECOVERY FULL GO ALTER AUTHORIZATION ON DATABASE::[TestDatabase] TO [sa] GO " Invoke-SqlCmd -ServerInstance sqldb01 -Query $sql
-
Prepare la base de datos secundaria utilizando los mandatos
Backup-SqlDatabase
yRestore-SqlDatabase
para crear una copia de seguridad deTestDatabase
en<hostname1>
enTempShare
en<file_share_host>
, la instancia de SQL Server que aloja la réplica primaria. Restaure la copia de seguridad en<hostname2>
, que aloja la réplica secundaria. Se debe utilizar el parámetro de restauraciónNoRecovery
.$sqldb01 = "<hostname1>" $sqldb02 = "<hostname2>" $filesharehost = "<file_share_host>" $backupfiledata = "\\" + $filesharehost +"\TempShare\TestDatabase.bak" $backupfilelog = "\\" + $filesharehost +"\TempShare\TestDatabase.trn" Backup-SqlDatabase -Database "TestDatabase" -ServerInstance $sqldb01 -BackupFile $backupfiledata -CopyOnly Backup-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb01 -BackupAction Log -CopyOnly Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfiledata -ServerInstance $sqldb02 -NoRecovery Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb02 -RestoreAction Log -NoRecovery
La nueva base de datos secundaria está en estado RESTORE. Hasta que se une al grupo de disponibilidad, no es accesible.
Crear un grupo de disponibilidad
Las bases de datos añadidas a un grupo de disponibilidad se conocen como bases de datos de disponibilidad. Al añadir bases de datos, la base de datos debe ser una base de datos en línea de lectura-escritura y existir en la instancia de servidor que alojará la réplica primaria en el WSFC. Cuando se añade, la base de datos se une al grupo de disponibilidad como base de datos primaria y permanece disponible para los clientes. No existe ninguna base de datos secundaria hasta que las copias de seguridad de la base de datos primaria se restauren en la instancia de servidor que se convertirá en la réplica secundaria. La nueva base de datos secundaria está en estado RESTORE hasta que se une al grupo de disponibilidad. Consulte Utilizar inicialización automática para inicializar una réplica secundaria para un grupo de disponibilidad Siempre activado si no se utiliza el método de copia de seguridad y restauración.
-
RDP al primer servidor SQL utilizando un usuario de la cuenta de grupo de administradores de SQL y abra una sesión de PowerShell.
-
Para asegurarse de que no obtiene errores de vía de acceso, utilice
Invoke-SQLCmd
, que fuerza la carga de la biblioteca de SQL PowerShell, a la que se puede acceder a través del árbol de unidades de PowerShell. PowerShell trata los objetos en SQL Server de forma similar a los archivos de un directorio. Sustituya<hostname1>
por el nombre de host del servidor SQL:invoke-sqlcmd cd SQLSERVER:\SQL\<hostname1>
-
Para crear el grupo de disponibilidad, el mandato
New-SqlAvailabilityReplica
con el parámetro -AsTemplate, se utiliza para crear un objeto de réplica de disponibilidad en memoria para cada una de las dos réplicas de disponibilidad que se incluirán en el grupo de disponibilidad. A continuación, el grupo de disponibilidad se crea utilizando el mandatoNew-SqlAvailabilityGroup
y haciendo referencia a los objetos de réplica de disponibilidad.AutomatedBackupPreference Primary
se utiliza para especificar que las copias de seguridad siempre deben producirse en la réplica primaria, mientras que-FailureConditionLevel OnCriticalServerErrors
especifica que la migración tras error automática se desencadena cuando se produce un error de servidor crítico. Es posible utilizar la opción-SeedingMode Automatic
que habilita la inicialización directa, ya que este método no requiere la copia de seguridad y restauración de una copia de la base de datos primaria. Para SQL 2019, el número de versión es 15.Consulte la documentación de New-SqlAvailabilityGroup para obtener descripciones de otros parámetros.
$sqldb01 = "<hostname1>" $sqldb02 = "<hostname2>" $sqldb01fqdn = "<fqdn1>" $sqldb02fqdn = "<fqdn2>" $endpointurl1 "TCP://" + $sqldb01fqdn + ":5022" $endpointurl2 "TCP://" + $sqldb02fqdn + ":5022" $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 +" \DEFAULT" $primaryReplica = New-SqlAvailabilityReplica -Name $sqldb01 -EndpointURL $endpointurl1 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate $secondaryReplica = New-SqlAvailabilityReplica -Name $sqldb02 -EndpointURL $endpointurl2 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate New-SqlAvailabilityGroup -Name "AG01" -Path $pathsqldb01 -AvailabilityReplica @($primaryReplica,$secondaryReplica) -Database "TestDatabase" -ClusterType WSFC -AutomatedBackupPreference Primary -FailureConditionLevel OnCriticalServerErrors
-
Una la réplica secundaria al grupo de disponibilidad con los mandatos siguientes. La unión coloca la base de datos secundaria en el estado ONLINE e inicia la sincronización de datos con la base de datos primaria correspondiente. La sincronización de datos es el proceso mediante el cual los cambios en una base de datos primaria se reproducen en una base de datos secundaria. La sincronización de datos implica que la base de datos primaria envía registros de transacciones a la base de datos secundaria.
$sqldb02 = "<hostname2>" $pathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT" Join-SqlAvailabilityGroup -Path $pathsqldb02 -Name "AG01" -ClusterType WSFC
-
Inicie la sincronización de datos uniendo cada base de datos secundaria al grupo de disponibilidad:
$sqldb02 = "<hostname2>" $agpathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT\AvailabilityGroups\AG01" Add-SqlAvailabilityDatabase -Path $agpathsqldb02 -Database "TestDatabase"
-
Utilice el mandato dir para verificar el contenido del nuevo grupo de disponibilidad, por ejemplo,
dir SQLSERVER:\SQL\sqldb01\DEFAULT\AvailabilityGroups\AG01
.
Crear el nombre de red distribuida del grupo de disponibilidad
Con SQL Server en IBM Cloud VPC, el nombre de red distribuida (DNN) direcciona el tráfico al recurso en clúster adecuado. El escucha (DNN) sustituye al escucha de grupo de disponibilidad de nombre de red virtual (VNN) tradicional cuando se utiliza con grupos de disponibilidad Siempre activado y simplifica el despliegue en un entorno de nube.
Los escuchas DNN están diseñados para escuchar en un puerto exclusivo. La entrada DNS para el nombre de escucha se resolverá en todas las direcciones IP de las réplicas del grupo de disponibilidad. Puesto que SQL Server está a la escucha en el puerto 1433, el puerto 1433 no se puede utilizar para ningún escucha DNN.
RDP al primer servidor SQL utilizando un usuario de la cuenta de grupo de administradores SQL y abra una sesión de PowerShell y utilice los mandatos siguientes; para crear un recurso DNN con el nombre dnnlsnr-6789
, configura DNS
en el servidor DNS AD del recurso DNN, inicia el recurso DNN, añade la dependencia del recurso de grupo de disponibilidad al recurso DNN y finalmente restablece el recurso de grupo de disponibilidad.
$ag = "AG01"
$dns = "dnnlsnr"
$port = "6789"
Add-ClusterResource -Name $port -ResourceType "Distributed Network Name" -Group $ag
Get-ClusterResource -Name $port | Set-ClusterParameter -Name DnsName -Value $dns
Start-ClusterResource -Name $port
$Dep = Get-ClusterResourceDependency -Resource $ag
if ( $Dep.DependencyExpression -match '\s*\((.*)\)\s*' ) {$DepStr = "$($Matches.1) or [$port]"} else {$DepStr = "[$port]"}
Set-ClusterResourceDependency -Resource $ag -Dependency "$DepStr"
Stop-ClusterResource -Name $ag
Start-ClusterResource -Name $ag
Utilice el mandato siguiente para permitir TCP 6789 a través del cortafuegos de Windows:
New-NetFirewallRule -DisplayName 'SQL-dnnlsnr-6789-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 6789