Read Only Routing

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Som bekant så kan erbjuder Always On Availability Groups en mängd möjligheter förutom möjligheten att spegla databaser och få failover av flera databaser samtidigt.

Tex så har man möjligheten att avlasta den primära databasen genom att köra backup på spegel databasen eller så kan man även omdirigera klienter som bara behöver läsa data till spegeln för att på så sätt lastbalansera.

Alla som konfigurerat Always On har sett att man på själva Availability gruppen kan tala om huruvida spegeln skall vara read only eller inte.

Räcker det då med att göra detta?
Nja, man skulle i detta skede kunna peka ut den server som huserar spegeldatabasen och låta applikationer som endast läser data göra det från den men vad händer då om det blir failover? Helt plötsligt skulle applikationen peka på den skarpa databasen. Kanske inte önskvärt…

För att komma runt ovanstående problem måste man se till så att alla klienter kopplar upp sig mot den sk listenern som konfigureras i samband med att man sätter upp Availability gruppen och som möjliggör att man inte behöver peka om klienter när en ev failover sker.

Räcker det då med att vi i vår connection sträng anger listenern om vi bara vill läsa data och vill avlasta den primära databasen genom att läsa data från vår sekundära replika?
Nej, by default kommer listenern alltid peka ut vår primära databas såvida vi inte först konfigurerat en sk Read Only Routing URL och sedan en sk Read Only Routing List.

Trots att det finns gott om wizards för att konfigurera Availability Groups kan vi inte bara starta en wizard för att konfigurera read only routing utan vi måste ta till TSQL. Inget problem med det, tvärtom 🙂

Antag att vi har två servrar NODE1 och NODE2. Vi har en availability group som heter AG1 och vill konfigurera Read Only Routing URL:

ALTER AVAILABILITY GROUP AG1
MODIFY REPLICA
ON
‘NODE1’
WITH
(
 SECONDARY_ROLE

 (
  READ_ONLY_ROUTING_URL=’TCP://NODE1.DENALI.LOCAL:1433′
 )
)

Motsvarande måste göras på alla noder som medverkar i vår Availability Group. Eftersom vi har en nod till, NODE2, gör vi detta även på den. OBS, servern måste agera Primary för att detta skall fungera så se först till att faila över Availability gruppen:

ALTER AVAILABILITY GROUP AG1
MODIFY REPLICA
ON
‘NODE2’
WITH
(
 SECONDARY_ROLE

 (
  READ_ONLY_ROUTING_URL=’TCP://NODE2.DENALI.LOCAL:1433′
 )
)

Efter detta måste vi skapa vår Read Only Routing List:

ALTER AVAILABILITY GROUP AG1
MODIFY REPLICA
ON
‘NODE1’
WITH
(  
 PRIMARY_ROLE  
 (      
  READ_ONLY_ROUTING_LIST =(‘NODE2′,’NODE1’)  
 )
)

Återigen måste motsvarande göras på resterande noder.

ALTER AVAILABILITY GROUP AG1
MODIFY REPLICA
ON
‘NODE2’
WITH
(  
 PRIMARY_ROLE  
 (      
  READ_ONLY_ROUTING_LIST =(‘NODE1′,’NODE2’)  
 )
)

Vad vi åstadkommer med ovanstående är att omdirigera alla klienter som bara vill läsa data till NODE2 om NODE1 är primary eller till NODE1 om NODE2 är primary.
Skulle det nu vara så att den sekundära noden inte är tillgänglig har vi i vår routing list även angett den primära noden att falla tillbaka på.

Vi har nu förberett vår Always On Availability Group så långt vi kan på SQL Server sidan. För att detta skall fungera fullt ut måste även klientens connectionsträng konfigureras men det är en annan blogpost.