Redireccionamiento de la conexión de lectura/escritura de réplicas de secundaria a principal (grupos de disponibilidad AlwaysOn)
Se aplica a: SQL Server 2019 (15.x)
SQL Server 2019 (15.x) CTP 2.0 introduce el redireccionamiento de la conexión de lectura/escritura de réplicas de secundaria a principal para los grupos de disponibilidad Always On. El redireccionamiento de la conexión de lectura/escritura está disponible en cualquier plataforma de sistema operativo. Permite que las conexiones de las aplicaciones cliente se dirijan a la réplica principal, independientemente del servidor de destino especificado en la cadena de las conexiones.
Por ejemplo, la cadena de conexión puede tener como destino una réplica secundaria. En función de la configuración de la réplica del grupo de disponibilidad y de la configuración de la cadena de conexión, la conexión se puede redirigir automáticamente a la réplica principal.
Casos de uso
Antes de SQL Server 2019 (15.x), el agente de escucha del grupo de disponibilidad y el recurso de clúster correspondiente redirigían el tráfico de usuario a la réplica principal para garantizar la reconexión después de una conmutación por error. SQL Server 2019 (15.x) sigue siendo compatible con la funcionalidad del agente de escucha del grupo de disponibilidad e incorpora el redireccionamiento de la conexión de réplica para los casos en los que no se puede incluir un agente de escucha. Por ejemplo:
- La tecnología de clúster con la que se integran los grupos de disponibilidad de SQL Server no ofrece ninguna capacidad parecida a los agentes de escucha.
- Una configuración de varias subredes (por ejemplo, en la nube) o una IP flotante de varias subredes con Pacemaker donde las configuraciones se vuelven complejas, propensas a sufrir errores y difíciles de resolver debido a los distintos componentes implicados.
- Escalado horizontal de lectura, o el tipo de clúster y de recuperación ante desastres es
NONE
, porque no hay ningún mecanismo sencillo para garantizar una reconexión transparente después de una conmutación por error manual.
Requisito
Para que una réplica secundaria redirija solicitudes de conexión de lectura/escritura:
- La réplica secundaria debe estar en línea.
- La especificación de réplica
PRIMARY_ROLE
debe incluirREAD_WRITE_ROUTING_URL
. - La cadena de conexión debe ser
ReadWrite
mediante la definición deApplicationIntent
comoReadWrite
, o bien si no se estableceApplicationIntent
y se permite que el valor predeterminado (ReadWrite
) surta efecto.
Establecer la opción READ_WRITE_ROUTING_URL
Para configurar el redireccionamiento de la conexión de lectura/escritura, establezca READ_WRITE_ROUTING_URL
para la réplica principal al crear el grupo de disponibilidad.
En SQL Server 2019 (15.x) se ha agregado READ_WRITE_ROUTING_URL
a la especificación <add_replica_option>
. Vea los siguientes temas:
PRIMARY_ROLE(READ_WRITE_ROUTING_URL) no establecido (predeterminado)
De forma predeterminada, no se establece el redireccionamiento de la conexión de réplica de lectura/escritura para una réplica. La manera en que una réplica secundaria gestiona las solicitudes de conexión depende de si está configurada para permitir las conexiones y de la opción ApplicationIntent
de la cadena de conexión. En la siguiente tabla se muestra cómo gestiona una réplica secundaria las conexiones a partir de SECONDARY_ROLE (ALLOW CONNECTIONS = )
y ApplicationIntent
.
Valor de ApplicationIntent |
SECONDARY_ROLE (ALLOW CONNECTIONS = NO) |
SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) |
SECONDARY_ROLE (ALLOW CONNECTIONS = ALL) |
---|---|---|---|
ApplicationIntent=ReadWrite Valor predeterminado |
Error de conexiones | Error de conexiones | Conexiones correctas Lecturas correctas Error de escrituras |
ApplicationIntent=ReadOnly |
Error de conexiones | Conexiones correctas | Conexiones correctas |
En la tabla anterior se muestra el comportamiento predeterminado, que es el mismo que en las versiones de SQL Server anteriores a SQL Server 2019 (15.x).
PRIMARY_ROLE(READ_WRITE_ROUTING_URL) establecido
Después de establecer el redireccionamiento de la conexión de lectura/escritura, la réplica gestionará las solicitudes de conexión de otra manera. El comportamiento de la conexión sigue dependiendo de la configuración de SECONDARY_ROLE (ALLOW CONNECTIONS = )
y ApplicationIntent
. En la siguiente tabla se muestra cómo gestiona una réplica secundaria con READ_WRITE_ROUTING
establecido las conexiones a partir de SECONDARY_ROLE (ALLOW CONNECTIONS = )
y ApplicationIntent
.
Valor de ApplicationIntent |
SECONDARY_ROLE (ALLOW CONNECTIONS = NO) |
SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) |
SECONDARY_ROLE (ALLOW CONNECTIONS = ALL) |
---|---|---|---|
ApplicationIntent=ReadWrite Valor predeterminado |
Error de conexiones | Error de conexiones | Las conexiones se enrutan a la réplica principal |
ApplicationIntent=ReadOnly |
Error de conexiones | Conexiones correctas | Conexiones correctas |
En la tabla anterior se muestra que, cuando la réplica principal tiene READ_WRITE_ROUTING_URL
establecido, la réplica secundaria redirigirá las conexiones a la réplica principal cuando SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
y la conexión especifica ReadWrite
.
Ejemplo
En este ejemplo, un grupo de disponibilidad tiene tres réplicas:
- Una réplica principal en COMPUTER01
- Una réplica secundaria sincrónica en COMPUTER02
- Réplica secundaria asíncrona en COMPUTER03
En la siguiente imagen se representa el grupo de disponibilidad.
El siguiente script de Transact-SQL crea este grupo de disponibilidad. En este ejemplo, cada réplica especifica READ_WRITE_ROUTING_URL
.
CREATE AVAILABILITY GROUP MyAg
WITH ( CLUSTER_TYPE = NONE )
FOR
DATABASE [<Database1>]
REPLICA ON
'COMPUTER01' WITH
(
ENDPOINT_URL = 'TCP://COMPUTER01.<domain>.<tld>:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,
READ_ONLY_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),
PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,
READ_ONLY_ROUTING_LIST = ('COMPUTER02', 'COMPUTER03'),
READ_WRITE_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),
SESSION_TIMEOUT = 10
),
'COMPUTER02' WITH
(
ENDPOINT_URL = 'TCP://COMPUTER02.<domain>.<tld>:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,
READ_ONLY_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),
PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,
READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER03'),
READ_WRITE_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),
SESSION_TIMEOUT = 10
),
'COMPUTER03' WITH
(
ENDPOINT_URL = 'TCP://COMPUTER03.<domain>.<tld>:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,
READ_ONLY_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),
PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,
READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER02'),
READ_WRITE_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),
SESSION_TIMEOUT = 10
);
GO
<domain>.<tld>
- Dominio y dominio de nivel superior del nombre de dominio completo. Por ejemplo,
corporation.com
.
- Dominio y dominio de nivel superior del nombre de dominio completo. Por ejemplo,
Comportamientos de conexión
En el diagrama siguiente, una aplicación cliente se conecta a COMPUTER02 con ApplicationIntent=ReadWrite
. La conexión se redirige a la réplica principal.
La réplica secundaria redirige las llamadas de lectura/escritura a la réplica principal. Una conexión de lectura/escritura a cualquier réplica se redirigirá a la réplica principal.
En el diagrama siguiente, la réplica principal se ha conmutado por error de forma manual a COMPUTER02. Una aplicación cliente se conecta a COMPUTER01 con ApplicationIntent=ReadWrite
. La conexión se redirige a la réplica principal.
Consulte también
Información general de los grupos de disponibilidad AlwaysOn (SQL Server)
Acerca del acceso de conexión de cliente a réplicas de disponibilidad (SQL Server)