Configurar grupos de disponibilidad Always On de SQL Server con confirmación síncrona mediante un balanceador de carga interno

Los grupos de disponibilidad Always On de Microsoft SQL Server te permiten replicar bases de datos en varias instancias de SQL Server Enterprise.

Al igual que las instancias de clúster de conmutación por error de SQL Server, los grupos de disponibilidad Always On usan clústeres de conmutación por error de Windows Server (WSFC) para implementar la alta disponibilidad. Sin embargo, las dos funciones se diferencian en los siguientes aspectos:

Grupos de disponibilidad Always On Instancias de clúster de conmutación por error
Ámbito de la conmutación por error Grupo de bases de datos Instancia
Almacenamiento No compartido Compartido

Para ver una comparación más detallada, consulta Comparación de instancias de clúster de conmutación por error y grupos de disponibilidad.

Los grupos de disponibilidad Always On admiten varios modos de disponibilidad. En este tutorial se muestra cómo puedes implementar grupos de disponibilidad Always On en el modo de confirmación síncrono para implementar la alta disponibilidad de una o varias bases de datos.

Durante la configuración, crearás tres instancias de VM. Dos instancias de VM, node-1 y node-2, actúan como nodos de clúster y ejecutan SQL Server. Se usa una tercera instancia de VM, witness, para conseguir un cuórum en un escenario de conmutación por error. Las tres instancias de VM se distribuyen en tres zonas y comparten una subred común.

Con un grupo de disponibilidad Always On de SQL Server, una base de datos de ejemplo, bookshelf, se replica de forma síncrona en las dos instancias de SQL Server.

En un entorno de clúster de Windows local, los anuncios del protocolo de resolución de direcciones (ARP) activan la conmutación por error de la dirección IP. Google Cloud, sin embargo, no tiene en cuenta los anuncios de ARP. Por lo tanto, debes implementar una de las dos opciones siguientes: usar un balanceador de carga interno y un nombre de red distribuido (DNN).

En este artículo se da por hecho que ya has implementado Active Directory en Google Cloud y que tienes conocimientos básicos de SQL Server, Active Directory y Compute Engine. Para obtener más información sobre Active Directory en Google Cloud, consulta la sección Antes de empezar.

Con un grupo de disponibilidad Always On de SQL Server, una base de datos de ejemplo, bookshelf, se replica de forma síncrona en las dos instancias de SQL Server. Un balanceador de carga interno se asegura de que el tráfico se dirija al nodo activo.

Para obtener más información sobre Windows Server Failover Clustering con un balanceador de carga interno, consulta Failover Clustering.

Arquitectura

Este diagrama incluye lo siguiente:

  • Dos instancias de VM en la misma región y en zonas diferentes para el clúster de conmutación por error llamado node-1 y node-2. Uno aloja la réplica principal de la base de datos de SQL Server, mientras que el otro nodo aloja la réplica secundaria.
  • Una tercera máquina virtual llamada witness actúa como testigo de recurso compartido de archivos para proporcionar un voto de desempate y alcanzar un quórum para la conmutación por error.
  • Un balanceador de carga interno situado delante del clúster proporciona un único endpoint para los clientes de SQL Server y usa una comprobación del estado para asegurarse de que el tráfico se dirige al nodo activo.

Preparar el proyecto y la red

Para desplegar tus grupos de disponibilidad Always On de SQL Server, debes preparar tuGoogle Cloud proyecto y tu VPC para el despliegue. En las siguientes secciones se explica cómo puedes hacerlo con detalle.

Configurar el proyecto y la región

Para preparar tu proyecto para la implementación de grupos de disponibilidad Always On de SQL Server, haz lo siguiente: Google Cloud

  1. En la Google Cloud consola, abre Cloud Shell haciendo clic en el botón Activar Cloud Shell Activa Cloud Shell..

    Ir a la Google Cloud consola

  2. Inicializa las siguientes variables.

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    Haz los cambios siguientes:

    • VPC_NAME: nombre de tu VPC
    • SUBNET_NAME: nombre de tu subred
  3. Configura tu ID de proyecto predeterminado.

    gcloud config set project PROJECT_ID
    

    Sustituye PROJECT_ID por el ID de tu Google Cloud proyecto.

  4. Define tu región predeterminada.

    gcloud config set compute/region REGION
    

    Sustituye REGION por el ID de la región en la que quieras hacer el despliegue.

Crear reglas de cortafuegos

Para permitir que los clientes se conecten a SQL Server y que los nodos del clúster se comuniquen entre sí, debe crear varias reglas de cortafuegos. Puede usar etiquetas de red para simplificar la creación de estas reglas de cortafuegos de la siguiente manera:

  • Los dos nodos del clúster se han anotado con la etiqueta wsfc-node.
  • Todos los servidores (incluido el witness) están anotados con la etiqueta wsfc.

Para crear reglas de cortafuegos que usen estas etiquetas de red, siga estos pasos:

  1. Vuelve a tu sesión de Cloud Shell.
  2. Crea reglas de cortafuegos para permitir el tráfico entre los nodos del clúster.

    SUBNET_CIDR=$(gcloud compute networks subnets describe $SUBNET_NAME --format=value\('ipCidrRange'\))
    
    gcloud compute firewall-rules create allow-all-between-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp,udp,icmp \
      --enable-logging \
      --source-tags=wsfc \
      --target-tags=wsfc \
      --network=$VPC_NAME \
      --priority 10000
    
    gcloud compute firewall-rules create allow-sql-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp:1433 \
      --enable-logging \
      --source-ranges=$SUBNET_CIDR \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    

Crear instancias de VM

Crea y despliega dos instancias de VM para el clúster de conmutación por error. En cualquier momento, una de estas VMs aloja la réplica principal de la base de datos de SQL Server, mientras que el otro nodo aloja la réplica secundaria. Las dos instancias de VM deben cumplir los siguientes requisitos:

  • Estar ubicados en la misma región para que se pueda acceder a ellos mediante un balanceador de carga de red con paso a través interno.
  • Tener instalados Windows Server Failover Cluster y SQL Server.
  • Tener habilitada la compatibilidad con WSFC de Compute Engine.

Usas una imagen premium de SQL Server que tiene preinstalado SQL Server 2022.

Para emitir un voto de desempate y alcanzar el quórum en el escenario de conmutación por error, implementa una tercera VM que actúe como testigo de recurso compartido de archivos siguiendo estos pasos:

  1. Vuelve a tu sesión de Cloud Shell.
  2. Crea una secuencia de comandos especializada para los nodos de WSFC. Esta secuencia de comandos instala las funciones de Windows necesarias y crea reglas de firewall para WSFC y SQL Server.

    cat << "EOF" > specialize-node.ps1
    
    $ErrorActionPreference = "stop"
    
    # Install required Windows features
    Install-WindowsFeature Failover-Clustering -IncludeManagementTools
    Install-WindowsFeature RSAT-AD-PowerShell
    
    # Open firewall for WSFC
    netsh advfirewall firewall add rule name="Allow WSFC health check" dir=in action=allow protocol=TCP localport=59998
    
    # Open firewall for SQL Server
    netsh advfirewall firewall add rule name="Allow SQL Server" dir=in action=allow protocol=TCP localport=1433
    
    # Open firewall for SQL Server replication
    netsh advfirewall firewall add rule name="Allow SQL Server replication" dir=in action=allow protocol=TCP localport=5022
    
    # Format data disk
    Get-Disk |
     Where partitionstyle -eq 'RAW' |
     Initialize-Disk -PartitionStyle MBR -PassThru |
     New-Partition -AssignDriveLetter -UseMaximumSize |
     Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false
    
    # Create data and log folders for SQL Server
    md d:\Data
    md d:\Logs
    EOF
    
  3. Crea las instancias de VM. En las dos máquinas virtuales que actúan como nodos del clúster, conecta un disco de datos adicional y habilita el clúster de conmutación por error de Windows Server. Para ello, asigna el valor true a la clave de metadatos enable-wsfc:

    REGION=$(gcloud config get-value compute/region)
    ZONE1=ZONE1
    ZONE2=ZONE2
    ZONE3=ZONE3
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $ZONE1 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-1" \
      --create-disk=name=node-1-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create node-2 \
      --zone $ZONE2 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-2" \
      --create-disk=name=node-2-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create "witness" \
      --zone $ZONE3 \
      --machine-type e2-medium \
      --subnet $SUBNET_NAME \
      --image-family=windows-2022 \
      --image-project=windows-cloud \
      --tags wsfc \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"
    

    Sustituye ZONE1, ZONE2 y ZONE3 en función de las zonas que utilices.

  4. Para unir las tres instancias de VM a Active Directory, haz lo siguiente en cada una de ellas:

    1. Monitoriza el proceso de inicialización de la VM viendo la salida de su puerto serie.

      gcloud compute instances tail-serial-port-output NAME
      

      Sustituye NAME por el nombre de la instancia de VM.

      Espera unos minutos hasta que veas el resultado Instance setup finished. A continuación, pulsa Ctrl+C. En este punto, la instancia de VM ya se puede usar.

    2. Crea un nombre de usuario y una contraseña para la instancia de VM.

    3. Conéctate a la VM mediante Escritorio remoto e inicia sesión con el nombre de usuario y la contraseña que has creado en el paso anterior.

    4. Haz clic con el botón derecho en el botón Inicio (o pulsa Win+X) y, a continuación, en Windows PowerShell (Administrador).

    5. Confirma la solicitud de elevación haciendo clic en .

    6. Une el ordenador a tu dominio de Active Directory y reinícialo.

      Add-Computer -Domain DOMAIN -Restart
      

      Sustituye DOMAIN por el nombre DNS de tu dominio de Active Directory.

    7. Introduce las credenciales de una cuenta que tenga permisos para unir una VM al dominio.

      Espera a que se reinicie la VM. Ahora has unido la instancia de VM a Active Directory.

Reservar direcciones IP estáticas

Ahora tienes dos direcciones IP estáticas reservadas en tu VPC. Una dirección IP se usa como dirección IP predeterminada del clúster WSFC y la otra sirve como IP estática del agente de escucha del grupo de disponibilidad de SQL Server.

En un clúster WSFC, la dirección IP del clúster se usa principalmente para tareas administrativas y para acceder a los recursos del clúster. Esta dirección IP virtual se asigna al clúster en sí, lo que permite a los administradores gestionar el clúster y realizar tareas como configurar los ajustes del clúster, monitorizar el estado de los nodos y gestionar los procesos de conmutación por error.

En el contexto de un grupo de disponibilidad de SQL Server, un agente de escucha es un nombre de red virtual (VNN) y una dirección IP que permite a los clientes conectarse al grupo de disponibilidad sin necesidad de saber qué servidor específico es el nodo principal.

Un balanceador de carga interno necesita una dirección IP interna para enrutar de forma eficiente el tráfico interno y admitir la alta disponibilidad y el balanceo de carga en el contexto de un clúster WSFC. El balanceador de carga interno se asegura de que las solicitudes siempre se dirijan a la réplica principal actual del clúster. Durante los eventos de conmutación por error, el balanceador de carga detecta los cambios en la réplica principal y redirige las conexiones de los clientes a la nueva réplica principal sin necesidad de intervención manual, lo que minimiza el tiempo de inactividad y asegura la disponibilidad continua de los servicios de la base de datos.

En el contexto de un clúster de conmutación por error de Windows Server (WSFC) con grupos de disponibilidad Always On de SQL Server, los balanceadores de carga internos asociados también usan las direcciones IP estáticas internas reservadas para la dirección IP del clúster de WSFC predeterminado y el receptor del grupo de disponibilidad.

  1. Para reservar dos direcciones IP estáticas en tu VPC, sigue estos pasos.

    gcloud compute addresses create wsfc-cluster-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region) && \
    CLUSTER_IP=$(gcloud compute addresses describe wsfc-cluster-ip \
        --region $(gcloud config get-value compute/region) \
        --format=value\(address\)) && \
    echo "cluster IP: $CLUSTER_IP"
    
  2. Sustituye la dirección IP del clúster en la variable CLUSTER_IP. La necesitarás más adelante para especificarla como IP del clúster:

    CLUSTER_IP=CLUSTER_IP
    
  3. Reserva otra IP estática para el receptor del grupo de disponibilidad y captura la dirección en una nueva variable de entorno llamada LISTENER_IP.

    gcloud compute addresses create wsfc-listener-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region)
    
    LISTENER_IP=$(gcloud compute addresses describe wsfc-listener-ip \
      --region $(gcloud config get-value compute/region) \
      --format=value\(address\)) && \
    echo "Listener IP: $LISTENER_IP"
    
  4. Sustituye la dirección IP reservada del balanceador de carga por la variable LISTENER_IP. La necesitarás más adelante para configurar tu grupo de disponibilidad.

    LISTENER_IP=LISTENER_IP
    

Tu proyecto y tu VPC ya están listos para implementar el clúster de conmutación por error de Windows Server y SQL Server.

Desplegar el clúster de conmutación por error

Ahora puedes usar las instancias de VM para desplegar un clúster de conmutación por error de Windows Server y SQL Server. En las siguientes secciones se explica cómo hacerlo en detalle.

Preparar SQL Server

Crea una cuenta de usuario en Active Directory para SQL Server siguiendo estos pasos.

  1. Conéctate a node-1 mediante Escritorio Remoto. Inicia sesión con tu cuenta de usuario del dominio.
  2. Haz clic con el botón derecho en el botón Inicio (o pulsa Win+X) y, a continuación, en Windows PowerShell (Administrador).
  3. Confirma la solicitud de elevación haciendo clic en .
  4. Crea una cuenta de usuario de dominio para SQL Server y el agente de SQL, y asigna una contraseña:

    $Credential = Get-Credential -UserName sql_server -Message 'Enter password'
    New-ADUser `
      -Name "sql_server" `
      -Description "SQL Admin account." `
      -AccountPassword $Credential.Password `
      -Enabled $true -PasswordNeverExpires $true
    

Para configurar SQL Server, sigue estos pasos en node-1 y node-2:

  1. Abre SQL Server Configuration Manager.
  2. En el panel de navegación, selecciona Servicios de SQL Server.
  3. En la lista de servicios, haz clic con el botón derecho en SQL Server (MSSQLSERVER) y selecciona Propiedades.
  4. En Iniciar sesión como, cambia la cuenta de la siguiente manera:

    • Nombre de la cuenta: DOMAIN\sql_server donde DOMAIN es el nombre de NetBIOS de tu dominio de Active Directory.
    • Contraseña: introduce la contraseña que elegiste anteriormente.
  5. Haz clic en Aceptar.

  6. Cuando se te pida que reinicies SQL Server, selecciona .

SQL Server ahora se ejecuta con una cuenta de usuario de dominio.

Crear recursos compartidos de archivos

Crea dos recursos compartidos de archivos en la instancia de VM witness para que pueda almacenar copias de seguridad de SQL Server y actuar como testigo de recurso compartido de archivos:

  1. Conéctate a witness mediante Escritorio Remoto. Inicia sesión con tu cuenta de usuario del dominio.
  2. Haz clic con el botón derecho en el botón Inicio (o pulsa Win+X) y, a continuación, en Windows PowerShell (Administrador).
  3. Confirma la solicitud de elevación haciendo clic en .
  4. Crea un recurso compartido de archivos de testigo y concédete a ti mismo y a los dos nodos del clúster acceso al recurso compartido de archivos.

    New-Item "C:\QWitness" –type directory
    
    icacls C:\QWitness\ /grant 'node-1$:(OI)(CI)(M)'
    icacls C:\QWitness\ /grant 'node-2$:(OI)(CI)(M)'
    
    New-SmbShare `
      -Name QWitness `
      -Path "C:\QWitness" `
      -Description "SQL File Share Witness" `
      -FullAccess $env:username,node-1$,node-2$
    
  5. Crea otro recurso compartido de archivos para almacenar copias de seguridad y concede acceso completo a SQL Server:

    New-Item "C:\Backup" –type directory
    New-SmbShare `
      -Name Backup `
      -Path "C:\Backup" `
      -Description "SQL Backup" `
      -FullAccess  $env:USERDOMAIN\sql_server
    

Crear el clúster de conmutación por error

Para crear el clúster de conmutación por error, sigue estos pasos:

  1. Vuelve a la sesión de Escritorio Remoto en node-1.
  2. Haz clic con el botón derecho en el botón Inicio (o pulsa Win+X) y, a continuación, en Windows PowerShell (Administrador).
  3. Confirma la solicitud de elevación haciendo clic en .
  4. Crea un clúster.

    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -StaticAddress CLUSTER_IP
    

    Sustituye CLUSTER_IP por la dirección IP del clúster que has creado anteriormente.

  5. Vuelve a la sesión de PowerShell en witness y concede al objeto de equipo virtual del clúster permiso para acceder al recurso compartido de archivos.

    icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)'
    Grant-SmbShareAccess `
      -Name QWitness `
      -AccountName 'sql-cluster$' `
      -AccessRight Full `
      -Force
    
  6. Vuelve a la sesión de PowerShell en node-1 y configura el clúster para que use el recurso compartido de archivos en witness como quórum del clúster.

    Set-ClusterQuorum -FileShareWitness \\witness\QWitness
    
  7. Verifica que el clúster se haya creado correctamente.

    Test-Cluster
    

    Es posible que veas las siguientes advertencias, que puedes ignorar sin problema.

    WARNING: System Configuration - Validate All Drivers Signed: The test reported some warnings..
    WARNING: Network - Validate Network Communication: The test reported some warnings..
    WARNING:
    Test Result:
    HadUnselectedTests, ClusterConditionallyApproved
    Testing has completed for the tests you selected. You should review the warnings in the Report.  A cluster solution is
    supported by Microsoft only if you run all cluster validation tests, and all tests succeed (with or without warnings).
    

    También puedes iniciar el complemento MMC Administrador de clústeres de conmutación por error para revisar el estado del clúster ejecutando cluadmin.msc.

  8. Si usas Managed AD, añade la cuenta de ordenador que usa el clúster de Windows al grupo Cloud Service Domain Join Accounts para que pueda unir ordenadores al dominio.

    Add-ADGroupMember `
      -Identity "Cloud Service Domain Join Accounts" `
      -Members sql-cluster$
    
  9. Habilita los grupos de disponibilidad Always On en ambos nodos.

    Enable-SqlAlwaysOn -ServerInstance node-1 -Force
    Enable-SqlAlwaysOn -ServerInstance node-2 -Force
    

Crear un grupo de disponibilidad

Ahora, crea una base de datos de ejemplo bookshelf, la incluyes en un grupo de disponibilidad nuevo llamado bookshelf-ag y configuras la alta disponibilidad.

Crear bases de datos

Crea una base de datos. Para este tutorial, la base de datos no tiene que contener ningún dato.

  1. Vuelve a la sesión de Escritorio Remoto en node-1.
  2. Abre SQL Server Management Studio.
  3. En el cuadro de diálogo Conectar con el servidor, comprueba que el nombre del servidor sea node-1 y selecciona Conectar.
  4. En el menú, selecciona Archivo > Nuevo > Consulta con la conexión actual.
  5. Pega la siguiente secuencia de comandos SQL en el editor:

    -- Create a sample database
    CREATE DATABASE bookshelf ON PRIMARY (
      NAME = 'bookshelf',
      FILENAME='d:\Data\bookshelf.mdf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    LOG ON (
      NAME = 'bookshelf_log',
      FILENAME='d:\Logs\bookshelf.ldf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    GO
    
    USE [bookshelf]
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- Create sample table
    CREATE TABLE [dbo].[Books] (
      [Id] [bigint] IDENTITY(1,1) NOT NULL,
      [Title] [nvarchar](max) NOT NULL,
      [Author] [nvarchar](max) NULL,
      [PublishedDate] [datetime] NULL,
      [ImageUrl] [nvarchar](max) NULL,
      [Description] [nvarchar](max) NULL,
      [CreatedById] [nvarchar](max) NULL,
      CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    -- Create a backup
    EXEC dbo.sp_changedbowner @loginame = 'sa', @map = false;
      ALTER DATABASE [bookshelf] SET RECOVERY FULL;
      GO
      BACKUP DATABASE bookshelf to disk = '\\witness\Backup\bookshelf.bak' WITH INIT
    GO
    

    La secuencia de comandos crea una base de datos con una sola tabla y realiza una copia de seguridad inicial en witness.

  6. Selecciona Ejecutar para ejecutar la secuencia de comandos SQL.

Configurar la alta disponibilidad

Ahora puede configurar la alta disponibilidad del grupo de disponibilidad mediante T-SQL o SQL Server Management Studio.

Usar T-SQL

Para configurar la alta disponibilidad del grupo de disponibilidad mediante T-SQL, sigue estos pasos:

  1. Conéctate a node-1 y, a continuación, ejecuta la siguiente secuencia de comandos para crear el grupo de disponibilidad bookshelf-ag.

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    USE [bookshelf];
    CREATE USER [NET_DOMAIN\sql_server] FOR LOGIN [NET_DOMAIN\sql_server];
    GO
    
    USE [master];
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  2. Conéctate a node-2 y ejecuta la siguiente secuencia de comandos.

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  3. En node-1, ejecuta la siguiente secuencia de comandos para crear el grupo de disponibilidad bookshelf-ag.

    USE master;
    GO
    
    CREATE AVAILABILITY GROUP [bookshelf-ag]
    WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
    CLUSTER_TYPE = WSFC,
    DB_FAILOVER = ON
    )
    FOR DATABASE [bookshelf]
    REPLICA ON
      N'node-1' WITH (
          ENDPOINT_URL = 'TCP://node-1:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      ),
      N'node-2' WITH (
          ENDPOINT_URL = 'TCP://node-2:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      );
    GO
    
  4. En la siguiente secuencia de comandos, sustituye LISTENER_IP por la dirección IP que has reservado anteriormente para el balanceador de carga interno y ejecútala.

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag]
    ADD LISTENER N'bookshelf' (
    WITH IP (
      (N'LISTENER_IP', N'255.255.255.0')
    ),
    PORT = 1433);
    GO
    
  5. Conéctate a node-2 y, a continuación, ejecuta la siguiente secuencia de comandos para unir la réplica secundaria al grupo de disponibilidad y habilitar la inicialización automática.

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN;
    ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE;
    
    
  6. Comprueba el estado del grupo de disponibilidad.

    SELECT * FROM sys.dm_hadr_availability_group_states;
    GO
    

    Deberías ver synchronization_health_desc como HEALTHY

Usar SQL Server Management Studio

Para configurar la alta disponibilidad del grupo de disponibilidad con SQL Server Management Studio, sigue estos pasos:

  1. En la ventana Explorador de objetos, haga clic con el botón derecho en Alta disponibilidad Always On y, a continuación, seleccione Nuevo Asistente para grupo de disponibilidad.
  2. En la página Specify Options (Especificar opciones), asigna el nombre bookshelf-ag al grupo de disponibilidad y, a continuación, selecciona Next (Siguiente).
  3. En la página Select Databases (Seleccionar bases de datos), selecciona la base de datos bookshelf y, a continuación, Next (Siguiente).
  4. En la página Especificar réplicas, selecciona la pestaña Réplicas.

    1. Selecciona Añadir réplica.
    2. En el cuadro de diálogo Conectar con el servidor, introduce el nombre del servidor node-2 y selecciona Conectar.

      La lista de réplicas de disponibilidad ahora contiene instancias de SQL Server, node-1 y node-2.

    3. En ambas instancias, defina el modo de disponibilidad como Confirmación síncrona.

    4. En ambas instancias, defina Conmutación por error automática como Habilitada.

    5. Selecciona la pestaña Listener.

      1. Seleccione Crear un receptor de grupo de disponibilidad.
      2. Introduce los siguientes ajustes.

        • Nombre de DNS del receptor: bookshelf
        • Puerto: 1433
        • Modo de red: IP estática
      3. Selecciona Añadir e introduce la dirección IP del receptor (LISTENER_IP) que has reservado anteriormente para el balanceador de carga interno. A continuación, selecciona Aceptar.

    6. Selecciona Siguiente.

  5. En la página Seleccionar sincronización de datos, elija Generación automática.

  6. En la página Validación, compruebe que todas las comprobaciones se han realizado correctamente.

  7. En la página Resumen, selecciona Finalizar.

  8. En la página Resultados, selecciona Cerrar.

Crear balanceadores de carga internos y comprobaciones del estado

La IP del clúster representa un único endpoint para el clúster de conmutación por error de Windows. Se usa con fines administrativos y para gestionar los recursos del clúster. La IP del clúster siempre apunta al nodo host (o principal) del clúster. Despliega un balanceador de carga interno que usa una comprobación del estado para asegurarse de que el tráfico se dirige al nodo host del clúster. Como las herramientas de WSFC requieren que haya varios protocolos disponibles para el reenvío (ICMP, UDP y TCP), recomendamos implementar un balanceador de carga interno con varios protocolos que admitan todos los puertos.

Para implementar un balanceador de carga interno, sigue estos pasos:

  1. Vuelve a tu sesión de Cloud Shell.
  2. Crea dos grupos de instancias sin gestionar, uno por zona, y añade los dos nodos a los grupos.

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $ZONE1
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $ZONE1 \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $ZONE2
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $ZONE2 \
      --instances node-2
    
  3. Crea una comprobación del estado para la IP del clúster que el balanceador de carga pueda usar para determinar cuál es el nodo activo desde la perspectiva del clúster de Windows. El puerto predeterminado al que responde el agente invitado de Compute Engine a las comprobaciones de estado es 59998. La comprobación del estado proporciona la dirección IP del clúster en la solicitud y espera que el nodo activo devuelva 1 como respuesta.

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --request=$CLUSTER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=2 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    
  4. Crea un servicio de backend y añade los dos grupos de instancias que ya tienes.

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  5. Crea el balanceador de carga interno asociado a la IP del clúster.

    gcloud compute forwarding-rules create wsfc \
      --load-balancing-scheme internal \
      --address $CLUSTER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-backend
    

Para proporcionar un único endpoint a los clientes de SQL Server que quieran conectarse a cualquier base de datos de tu grupo de disponibilidad de bookshelf, implementa un nuevo balanceador de carga interno dedicado a ese grupo de disponibilidad. Para ello, sigue estos pasos:

  1. Crea una comprobación de estado para el receptor del grupo de disponibilidad que el balanceador de carga pueda usar para determinar cuál es el nodo principal del bookshelf grupo de disponibilidad de SQL Server.

    gcloud compute health-checks create tcp wsfc-bookshelf-healthcheck \
      --request=$LISTENER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    

    La comprobación de estado usa el mismo puerto del agente invitado de Compute Engine, pero proporciona en su solicitud la dirección IP del receptor del grupo de disponibilidad bookshelf.

  2. Crea un servicio de backend y añade los dos grupos de instancias.

    gcloud compute backend-services create wsfc-bookshelf-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-bookshelf-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  3. Crea el balanceador de carga interno asociado al bookshelf-ag listener del grupo de disponibilidad de SQL Server.

    gcloud compute forwarding-rules create wsfc-bookshelf \
      --load-balancing-scheme internal \
      --address $LISTENER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-bookshelf-backend
    

Ahora puede conectarse al agente de escucha del grupo de disponibilidad de SQL Server mediante el nombre DNS bookshelf y su puerto definido en el agente de escucha del grupo de disponibilidad de la estantería. El balanceador de carga interno dirige el tráfico al nodo principal del grupo de disponibilidad bookshelf.

Para crear varios grupos de disponibilidad en un único clúster de conmutación por error, debes usar servicios de backend independientes y un balanceador de carga independiente con su propia comprobación de estado por cada grupo de disponibilidad.

Cada grupo de disponibilidad puede tener nodos diferentes designados como principales, y pueden ser distintos del nodo host del clúster de Windows. Si tienes varios grupos de disponibilidad, necesitas lo siguiente:

  • Una dirección IP estática reservada para el receptor del grupo de disponibilidad que usa el balanceador de carga interno. Reserva una dirección para cada grupo de disponibilidad.

  • Una regla de comprobación de estado independiente para cada grupo de disponibilidad. La solicitud de comprobación del estado proporciona la dirección IP estática del receptor del grupo de disponibilidad (que también es la dirección IP reservada en el paso anterior). La comprobación del estado busca la respuesta 1 devuelta por el agente de GCE. Todas las comprobaciones del estado usan el puerto 59998.

  • Un servicio de backend independiente para cada grupo de disponibilidad al que añadas los dos grupos de instancias de proceso. El servicio backend usa la comprobación del estado definida en el paso anterior.

  • Un balanceador de carga interno para cada grupo de disponibilidad del servicio de backend creado en el paso anterior. El balanceador de carga está asociado a la dirección IP estática del agente de escucha del grupo de disponibilidad.

Probar la conmutación por error

Ahora puedes probar si la conmutación por error funciona correctamente:

  1. Vuelve a la sesión de PowerShell en witness.
  2. Ejecuta la siguiente secuencia de comandos.

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=tcp:bookshelf,1433;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT SERVERPROPERTY('ServerName')"
    
      $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd
      $Data = New-Object System.Data.DataSet
      $Adapter.Fill($Data) | Out-Null
      $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss")
    
      Start-Sleep -Seconds 2
    }
    

    En esta guía, hemos usado el nombre DNS bookshelf y el valor del puerto 1433 para el receptor del grupo de disponibilidad en la definición del servidor tcp:bookshelf,1433.

    Cada 2 segundos, la secuencia de comandos se conecta a SQL Server mediante el agente de escucha del grupo de disponibilidad y consulta el nombre del servidor.

    Deja que el script se ejecute.

  3. Vuelve a la sesión de Escritorio remoto en node-1 para activar una conmutación por error.

    1. En SQL Server Management Studio, ve a Always On Alta disponibilidad > Grupos de disponibilidad > bookshelf-ag (Principal) y haz clic con el botón derecho en el nodo.
    2. Selecciona Conmutación por error.
    3. En la página Seleccionar nueva réplica principal, comprueba que node-2 esté seleccionada como nueva réplica principal y que la columna Preparación para la conmutación por error indique No data loss. A continuación, selecciona Siguiente.
    4. En la página Conectar con réplica, selecciona Conectar.
    5. En el cuadro de diálogo Conectar con el servidor, comprueba que el nombre del servidor sea node-2 y haz clic en Conectar.
    6. Selecciona Siguiente y, a continuación, Finalizar.
    7. En la página Resultados, comprueba que la conmutación por error se haya realizado correctamente.
  4. Vuelve a la sesión de PowerShell en witness.

  5. Observa el resultado de la secuencia de comandos en ejecución y verás que el nombre del servidor cambia de node-1 a node-2 como resultado de la conmutación por error.

  6. Para detener la secuencia de comandos, pulsa Ctrl+C.