분할된 데이터베이스 간에 데이터를 이동하는 분할 병합 서비스 배포
적용 대상: Azure SQL Database
분할-병합 도구를 사용하면 분할된 데이터베이스 간에 데이터를 이동할 수 있습니다. 스케일 아웃 클라우드 데이터베이스 간 데이터 이동을 확인하세요.
참고 항목
분할/병합 도구는 Azure Web Apps용입니다. Cloud Services(클래식)의 지원 종료일은 2024년 8월 31일입니다. Cloud Services(클래식)에서 분할/병합 도구를 사용 중인 경우 2024년 8월 31일 이전에 Azure Web Apps로 마이그레이션하세요.
필수 조건
분할/병합 상태 데이터베이스로 사용할 SQL 데이터베이스를 만듭니다. Azure Portal로 이동합니다. 새로운 SQL 데이터베이스를 만듭니다. 데이터베이스에 이름을 지정하고 새로운 관리자와 비밀번호를 만듭니다. 나중에 사용할 수 있도록 이름과 암호를 기록합니다.
Azure의 논리 서버에서 Azure 서비스의 연결을 허용하는지 확인합니다. Azure 포털에서 논리 서버의 방화벽 설정에서 Azure 서비스에 대한 액세스 허용 설정이 켜기로 설정되어 있는지 확인합니다. 저장 아이콘을 선택합니다.
진단 출력에 사용할 Azure Storage 계정을 만듭니다.
공용 분할/병합 Docker 이미지를 사용하거나 분할/병합 Docker 이미지를 Azure Container Service 또는 선택한 Docker 레지스트리에 푸시합니다.
서비스에 대한 두 개의 Azure Web Apps 만들기
두 개의 Web Apps(worker
웹앱 및 UI
웹앱)을 만듭니다.
작업자 웹앱
Azure Portal에서 Web Apps을 만듭니다.
게시 필드에서 컨테이너를 선택합니다.
운영 체제로 Windows를 선택합니다.
Docker 탭으로 이동합니다.
다음 정보를 입력하세요.
이미지 원본:Docker hub
액세스 형식:Public
이미지 및 태그:mcr.microsoft.com/splitmerge/splitmergeworker:20240812.1
검토 + 만들기를 사용하여 웹앱을 만듭니다.
UI 웹앱
UI 웹앱을 만들려면 작업자 웹앱을 만드는 데 사용한 것과 동일한 단계를 수행합니다. 단, 하나의 차이점이 있습니다.
- 이미지 및 태그 필드에 다른 Docker 이미지가 있습니다.
mcr.microsoft.com/splitmerge/splitmergeweb:20240812.1
분할/병합 웹앱 구성
보안 구성
서비스의 보안을 구성하는 자세한 지침은 분할-병합 보안 설정을 참조하세요.
이 자습서에 대한 간단한 테스트를 배포하기 위해 서비스를 작동하고 실행하는 데 필요한 최소 구성 단계가 수행됩니다. 이러한 단계를 통해 실행하는 컴퓨터/계정 하나만 서비스와 통신할 수 있습니다.
자체 서명된 인증서 및 PFX 파일 만들기
PowerShell을 사용하여 자체 서명된 인증서 및 PFX 파일을 만듭니다.
먼저, 새 디렉터리를 만듭니다. 그런 다음 인라인 값을 적절히 바꾸고 새 디렉터리에서 다음 PowerShell 명령을 실행합니다.
$cert = New-SelfSignedCertificate -Subject "CN=*.cloudapp.net" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256
$mypwd = ConvertTo-SecureString -String "{myPassword}" -Force -AsPlainText ## Replace {myPassword}
Export-PfxCertificate -Cert $cert -FilePath "C:\Users\admin\Desktop\$certname.pfx" -Password $mypwd ## Specify your preferred location
웹앱에 PFX 파일 업로드 및 인증서 사용 설정
worker
웹앱 및 UI
웹앱 모두에 대해 다음 단계를 반복합니다.
- Azure Portal로 이동합니다.
- App Services를 선택합니다.
- 분할/병합 도구에 대해 위에서 만든 웹앱을 선택합니다.
- 메뉴에서 인증서를 선택합니다.
- 사용자 고유 인증서 가져오기(.pfx)를 선택합니다.
- 표시줄에서 인증서 추가를 선택합니다.
- PFX 파일을 선택하고 위와 동일한 암호를 입력합니다.
- 완료되면 목록의 새 항목에서 인증서 지문을 복사합니다.
- 웹앱 메뉴에서 설정 / 구성을 엽니다.
- 클라이언트 인증서 모드를
Require
(으)로 설정합니다.
웹앱 구성
worker
웹앱 및 UI
웹앱 모두에 대해 다음 단계를 반복합니다.
배포된 웹앱을 열고 설정>환경 변수>앱 설정으로 이동합니다. 추가를 선택합니다.
ElasticScaleMetadata라는 이름의 변수와 이전에 배포된 상태 데이터베이스에 대한 연결 문자열이 있는 값을 추가합니다.
Important
지금은 상태 데이터베이스에서 라틴어 데이터 정렬(
SQL\_Latin1\_General\_CP1\_CI\_AS
)을 사용해야 합니다. 자세한 내용은 Windows 데이터 정렬 이름을 참조하세요.Azure SQL Database를 사용할 경우 연결 문자열의 형식은 일반적으로 다음과 같습니다.
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<userId>; Password=<password>; Encrypt=True; Connection Timeout=30
추가 변수 추가:
속성 값 WorkerRoleSynchronizationStorageAccountConnectionString 이전에 만든 Azure Storage에 유효한 연결 문자열입니다. DataEncryptionPrimaryCertificateThumbprint 이전에 생성된 인증서 지문입니다. MetadataExpirationPeriodInMinutes 20160 MaxRetryCount 5 WEBSITE_LOAD_CERTIFICATES * WEBSITE_PULL_IMAGE_OVER_VNET 0 적용을 선택하고 애플리케이션을 다시 시작합니다.
worker
웹앱 및UI
웹앱 모두에 대해 동일한 단계를 반복합니다.
배포 문제 해결
웹 역할이 온라인 상태가 아니면 보안 구성에 문제가 발생할 수 있습니다. 앞에서 설명한 대로 TLS/SSL이 구성되어 있는지 확인합니다.
작업자 역할이 온라인 상태가 아니지만 웹 역할이 성공하는 경우 이전에 만든 상태 데이터베이스에 연결하는 데 문제가 발생할 수 있습니다.
연결 문자열 정확한지 확인합니다.
서버와 데이터베이스가 있는지, 사용자 ID와 암호가 올바른지 확인합니다.
Azure SQL 데이터베이스를 사용할 경우 연결 문자열의 형식은 다음과 같습니다.
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<user>; Password=<password>; Encrypt=True; Connection Timeout=30
서버 이름이
https://
로 시작하지 않는지 확인합니다.서버에서 Azure 서비스의 연결을 허용하는지 확인합니다. 이렇게 하려면 포털에서 데이터베이스를 열고 Azure 서비스에 대한 액세스 허용 설정이 On으로 설정되었는지 확인합니다.
서비스 배포 테스트
웹 브라우저와 연결
UI
웹앱의 개요로 이동하여 찾아보기를 선택합니다. 메시지가 나타나면 올바른 인증서를 선택합니다.
PowerShell 스크립트로 테스트
포함된 샘플 PowerShell 스크립트를 실행하여 배포 및 환경을 테스트할 수 있습니다.
Important
샘플 스크립트는 PowerShell 5.1에서 실행됩니다. 현재 PowerShell 6 이상에서는 실행되지 않습니다.
포함된 스크립트 파일은 다음과 같습니다.
SetupSampleSplitMergeEnvironment.ps1
- 분할-병합에 대한 테스트 데이터 계층을 설정합니다.- 분할 맵 관리자 데이터베이스를 만듭니다.
- 두 개의 분할 데이터베이스를 만듭니다.
- 해당 데이터베이스에 대한 분할된 데이터베이스 맵을 만듭니다. 이때 해당 데이터베이스의 기존 분할된 데이터베이스 맵은 삭제됩니다.
- 두 분할 데이터베이스에서 작은 샘플 테이블을 만들고 둘 중 하나의 테이블을 채웁니다.
- 분할된 테이블에 대한 SchemaInfo를 선언합니다.
ExecuteSampleSplitMerge.ps1
- 테스트 데이터 계층에서 테스트 작업을 실행합니다.- 첫 번째 분할된 데이터베이스에서 두 번째 분할된 데이터베이스로 데이터의 절반을 분할하는 분할 요청을 분할/병합 서비스 웹 프런트 엔드로 보냅니다.
- 분할 요청 상태를 확인하기 위해 웹 프런트 엔드를 폴링한 다음 요청이 완료될 때까지 기다립니다.
- 두 번째 분할 데이터베이스에서 첫 번째 분할 데이터베이스로 데이터를 다시 이동하는 병합 요청을 분할-병합 서비스 웹 프런트 엔드로 보냅니다.
- 병합 요청 상태를 확인하기 위해 웹 프런트 엔드를 폴링한 다음, 요청이 완료될 때까지 기다립니다.
GetMappings.ps1
– 분할 매핑의 현재 상태를 출력하는 최상위 샘플 스크립트입니다.ShardManagement.psm1
– ShardManagement API를 래핑하는 도우미 스크립트입니다.SqlDatabaseHelpers.psm1
- SQL Database에서 데이터베이스를 생성 및 관리하기 위한 도우미 스크립트입니다.
PowerShell을 사용하여 배포 확인
새 PowerShell 창을 열고 분할/병합 패키지를 다운로드한 디렉터리로 이동한 다음, "PowerShell" 디렉터리로 이동합니다.
분할 맵 관리자와 분할 데이터베이스를 생성할 서버를 생성하거나 기존 서버를 선택합니다.
참고 항목
SetupSampleSplitMergeEnvironment.ps1
스크립트가 기본적으로 동일한 서버에 모든 데이터베이스를 만들어 스크립트를 단순하게 유지합니다. 이 제한은 분할-병합 서비스 자체의 제한은 아닙니다.분할-병합 서비스가 데이터를 이동하고 분할 데이터베이스 맵을 업데이트하려면 데이터베이스에 대한 읽기/쓰기 액세스 권한이 있는 SQL 인증 로그인이 필요합니다. 분할-병합 서비스는 클라우드에서 실행되므로 현재 통합 인증을 지원하지 않습니다.
서버가 이러한 스크립트를 실행하는 컴퓨터의 IP 주소에서 액세스할 수 있도록 구성되었는지 확인합니다. 이 설정은 SQL 서버/방화벽 및 가상 네트워크/클라이언트 IP 주소에서 찾을 수 있습니다.
SetupSampleSplitMergeEnvironment.ps1
스크립트를 실행하여 샘플 환경을 만듭니다.이 스크립트를 실행하면 분할 맵 관리자 데이터베이스 및 분할 데이터베이스의 기존 분할 맵 관리 데이터 구조가 지워지게 됩니다. 분할 맵 또는 분할 데이터베이스를 다시 초기화하려는 경우에 이 스크립트를 다시 실행하는 것이 유용할 수 있습니다.
샘플 명령줄:
.\SetupSampleSplitMergeEnvironment.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
Getmappings.ps1 스크립트를 실행하여 샘플 환경에 현재 존재하는 매핑을 확인합니다.
.\GetMappings.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
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.
다른 데이터 형식으로도 연결해 봅니다. 이러한 모든 스크립트는 키 유형을 지정할 수 있도록 하는 선택적인 -ShardKeyType 매개 변수를 사용합니다. 기본값은 Int32이지만 Int64, Guid 또는 이진을 지정할 수도 있습니다.
만들기 요청
이 서비스는 웹 UI를 사용하거나 웹 역할을 통해 요청을 제출할 SplitMerge.psm1
PowerShell 모듈을 가져오고 사용하여 이용할 수 있습니다.
서비스는 분할된 테이블과 참조 테이블 모두에서 데이터를 이동할 수 있습니다. 분할된 테이블에는 분할 키 열과 각 분할 키에 대한 여러 행의 데이터가 있습니다. 참조 테이블은 분할되지 않으므로 모든 분할 데이터베이스에 동일한 행 데이터가 포함됩니다. 참조 테이블은 자주 변경되지 않고 쿼리에서 분할된 테이블과 조인하는 데 사용되는 데이터에 유용합니다.
분할-병합 작업을 수행하려면 이동할 분할된 테이블 및 참조 테이블을 선언해야 합니다. 이 작업은 SchemaInfo API를 사용하여 수행됩니다. 이 API는 Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema
네임스페이스에 있습니다.
- 각 분할된 테이블에 대해 테이블의 부모 스키마 이름(선택 사항, 기본값은 "dbo"), 테이블 이름 및 분할 키가 포함된 해당 테이블의 열 이름을 설명하는 ShardedTableInfo 개체를 만듭니다.
- 각 참조 테이블에 대해 테이블의 부모 스키마 이름(선택 사항, 기본값은 "dbo") 및 테이블 이름을 설명하는 ReferenceTableInfo 개체를 만듭니다.
- 앞의 TableInfo 개체를 새 SchemaInfo 개체에 추가합니다.
- ShardMapManager 개체에 대한 참조를 가져와 GetSchemaInfoCollection을 호출합니다.
- SchemaInfoCollection에 SchemaInfo를 추가하여 분할된 데이터베이스 맵 이름을 제공합니다.
이 예제는 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 사용자 의견 포럼에서 새로운 아이디어를 추가하거나 기존 아이디어에 투표해 주세요.