sql >> Base de Datos >  >> RDS >> Database

Enrutamiento de solo lectura para un Always On

Como DBA, generalmente nos encontramos con nuestros clientes que se quejan de que el servidor de producción actual no puede mantener la carga en el servidor y si la carga se puede equilibrar con el servidor secundario. Esto es posible con una base de datos en DR Server con una base de datos de solo lectura en Log Shipping y réplicas secundarias de SQL Server en el grupo de disponibilidad Always On. La mayor ventaja de los grupos siempre activos es que nos permite configurar HA a nivel de grupo para cualquier cantidad de bases de datos y podemos crear hasta cuatro réplicas secundarias y esta es una combinación de agrupación en clústeres, envío de registros y duplicación de bases de datos donde la transmisión de datos es más flexible y funcional.

Réplica secundaria de lectura siempre activa tiene una característica para manejar solicitudes de conexión de solo lectura específicas denominada enrutamiento de solo lectura. Por lo general, de forma predeterminada, tanto la lectura como la intención de lectura se dirigen a la réplica principal y nada está destinado a las réplicas secundarias. Ahora, las réplicas secundarias no solo se pueden usar con fines de copia de seguridad, DBCC y generación de informes, sino que también se pueden consultar en el futuro mediante el uso de "Solo lectura" como su intención de aplicación en la cadena de conexión de la aplicación.

Tenemos tres réplicas SQL1, SQL2 y SQL3 en el clúster de conmutación por error de Windows. Cada nodo tiene una instancia independiente de SQL Server 2012 instalada y configurada con Always On AG. Siempre estamos en AG Group llamado "CODEAG" con el nombre de oyente "CODELIS"

En la siguiente captura de pantalla, SQL1 es una réplica principal, SQL2 es una réplica secundaria, SQL3 es una réplica secundaria.

Cómo configurar una lista de enrutamiento de solo lectura en grupos de disponibilidad siempre activos

Paso 1:

Las conexiones se realizan al grupo de disponibilidad mediante el nombre o la IP del agente de escucha. Ahora, para crear múltiples oyentes para un grupo de disponibilidad, siga el procedimiento a continuación.

Para crear o configurar manualmente un agente de escucha para un grupo de disponibilidad

  1. En el Explorador de objetos, conéctese a la instancia que contiene la réplica principal del grupo de disponibilidad.
  2. Expanda el grupo AON y haga clic en el grupo de disponibilidad para el que estamos intentando configurar manualmente el oyente y continúe.
  3. Haga clic con el botón derecho en el nodo de agentes de escucha del grupo de disponibilidad y seleccione Nuevo comando de agente de escucha. Esto abre un nuevo cuadro de diálogo para configurar un oyente.
  4. El número de puerto de un agente de escucha existente se puede cambiar expandiendo el nodo de agentes de escucha del grupo de disponibilidad y luego haciendo clic con el botón derecho en los agentes de escucha y seleccionando las propiedades.
  5. Ahora, ingrese el nuevo número de puerto y haga clic en Aceptar.

Identifique el nombre del agente de escucha configurado para la replicación Always On consultando el DMV como se indica a continuación.

SELECT AV.name AS AVGName
, AVGLis.dns_name AS ListenerName
, AVGLis.ip_configuration_string_from_cluster AS ListenerIP
FROM sys.availability_group_listeners AVGLis
INNER JOIN sys.availability_groups AV on AV.group_id = AV.group_id

En la siguiente captura de pantalla, el nombre del grupo AG es CODEAG y la IP del agente de escucha AG es CODELIS.

Paso 2:

Para configurar el enrutamiento de solo lectura, debemos configurar las réplicas solo para lectura para permitir conexiones de solo lectura a réplicas secundarias.

  1. Conéctese a la instancia que contiene la réplica principal.
  2. Expanda el nodo de alta disponibilidad de AON, luego el nodo de grupo AG.
  3. Haga clic en el Grupo AG cuya réplica debe cambiarse.
  4. Haga clic con el botón derecho en la réplica y seleccione las propiedades para cambiar el acceso de conexión para los roles principal y secundario de la siguiente manera.

El rol secundario tiene un nuevo valor de la lista desplegable secundaria legible.

Solo con intención de lectura

Esta opción permite el acceso de lectura de las bases de datos secundarias de esta réplica. Solo se permiten conexiones de solo lectura.

Esta opción solo permite el acceso de lectura, pero todas las conexiones están permitidas para la réplica secundaria.

No

Esto detiene todas las conexiones de usuario a la réplica secundaria y ni siquiera le permite leer.

Establezca las propiedades secundarias legibles en Solo lectura.

En la siguiente captura de pantalla, las propiedades Secundarias legibles de cada réplica secundaria están configuradas en Solo intención de lectura.

Paso 3:

A cada réplica secundaria legible se le puede asignar una URL de enrutamiento de solo lectura que se usará para enrutar las solicitudes de conexión de intención de lectura a una réplica secundaria legible específica.

Use T-SQL para especificar una URL de enrutamiento de solo lectura para todas las réplicas en nuestro grupo de disponibilidad.

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL1' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL1' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL1.abc.com:17999'));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));


ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL2.abc.com:17999'));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL3' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL3' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL3.abc.com:17999'));

Paso 4:

Para la réplica que estamos marcando como enrutamiento de solo lectura cuando es la réplica principal, es necesario especificar una lista de enrutamiento de solo lectura y esto se lleva a cabo solo cuando la réplica local se ejecuta bajo el rol principal.

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL1' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL3')));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL3' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL1')));

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL3','SQL1')));

En el script anterior, el ejemplo cuando SQL1 es la réplica principal, la carga de trabajo de solo lectura se redirigirá a las réplicas secundarias legibles; SQL2 y SQL3 respectivamente:de manera similar, si SQL3 es la réplica principal, la carga de trabajo de solo lectura se redirigirá a las réplicas secundarias legibles; el SQL2 y SQL1 respectivamente.

El tráfico dirigido de solo lectura se enrutará a la primera réplica disponible hasta que, a menos que no sea accesible, dirigirá el tráfico a la siguiente réplica disponible en la lista de enrutamiento. Cuando tiene más de una réplica, no es posible compartir la carga entre réplicas hasta SQL Server 2012 y 2014. Sin embargo, SQL Server 2016 le permite equilibrar la carga entre réplicas de solo lectura.

Ejemplo:

ALTER AVAILABILITY GROUP [CODEAG]
MODIFY REPLICA ON
N'SQL2' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('SQL3','SQL1'), ‘SQL2’)));

Este comportamiento de la lista de enrutamiento 'equilibra la carga' de las conexiones de solo lectura entre SQL3 y SQL1. Arriba, tenemos dos listas incrustadas en la lista de enrutamiento:

Lista 1:'SQL3', 'SQL1'

Lista 2:'SQL2'

Ruta a las réplicas de la primera lista. SQL3 y SQL1 son accesibles para conexiones de solo lectura. La primera conexión entrante de solo lectura se enrutará a SQL3, la segunda conexión de solo lectura se enrutará a SQL1, la tercera conexión de solo lectura se enrutará a SQL3, la cuarta conexión de solo lectura se enrutará a SQL1 y y así sucesivamente, con una distribución por turnos de conexiones de solo lectura entre las dos réplicas de la primera lista.

Si alguna réplica deja de estar disponible, el enrutamiento continuará con las réplicas restantes en la primera lista. Si SQL3 o SQL1 se vuelven inaccesibles para las conexiones de solo lectura, las conexiones de solo lectura solo se enrutarán a las réplicas de solo lectura accesibles en la primera lista. Por ejemplo, si SQL3 está en un estado no sincronizado o ALLOW_CONNECTIONS está establecido en NO, todas las conexiones de solo lectura se enrutarán a SQL1. Siempre que uno de los servidores esté disponible para conexiones de solo lectura, NO se enrutarán conexiones de solo lectura a SQL2.

Si todas las réplicas de la primera lista son inaccesibles, ruta a réplicas en la siguiente lista. Si SQL3 y SQL1 se vuelven inaccesibles para las conexiones de solo lectura, todas las conexiones de solo lectura solo se enrutarán a la siguiente lista de réplicas, que en este caso es SQL2.

Reanude el enrutamiento a la primera lista si hay réplicas disponibles. A medida que las réplicas secundarias que tienen mayor prioridad en la lista sean accesibles para las conexiones de solo lectura, las futuras conexiones de solo lectura se conectarán a ellas según corresponda.

En SQL Server 2016, puede configurar el equilibrio de carga en un conjunto de réplicas de solo lectura.

Paso 5:

sys.availability_read_only_routing_lists DMV, que devuelve la lista de enrutamiento de solo lectura de cada réplica del grupo de disponibilidad en el grupo de disponibilidad AlwaysOn.

SELECT   AVGSrc.replica_server_name AS SourceReplica 
, AVGRepl.replica_server_name AS ReadOnlyReplica
, AVGRepl.read_only_routing_url AS RoutingURL
, AVGRL.routing_priority AS RoutingPriority
FROM sys.availability_read_only_routing_lists AVGRL
INNER JOIN sys.availability_replicas AVGSrc ON AVGRL.replica_id = AVGSrc.replica_id
INNER JOIN sys.availability_replicas AVGRepl ON AVGRL.read_only_replica_id = AVGRepl.replica_id
INNER JOIN sys.availability_groups AV ON AV.group_id = AVGSrc.group_id
ORDER BY SourceReplica

En la siguiente captura de pantalla, el resultado muestra la URL de enrutamiento y la prioridad de enrutamiento.

Paso 6:

Para probar el enrutamiento de solo lectura mediante SQLCMD, use el parámetro –K ReadOnly que muestra la réplica secundaria que recibe conexiones de lectura según la lista de enrutamiento.

En la siguiente captura de pantalla, la réplica secundaria acepta las conexiones de lectura, es decir... SQL2.

Paso 7:

Conmute por error el grupo de disponibilidad y pruebe el enrutamiento de solo lectura.

  1. En el Explorador de objetos, conéctese a una instancia de servidor que hospede una réplica secundaria del grupo de disponibilidad que debe conmutarse por error. Expanda el árbol de servidores.
  2. Expanda el nodo de alta disponibilidad AlwaysOn y el nodo de grupos de disponibilidad.
  3. Haga clic con el botón derecho en el grupo de disponibilidad que desea conmutar por error y seleccione Conmutación por error.

Ahora, SQL2 se convierte en la réplica principal y SQL1 maneja las conexiones.

La sintaxis de la cadena de conexión que debe usar la aplicación dependerá del proveedor de SQL Server.

Si es .Net Framework Data Provider 4.0.2 para SQL Server, la sintaxis será la siguiente:

Servidor=tcp:MyAgListener,número de puerto;Base de datos=SQL1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True

Conclusión:

Para reducir las cargas de trabajo, este enrutamiento de solo lectura sigue siendo la mejor opción. Una aplicación que involucre SQL Server Reporting Services alojada en SharePoint o la instalación en modo nativo de Report Server puede usar la intención de solo lectura que evita el bloqueo típico, la memoria y el uso de CPU en los nodos principales.