분할된 데이터베이스 간에 데이터를 이동하는 분할 병합 서비스 배포

적용 대상:Azure SQL Database

분할-병합 도구를 사용하면 분할된 데이터베이스 간에 데이터를 이동할 수 있습니다. 스케일 아웃 클라우드 데이터베이스 간 데이터 이동을 확인하세요.

참고 항목

분할 병합 도구는 App Services가 아닌 Cloud Services(클래식)에서 작동하기 위한 것입니다.

분할-병합 패키지 다운로드

  1. NuGet에서 최신 NuGet 버전을 다운로드합니다.

  2. 명령 프롬프트를 열고 nuget.exe를 다운로드한 디렉토리로 이동합니다. 다운로드에는 PowerShell 명령이 포함됩니다.

  3. 아래 명령을 사용하여 최신 분할/병합 패키지를 현재 디렉터리에 다운로드합니다.

    nuget install Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge
    

파일은 Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge.x.x.xxx.x라는 디렉터리에 배치되며 여기서 x.x.xxx.x(은)는 버전 번호를 반영합니다. content\splitmerge\service 하위 디렉터리에서 분할 병합 서비스 파일을, content\splitmerge\powershell 하위 디렉터리에서및 분할-병합 PowerShell 스크립트(및 필수 클라이언트 dll)을 찾습니다.

필수 조건

  1. 분할 병합 상태 데이터베이스로 사용할 Azure SQL Database 데이터베이스를 만듭니다. Azure Portal로 이동합니다. 새로운 SQL 데이터베이스를 만듭니다. 데이터베이스에 이름을 지정하고 새 관리자 및 암호를 만듭니다. 나중에 사용할 수 있도록 이름과 암호를 기록합니다.

  2. 서버에서 Azure 서비스의 연결을 허용하는지 확인합니다. 포털의 방화벽 설정에서 Azure Services에 대한 액세스 허용 설정켜기로 설정되어 있는지 확인합니다. “저장” 아이콘을 클릭합니다.

  3. 진단 출력에 사용할 Azure Storage 계정을 만듭니다.

  4. 분할-병합 서비스에 사용할 Azure 클라우드 서비스를 만듭니다.

분할-병합 서비스 구성하기

분할-병합 서비스 구성

  1. 분할/병합 어셈블리를 다운로드한 폴더에서 SplitMergeService.cspkg와 함께 제공된 ServiceConfiguration.Template.cscfg 파일의 복사본을 만들고 이름을 ServiceConfiguration.cscfg로 바꿉니다.

  2. Visual Studio와 같은 텍스트 편집기에서 인증서 지문 형식과 같은 입력의 유효성을 검사하는 ServiceConfiguration.cscfg 를 엽니다.

  3. 새 데이터베이스를 만들거나 분할/병합 작업에 대한 상태 데이터베이스로 사용할 기존 데이터베이스를 선택하고 해당 데이터베이스의 연결 문자열을 검색합니다.

    Important

    지금은 상태 데이터베이스에서 라틴어 데이터 정렬(SQL_Latin1_General_CP1_CI_AS)을 사용해야 합니다. 자세한 내용은 Windows 데이터 정렬 이름(Transact-SQL)을 참조하세요.

    Azure SQL Database를 사용할 경우 연결 문자열의 형식은 일반적으로 다음과 같습니다.

    Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<userId>; Password=<password>; Encrypt=True; Connection Timeout=30

  4. ElasticScaleMetadata 설정의 SplitMergeWebSplitMergeWorker 역할 섹션에 있는 .cscfg 파일에 이 연결 문자열을 입력합니다.

  5. SplitMergeWorker 역할의 경우 WorkerRoleSynchronizationStorageAccountConnectionString 설정에 대해 Azure Storage에 대한 유효한 연결 문자열을 입력합니다.

보안 구성

서비스의 보안을 구성하는 자세한 지침은 분할-병합 보안 설정을 참조하세요.

이 자습서에 대한 간단한 테스트를 배포하기 위해 서비스를 작동하고 실행하는 데 필요한 최소 구성 단계가 수행됩니다. 이러한 단계를 통해 실행하는 컴퓨터/계정 하나만 서비스와 통신할 수 있습니다.

자체 서명된 인증서 만들기

새 디렉터리를 만들고 이 디렉터리에서 Visual Studio용 개발자 명령 프롬프트 창을 사용하여 다음 명령을 실행합니다.

makecert ^
 -n "CN=*.cloudapp.net" ^
 -r -cy end -sky exchange -eku "1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2" ^
 -a sha256 -len 2048 ^
 -sr currentuser -ss root ^
 -sv MyCert.pvk MyCert.cer

프라이빗 키를 보호하기 위해 암호를 입력하라는 메시지가 표시됩니다. 강력한 암호를 입력하고 확인합니다. 이후에 사용할 암호를 한 번 더 입력하라는 메시지가 표시됩니다. 마지막에 를 클릭하여 신뢰할 수 있는 인증 기관 루트 저장소로 가져옵니다.

PFX 파일 만들기

인증서를 만들 때 사용한 것과 동일한 비밀번호를 사용하여 makecert를 실행한 동일한 창에서 다음 명령을 실행합니다:

pvk2pfx -pvk MyCert.pvk -spc MyCert.cer -pfx MyCert.pfx -pi <password>

개인 저장소로 클라이언트 인증서 가져오기

  1. Windows 탐색기에서 MyCert.pfx를 두 번 클릭합니다.
  2. 인증서 가져오기 마법사에서 현재 사용자를 선택하고 다음을 클릭합니다.
  3. 파일 경로를 확인하고 다음을 클릭합니다.
  4. 암호를 입력하고 모든 확장 속성 포함이 확인된 채로 두고 다음을 클릭합니다.
  5. 인증서 저장소[…]를 자동으로 선택이 확인된 채로 두고 다음을 클릭합니다.
  6. 완료확인을 클릭합니다.

클라우드 서비스에 PFX 파일 업로드

  1. Azure Portal로 이동합니다.
  2. 클라우드 서비스를 선택합니다.
  3. 분할/병합 서비스에 대해 위에서 만든 클라우드 서비스를 선택합니다.
  4. 상단 메뉴에서 인증서를 클릭합니다.
  5. 아래 바에서 업로드를 클릭합니다.
  6. PFX 파일을 선택하고 위와 동일한 암호를 입력합니다.
  7. 완료되면 목록의 새 항목에서 인증서 지문을 복사합니다.

서비스 구성 파일 업데이트

위에 복사한 인증서 지문을 이러한 설정의 지문/값 특성에 붙여넣습니다. 작업자 역할의 경우:

 <Setting name="DataEncryptionPrimaryCertificateThumbprint" value="" />
 <Certificate name="DataEncryptionPrimary" thumbprint="" thumbprintAlgorithm="sha1" />

웹 역할의 경우:

 <Setting name="AdditionalTrustedRootCertificationAuthorities" value="" />
 <Setting name="AllowedClientCertificateThumbprints" value="" />
 <Setting name="DataEncryptionPrimaryCertificateThumbprint" value="" />
 <Certificate name="SSL" thumbprint="" thumbprintAlgorithm="sha1" />
 <Certificate name="CA" thumbprint="" thumbprintAlgorithm="sha1" />
 <Certificate name="DataEncryptionPrimary" thumbprint="" thumbprintAlgorithm="sha1" />

프로덕션 배포의 경우 CA, 암호화, 서버 인증서 및 클라이언트 인증서에 개별 인증서를 사용해야 합니다. 이에 대한 자세한 지침은 보안 구성을 참조하세요.

서비스 배포하기

  1. Azure Portal로 이동
  2. 이전에 만든 클라우드 서비스를 선택합니다.
  3. 개요를 클릭합니다.
  4. 스테이징 환경을 선택한 다음 업로드를 클릭합니다.
  5. 대화 상자에서 배포 레이블을 입력합니다. '패키지' 및 '구성'에 대해 '로컬에서'를 클릭하고 SplitMergeService.cspkg 파일 및 이전에 구성한 cscfg 파일을 선택합니다.
  6. 하나 이상의 역할에 단일 인스턴스가 포함되어 있어도 배포라는 확인란이 선택되어 있는지 확인합니다.
  7. 오른쪽 아래의 눈금 단추를 눌러 배포를 시작합니다. 완료하는 데 몇 분 정도 걸릴 수 있습니다.

배포 문제 해결

웹 역할이 온라인 상태가 되면 보안 구성에 문제가 발생할 수 있습니다. 위에서 설명한 대로 TLS/SSL이 구성되어 있는지 확인합니다.

작업자 역할이 온라인 상태가 아니지만 웹 역할이 성공하는 경우 이전에 만든 상태 데이터베이스에 연결하는 데 문제가 발생할 수 있습니다.

  • cscfg의 연결 문자열 정확한지 확인합니다.

  • 서버와 데이터베이스가 있는지, 사용자 ID와 암호가 올바른지 확인합니다.

  • Azure SQL 데이터베이스를 사용할 경우 연결 문자열의 형식은 다음과 같습니다.

    Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<user>; Password=<password>; Encrypt=True; Connection Timeout=30

  • 서버 이름이 https://로 시작하지 않는지 확인합니다.

  • 서버에서 Azure 서비스의 연결을 허용하는지 확인합니다. 이렇게 하려면 포털에서 데이터베이스를 열고 Azure 서비스에 대한 액세스 허용 설정이 On**으로 설정되었는지 확인합니다.

서비스 배포 테스트

웹 브라우저와 연결

분할-병합 서비스의 웹 엔드포인트를 결정합니다. 클라우드 서비스의 개요로 이동하고 오른쪽의 사이트 URL을 확인하여 포털에서 이를 찾을 수 있습니다. 기본 보안 설정이 HTTP 엔드포인트를 사용하지 않도록 설정하기 때문에 http://https://로 바꿉니다. 이 URL의 페이지를 브라우저에 로드합니다.

PowerShell 스크립트로 테스트

포함된 샘플 PowerShell 스크립트를 실행하여 배포 및 환경을 테스트할 수 있습니다.

Important

샘플 스크립트는 PowerShell 5.1에서 실행됩니다. 현재 PowerShell 6 이상에서는 실행되지 않습니다.

포함된 스크립트 파일은 다음과 같습니다.

  1. SetupSampleSplitMergeEnvironment.ps1 - 분할/병합에 대한 테스트 데이터 계층을 설정합니다. 자세한 설명은 아래 테이블을 참조하세요.

  2. ExecuteSampleSplitMerge.ps1 - 테스트 데이터 계층에서 테스트 작업을 실행합니다(자세한 설명은 아래 표 참조).

  3. GetMappings.ps1 – 분할된 데이터베이스 매핑의 현재 상태를 출력하는 최상위 샘플 스크립트입니다.

  4. ShardManagement.psm1 – ShardManagement API를 래핑하는 도우미 스크립트입니다.

  5. SqlDatabaseHelpers.psm1 - SQL Database에서 데이터베이스 생성 및 관리를 위한 도우미 스크립트입니다.

    PowerShell 파일 단계
    SetupSampleSplitMergeEnvironment.ps1 1. 분할된 데이터베이스 맵 관리자 데이터베이스를 만듭니다.
    2. 분할된 데이터베이스를 2개 만듭니다.
    3. 해당 데이터베이스에 대한 분할된 데이터베이스 맵을 만듭니다. 이때 해당 데이터베이스의 기존 분할된 데이터베이스 맵은 삭제됩니다.
    4. 두 분할된 데이터베이스에서 작은 샘플 테이블을 만들고 둘 중 하나의 테이블을 채웁니다.
    5. 분할된 테이블에 대한 SchemaInfo를 선언합니다.
    PowerShell 파일 단계
    ExecuteSampleSplitMerge.ps1 1. 첫 번째 분할된 데이터베이스에서 두 번째 분할된 데이터베이스로 데이터의 절반을 분할하는 분할 요청을 분할/병합 서비스 웹 프런트 엔드로 보냅니다.
    2. 분할 요청 상태를 확인하기 위해 웹 프런트 엔드를 폴링한 다음, 요청이 완료될 때까지 기다립니다.
    3. 두 번째 분할된 데이터베이스에서 첫 번째 분할된 데이터베이스로 데이터를 다시 이동하는 병합 요청을 분할/병합 서비스 웹 프런트 엔드로 보냅니다.
    4. 병합 요청 상태를 확인하기 위해 웹 프런트 엔드를 폴링한 다음, 요청이 완료될 때까지 기다립니다.

PowerShell을 사용하여 배포 확인

  1. 새 PowerShell 창을 열고 분할/병합 패키지를 다운로드한 디렉터리로 이동한 다음, "PowerShell" 디렉터리로 이동합니다.

  2. 분할 맵 관리자와 분할 데이터베이스를 생성할 서버를 생성하거나 기존 서버를 선택합니다.

    참고 항목

    SetupSampleSplitMergeEnvironment.ps1 스크립트가 기본적으로 동일한 서버에 모든 데이터베이스를 만들어 스크립트를 단순하게 유지합니다. 이 제한은 분할/병합 서비스 자체의 제한은 아닙니다.

    분할-병합 서비스가 데이터를 이동하고 분할된 데이터베이스 맵을 업데이트하려면 DB에 대한 읽기/쓰기 액세스 권한이 있는 SQL 인증 로그인이 필요합니다. 분할-병합 서비스는 클라우드에서 실행되므로 현재 통합 인증을 지원하지 않습니다.

    서버가 이러한 스크립트를 실행하는 컴퓨터의 IP 주소에서 액세스할 수 있도록 구성되었는지 확인합니다. 이 설정은 SQL 서버/방화벽 및 가상 네트워크/클라이언트 IP 주소에서 찾을 수 있습니다.

  3. SetupSampleSplitMergeEnvironment.ps1 스크립트를 실행하여 샘플 환경을 만듭니다.

    이 스크립트를 실행하면 분할된 데이터베이스 맵 관리자 데이터베이스 및 분할된 데이터베이스의 기존 분할된 데이터베이스 맵 관리 데이터 구조가 지워지게 됩니다. 분할된 데이터베이스 맵 또는 분할된 데이터베이스를 다시 초기화하려는 경우에 이 스크립트를 다시 실행하는 것이 유용할 수 있습니다.

    샘플 명령줄:

    .\SetupSampleSplitMergeEnvironment.ps1
     -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  4. Getmappings.ps1 스크립트를 실행하여 샘플 환경에 현재 존재하는 매핑을 확인합니다.

    .\GetMappings.ps1
     -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  5. ExecuteSampleSplitMerge.ps1 스크립트를 실행하여 첫 번째 분할된 데이터베이스에서 두 번째 분할된 데이터베이스로 데이터의 절반을 이동하는 분할 작업을 실행한 다음 데이터를 첫 번째 분할된 데이터베이스로 다시 이동하는 병합 작업을 실행합니다. TLS를 구성하고 http 엔드포인트를 사용하지 않도록 설정한 경우 https:// 엔드포인트를 대신 사용해야 합니다.

    샘플 명령줄:

    .\ExecuteSampleSplitMerge.ps1
    -UserName 'mysqluser' -Password 'MySqlPassw0rd'
    -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    -SplitMergeServiceEndpoint 'https://mysplitmergeservice.cloudapp.net'
    -CertificateThumbprint '0123456789abcdef0123456789abcdef01234567'
    

    아래 오류가 표시되면 대개 웹 엔드포인트의 인증서에 문제가 있는 것입니다. 원하는 웹 브라우저로 웹 엔드포인트에 연결하여 인증서 오류가 발생하는지 확인합니다.

    Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLSsecure channel.

    정상적으로 연결되는 경우의 출력은 다음과 같습니다.

    > .\ExecuteSampleSplitMerge.ps1 -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net' -SplitMergeServiceEndpoint 'http://mysplitmergeservice.cloudapp.net' -CertificateThumbprint 0123456789abcdef0123456789abcdef01234567
    > Sending split request
    > Began split operation with id dc68dfa0-e22b-4823-886a-9bdc903c80f3
    > Polling split-merge request status. Press Ctrl-C to end
    > Progress: 0% | Status: Queued | Details: [Informational] Queued request
    > Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request.
    > Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target     shards.
    > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from     source to target shard.
    > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Waiting for reference tables copy     completion.
    > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from     source to target shard.
    > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of     Sharded tables
    > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range     [100:110) for table [dbo].[MyShardedTable]
    > ...
    > ...
    > Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table     [dbo].[MyShardedTable].
    > Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created     while processing the request.
    > Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request.
    > Sending merge request
    > Began merge operation with id 6ffc308f-d006-466b-b24e-857242ec5f66
    > Polling request status. Press Ctrl-C to end
    > Progress: 0% | Status: Queued | Details: [Informational] Queued request
    > Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request.
    > Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target     shards.
    > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from     source to target shard.
    > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of     Sharded tables
    > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range     [100:110) for table [dbo].[MyShardedTable]
    > ...
    > ...
    > Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table     [dbo].[MyShardedTable].
    > Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created     while processing the request.
    > Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request.
    >
    
  6. 다른 데이터 형식으로도 연결해 봅니다. 이러한 모든 스크립트는 키 유형을 지정할 수 있도록 하는 선택적인 -ShardKeyType 매개 변수를 사용합니다. 기본값은 Int32이지만 Int64, Guid 또는 이진을 지정할 수도 있습니다.

만들기 요청

이 서비스는 웹 UI를 사용하거나 웹 역할을 통해 요청을 제출할 SplitMerge.psm1 PowerShell 모듈을 가져오고 사용하여 사용할 수 있습니다.

서비스는 분할된 테이블과 참조 테이블 모두에서 데이터를 이동할 수 있습니다. 분할된 테이블에는 분할 키 열과 각 분할 키에 대한 여러 행의 데이터가 있습니다. 참조 테이블은 분할되지 않으므로 모든 분할된 데이터베이스에 동일한 행 데이터가 포함됩니다. 참조 테이블은 자주 변경되지 않고 쿼리에서 분할된 테이블과 조인하는 데 사용되는 데이터에 유용합니다.

분할/병합 작업을 수행하려면 이동할 분할된 테이블 및 참조 테이블을 선언해야 합니다. 이 작업은 SchemaInfo API를 사용하여 수행됩니다. 이 API는 Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema 네임스페이스에 있습니다.

  1. 각 분할된 테이블에 대해 테이블의 부모 스키마 이름(선택 사항, 기본값은 "dbo"), 테이블 이름 및 분할 키가 포함된 해당 테이블의 열 이름을 설명하는 ShardedTableInfo 개체를 만듭니다.
  2. 각 참조 테이블에 대해 테이블의 부모 스키마 이름(선택 사항, 기본값은 "dbo") 및 테이블 이름을 설명하는 ReferenceTableInfo 개체를 만듭니다.
  3. 위의 TableInfo 개체를 새 SchemaInfo 개체에 추가합니다.
  4. ShardMapManager 개체에 대한 참조를 가져와 GetSchemaInfoCollection을 호출합니다.
  5. SchemaInfoCollectionSchemaInfo를 추가하여 분할된 데이터베이스 맵 이름을 제공합니다.

이 예제는 SetupSampleSplitMergeEnvironment.ps1 스크립트에서 확인할 수 있습니다.

분할-병합 서비스는 대상 데이터베이스(또는 데이터베이스의 테이블에 대한 스키마)를 만들지 않습니다. 서비스에 요청을 보내기 전에 미리 만들어야 합니다.

문제 해결

샘플 PowerShell 스크립트를 실행할 때 아래 메시지가 표시 될 수 있습니다.

Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

이 오류는 TLS/SSL 인증서가 제대로 구성되지 않은 것을 의미합니다. '웹 브라우저로 커넥트' 섹션의 지침을 따르세요.

요청을 제출할 수 없는 경우 다음이 표시될 수 있습니다.

[Exception] System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'dbo.InsertRequest'.

이 경우 구성 파일, 특히 WorkerRoleSynchronizationStorageAccountConnectionString에 대한 설정을 검사합니다. 이 오류는 일반적으로 작업자 역할이 처음 사용할 때 메타데이터 데이터베이스를 성공적으로 초기화할 수 없음을 나타냅니다.

추가 리소스

아직 탄력적인 데이터베이스 도구를 사용 하지 않나요? 시작 가이드를 확인합니다. 질문이 있는 경우 SQL Database에 대한 Microsoft Q&A 질문 페이지에서 문의하고, 기능 요청이 있는 경우 SQL Database 사용자 의견 포럼에서 새로운 아이디어를 추가하거나 기존 아이디어에 투표해 주세요.