Come DBA, generalmente ci imbattiamo nei nostri clienti che si lamentano del fatto che l'attuale server di produzione non è in grado di sostenere il carico sul server e se il carico può essere bilanciato con il server secondario. Ciò è possibile con un database in DR Server con database di sola lettura in Log Shipping e repliche secondarie di SQL Server nel gruppo di disponibilità Always On. Il più grande vantaggio di Always On Groups è che ci consente di impostare HA a livello di gruppo per qualsiasi numero di database e possiamo creare fino a quattro repliche secondarie e questa è una combinazione di Clustering, Log Shipping e Database Mirroring in cui la trasmissione dei dati è più flessibile e funzionale.
Always On Readable Secondary Replica dispone di una funzionalità per gestire particolari richieste di connessione di sola lettura denominata Routing di sola lettura. In genere, per impostazione predefinita, sia l'intento di lettura che quello di lettura vengono indirizzati alla replica primaria e nulla è destinato alle repliche secondarie. Ora, le repliche secondarie possono essere utilizzate non solo per scopi di backup, DBCC e reportistica, ma possono anche essere interrogate in futuro utilizzando "Sola lettura" come intento dell'applicazione nella stringa di connessione dell'applicazione.
Abbiamo tre repliche SQL1, SQL2 e SQL3 nel cluster di failover di Windows. Ogni nodo dispone di un'istanza di SQL Server 2012 autonoma installata e configurata con Always On AG. Siamo sempre su AG Group denominato “CODEAG” con il nome dell'ascoltatore “CODELIS”
Nella schermata seguente, SQL1 è una replica primaria, SQL2 è una replica secondaria, SQL3 è una replica secondaria.
Come configurare l'elenco di instradamento di sola lettura in sempre nei gruppi di disponibilità
Fase 1:
Le connessioni vengono effettuate al gruppo di disponibilità utilizzando il nome o l'IP del listener. Ora, per creare più ascoltatori per un gruppo di disponibilità, segui la procedura seguente.
Per creare o configurare manualmente un listener per un gruppo di disponibilità
- In Esplora oggetti, connettiti all'istanza che contiene la replica primaria del gruppo di disponibilità.
- Espandi il gruppo AON e fai clic sul gruppo di disponibilità per il quale stiamo cercando di configurare manualmente il listener e procedi.
- Fai clic con il pulsante destro del mouse sul nodo Listener del gruppo di disponibilità e seleziona Nuovo comando Listener. Si apre una nuova finestra di dialogo per la configurazione di un listener.
- Il numero di porta di un listener esistente può essere modificato espandendo il nodo Listeners del gruppo di disponibilità, quindi facendo clic con il pulsante destro del mouse sui listener e selezionando le proprietà.
- Ora, inserisci il nuovo numero di porta e fai clic su OK.
Identifica il nome del listener configurato per la replica Always On eseguendo una query su DMV come di seguito.
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
Nella schermata seguente, il nome del gruppo AG è CODEAG e l'IP listener AG è CODELIS.
Fase 2:
Per configurare il routing di sola lettura, è necessario configurare le repliche in sola lettura per consentire connessioni di sola lettura alle repliche secondarie.
- Connettiti all'istanza che contiene la replica primaria.
- Espandi il nodo AON ad alta disponibilità, quindi il nodo del gruppo AG.
- Fai clic sul gruppo AG la cui replica deve essere modificata.
- Fai clic con il pulsante destro del mouse sulla replica e seleziona le proprietà per modificare l'accesso alla connessione per i ruoli primario e secondario come segue.
Il ruolo secondario ha un nuovo valore dall'elenco a discesa secondario leggibile.
Solo intento di lettura
Questa opzione consente l'accesso in lettura ai database secondari di questa replica. Sono consentite solo connessioni di sola lettura.
Sì
Questa opzione consente l'accesso in sola lettura ma tutte le connessioni sono consentite per la replica secondaria.
No
Questo interrompe tutte le connessioni utente alla replica secondaria e non ti consente nemmeno di leggere.
Imposta le proprietà secondarie leggibili su Solo intento di lettura.
Nello screenshot seguente, le proprietà Readable Secondary di ogni replica secondaria sono impostate su Read-intent only.
Fase 3:
A ciascuna replica secondaria leggibile può essere assegnato un URL di routing di sola lettura che verrà utilizzato per instradare le richieste di connessione con intento di lettura a una replica secondaria leggibile specifica.
Usa T-SQL per specificare un URL di instradamento di sola lettura per tutte le repliche nel nostro gruppo di disponibilità.
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'));
Fase 4:
Per la replica che stiamo contrassegnando come instradamento di sola lettura quando è la replica primaria, è necessario specificare un elenco di instradamento di sola lettura e questo viene effettuato solo quando la replica locale è in esecuzione con il ruolo principale.
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')));
Nello script precedente, l'esempio in cui SQL1 è la replica primaria, il carico di lavoro di sola lettura verrà reindirizzato alle repliche secondarie leggibili; rispettivamente SQL2 e SQL3:allo stesso modo, se SQL3 è la replica primaria, il carico di lavoro di sola lettura verrà reindirizzato alle repliche secondarie leggibili; rispettivamente SQL2 e SQL1.
Il traffico diretto di sola lettura verrà instradato alla prima replica disponibile finché e, a meno che non sia accessibile, indirizzerà il traffico alla successiva replica disponibile nell'elenco di routing. Quando si dispone di più di una replica, non è possibile condividere il carico tra le repliche fino a SQL Server 2012 e 2014. Tuttavia, SQL Server 2016 consente di bilanciare il carico tra le repliche di sola lettura.
Esempio:
ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('SQL3','SQL1'), ‘SQL2’)));
Questo comportamento dell'elenco di routing "bilancia il carico" delle connessioni di sola lettura tra SQL3 e SQL1. Sopra, abbiamo due elenchi incorporati nell'elenco di instradamento:
Elenco 1:"SQL3", "SQL1"
Elenco 2:"SQL2"
Indirizza le repliche nel primo elenco. SQL3 e SQL1 sono accessibili alle connessioni di sola lettura. La prima connessione di sola lettura in ingresso verrà instradata a SQL3, la seconda connessione di sola lettura verrà instradata a SQL1, la terza connessione di sola lettura verrà instradata a SQL3, la quarta connessione di sola lettura verrà instradata a SQL1 e così via, con una distribuzione "round robin" delle connessioni di sola lettura tra le due repliche nel primo elenco.
Se alcune repliche diventano non disponibili, il routing continuerà con le repliche rimanenti nel primo elenco. Se SQL3 o SQL1 diventa inaccessibile alle connessioni di sola lettura, le connessioni di sola lettura verranno instradate solo alle repliche di sola lettura accessibili nel primo elenco. Ad esempio, se SQL3 è in uno stato non sincronizzato o ALLOW_CONNECTIONS è impostato su NO, tutte le connessioni di sola lettura verranno instradate a SQL1. Finché uno dei server è disponibile per connessioni di sola lettura, NESSUNA connessione di sola lettura verrà instradata a SQL2.
Se tutte le repliche nel primo elenco sono inaccessibili, Indirizza le repliche nell'elenco successivo. Se SQL3 e SQL1 diventano inaccessibili alle connessioni di sola lettura, tutte le connessioni di sola lettura verranno indirizzate solo all'elenco di repliche successivo, che in questo caso è SQL2.
Riprendi il routing al primo elenco se diventano disponibili repliche. Quando le repliche secondarie che hanno una priorità più alta nell'elenco diventano accessibili alle connessioni di sola lettura, le future connessioni di sola lettura si collegheranno ad esse come appropriato.
In SQL Server 2016 puoi configurare il bilanciamento del carico su un set di repliche di sola lettura.
Fase 5:
sys.availability_read_only_routing_lists DMV, che restituisce l'elenco di instradamento di sola lettura di ciascuna replica del gruppo di disponibilità nel gruppo di disponibilità Always On.
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
Nella schermata seguente, il risultato mostra l'URL di routing e la priorità di routing.
Fase 6:
Per testare il routing di sola lettura utilizzando SQLCMD, utilizzare il parametro –K ReadOnly che mostra la replica secondaria che riceve le connessioni di lettura secondo l'elenco di routing.
Nella schermata seguente, la replica secondaria accetta le connessioni di lettura, ad esempio... SQL2.
Passo 7:
Fai il failover del gruppo di disponibilità e verifica il routing di sola lettura.
- In Esplora oggetti, connettiti a un'istanza del server che ospita una replica secondaria del gruppo di disponibilità di cui è necessario eseguire il failover. Espandi la struttura del server.
- Espandi il nodo Alta disponibilità AlwaysOn e il nodo Gruppi di disponibilità.
- Fai clic con il pulsante destro del mouse sul gruppo di disponibilità di cui eseguire il failover e seleziona Failover.
Ora, SQL2 diventa replica primaria e le connessioni vengono gestite da SQL1.
La sintassi della stringa di connessione che l'applicazione deve utilizzare dipenderà dal provider SQL Server.
Se è .Net Framework Data Provider 4.0.2 per SQL Server, la sintassi sarà la seguente:
Server=tcp:MyAgListener,portnumber;Database=SQL1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
Conclusione:
Per ridurre i carichi di lavoro, questo routing di sola lettura rimane l'opzione migliore. Un'applicazione che coinvolge SQL Server Reporting Services ospitato in SharePoint o l'installazione in modalità nativa di Report Server può utilizzare l'intento di sola lettura che evita il blocco tipico, l'utilizzo di memoria e CPU sui nodi primari.