다음을 통해 공유


가용성 그룹의 일부로 하나의 피어 구성

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

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

역할 및 이름

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

Peer1

  • Node1: MyAG 가용성 그룹의 복제본 1입니다.
  • Node2: MyAG 가용성 그룹의 복제본 2입니다.
  • MyAG: Node1Node2에서 만들 가용성 그룹의 이름.
  • MyAGListenerName: 가용성 그룹 수신기의 이름입니다.
  • Dist1: 원격 배포자 인스턴스의 이름입니다.
  • MyDBName: 데이터베이스의 이름입니다.
  • P2P_MyDBName: 게시 이름입니다.

Peer2

  • Node3: SQL Server의 기본 인스턴스를 호스팅하는 독립 실행형 서버입니다.
  • Dist2: 원격 배포자 인스턴스의 이름입니다.
  • MyDBName: 데이터베이스의 이름입니다.
  • P2P_MyDBName: 게시 이름입니다.

필수 조건

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

  • 다른 피어 데이터베이스를 호스트할 SQL Server의 한 인스턴스입니다.

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

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

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

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

  • SQL Server의 모든 인스턴스에 SQL Server 복제 를 설치합니다.

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

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

    참고 항목

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

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

배포자 및 원격 게시자 구성(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를 원격 게시자로 구성합니다.

    @security_mode 복제 에이전트가 현재 주 복제본에 연결하는 방법을 결정합니다.

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

    참고 항목

    수정된 복제 에이전트가 배포자가 아닌 다른 컴퓨터에서 실행되는 경우 주 복제본에 대한 연결에 Windows 인증 사용하려면 복제본 호스트 컴퓨터 간의 통신에 대한 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. 복제에 데이터베이스를 활성화합니다.

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

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

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

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

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

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

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

    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>는 선택 사항입니다. 기본 포트가 아닌 포트를 사용하는 경우에만 필요합니다. <> 꺾쇠 괄호는 포함하지 마세요.

위의 단계를 완료한 후 가용성 그룹은 피어 투 피어 토폴로지에서 참여할 준비가 됩니다. 다음 단계에서는 참여하도록 SQL Server(Peer2)의 독립 실행형 인스턴스를 구성합니다.

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

  1. 배포자에서 배포를 구성합니다.

    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. 배포자 Dist2에서 Node3을 원격 게시자로 구성

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

게시자(Peer2) 구성

  1. Node3에서 원격 배포를 구성합니다.

    exec sys.sp_adddistributor  
    @distributor = 'Dist2',  
    @password = '<Password used when running sp_adddistributor on distributor server>' 
    
  2. Node3에서 복제를 위해 데이터베이스를 사용하도록 설정합니다.

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

피어 투 피어 게시 만들기(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

Peer1에서 Peer2로 밀어넣기 구독 만들기

이 단계에서는 가용성 그룹에서 SQL Server의 독립 실행형 인스턴스로 밀어넣기 구독을 만듭니다.

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

EXEC [MyDBName].dbo.sp_addsubscription 
   @publication = N'P2P_MyDBName'
 , @subscriber = N'Node3'
 , @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'Node3'
 , @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에서 가용성 그룹 수신기로 밀어넣기 구독 만들기

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

Important

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

@subscriber = N'MyAGListenerName,<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

연결된 서버 구성

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

EXEC sys.sp_addlinkedserver   
    @server = 'MySubscriber';

다음 단계