Database
 sql >> Baza danych >  >> RDS >> Database

Routing tylko do odczytu dla zawsze włączonych

Jako administratorzy baz danych zwykle spotykamy naszych klientów narzekających, że obecny serwer produkcyjny nie jest w stanie utrzymać obciążenia na serwerze i czy obciążenie może być zrównoważone z serwerem pomocniczym. Jest to możliwe w przypadku bazy danych na serwerze DR z bazą danych tylko do odczytu w replikach Log Shipping i pomocniczego serwera SQL Server w grupie dostępności Always On. Największą zaletą Always On Groups jest to, że pozwala nam ustawić HA na poziomie grupy dla dowolnej liczby baz danych i możemy stworzyć do czterech replik pomocniczych i jest to połączenie klastrowania, przesyłania dzienników i dublowania bazy danych, gdzie odbywa się transmisja danych bardziej elastyczny i funkcjonalny.

Zawsze dostępna do odczytu replika pomocnicza ma funkcję obsługi określonych żądań połączeń tylko do odczytu, zwaną routingiem tylko do odczytu. Ogólnie rzecz biorąc, domyślnie zarówno odczyt, jak i zamiar odczytu są kierowane do repliki podstawowej i nic nie jest przeznaczone dla replik pomocniczych. Teraz repliki pomocnicze mogą być używane nie tylko do celów tworzenia kopii zapasowych, DBCC i raportowania, ale także mogą być odpytywane w przyszłości, używając „Tylko do odczytu” jako ich intencji aplikacji w parametrach połączenia aplikacji.

Mamy trzy repliki SQL1, SQL2 i SQL3 w klastrze pracy awaryjnej Windows. Każdy węzeł ma autonomiczną instancję SQL Server 2012 zainstalowaną i skonfigurowaną z Always On AG. Jesteśmy zawsze w AG Group o nazwie „CODEAG” z nazwą słuchacza „CODELIS”

Na poniższym zrzucie ekranu SQL1 jest repliką podstawową, SQL2 jest repliką drugorzędną, SQL3 jest repliką drugorzędną.

Jak skonfigurować listę routingu tylko do odczytu w zawsze w grupach dostępności

Krok 1:

Połączenia z grupą dostępności są nawiązywane przy użyciu nazwy lub adresu IP odbiornika. Teraz, aby utworzyć wiele słuchaczy dla jednej grupy dostępności, postępuj zgodnie z poniższą procedurą.

Aby ręcznie utworzyć lub skonfigurować odbiornik dla grupy dostępności

  1. W Object Explorer, połącz się z instancją, która przechowuje podstawową replikę grupy dostępności.
  2. Rozwiń grupę AON i kliknij grupę dostępności, dla której próbujemy ręcznie skonfigurować odbiornik i kontynuuj.
  3. Kliknij prawym przyciskiem myszy węzeł nasłuchiwania grupy dostępności i wybierz polecenie Nowe polecenie nasłuchiwania. Spowoduje to otwarcie nowego okna dialogowego do konfiguracji słuchacza.
  4. Numer portu istniejącego odbiornika można zmienić, rozwijając węzeł nasłuchiwania grupy dostępności, a następnie klikając go prawym przyciskiem myszy i wybierając właściwości.
  5. Teraz wprowadź nowy numer portu i kliknij OK.

Zidentyfikuj nazwę odbiornika skonfigurowaną dla replikacji Always On, wysyłając zapytanie do DMV, jak poniżej.

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

Na poniższym zrzucie ekranu nazwa grupy AG to CODEAG, a adres IP odbiornika AG to CODELIS.

Krok 2:

Aby skonfigurować routing tylko do odczytu, musimy skonfigurować repliki tylko do odczytu, aby umożliwić połączenia tylko do odczytu z replikami pomocniczymi.

  1. Połącz się z instancją, która przechowuje replikę główną.
  2. Rozwiń węzeł wysokiej dostępności AON, a następnie węzeł grupy AG.
  3. Kliknij AG Group, której replikę należy zmienić.
  4. Kliknij prawym przyciskiem myszy replikę i wybierz właściwości, aby zmienić dostęp do połączenia dla ról Podstawowych i Dodatkowych w następujący sposób.

Rola drugorzędna ma nową wartość z czytelnej listy rozwijanej drugorzędnej.

Tylko do odczytu

Ta opcja umożliwia dostęp do odczytu pomocniczych baz danych tej repliki. Dozwolone są tylko połączenia tylko do odczytu.

Tak

Ta opcja pozwala tylko na dostęp do odczytu, ale wszystkie połączenia są dozwolone dla repliki wtórnej.

Nie

Zatrzymuje to wszystkie połączenia użytkownika z repliką pomocniczą i nie pozwala nawet na odczyt.

Ustaw czytelne właściwości drugorzędne na Tylko do odczytu

Na poniższym zrzucie ekranu właściwości drugorzędne do odczytu każdej repliki drugorzędnej są ustawione na tylko do odczytu.

Krok 3:

Do każdej możliwej do odczytu repliki wtórnej można przypisać adres URL routingu tylko do odczytu, który będzie używany do kierowania żądań połączeń z zamiarem odczytu do określonej możliwej do odczytu repliki wtórnej.

Użyj T-SQL, aby określić adres URL routingu tylko do odczytu dla wszystkich replik w naszej grupie dostępności.

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'));

Krok 4:

W przypadku repliki, którą oznaczamy jako routing tylko do odczytu, gdy jest to replika podstawowa, istnieje potrzeba określenia listy routingu tylko do odczytu, co ma zastosowanie tylko wtedy, gdy replika lokalna działa w ramach roli podstawowej.

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')));

W powyższym skrypcie, w przykładzie, gdy SQL1 jest repliką podstawową, obciążenie przeznaczone tylko do odczytu zostanie przekierowane do możliwych do odczytu replik pomocniczych; odpowiednio SQL2 i SQL3:podobnie, jeśli SQL3 jest repliką podstawową, obciążenie przeznaczone tylko do odczytu zostanie przekierowane do odczytywalnych replik pomocniczych; odpowiednio SQL2 i SQL1.

Ruch skierowany tylko do odczytu będzie kierowany do pierwszej dostępnej repliki, dopóki nie będzie dostępny, a jeśli nie, przekieruje ruch do następnej dostępnej repliki na liście routingu. Jeśli masz więcej niż jedną replikę, nie jest możliwe dzielenie obciążenia między replikami do SQL Server 2012 i 2014. Jednak SQL Server 2016 pozwala zrównoważyć obciążenie między replikami tylko do odczytu.

Przykład:

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

To zachowanie listy routingu „równoważy obciążenie” połączeń tylko do odczytu między SQL3 i SQL1. Powyżej mamy dwie osadzone listy na liście routingu:

Lista 1:„SQL3”, „SQL1”

Lista 2:„SQL2”

Trasa do replik na pierwszej liście. SQL3 i SQL1 są dostępne dla połączeń tylko do odczytu. Pierwsze przychodzące połączenie tylko do odczytu zostanie przekierowane do SQL3, drugie połączenie tylko do odczytu zostanie przekierowane do SQL1, trzecie połączenie tylko do odczytu zostanie przekierowane do SQL3, czwarte połączenie tylko do odczytu zostanie przekierowane do SQL1 oraz i tak dalej, z rozmieszczeniem „round-robin” połączeń tylko do odczytu między dwiema replikami z pierwszej listy.

Jeśli jakiekolwiek repliki staną się niedostępne, routing będzie kontynuowany z pozostałymi replikami na pierwszej liście. Jeśli SQL3 lub SQL1 staną się niedostępne dla połączeń tylko do odczytu, połączenia tylko do odczytu będą kierowane tylko do dostępnych replik tylko do odczytu na pierwszej liście. Na przykład, jeśli SQL3 jest w stanie niezsynchronizowanym lub ALLOW_CONNECTIONS jest ustawione na NO, wszystkie połączenia tylko do odczytu będą kierowane do SQL1. Dopóki jeden z serwerów jest dostępny dla połączeń tylko do odczytu, ŻADNE połączenia tylko do odczytu nie będą kierowane do SQL2.

Jeśli wszystkie repliki na pierwszej liście są niedostępne, kieruj do replik na następnej liście. Jeśli SQL3 i SQL1 staną się niedostępne dla połączeń tylko do odczytu, wszystkie połączenia tylko do odczytu będą kierowane tylko do następnej listy replik, którą w tym przypadku jest SQL2.

Wznów routing do pierwszej listy, jeśli jakiekolwiek repliki staną się dostępne. Ponieważ repliki drugorzędne, które mają wyższy priorytet na liście, stają się dostępne dla połączeń tylko do odczytu, przyszłe połączenia tylko do odczytu będą się z nimi odpowiednio łączyć.

W SQL Server 2016 można skonfigurować równoważenie obciążenia w zestawie replik tylko do odczytu.

Krok 5:

sys.availability_read_only_routing_lists DMV, który zwraca listę routingu tylko do odczytu każdej repliki grupy dostępności w grupie zawsze włączonej dostępności.

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

Na poniższym zrzucie ekranu wynik pokazuje adres URL routingu i priorytet routingu.

Krok 6:

Aby przetestować routing tylko do odczytu przy użyciu SQLCMD, użyj parametru –K ReadOnly, który pokazuje replikę wtórną odbierającą połączenia do odczytu zgodnie z listą routingu.

Na poniższym zrzucie druga replika akceptuje połączenia do odczytu, tj.… SQL2.

Krok 7:

Przełącz awaryjnie grupę dostępności i przetestuj routing tylko do odczytu.

  1. W Eksploratorze obiektów połącz się z wystąpieniem serwera, który obsługuje dodatkową replikę grupy dostępności, która wymaga przełączenia awaryjnego. Rozwiń drzewo serwerów.
  2. Rozwiń węzeł AlwaysOn High Availability oraz węzeł Grupy dostępności.
  3. Kliknij prawym przyciskiem myszy grupę dostępności do przełączenia awaryjnego i wybierz Przełączanie awaryjne.

Teraz SQL2 staje się podstawową repliką, a połączenia są obsługiwane przez SQL1.

Składnia parametrów połączenia, której aplikacja powinna używać, będzie zależeć od dostawcy serwera SQL.

Jeśli jest to .Net Framework Data Provider 4.0.2 dla SQL Server, składnia będzie następująca:

Server=tcp:MyAgListener,portnumber;Database=SQL1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True

Wniosek:

Aby zmniejszyć obciążenia, ta trasa tylko do odczytu pozostaje najlepszą opcją. Aplikacja korzystająca z usług SQL Server Reporting Services hostowana w programie SharePoint lub instalacja serwera raportów w trybie natywnym może wykorzystywać intencję tylko do odczytu, która pozwala uniknąć typowego blokowania, użycia pamięci i procesora w węzłach podstawowych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Prosta parametryzacja i trywialne plany — część 2

  2. „Czy to jest tajemnica? Czy to bezpieczne?” Postępowanie z danymi wrażliwymi w modelowaniu danych

  3. Zintegruj Firebase z PHP do komunikacji w czasie rzeczywistym

  4. Planowanie miejsca na dysku dla baz danych

  5. Obcinanie SQL