SQL에서 NoSQL로의 마이그레이션은 모순처럼 보이지만, Couchbase Server의 NoSQL 데이터베이스의 발전과 혁신 덕분에 점점 더 쉬워지고 있습니다.

이 글에서는 다음과 같은 도구를 소개합니다. SqlServerToCouchbase는 Microsoft SQL Server 데이터베이스를 Couchbase Server 데이터베이스로 "변환"하는 데 도움이 되는 자동화된 도구의 오픈소스 시도입니다. 그 과정에서 데이터 마이그레이션 전략, SQL과 NoSQL 용어의 비교, 두 데이터베이스 유형 간의 장단점을 살펴볼 것입니다. SQL Server 또는 Couchbase Server를 사용하지 않더라도이 문서가 전환 작업에 도움이 될 수 있습니다.

시작하기 전에 두 데이터베이스 사이를 이동하는 경우(SQL에서 NoSQL로 또는 SQL에서 SQL로)는 두 언어 간 번역과 매우 유사합니다. Babelfish, Google 번역 등과 같은 자동화 도구가 있습니다. 이러한 도구는 시작하는 데 매우 유용한 도구이지만, (결국) 언어에 몰입하는 것을 대신할 수는 없습니다.

구문 번역 외에도 모든 기술을 둘러싼 관용구와 문화도 있습니다. 어떤 자동화 도구도 모든 뉘앙스를 포착할 수는 없지만, 어디까지 가능한지 한 번 시도해 보겠습니다.

SQL을 NoSQL로 변환하기: 데이터 마이그레이션 전략

SQL Server에서 Couchbase로(또는 다른 관계형 데이터베이스로) 데이터를 마이그레이션하려는 경우 첫 번째 단계는 높은 수준의 목표와 계획에 대한 합의를 도출하는 것입니다. 여러 가지 경로가 있으며, 각 경로마다 위험, 노력, 이점이 서로 상충됩니다. 다음은 SQL을 NoSQL로 변환하는 방법에 대한 몇 가지 예입니다:

레벨 설명 위험 노력 혜택

1

재작성: 마이그레이션 없음, 모든 것을 다시 작성

5/5

5/5

⭐⭐⭐⭐⭐

2

스키마 재설계: 비즈니스 로직 유지, 데이터 계층 및 스키마 재작성, NoSQL에 최적화된 모델로 스키마를 완전히 재설계하세요.

4/5

4/5

⭐⭐⭐⭐

3

리팩터링 우선: 데이터 로직과 RDBMS 스키마를 NoSQL에 최적화된 모델로 리팩터링하는 것만 빼고 모든 것을 유지하세요.

4/5

3/5

⭐⭐⭐

4

나중에 최적화: 가능한 한 적은 변경으로 스키마를 호스팅하고, 새로운 기술에서 애플리케이션을 실행하고, 성능에 따라 필요에 따라 스키마를 리팩터링/최적화하세요.

3/5

4/5

⭐⭐⭐

5

그냥 호스트하기: 가능한 한 적은 변경으로 스키마를 호스팅하세요.

2/5

2/5

⭐⭐

역사적으로 NoSQL 데이터베이스는 '레벨 1' 리빌드 또는 그린필드 프로젝트에 중점을 두었습니다. 이러한 접근 방식은 처음부터 NoSQL의 이점을 최대한 활용할 수 있지만, 리빌드는 항상 비용이 많이 들고 위험합니다.

하지만 Couchbase Server는 Couchbase Server 7에서 제공되는 새로운 기능과 함께(다운로드할 수 있습니다. 현재 Couchbase 7 베타 버전), 레벨 5(이후 레벨 4) 접근 방식을 사용하면 NoSQL을 시도하는 데 따르는 위험과 비용을 줄일 수 있습니다. 반드시 모두 NoSQL의 이점을 바로 누릴 수 있지만, 그 어느 때보다 쉽게 시작할 수 있습니다.

SQL을 NoSQL 쿼리로 변환

대부분의 개발자와 데이터베이스 사용자는 관계형 데이터베이스에 익숙합니다. 스키마, 테이블, 행과 열, SQL 쿼리, ACID 트랜잭션. Couchbase의 쿼리 언어(N1QL)는 SQL이 오랫동안 링구아 프랑카 의 데이터베이스. N1QL은 현재 JOIN, 강력한 인덱싱, 집계, CTE 등을 포함한 전체 SQL 기능을 제공합니다. 따라서 SQL 개발자가 Couchbase의 NoSQL 제품을 처음 사용하는 경우에도 비교적 간단하게 생산성을 높일 수 있습니다.

: 체크 아웃 개발자가 카우치베이스를 중요하게 생각하는 이유 및 기타 TechValidate의 독립적인 연구.

다른 관계형 개념도 대부분 쉽게 변환하고 변환할 수 있다면 어떨까요? SQL Server 개념을 Couchbase Server 개념에 어떻게 매핑할 수 있는지 살펴보겠습니다.

SQL Server 카우치베이스 서버 참고

서버

클러스터

NoSQL의 주요 이점 중 하나는 클러스터링이 제공하는 확장성과 고가용성입니다.

카탈로그/데이터베이스

버킷

카우치베이스 버킷은 성능 향상을 위한 내장 캐시도 제공합니다.

스키마

범위

스키마는 SQL Server에서 "dbo"인 경우가 많지만 항상 그런 것은 아닙니다.

컬렉션

컬렉션의 유연성 향상: 미리 정의된 열이나 제약 조건이 없습니다.

문서

플랫 데이터 대신 JSON

tSQL

N1QL

N1QL은 "SQL과 유사한" 것이 아니라, SQL++라고도 하는 JSON 확장 기능을 갖춘 완전한 SQL 구현입니다.

기본 키

문서 키

기본 키는 테이블별로 고유해야 하며, 문서 키는 컬렉션별로 고유해야 합니다.

색인

색인

SQL: 열에 대한 인덱스, 카우치베이스: JSON 필드에 대한 인덱스

이 매핑을 기준으로 SQL Server 데이터베이스의 내용을 Couchbase Server 데이터베이스로 자동 변환하는 프로그램을 작성할 수 있을까요?

저는 우리가 그 목표를 대부분 달성할 수 있다고 믿으며, 다음과 같은 오픈 소스 프로젝트를 만들었습니다. SqlServerToCouchbase 를 사용하면 됩니다.

SQL 데이터베이스를 NoSQL/카탈로그를 버킷으로 변환하기

저는 어드벤처웍스 샘플을 SQL Server에서 제공합니다. Couchbase 7 데이터베이스로 마이그레이션할 예정입니다(현재 베타 버전로 변경되었지만 올해는 RTM이 될 가능성이 높습니다).

참고: 저는 현재 사용 가능한 SQL Server 버전이 AdventureWorks2016이기 때문에 이 버전을 사용하고 있습니다. 대부분의 이전 버전과 최신 버전이 정상적으로 작동하지만 문제가 발생할 수 있습니다, 깃허브 이슈를 생성하세요.!

SQL Server with AdventureWorks

Couchbase Server에서 버킷을 수동으로 만들거나 유틸리티가 자동으로 버킷을 만들도록 할 수 있습니다.

AdventureWorks bucket in Couchbase

스키마에서 범위로

SQL Server에서는 스키마 는 조직/보안 목적으로 테이블과 같은 개체를 함께 그룹화할 수 있는 '네임스페이스'와 같습니다. 예를 들어 AdventureWorks에는 HumanResources, Person, Production 등과 같은 스키마가 포함되어 있습니다.

많은 프로젝트에서 기본 "dbo" 스키마 외에는 실제로 스키마를 사용하지 않습니다. 그러나 스키마를 사용하여 특정 마이크로서비스 또는 멀티테넌트 앱의 특정 테넌트에 대한 데이터를 그룹화할 수 있습니다.

SQL Server schemas

Couchbase 7에는 다음과 같은 매우 유사한 개념이 있습니다. "범위". 마이크로서비스 또는 멀티테넌시에 대해 동일한 조직 및 보안 이점을 제공합니다.

Couchbase scopes

기본 설정에 따라 SqlServerToCouchbase 유틸리티는 SQL Server의 스키마를 기반으로 범위를 만들 수도 있고, 스키마를 무시하고 모든 것을 "_default"(대략 "dbo"와 동일)라는 스키마에 넣을 수도 있습니다. 위의 예에서는 각 AdventureWorks 스키마에 대한 범위를 만들기로 선택했습니다.

테이블에서 컬렉션으로

SQL Server에서 테이블은 엄격하게 강제 적용되는 관계입니다(따라서 "관계형" 데이터베이스)를 통해 데이터를 함께 정리합니다.

SQL Server table

카우치베이스에서는 엄격하게 강제된 관계는 없지만 카우치베이스 7에서는 "컬렉션". 이렇게 하면 데이터에 어떤 제약 조건(기본 키와 유사한 고유 문서 키 외에는)도 적용할 수 없지만 동일한 수준의 데이터 구성을 제공할 수 있습니다.

SqlServerToCouchbase 유틸리티는 찾은 각 테이블에 대해 컬렉션을 생성합니다. 이전 단계에서 범위를 만들도록 선택한 경우 해당 컬렉션은 해당 범위 안에 배치됩니다.

Couchbase collection

: SQL Server의 테이블 이름은 Couchbase Server의 컬렉션 이름보다 훨씬 더 길 수 있습니다. 따라서 테이블 이름이 긴 데이터베이스를 마이그레이션하는 경우 새롭고 더 짧은 컬렉션 이름을 명시적으로 제공해야 합니다.

SQL 쿼리를 변환하는 것은 어떨까요?

SqlServerToCouchbase 유틸리티는 (아직) SQL Server 쿼리를 변환하지는 않지만, 다음은 AdventureWorks의 SQL Server 쿼리와 Couchbase에서 변환된 AdventureWorks 데이터베이스의 동등한 쿼리를 비교한 것입니다.

아래 tSQL 쿼리(다음에서 가져옴)는 Microsoft 문서)는 "모든 직원의 이름과 성, 그리고 그들이 거주하는 도시를 반환"하도록 설계되었습니다.

이 쿼리의 결과입니다:

SQL Server query results

거의 변경하지 않고도 매우 유사한 쿼리를 Couchbase에서 N1QL 쿼리로 실행할 수 있습니다:

N1QL 버전에서 유일한 차이점은 || 대신 + 를 문자열 연결에 사용하고 결과는 결과 집합이 아닌 JSON을 사용합니다:

이것은 not 는 N1QL 쿼리가 최대한 최적화되어 있음을 의미합니다. 예를 들어, 위의 N1QL 쿼리는 문서 키를 사용하지 않으며, 더 많거나 다른 인덱스의 이점을 누릴 수 있습니다. (예를 들어, 이름, 성, 도시만 필요하므로 여기에는 커버링 인덱스가 적절할 수 있습니다). 하지만 이것은 "레벨 5" 변환이므로 시작하기에 충분할 것입니다.

인덱스에서 인덱스로의 변환

SQL Server에서는 테이블에 하나 이상의 열에 대한 인덱스를 만들 수 있습니다.

카우치베이스 서버는 또한 다음을 수행할 수 있습니다. 인덱스 만들기 를 컬렉션에서 하나 이상의 JSON 필드로 설정합니다.

SqlServerToCouchbase 유틸리티는 SQL Server 인덱스의 직접 변환을 수행합니다.

예를 들어 SQL Server의 인덱스입니다:

는 Couchbase Server의 인덱스가 됩니다:

Couchbase는 모든 인덱스를 변환하지만 실행하려는 쿼리에 따라 SQL Server 인덱싱 수준이 너무 높거나 낮을 수 있습니다. 다행히도 Couchbase Server 6.6 이상 버전에는 기본으로 제공되는 인덱스 어드바이저 (독립형 웹 기반 버전도 사용 가능)를 사용하면 원하는 모든 N1QL 쿼리에 대한 인덱스를 추천합니다.

참고: 카우치베이스 서버는 기본적으로 전체 테이블 스캔(즉, 기본 인덱스)에 해당하는 것을 허용하지 않습니다. SqlServerToCouchbase 유틸리티는 각 컬렉션에 대한 기본 인덱스를 생성하지 않습니다. 쿼리를 실행하려고 할 때 "키 공간에 사용할 수 있는 인덱스가 없습니다"와 같은 오류 메시지가 표시되면 인덱스 어드바이저를 사용해보라는 신호입니다.

또한 카우치베이스 인덱스 모니터 을 클릭해 인덱스 요청률(다른 인덱스 특성 중)을 확인하세요. 이를 통해 더 이상 필요하지 않은 인덱스를 식별하는 데 도움이 될 수 있습니다.

행에서 문서로

적절한 범위와 컬렉션이 설정되면 SqlServerToCouchbase 유틸리티를 사용하여 각 테이블에서 모든 데이터 행을 가져와 각 컬렉션의 JSON 문서에 쓸 수 있습니다.

13001 sql server address row

대부분의 경우 SQL Server에서 지원하는 데이터 유형은 다음과 같습니다. JSON에 잘 매핑 데이터 유형. 몇 가지 예시입니다:

SQL Server 데이터 유형 JSON 데이터 유형

문자, 바이트 문자, nvarchar 등

문자열

정수, 소수, 부동 소수, 실수 등

숫자

bit

부울

날짜, 날짜, 시간 등

문자열

또한 SqlServerToCouchbase 유틸리티가 처리할 수 있는 몇 가지 특수한 SQL Server 데이터 유형도 있습니다.

예를 들어, SQL Server의 지리 유형은 "Lat" 및 "Long" 및 "Z"와 같은 속성을 가진 중첩된 JSON 객체가 됩니다. 다음은 위 스크린샷의 데이터 행에 대한 변환된 문서입니다.

궁금한 특정 데이터 유형이 있는 경우 SqlServerToCouchbase 유틸리티를 사용해 보고 어떤 일이 발생하는지 확인하세요. 예상한 대로 데이터가 변환되지 않는 경우, 깃허브에서 이슈를 생성하세요..

사용자 대 사용자

SQL Server는 데이터베이스, 스키마 및 테이블 수준에서 다양한 사용자 유형, 보안 역할 및 권한을 지원합니다.

카우치베이스 서버에는 버킷, 범위 및 컬렉션 수준에서 다양한 권한을 설정할 수 있는 역할 기반 인증(RBAC)이 있습니다.

SqlServerToCouchbase 유틸리티는 일치하는 사용자를 생성하고 가능한 한 권한을 최대한 변환하기 위해 최선을 다합니다.

AdventureWorks에는 세분화된 권한을 가진 사용자의 예가 포함되어 있지 않습니다. 저는 Person 스키마에 있는 몇 개의 테이블에 대한 권한의 하위 집합을 나타내기 위해 직접 만들었습니다.

SQL Server user permissions at the table level

Couchbase의 해당 사용자도 비슷한 권한을 갖게 됩니다:

Couchbase user permissions at the collection level

SQL Server에는 데이터 작업을 위한 API가 하나만 있지만(tSQL), Couchbase에는 N1QL, 키/값, 전체 텍스트 검색, 분석 등 여러 가지가 있습니다. 따라서 Couchbase에서 사용자에게 변환되는 권한의 수가 더 많습니다. "레벨 4"로 올라갈수록 필요에 따라 이러한 권한을 조정할 수 있습니다.

경고: 사용자, 인증, 권한 부여 및 보안은 반드시 주의를 기울이고 수동으로 검토해야 하는 영역입니다. 원하는 결과를 얻을 수 있다고 확신할 때까지 이 단계를 완전히 자동화하지 마세요.

다음 단계

"변환" 유틸리티는 SQL Server 데이터베이스의 Couchbase Server 변환을 생성합니다. 하지만 현재 클라이언트 코드는 변환할 수 없습니다. 이는 SQL Server에서 NoSQL로의 데이터베이스 마이그레이션뿐만 아니라 모든 데이터베이스 마이그레이션에서 어려운 문제입니다. 하지만 SQL 쿼리 및 클라이언트 코드 마이그레이션에 대한 향후 포스팅을 이 블로그에서 계속 지켜봐 주세요!

그 동안 몇 가지 단계를 살펴볼 필요가 있습니다:

  • 카우치베이스 SDK를 사용하려면 클라이언트에서 데이터 액세스 권한을 변경해야 합니다. 예를 들어 ADO.NET, Dapper, PetaPoco 등을 사용하는 경우에는 카우치베이스 .NET SDK.
  • 엔티티 프레임워크를 사용하시나요? 확인해보세요. Linq2Couchbase 프로젝트. (Java를 사용하는 경우 Spring 데이터 카우치베이스.)
  • 카우치베이스는 ACID 트랜잭션을 지원합니다! .NET용, Couchbase.Transactions 는 현재 베타 버전입니다. Couchbase 7에서 N1QL은 다음을 지원합니다. 트랜잭션 시작/커밋/롤백
  • Couchbase의 N1QL은 완전한 SQL 구현입니다. 그러나 모든 SQL 방언과 마찬가지로 N1QL과 tSQL 사이에는 차이점이 있습니다. 일부 쿼리는 그대로 작동할 수 있지만 대부분의 경우 구문 차이가 있을 수 있습니다. 브라우저 내 대화형 N1QL 튜토리얼.
  • MySQL과 비슷한 접근 방식을 찾고 계신가요? 확인해 보세요. 관계형에서 컬렉션으로의 마이그레이션 실습 를 사용하여 Python / CLI를 사용하는 유사한 접근 방식을 사용할 수 있습니다.
  • PostgreSQL과 유사한 접근 방식을 찾고 계신가요? 확인해 보세요. Couchgres는 커뮤니티가 지원하는 오픈소스 프로젝트로, Golang/CLI와 유사한 접근 방식을 사용합니다.

요약

Couchbase Server 7은 Couchbase Server의 가장 크고 중요한 릴리스가 될 예정입니다. SQL에서 NoSQL로 변환하는 여정에 도움이 될 수 있도록 설계된 이와 같은 더 많은 글을 Couchbase 블로그에서 계속 지켜봐 주세요.

지금 바로 Couchbase Server 7 베타를 사용하여 다음을 수행할 수 있습니다. 다운로드하여 사용해 보기. 베타 버전이므로, 피드백이나 질문이 있으시면 언제든지 베타 지원 섹션 Couchbase Server 7 및 기타 베타/프리뷰 릴리스에 대한 Couchbase 포럼을 참조하세요.

작성자

게시자 매튜 그로브스

Matthew D. Groves는 코딩을 좋아하는 사람입니다. C#, jQuery, PHP 등 무엇이든 풀 리퀘스트를 제출할 정도로 코딩을 좋아합니다. 90년대에 부모님의 피자 가게를 위해 QuickBASIC POS 앱을 만든 이후로 전문적으로 코딩을 해왔습니다. 현재 Couchbase의 선임 제품 마케팅 관리자로 일하고 있습니다. 여가 시간에는 가족과 함께 축구 경기를 관람하고 개발자 커뮤니티에 참여하며 시간을 보냅니다. 그는 .NET의 AOP, .NET의 프로 마이크로서비스, Pluralsight 저자, Microsoft MVP의 저자이기도 합니다.

댓글 남기기