가용성 그룹에서 두 피어 구성

SQL Server 2019(15.x) CU 13부터 SQL Server Always On 가용성 그룹에 속한 데이터베이스는 피어 투 피어 트랜잭션 복제본(replica)tion 토폴로지에서 피어로 참여할 수 있습니다. 이 문서에서는 각각 자체 가용성 그룹에 있는 두 피어를 사용하여 이 시나리오를 구성하는 방법을 설명합니다.

이 예제의 스크립트는 T-SQL 저장 프로시저를 사용합니다.

역할 및 이름

이 섹션에서는 이 문서의 복제 토폴로지에서 참여하는 다양한 요소의 역할과 이름을 설명합니다.

Peer1

  • Node1: 첫 번째 가용성 그룹에 대한 기본 복제본(replica)
  • Node2: 첫 번째 가용성 그룹의 보조 복제본
  • MyAG: 첫 번째 가용성 그룹의 가용성 그룹 이름
  • MyDBName: Peer1 데이터베이스. 게시할 데이터베이스
  • Dist1: 원격 배포자
  • P2P_MyDBName: 게시 이름
  • MyAGListenerName: 가용성 그룹 수신기

Peer2

  • Node3: 두 번째 가용성 그룹에 대한 기본 복제본(replica)
  • Node4: 두 번째 가용성 그룹에 대한 보조 복제본(replica)
  • MyAG2: 두 번째 가용성 그룹 이름의 가용성 그룹 이름
  • MyDBName: 게시할 데이터베이스
  • Dist2: 원격 배포자
  • P2P_MyDBName: 게시 이름
  • MyAG2ListenerName: 가용성 그룹 수신기

필수 조건

  • 가용성 그룹을 호스트하기 위한 별도의 물리적 또는 가상 서버에 있는 SQL Server 인스턴스 4개. 두 가용성 그룹은 각각 피어 데이터베이스를 포함합니다.

  • 배포자 데이터베이스를 호스트하기 위한 2개의 SQL Server 인스턴스.

  • 모든 서버 인스턴스에는 지원되는 버전(Enterprise Edition 또는 Developer Edition)이 필요합니다.

  • 모든 서버 인스턴스에는 지원되는 버전인 SQL Server 2019(15.x) CU13 이상이 필요합니다.

  • 모든 인스턴스 간에 충분한 네트워크 연결 및 대역폭.

  • SQL Server의 모든 인스턴스에 SQL Server 복제본(replica)tion을 설치합니다.

    인스턴스에 복제본(replica) 설치되어 있는지 확인하려면 다음 쿼리를 실행합니다.

    USE master;   
    GO   
    DECLARE @installed int;   
    EXEC @installed = sys.sp_MS_replication_installed;   
    SELECT @installed; 
    

    참고 항목

    배포 데이터베이스에 대한 단일 실패 지점을 방지하려면 각 피어에 대해 원격 배포자를 사용합니다.

    데모 또는 테스트 환경의 경우 단일 인스턴스에서 배포 데이터베이스를 구성할 수 있습니다.

배포자 및 원격 게시자 구성(Peer1)

이 섹션에서는 가용성 그룹에서 첫 번째 피어(Peer1)를 설정하는 방법을 설명합니다.

  1. Dist1에서 배포를 구성하려면 실행 sp_adddistributor 합니다. @password =를 사용하여 원격 게시자가 배포자에 연결하는 데 사용하는 암호를 지정합니다. 원격 배포자를 구성할 때 각 원격 게시자에서 이 암호를 사용합니다.

    USE master;  
    GO  
    EXEC sys.sp_adddistributor  
     @distributor = 'Dist1',  
     @password = '<Strong password for distributor>';  
    
  2. 배포자에서 배포 데이터베이스를 만듭니다.

    USE master;
    GO  
    EXEC sys.sp_adddistributiondb  
     @database = 'distribution',  
     @security_mode = 1;  
    
  3. Node1 및 Node2 원격 게시자를 구성합니다.

    복제본(replica) @security_mode 에이전트가 현재 주 데이터베이스에 연결하는 방법을 결정합니다.

    • 1= Windows 인증.
    • 0 = SQL Server 인증. @login@password가 필요합니다. 지정된 로그인 및 암호는 각 보조 복제본(replica) 유효해야 합니다.

    참고 항목

    수정된 복제본(replica) 에이전트가 배포자가 아닌 다른 컴퓨터에서 실행되는 경우 주 데이터베이스에 대한 연결에 Windows 인증 사용하려면 복제본(replica) 호스트 컴퓨터 간의 통신에 대한 Kerberos 인증이 필요합니다. 현재 주 복제본에 대한 연결에 SQL Server 로그인을 사용하면 Kerberos 인증이 필요하지 않습니다.

    USE master;  
    GO  
    EXEC sys.sp_adddistpublisher  
     @publisher = 'Node1',  
     @distribution_db = 'distribution',  
     @working_directory = '\\MyReplShare\WorkingDir',  
     @security_mode = 1
    USE master;  
    GO  
    EXEC sys.sp_adddistpublisher  
     @publisher = 'Node2',  
     @distribution_db = 'distribution',  
     @working_directory = '\\MyReplShare\WorkingDir',  
     @security_mode = 1
    

원래 게시자에서 게시자 구성(Node1)

  1. 원격 배포 원본 게시자(Node1)를 구성합니다. @password 값은 배포를 설정하기 위해 배포자에서 sp_adddistributor를 실행할 때 사용한 것과 동일한 값으로 지정합니다.

    EXEC sys.sp_adddistributor  
    @distributor = 'Dist1',  
    @password = '<Password used when running sp_adddistributor on distributor server>' 
    
  2. 데이터베이스를 복제본(replica) 사용하도록 설정합니다.

    USE master;  
    GO  
    EXEC sys.sp_replicationdboption  
     @dbname = 'MyDBName',  
     @optname = 'publish',  
     @value = 'true';  
    

보조 복제본(replica) 호스트를 복제본(replica)tion 게시자로 구성(Node2)

첫 번째 가용성 그룹에 대한 각 보조 복제본(replica) 호스트(Node2)에서 배포를 구성합니다. @password 값은 배포를 설정하기 위해 배포자에서 sp_adddistributor를 실행할 때 사용한 것과 동일한 값으로 지정합니다.

EXEC sys.sp_adddistributor  
   @distributor = 'Dist1',  
   @password = '<Password used when running sp_adddistributor on distributor server>' 

데이터베이스를 가용성 그룹의 일부로 만들고 수신기 만들기(Peer1)

  1. 의도된 주 복제본에서 데이터베이스를 멤버 데이터베이스로 사용하여 가용성 그룹을 만듭니다.

  2. 가용성 그룹에 대한 DNS 수신기 만들기 복제본(replica) 에이전트는 수신기를 사용하여 현재 기본 복제본(replica) 연결합니다. 다음 예제에서는 라는 MyAGListenerName수신기를 만듭니다.

    ALTER AVAILABILITY GROUP 'MyAG'
    ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));   
    

    참고 항목

    위의 스크립트에서 대괄호([ ... ])의 정보는 선택 사항입니다. TCP 포트에 대한 기본값이 아닌 값을 지정하는 데 사용합니다. 대괄호를 포함하지 마세요.

원래 게시자를 AG 수신기 이름으로 리디렉션(Peer1)

Peer1용 배포자에서 원래 게시자를 AG 수신기 이름으로 리디렉션합니다.

USE distribution;   
GO   
EXEC sys.sp_redirect_publisher    
@original_publisher = 'Node1',   
@publisher_db = 'MyDBName',   
@redirected_publisher = 'MyAGListenerName,<port>';   

참고 항목

위의 스크립트에서 ,<port>는 선택 사항입니다. 기본 포트가 아닌 포트를 사용하는 경우에만 필요합니다. <> 꺾쇠 괄호는 포함하지 마세요.

원래 게시자(Node1)에서 피어 투 피어 게시(Peer1) 만들기

다음 스크립트는 Peer1에 대한 게시를 만듭니다.

EXEC master..sp_replicationdboption  @dbname=  'MyDBName'   
        ,@optname=  'publish'   
        ,@value=  'true'  
GO
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
GO
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node1'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 100
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p, @independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted, @status = @status, @sync_method = @sync_method
GO
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
GO
DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, 
@source_owner = @source_owner, @type = @type
GO

피어 투 피어 게시가 가용성 그룹(Peer1)과 호환되도록 만들기

원래 게시자(Node1)에서 다음 스크립트를 실행하여 게시가 가용성 그룹과 호환되도록 합니다.

USE MyDBName
GO
DECLARE @publication sysname = N'P2P_MyDBName' 
DECLARE @property sysname = N'redirected_publisher' 
DECLARE @value sysname = N'MyAGListenerName,<port>' 
EXEC MyDBName..sp_changepublication @publication = @publication, @property = @property, @value = @value 
GO 

참고 항목

위의 스크립트에서 ,<port>는 선택 사항입니다. 기본 포트가 아닌 포트를 사용하는 경우에만 필요합니다.

위의 단계를 완료한 후 가용성 그룹은 피어 투 피어 토폴로지에서 참여할 준비가 됩니다. 다음 단계에서는 피어 투 피어 복제본(replica)tion 토폴로지에서 별도의 가용성 그룹을 두 번째 피어(Peer2)로 구성합니다.

배포자 및 원격 게시자 구성(Peer2)

이 섹션에서는 다른 가용성 그룹에서 두 번째 피어(Peer2)를 설정하는 방법을 설명합니다.

  1. sp_adddistributor를 실행하여 Dist2에서 배포를 구성합니다. @password =를 사용하여 원격 게시자가 배포자에 연결하는 데 사용하는 암호를 지정합니다. 원격 배포자를 구성할 때 각 원격 게시자에서 이 암호를 사용합니다.

    USE master;  
    GO  
    EXEC sys.sp_adddistributor  
     @distributor = 'Dist2',  
     @password = '<Strong password for distributor>';  
    
  2. 배포자에서 배포 데이터베이스를 만듭니다.

    USE master;
    GO  
    EXEC sys.sp_adddistributiondb  
     @database = 'distribution',  
     @security_mode = 1;  
    
  3. Node3Node4 원격 게시자를 구성합니다.

    복제본(replica) @security_mode 에이전트가 현재 주 데이터베이스에 연결하는 방법을 결정합니다.

    • 1= Windows 인증.
    • 0 = SQL Server 인증. @login@password가 필요합니다. 지정된 로그인 및 암호는 각 보조 복제본(replica) 유효해야 합니다.

    참고 항목

    수정된 복제본(replica) 에이전트가 배포자가 아닌 다른 컴퓨터에서 실행되는 경우 주 데이터베이스에 대한 연결에 Windows 인증 사용하려면 복제본(replica) 호스트 컴퓨터 간의 통신에 대한 Kerberos 인증이 필요합니다. 현재 주 복제본에 대한 연결에 SQL Server 로그인을 사용하면 Kerberos 인증이 필요하지 않습니다.

    USE master;  
    GO  
    EXEC sys.sp_adddistpublisher  
     @publisher = 'Node3',  
     @distribution_db = 'distribution',  
     @working_directory = '\\MyReplShare\WorkingDir2',  
     @security_mode = 1
    USE master;  
    GO  
    EXEC sys.sp_adddistpublisher  
     @publisher = 'Node4',  
     @distribution_db = 'distribution',  
     @working_directory = '\\MyReplShare\WorkingDir2',  
     @security_mode = 1
    

게시자(Peer2) 구성

  1. (Node3)에서 원격 배포를 구성합니다. @password 값은 배포를 설정하기 위해 배포자에서 sp_adddistributor를 실행할 때 사용한 것과 동일한 값으로 지정합니다.

    EXEC sys.sp_adddistributor  
    @distributor = 'Dist2',  
    @password = '<Password used when running sp_adddistributor on distributor server>' 
    
  2. 데이터베이스를 복제본(replica) 사용하도록 설정합니다.

    USE master;  
    GO  
    EXEC sys.sp_replicationdboption  
     @dbname = 'MyDBName',  
     @optname = 'publish',  
     @value = 'true';  
    

보조 복제본 호스트를 복제 게시자(Node4)로 구성

두 번째 가용성 그룹에 대한 각 보조 복제본(replica) 호스트(Node4)에서 배포를 구성합니다. @password 값은 배포를 설정하기 위해 배포자에서 sp_adddistributor를 실행할 때 사용한 것과 동일한 값으로 지정합니다.

EXEC sys.sp_adddistributor  
   @distributor = 'Dist2',  
   @password = '<Password used when running sp_adddistributor on distributor server>' 

데이터베이스를 가용성 그룹의 일부로 만들고 수신기(Peer2) 만들기

  1. 의도된 주 복제본에서 데이터베이스를 멤버 데이터베이스로 사용하여 가용성 그룹을 만듭니다.

  2. 가용성 그룹에 대한 DNS 수신기 만들기 복제본(replica) 에이전트는 수신기를 사용하여 현재 기본 복제본(replica) 연결합니다. 다음 예제에서는 라는 MyAG2ListenerName수신기를 만듭니다.

    ALTER AVAILABILITY GROUP 'MyAG2'
    ADD LISTENER 'MyAG2ListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));   
    

    참고 항목

    위의 스크립트에서 대괄호([ ... ])의 정보는 선택 사항입니다. TCP 포트에 대한 기본값이 아닌 값을 지정하는 데 사용합니다. 대괄호를 포함하지 마세요.

원래 게시자를 AG 수신기 이름으로 리디렉션(Peer2)

Peer2 배포자에서 원래 게시자를 AG 수신기 이름으로 리디렉션합니다.

USE distribution;   
GO   
EXEC sys.sp_redirect_publisher    
@original_publisher = 'Node3',   
@publisher_db = 'MyDBName',   
@redirected_publisher = 'MyAG2ListenerName,<port>';   

참고 항목

위의 스크립트에서 ,<port>는 선택 사항입니다. 기본 포트가 아닌 포트를 사용하는 경우에만 필요합니다. <> 꺾쇠 괄호는 포함하지 마세요.

피어 투 피어 게시 만들기(Peer2)

다음 스크립트는 Peer2에 대한 게시를 만듭니다.

Node3에서 다음 명령을 실행하여 피어 투 피어 게시를 만듭니다.

EXEC master..sp_replicationdboption  @dbname=  'MyDBName'   
        ,@optname=  'publish'   
        ,@value=  'true'  
GO
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
GO

-- Note – Make sure that the value for @p2p_originator_id is different from Peer1.
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node3'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 1
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p, @independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted, @status = @status, @sync_method = @sync_method
GO
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
GO

DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, 
@source_owner = @source_owner, @type = @type
GO

피어 투 피어 게시가 가용성 그룹과 호환되도록 만들기(Peer2)

원래 게시자(Node3)에서 다음 스크립트를 실행하여 게시가 가용성 그룹과 호환되도록 합니다.

USE MyDBName
GO
DECLARE @publication sysname = N'P2P_MyDBName' 
DECLARE @property sysname = N'redirected_publisher' 
DECLARE @value sysname = N'MyAG2ListenerName,<port>' 
EXEC MyDBName..sp_changepublication @publication = @publication, @property = @property, @value = @value 
GO 

참고 항목

위의 스크립트에서 ,<port>는 선택 사항입니다. 기본 포트가 아닌 포트를 사용하는 경우에만 필요합니다.

Peer1에서 Peer2에 대한 가용성 그룹 수신기로 밀어넣기 구독 만들기

Peer1에서 가용성 그룹 수신기 Peer2로 밀어넣기 구독을 만들려면 Node1에서 다음 명령을 실행합니다.

Node1에서 다음 스크립트를 실행합니다. Node1이 주 복제본을 실행하고 있다고 가정합니다.

Important

아래 스크립트는 구독자의 가용성 그룹 수신기 이름을 지정합니다.

@subscriber = N'MyAGListenerName,<port>'

참고 항목

위의 스크립트에서 ,<port>는 선택 사항입니다. 기본 포트가 아닌 포트를 사용하는 경우에만 필요합니다. <> 꺾쇠 괄호는 포함하지 마세요.

EXEC [MyDBName].dbo.sp_addsubscription 
   @publication = N'P2P_MyDBName'
 , @subscriber = N'MyAG2Listener,<port>' 
 , @destination_db = N'MyDBName'
 , @subscription_type = N'push'
 , @sync_type = N'replication support only'
GO

EXEC [MyDBName].dbo.sp_addpushsubscription_agent 
   @publication = N'P2P_MyDBName'
 , @subscriber = N'MyAG2Listener,<port>' 
 , @subscriber_db = N'MyDBName'
 , @job_login = null 
 , @job_password = null
 , @subscriber_security_mode = 1
 , @frequency_type = 64
 , @frequency_interval = 1
 , @frequency_relative_interval = 1
 , @frequency_recurrence_factor = 0
 , @frequency_subday = 4
 , @frequency_subday_interval = 5
 , @active_start_time_of_day = 0
 , @active_end_time_of_day = 235959
 , @active_start_date = 0
 , @active_end_date = 0
 , @dts_package_location = N'Distributor'
GO

Peer2에서 가용성 그룹 수신기로 밀어넣기 구독 만들기(Peer1)

Peer2에서 가용성 그룹 수신기(Peer1)로 밀어넣기 구독을 만들려면 Node3에서 다음 명령을 실행합니다.

Important

아래 스크립트는 구독자의 가용성 그룹 수신기 이름을 지정합니다.

@subscriber = N'MyAGListenerName,<port>'

참고 항목

위의 스크립트에서 ,<port>는 선택 사항입니다. 기본 포트가 아닌 포트를 사용하는 경우에만 필요합니다. <> 꺾쇠 괄호는 포함하지 마세요.

EXEC [MyDBName].dbo.sp_addsubscription 
   @publication = N'P2P_MyDBName'
 , @subscriber = N'MyAGListenerName,<port>'
 , @destination_db = N'MyDBName'
 , @subscription_type = N'push'
 , @sync_type = N'replication support only'
GO

EXEC [MyDBName].dbo.sp_addpushsubscription_agent 
   @publication = N'P2P_MyDBName'
 , @subscriber = N'MyAGListenerName,<port>'
 , @subscriber_db = N'MyDBName'
 , @job_login = null
 , @job_password = null
 , @subscriber_security_mode = 1
 , @frequency_type = 64
 , @frequency_interval = 1
 , @frequency_relative_interval = 1
 , @frequency_recurrence_factor = 0
 , @frequency_subday = 4
 , @frequency_subday_interval = 5
 , @active_start_time_of_day = 0
 , @active_end_time_of_day = 235959
 , @active_start_date = 0
 , @active_end_date = 0
 , @dts_package_location = N'Distributor'
GO

연결된 서버 구성

각 보조 복제본(replica) 호스트에서 데이터베이스 게시의 밀어넣기 구독자가 연결된 서버로 표시되는지 확인합니다.

EXEC sys.sp_addlinkedserver   
    @server = 'MySubscriber';

다음 단계