Always On 가용성 그룹에서 복제 배포 데이터베이스 설정

적용 대상:SQL Server

이 문서에서는 AG(Always On 가용성 그룹)에서 SQL Server 복제본(replica)tion 배포 데이터베이스를 설정하는 방법을 설명합니다.

SQL Server 2017 CU6 및 SQL Server 2016 SP2-CU3에서는 다음 메커니즘을 통해 AG에서 복제본(replica)tion 배포 데이터베이스를 지원합니다.

  • 배포 데이터베이스 AG에는 수신기가 있어야 합니다. 게시자가 배포자를 추가할 때는 수신기 이름을 배포자의 이름으로 사용합니다.
  • 수신기 이름을 배포자의 이름으로 사용하여 복제 작업을 만듭니다. 배포 서버에서 만든 복제 스냅샷, 로그 판독기 및 배포 에이전트(밀어넣기 구독) 작업은 배포 DB용 AG의 모든 보조 복제본(replica) 생성됩니다.

참고 항목

끌어오기 서스크립션에 대한 배포 에이전트 작업은 배포 서버가 아닌 구독자 서버에 만들어집니다.

  • 새 작업은 배포 데이터베이스의 상태(AG에서 주 또는 보조)를 모니터하며 배포 데이터베이스 상태에 따라 복제 작업을 사용하거나 사용하지 않도록 설정합니다.

아래 설명된 단계에 따라 AG의 배포 데이터베이스를 구성한 후에는 배포 데이터베이스 AG 장애 조치(failover) 전후에 복제본(replica)tion 구성 및 런타임 작업을 제대로 실행할 수 있습니다.

지원되는 시나리오

  • AG에 포함할 배포 데이터베이스 구성
  • AG 장애 조치(failover) 전후에 게시 및 구독과 같은 복제본(replica) 구성
  • 복제 작업은 장애 조치 전후에 작동합니다.
  • 배포 데이터베이스가 AG에 있을 때 배포자 및 게시자에서 복제 제거
  • 기존 배포 데이터베이스 AG에 노드 추가 또는 제거
  • 배포자에는 여러 배포 데이터베이스가 있을 수 있습니다. 각 배포 데이터베이스는 자체 AG에 있을 수 있고 다른 AG에는 있을 수 없습니다. 여러 배포 데이터베이스가 AG를 공유할 수 있습니다.
  • 게시자 및 배포자는 별도의 SQL Server 인스턴스에 있어야 합니다.
  • 배포 데이터베이스를 호스팅하는 가용성 그룹에 대한 수신기가 기본이 아닌 포트를 사용하도록 구성된 경우 수신기 및 기본 포트가 아닌 포트에 대한 별칭을 설정하는 데 필요합니다.

제한 사항 또는 제외

  • 로컬 배포자(게시자 서버도 배포자)는 지원되지 않습니다. 게시자와 배포자는 별도의 SQL Server 인스턴스여야 합니다. 이러한 인스턴스는 동일한 노드 집합에서 호스트할 수 있습니다. 다음과 같은 이유로 로컬 배포자를 지원하지 않습니다.

    • 배포자가 로컬로 구성된 경우 가용성 그룹 수신기를 사용하여 트래픽을 배포자에 라우팅할 수 없으므로 장애 조치(failover) 후 복제본(replica) 에이전트가 실패합니다.
    • 로컬 배포자를 구성한 다음 배포자 가용성 그룹이 원래 보조 데이터베이스로 장애 조치되면 배포자에 대한 게시자 연결이 로컬에서 원격으로 변경되어 복제본(replica)tion 저장 프로시저 및 에이전트가 실패합니다.
  • Oracle 게시자는 지원되지 않습니다.

  • 병합 복제는 지원되지 않습니다.

  • 즉시 또는 업데이트 큐에 있는 구독자가 있는 트랜잭션 복제는 지원되지 않습니다.

  • 피어 투 피어 복제본(replica)TION은 SQL Server 2019(15.x) CU 17 이전에 지원되지 않습니다.

  • 배포 데이터베이스 복제본(replica) 호스팅하는 모든 SQL Server 2017 인스턴스는 SQL Server 2017 CU 6 이상이어야 합니다.

  • 배포 데이터베이스 복제본을 호스팅하는 모든 SQL Server 2016 인스턴스는 SQL Server 2016 SP2-CU3 이상이어야 합니다.

  • 배포 데이터베이스 복제본(replica) 호스팅하는 모든 SQL Server 인스턴스는 업그레이드가 진행되는 좁은 기간 동안을 제외하고 동일한 버전이어야 합니다.

  • 배포 데이터베이스는 전체 복구 모델에 있어야 합니다.

  • 복구와, 트랜잭션 로그 잘림을 허용하기 위해 전체 및 트랜잭션 로그 백업을 구성합니다.

  • 배포 데이터베이스 AG에는 수신기가 구성되어 있어야 합니다.

  • 배포 데이터베이스 AG의 보조 복제본(replica) 동기 또는 비동기일 수 있습니다. 동기 모드를 사용하는 것이 좋습니다.

  • 양방향 트랜잭션 복제본(replica)tion은 지원되지 않습니다.

  • 배포 데이터베이스가 가용성 그룹에 추가될 때 SSMS는 배포 데이터베이스를 동기화/동기화된 것으로 표시하지 않습니다.

    참고 항목

    보조 복제본(replica) 복제본(replica)tion 저장 프로시저(예: , sp_dropdistpublishersp_dropdistributiondb, sp_dropdistributor, sp_adddistributiondbsp_adddistpublisher)를 실행하기 전에 복제본(replica) 완전히 동기화되었는지 확인합니다.

  • 배포 데이터베이스 AG의 모든 보조 복제본은 읽을 수 있어야 합니다. 보조 복제본(replica) 읽을 수 없는 경우 특정 보조 복제본(replica) SQL Server Management Studio의 배포자 속성에 액세스할 수 없으므로 복제본(replica) 계속 올바르게 작동합니다.

  • 배포 데이터베이스 AG의 모든 노드는 동일한 do기본 계정을 사용하여 SQL Server 에이전트 실행해야 하며, 이렇게 기본 계정은 각 노드에서 동일한 권한을 가져야 합니다.

  • 복제본(replica) 에이전트가 프록시 계정으로 실행되는 경우 프록시 계정은 배포 데이터베이스 AG의 모든 노드에 존재하고 각 노드에 대해 동일한 권한을 가져야 합니다.

  • 배포 데이터베이스 AG에 참여하는 모든 복제본(replica) 배포자 또는 배포 데이터베이스 속성을 변경합니다.

  • 배포 데이터베이스 AG에 참여하는 모든 복제본(replica) msdb 저장 프로시저 또는 SQL Server Management Studio를 통해 복제본(replica)tion 작업을 변경합니다.

  • 에이전트에 사용자 지정 프로필을 사용하는 경우 프로시저 sp_add_agent_profile 사용하여 모든 보조 복제본(replica) 수동으로 만들어야 합니다. 프로필은 모든 복제본(replica) 동일한 ID를 가져야 합니다.

  • 게시자에서 배포자를 구성하려면 스크립트를 사용해야 합니다. 복제본(replica) 마법사를 사용할 수 없습니다. 다른 용도에는 복제 마법사 및 속성 시트를 사용할 수 있습니다.

  • 배포 데이터베이스에 대한 AG 구성은 스크립트를 통해서만 수행할 수 있습니다.

  • AG에서 배포 데이터베이스를 설정하는 것은 새로운 복제본(replica) 구성이어야 합니다. 기존 배포 데이터베이스를 AG로 전환하는 것은 지원되지 않습니다. 또한 배포 데이터베이스가 AG로 가면 더 이상 유효한 배포 데이터베이스로 작동하지 않으며 삭제해야 합니다.

구성 아키텍처

이 문서의 예에서는 다음 서버 이름 및 설정을 사용합니다.

  • DIST1, DIST2, DIST3은 배포자 서버입니다.
  • PUB는 게시자 서버입니다.
  • 배포 데이터베이스 AG가 구성된 후 수신기 이름은 DISTLISTENER입니다.
  • DIST1은 배포 데이터베이스 AG의 초기 기본 복제본(replica).

배포자, 배포 데이터베이스 및 게시자 구성

이 예제에서는 새 배포자 및 게시자를 구성하고 배포 데이터베이스를 AG에 배치합니다.

배포자 워크플로

  1. sp_adddistributor @@servername을 통해 배포자로 DIST1, DIST2, DIST3을 구성합니다. 를 통해 암호를 distributor_admin 지정합니다 @password. @password는 DIST1, DIST2, DIST3 전체에서 동일해야 합니다.

  2. 를 사용하여 DIST1 sp_adddistributiondb에서 배포 데이터베이스를 만듭니다. 배포 데이터베이스의 이름은 .입니다 distribution. 데이터베이스의 distribution 복구 모델을 단순에서 전체로 변경합니다.

  3. DIST1, DIST2 및 DIST3에서 복제본(replica) 사용하여 데이터베이스용 AG distribution 를 만듭니다. 바람직하게는 모든 복제본(replica) 동기식입니다. 읽기 가능하거나 읽기를 허용하도록 보조 복제본(replica) 구성합니다. 현재 배포 데이터베이스는 AG이고, DIST1은 기본 복제본(replica), DIST2 및 DIST3은 보조 복제본(replica).

  4. AG에 대해 명명된 DISTLISTENER 수신기를 구성합니다.

  5. 복구와, 트랜잭션 로그 잘림을 허용하기 위해 전체 및 트랜잭션 로그 백업을 구성합니다.

  6. DIST2 및 DIST3에서 다음을 실행합니다.

    EXEC sys.sp_adddistributiondb @database = 'distribution';
    
  7. DIST1에서 게시자로 추가 PUB 하려면 다음을 실행합니다.

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    @working_directory 은 DIST1, DIST2 및 DIST3과 독립적인 네트워크 경로여야 합니다.

  8. DIST2 및 DIST3에서 복제본(replica) 보조로 읽을 수 있는 경우 다음을 실행합니다.

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    복제본(replica) 보조 데이터베이스로 읽을 수 없는 경우 복제본(replica) 주 복제본이 되도록 장애 조치(failover)를 수행하고 실행합니다.

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    @working_directory 은 이전 단계와 동일해야 합니다.

게시자 워크플로

데이터베이스 AG 수신기를 distribution 배포자로 추가하려면 PUB에서 다음을 실행합니다.

EXEC sys.sp_adddistributor @distributor = 'DISTLISTENER', @password = '<distributor_admin password>' ;

이 값은 배포자 워크플로에서 배포자를 구성할 때 지정한 값 @password 이어야 합니다.

배포자 및 게시자 제거

이 예제에서는 배포 데이터베이스가 AG에 있을 때 게시자 및 배포자를 제거합니다.

게시자 워크플로

PUB에서 이 게시자에 대한 모든 구독 및 게시를 삭제한 다음, 호출 sp_dropdistributor합니다.

배포자 워크플로

이 예제에서 DIST1은 현재 데이터베이스 AG의 distribution 기본 데이터베이스입니다. DIST2 및 DIST3은 보조 복제본(replica).

  1. DIST2 및 DIST3에서 다음을 실행합니다.

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB', @no_checks = 1;
    
  2. DIST1에서 다음을 실행합니다.

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB';
    
  3. AG를 삭제합니다.

  4. DIST2 및 DIST3에서 복구로 데이터베이스를 복원하여 distribution 데이터베이스를 read_write 모드로 변경합니다.

    RESTORE DATABASE [distribution] WITH RECOVERY, KEEP_REPLICATION;
    
  5. 데이터베이스를 삭제 distribution 하고 스냅샷 디렉터리를 유지하려면 다음을 실행합니다.

    EXEC sys.sp_dropdistributiondb @database = 'distribution' , @former_ag_secondary = 1;
    

이 프로시저는 이 복제본(replica) 모든 현수 작업을 제거합니다.

  1. DIST1에 데이터베이스를 삭제 distribution 하려면

    EXEC sys.sp_dropdistributiondb @database = 'distribution';
    
  2. AG에 다른 배포 데이터베이스가 없는 경우 DIST1, DIST2 및 DIST3에서 실행 sp_dropdistributor 합니다.

배포 데이터베이스 AG에 복제본(replica) 추가

다음은 AG에서 배포 데이터베이스를 사용하여 기존 복제본(replica) 구성에 새 배포자를 추가하는 예제입니다. 이 예제에서는 기존 배포 데이터베이스가 AG에 있습니다. DIST1 및 DIST2는 배포자이며 AG distribution 의 배포 데이터베이스이며 PUB는 게시자입니다. AG에서 DIST3을 복제본(replica) 추가합니다.

배포자 워크플로

  1. DIST3을 통해 sp_adddistributor @@servername배포자로 구성해야 합니다. distributor_admin에 대한 암호는 @password 매개 변수를 통해 지정되어야 합니다. 암호는 DIST1 및 DIST2에 지정된 암호와 동일해야 합니다.

  2. 현재 배포 데이터베이스에 대한 DIST3을 AG에 추가합니다.

  3. DIST3에서 다음을 실행합니다.

    EXEC sys.sp_adddistributiondb @database = 'distribution';
    
  4. DIST3에서 복제본(replica) 보조로 읽을 수 있는 경우 다음을 실행합니다.

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    복제본(replica) 보조 데이터베이스로 읽을 수 없는 경우 복제본(replica) 주 복제본이 되도록 장애 조치(failover)를 수행하고 다음을 실행합니다.

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    @working_directory 은 DIST1 및 DIST2에 대해 지정된 값과 동일해야 합니다.

  5. DIST3에서는 구독자에 대한 연결된 서버를 다시 만들어야 합니다.

배포 데이터베이스 AG에서 복제본 제거

다음은 배포 데이터베이스 AG의 나머지 복제본(replica) 영향을 받지 않는 동안 배포자를 현재 배포 데이터베이스 AG에서 제거하는 예제입니다. 이 예제에서는 배포 데이터베이스가 AG에 있습니다. DIST1, DIST2 및 DIST3은 배포자이며 AG distribution 의 배포 데이터베이스이며 PUB는 게시자입니다. AG에서 DIST3을 제거합니다.

배포자 워크플로

  1. DIST3이 데이터베이스 AG의 distribution 보조 데이터베이스인지 확인합니다.

  2. 데이터베이스 AG에서 DIST3을 distribution 제거합니다.

  3. DIST3에서 복구를 distribution 사용하여 데이터베이스를 복원하여 데이터베이스를 read_write 모드로 변경합니다. 예를 들어 다음 명령을 실행합니다.

    RESTORE DATABASE distribution WITH RECOVERY, KEEP_REPLICATION;
    
  4. DIST3에서 분리된 모든 작업을 제거하려면 다음을 실행합니다.

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB', @no_checks = 1;
    
  5. DIST3에서 다음을 실행합니다.

    EXEC sys.sp_dropdistributiondb @database = 'distribution', @former_ag_secondary = 1;
    
  6. DIST3에서 다음을 실행합니다.

    EXEC sys.sp_dropdistributor;
    

배포 데이터베이스 AG에서 게시자 제거

이 예제에서는 현재 배포 데이터베이스 AG에서 게시자를 제거하며, 배포 데이터베이스 AG에서 서비스하는 나머지 게시자에는 영향이 없습니다. 이 예에서는 기존 구성이 AG에 배포 데이터베이스를 갖습니다. DIST1, DIST2 및 DIST3은 배포자이며 AG distribution 의 배포 데이터베이스이며 PUB1 및 PUB2는 데이터베이스에서 distribution 제공하는 게시자입니다. 이 예에서는 이러한 배포자에서 PUB1을 제거합니다.

게시자 워크플로

PUB1에서 이 게시자에 대한 모든 구독 및 게시를 삭제한 다음 sp_dropdistributor호출합니다.

배포자 워크플로

DIST1은 현재 데이터베이스 AG의 distribution 기본 데이터베이스입니다.

  1. DIST2 및 DIST3에서 다음을 실행합니다.

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB1',  @no_checks = 1;
    
  2. DIST1에서 다음을 실행합니다.

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB1';
    
  3. 이 시점에서 DIST2 또는 DIST3의 PUB1과 관련된 분리된 작업이 있을 수 있습니다. DIST2 및 DIST3에서 장애 조치(failover)가 발생할 때마다 PUB1의 모든 게시와 관련한 분리된 작업은 Monitor and sync replication agent jobs 작업을 통해 제거됩니다.

구독 추가

이 예는 배포자 간에 구독자 정보를 올바르게 구성하는 방법에 대한 것입니다. 이 예제에서는 구독자를 추가합니다. DIST1은 AG에서 배포 데이터베이스의 현재 주 복제본(replica), DIST2 및 DIST3은 AG에서 배포 데이터베이스의 보조 복제본(replica). 구독자 이름이 SUB입니다.

게시자 워크플로

PUB에서 일반적으로 구독자에 대해 수행하는 것처럼 구독을 추가합니다 SUB.

배포자 워크플로

이전에 DIST2 및 DIST3에 등록하지 않은 경우 DIST2 및 DIST3에서 'SUB'에 대해 연결된 서버를 추가합니다. 다음은 연결된 서버 만들기를 위한 샘플 TSQL입니다.

EXEC master.dbo.sp_addlinkedserver@server =N'SUB', @srvproduct=N'SQL Server';
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin@rmtsrvname = N'SUB', @useself = N'True',@locallogin = NULL,@rmtuser =N ULL,@rmtpassword = NULL;

끌어오기 구독 추가

구독자 워크플로

AG에서 배포 데이터베이스를 사용하여 게시에 대한 끌어오기 구독을 추가하려면 매개 변수sp_addpullsubscription_agent@distributor AG 수신기 이름을 사용합니다.

샘플 T-SQL AG에서 배포 DB 만들기

다음 스크립트는 가용성 그룹에서 배포 데이터베이스를 사용하도록 설정합니다.

--- WorkFlow to Enable Distribution Database In AG.

-- SECTION 1 ---- CONFIGURE THE DISTRIBUTOR SERVERS

-- Step1 - Configure the Distribution DB nodes (AG Replicas) to act as a distributor
:Connect SQLNode1
EXEC [sys].[sp_adddistributor]
    @distributor = @@SERVERNAME,
    @password = 'Pass@word1';
GO
:Connect SQLNode2
EXEC [sys].[sp_adddistributor]
    @distributor = @@SERVERNAME,
    @password = 'Pass@word1';
GO

-- Step2 - Configure the Distribution Database
:Connect SQLNode1
USE [master];
EXEC [sys].[sp_adddistributiondb]
    @database = 'DistributionDB',
    @security_mode = 1;
GO
ALTER DATABASE [DistributionDB] SET RECOVERY FULL;
GO
BACKUP DATABASE [DistributionDB] TO DISK = 'NUL';
GO
-- Step 3 - Create AG for the Distribution DB.
:Connect SQLNode1
USE [master];
GO
CREATE ENDPOINT [Hadr_endpoint]
    STATE = STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = WINDOWS NEGOTIATE,
        ENCRYPTION = REQUIRED ALGORITHM AES
    );
GO

:Connect SQLNode2
USE [master];
GO
CREATE ENDPOINT [Hadr_endpoint]
    STATE = STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = WINDOWS NEGOTIATE,
        ENCRYPTION = REQUIRED ALGORITHM AES
    );
GO

:Connect SQLNode1
-- Create the Availability Group
CREATE AVAILABILITY GROUP [DistributionDB_AG]
FOR DATABASE [DistributionDB]
REPLICA ON
N'SQLNode1' WITH (ENDPOINT_URL = N'TCP://SQLNode1.contoso.com:5022', 
	 FAILOVER_MODE = AUTOMATIC, 
	 AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, 
	 BACKUP_PRIORITY = 50, 
	 SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL), 
	 SEEDING_MODE = AUTOMATIC),
N'SQLNode2' WITH (ENDPOINT_URL = N'TCP://SQLNode2.contoso.com:5022', 
	 FAILOVER_MODE = AUTOMATIC, 
	 AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, 
	 BACKUP_PRIORITY = 50, 
	 SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL), 
	 SEEDING_MODE = AUTOMATIC);
GO


:Connect SQLNode2
ALTER AVAILABILITY GROUP [DistributionDB_AG] JOIN;
GO  
ALTER AVAILABILITY GROUP [DistributionDB_AG] GRANT CREATE ANY DATABASE;
GO

--STEP4 - Create the Listener for the Availability Group. This is very important.
:Connect SQLNode1

USE [master]
GO
ALTER AVAILABILITY GROUP [DistributionDB_AG]
ADD LISTENER N'DistributionDBList' (
WITH IP
((N'10.0.0.8', N'255.255.255.0')) , PORT=1500);
GO

-- STEP 5 - Enable SQLNode2 also as a Distributor
:Connect SQLNode2
EXEC sys.sp_adddistributiondb @database = 'DistributionDB', @security_mode = 1;
GO

--STEP 6 - On all Distributor Nodes Configure the Publisher Details 
:Connect SQLNode1
EXEC sys.sp_adddistpublisher @publisher = 'SQLNode4', @distribution_db = 'DistributionDB', 
	@working_directory = '\\sqlfileshare\Dist_Work_Directory\';
GO
:Connect SQLNode2
EXEC sys.sp_adddistpublisher @publisher = 'SQLNode4', @distribution_db = 'DistributionDB', 
	@working_directory = '\\sqlfileshare\Dist_Work_Directory\';
GO

-- SECTION 2 ---- CONFIGURE THE PUBLISHER SERVER
:Connect SQLNode4
EXEC sys.sp_adddistributor @distributor = 'DistributionDBList', -- Listener for the Distribution DB.	
	@password = 'Pass@word1';
GO

-- SECTION 3 ---- CONFIGURE THE SUBSCRIBERS 
-- On Publisher, create the publication as one would normally do.
-- On the Secondary replicas of the Distribution DB, add the Subscriber as a linked server.
:Connect SQLNode2
EXEC master.dbo.sp_addlinkedserver @server = N'SQLNODE5', @srvproduct = N'SQL Server';
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'SQLNODE5', @useself = N'True',
	@locallogin = NULL,@rmtuser = NULL,@rmtpassword = NULL;

데이터 및 데이터베이스 개체 게시
배포자 보안 설정
배포자 및 게시자 속성 보기 및 수정
게시 및 배포 해제
복제용 데이터베이스 사용(SQL Server Management Studio)