다음을 통해 공유


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

적용 대상: SQL Server

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

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

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

참고 항목

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

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

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

지원되는 시나리오

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

제한 사항 또는 제외 항목

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

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

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

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

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

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

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

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

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

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

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

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

  • 양방향 트랜잭션 복제는 지원되지 않습니다.

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

    참고 항목

    보조 복제본에서 복제 저장 프로시저(예 - sp_dropdistpublisher, sp_dropdistributiondb, sp_dropdistributor, sp_adddistributiondb, sp_adddistpublisher)를 실행하기 전에 복제본이 완전히 동기화되었는지 확인합니다.

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

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

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

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

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

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

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

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

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

구성 아키텍처

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

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

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

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

배포자 워크플로

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

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

  3. DIST1, DIST2 및 DIST3에서 복제본으로 distribution 데이터베이스용 AG를 만듭니다. 모든 복제본이 동기식인 것이 좋습니다. 읽기 가능하거나 읽기를 허용하도록 보조 복제본을 구성합니다. 현재 배포 데이터베이스는 AG, DIST1은 주 복제본, DIST2 및 DIST3은 보조 복제본입니다.

  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에서 복제본을 보조 복제본으로 읽을 수 있는 경우 다음을 실행합니다.

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

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

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

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

게시자 워크플로

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

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

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

배포자 및 게시자 제거

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

게시자 워크플로

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

배포자 워크플로

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

  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;
    

이 절차는 이 복제본의 모든 현수 작업을 제거합니다.

  1. DIST1에서 distribution 데이터베이스를 삭제하려면 다음을 실행합니다.

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

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

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

배포자 워크플로

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

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

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

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

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

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

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

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

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

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

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

배포자 워크플로

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

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

  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은 배포자이며 distribution은(는) AG에 있는 배포 데이터베이스이며 PUB1 및 PUB2는 distribution 데이터베이스가 서비스하는 게시자입니다. 이 예에서는 이러한 배포자에서 PUB1을 제거합니다.

게시자 워크플로

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

배포자 워크플로

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

  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에서 배포 데이터베이스의 현재 주 복제본이며, DIST2 및 DIST3은 AG에서 배포 데이터베이스의 보조 복제본입니다. 구독자 이름은 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에서 배포 데이터베이스를 사용하여 게시에 대한 끌어오기 구독을 추가하려면 @distributorsp_addpullsubscription_agent 매개 변수에 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)