Всегда доступность SQL Server

У меня есть два сервера SQL Server 2016, и я хочу реализовать AlwaysOn Availabiliy.

Первый сервер Read_Write

Второй сервер только для чтения

Я настроил доступность AlwaysOn следующим образом:

CREATE AVAILABILITY GROUP ag
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
DB_FAILOVER = OFF,
DTC_SUPPORT = NONE,
FAILURE_CONDITION_LEVEL = 3,
HEALTH_CHECK_TIMEOUT = 30000)
FOR DATABASE DATABASE_NAME
REPLICA ON N'server1' WITH (ENDPOINT_URL = N'TCP://server1_adress:port', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, SESSION_TIMEOUT = 10, BACKUP_PRIORITY = 50, SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://server1_adress:port')),
N'server2' WITH (ENDPOINT_URL = N'TCP://server2_adress:5022', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, SESSION_TIMEOUT = 10, BACKUP_PRIORITY = 50, PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=('server1')))
LISTENER N'listener_server' (
WITH IP
((N'ip', N'mask')
)
, PORT=port);

Моя проблема в том, что все запросы направляются на первый сервер.

Как настроить AlwaysOn для балансировки запросов на чтение между двумя серверами?

Спасибо.


person mchaari    schedule 12.09.2017    source источник
comment
Помимо того, что сказал Басти, вам также необходимо убедиться, что в строке подключения указано имя целевой базы данных.   -  person SQL Warrior    schedule 26.03.2018


Ответы (1)


Прежде всего, вам нужно определить специальную строку подключения, чтобы сообщить SQL Server о подключении к реплике, доступной только для чтения (называемой «намерение приложения»):

Server=tcp:MyAgListener,1433;Database=Db1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True  

На втором шаге вы должны разрешить доступ только для чтения ко всем узлам, если они являются вторичными:

ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'server1' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = 
READ_ONLY))
GO
ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'server2' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = 
READ_ONLY))
GO

Кроме того, добавьте URL-адрес маршрутизации только для чтения на server2:

ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'server2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = 
N'TCP://server2_adress:port'));
GO

На следующем шаге вы должны определить список маршрутизации, к которому сервер должен быть подключен, когда конкретный сервер является основным. Вы уже определили READ_ONLY_ROUTING_LIST. Но только с одним сервером. Что происходит, когда server1 ломается? Вы должны определить список маршрутизации для каждого возможного первичного узла.

ALTER AVAILABILITY GROUP [ag] 
MODIFY REPLICA ON
N'server1' WITH 
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('server2','server1')));

ALTER AVAILABILITY GROUP [ag] 
MODIFY REPLICA ON
N'server2' WITH 
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('server1','server2')));
GO

Для новой функции балансировки нагрузки AlwaysOn в SQL Server 2016 вам потребуется как минимум третий узел только для чтения, который разрешает подключения только для чтения и настраивает «вложенный» список маршрутизации:

ALTER AVAILABILITY GROUP ag 
MODIFY REPLICA ON N'server1' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=
(('server2', 'server3'), 'server1')));
person Basti    schedule 20.09.2017