[이 블로그는 http://blog.grallandco.com]에서 신디케이트되었습니다.
소개
마지막으로 Couchbase 커뮤니티와 교류하는 동안 현재 데이터베이스의 데이터를 어떻게 하면 Couchbase로 쉽게 가져올 수 있는지 질문이 있었습니다. 그리고 제 대답은 항상 같았습니다:
- Talend와 같은 ETL을 사용하여 수행합니다.
- 간단한 프로그램을 작성하여 RDBMS에서 Couchbase로 데이터를 복사하기만 하면 됩니다...
그래서 저는 RDBMS의 콘텐츠를 Couchbase로 가져올 수 있는 이 작은 프로그램을 작성했습니다. 이 도구를 그대로 사용하거나 코드를 살펴보고 애플리케이션에 맞게 조정할 수 있습니다.
도구: 카우치베이스 SQL 임포터
Couchbase SQL 임포터, 사용 가능 여기를 사용하면 간단한 명령줄로 SQL 스키마의 전체 또는 일부를 Couchbase로 복사할 수 있습니다. 이 명령을 실행하는 방법을 설명하기 전에 데이터를 가져올 때 Couchbase에 데이터가 어떻게 저장되는지 살펴보겠습니다:
- 각 테이블 행은 단일 JSON 문서로 가져옵니다.
- 여기서 각 테이블 열은 JSON 속성이 됩니다.
- 각 문서는 테이블의 이름과 카운터(증분)로 구성된 키입니다.
다음 구체적인 예는 MySQL World 샘플 데이터베이스를 참조하면 작동 방식을 이해하는 데 도움이 됩니다. 이 데이터베이스에는 3개의 테이블이 포함되어 있습니다: 도시, 국가, 국가 언어입니다. 도시 테이블은 다음과 같습니다:
+————-+———-+——+—–+———+—————-+
| 필드 | 유형 | Null | 키 | 기본값 | 추가 |
+————-+———-+——+—–+———+—————-+
| ID | int(11) | NO | PRI | NULL | 자동 증가 |
| 이름 | 문자(35) | NO | | | | | |
국가코드 | 문자(3) | NO | | | | | |
| 지구 | 문자(20) | 아니오 | | | | |
| 인구 | int(11) | NO | | 0 | |
+————-+———-+——+—–+———+—————-+
이 테이블과 일치하는 JSON 문서는 다음과 같습니다:
도시:3805
{
"이름": "샌프란시스코",
"지구": "캘리포니아",
"ID": 3805,
"인구": 776733,
"CountryCode": "USA"
}
{
"이름": "샌프란시스코",
"지구": "캘리포니아",
"ID": 3805,
"인구": 776733,
"CountryCode": "USA"
}
여기서는 단순히 모든 행을 가져와서 Couchbase로 "이동"하고 있음을 알 수 있습니다. 이것은 데이터 집합을 Couchbase로 가져오는 좋은 첫 단계이지만, 애플리케이션에 사용할 최종 모델은 아닐 수 있습니다. 대부분의 경우 임베디드 문서, 값 목록 등을 JSON 문서에 사용해야 할 때를 확인해야 합니다.
JSON 문서 외에도 이 도구는 다음 로직을 기반으로 보기를 생성합니다:
- '테이블'(일명 유형)의 이름을 키로 하여 가져온 모든 문서를 나열하는 뷰입니다.
- 기본 키 열이 있는 각 테이블에 대한 보기
보기: 전체/유형별
{
"행": [
{"key": "도시", "값": 4079},
{"key": "국가", "값": 239},
{"key": "국가 언어", "값": 984}
]
}
"행": [
{"key": "도시", "값": 4079},
{"key": "국가", "값": 239},
{"key": "국가 언어", "값": 984}
]
}
보시다시피 이 보기를 사용하면 하나의 Couchbase 쿼리로 유형별 문서 수를 확인할 수 있습니다.
또한 각 테이블/문서 유형에 대해 테이블 기본 키에서 인덱스의 키가 만들어지는 뷰가 만들어집니다. 예를 들어 'City' 문서를 쿼리해 보겠습니다.
보기: city/by_pk?reduce=false&limit=5
{
"총_행": 4079,
"행": [
{"id": "city:1", "key": 1, "value": null},
{"id": "city:2", "key": 2, "value": null},
{"id": "city:3", "key": 3, "value": null},
{"id": "city:4", "key": 4, "value": null},
{"id": "city:5", "key": 5, "value": null}
]
}
"총_행": 4079,
"행": [
{"id": "city:1", "key": 1, "value": null},
{"id": "city:2", "key": 2, "value": null},
{"id": "city:3", "key": 3, "value": null},
{"id": "city:4", "key": 4, "value": null},
{"id": "city:5", "key": 5, "value": null}
]
}
인덱스 키는 City.ID 열의 값과 일치합니다. 기본 키가 여러 열로 구성된 경우 키의 모양은 다음과 같습니다:
보기: CountryLanguage/by_pk?reduce=false&limit=5
{
"총_행": 984,
"행": [
{"id": "국가언어:1", "키": ["ABW", "Dutch"], "value": null},
{"id": "국가언어:2", "키": ["ABW", "English"], "value": null},
{"id": "국가언어:3", "키": ["ABW", "파피아멘토"], "값": null},
{"id": "국가언어:4", "키": ["ABW", "스페인어"], "value": null},
{"id": "국가언어:5", "키": ["AFG", "Balochi"], "value": null}
]
}
"총_행": 984,
"행": [
{"id": "국가언어:1", "키": ["ABW", "Dutch"], "value": null},
{"id": "국가언어:2", "키": ["ABW", "English"], "value": null},
{"id": "국가언어:3", "키": ["ABW", "파피아멘토"], "값": null},
{"id": "국가언어:4", "키": ["ABW", "스페인어"], "value": null},
{"id": "국가언어:5", "키": ["AFG", "Balochi"], "value": null}
]
}
이 뷰는 CountryLanguage.CountryCode 및 CountryLanguage.Language 열로 구성된 CountryLanguage 테이블 기본 키에서 작성됩니다.
+————-+—————+——+—–+———+——-+
| 필드 | 유형 | Null | 키 | 기본값 | 추가 |
+————-+—————+——+—–+———+——-+
국가코드 | 문자(3) | NO | PRI | | | | |
| 언어 | 문자(30) | NO | PRI | | |
| IsOfficial | enum('T','F') | NO | | F | |
| 퍼센트 | float(4,1) | NO | | 0.0 | |
+————-+—————+——+—–+———+——-+
| 필드 | 유형 | Null | 키 | 기본값 | 추가 |
+————-+—————+——+—–+———+——-+
국가코드 | 문자(3) | NO | PRI | | | | |
| 언어 | 문자(30) | NO | PRI | | |
| IsOfficial | enum('T','F') | NO | | F | |
| 퍼센트 | float(4,1) | NO | | 0.0 | |
+————-+—————+——+—–+———+——-+
Couchbase SQL 임포터 도구는 어떻게 사용하나요?
임포터는 간단한 Java 기반 명령줄 유틸리티로 사용이 매우 간단합니다:
1. 1. CouchbaseSqlImporter.jar 파일을 여기에서 다운로드하십시오.. 이 파일에는 Couchbase와 함께 작동하기 위한 모든 종속성, 즉 Java Couchbase 클라이언트 및 GSON이 포함되어 있습니다.
2. 데이터 소스로 사용 중인 데이터베이스의 JDBC 드라이버를 다운로드합니다. 이 예제에서는 MySQL을 사용하며 MySQL 사이트용 드라이버를 다운로드했습니다.
3. 속성 파일을 사용하여 가져오기를 구성합니다.
## SQL 정보 ##
sql.connection=jdbc:mysql://192.168.99.19:3306/world
sql.username=root
sql.password=password## 카우치베이스 정보 ##
cb.uris=http://localhost:8091/pools
cb.bucket=기본값
cb.password=## 정보 가져오기
import.tables=ALL
import.createViews=true
import.typefield=type
import.fieldcase=lower
sql.connection=jdbc:mysql://192.168.99.19:3306/world
sql.username=root
sql.password=password## 카우치베이스 정보 ##
cb.uris=http://localhost:8091/pools
cb.bucket=기본값
cb.password=## 정보 가져오기
import.tables=ALL
import.createViews=true
import.typefield=type
import.fieldcase=lower
이 샘플 속성 파일에는 세 개의 섹션이 포함되어 있습니다:
- 처음 두 섹션은 SQL 데이터베이스와 Couchbase 클러스터에 대한 연결을 구성하는 데 사용됩니다(버킷을 먼저 만들어야 합니다).
- 세 번째 섹션에서는 가져오기 자체를 구성할 수 있습니다.
- import.tables : 모든 테이블을 가져오거나 가져오려는 테이블 목록(예: 도시, 국가)을 가져오려면 모두를 클릭합니다.
- import.createViews 를 참 또는 거짓으로 설정하여 뷰를 강제로 생성합니다.
- import.typefield '유형'이 포함된 모든 문서에 새 속성을 추가하는 데 사용됩니다.
- import.fieldcase : null, lower, upper : 속성 이름과 유형 값의 대/소문자를 강제 적용합니다(예: 도시 또는 도시 또는 CITY).
- 4. 도구를 실행합니다!
java -cp "./CouchbaseSqlImporter.jar:./mysql-connector-java-5.1.25-bin.jar" com.couchbase.util.SqlImporter import.properties
따라서 적절한 클래스 경로(-cp 매개 변수)를 사용하여 Java 명령을 실행합니다.
완료되면 SQL 데이터베이스에서 Couchbase로 데이터를 가져올 수 있습니다.
내부적으로 어떻게 운영되는지 궁금하다면 다음 단락을 참조하세요.
코드: 어떻게 작동하나요?
도구의 주요 클래스는 매우 간단합니다. com.couchbase.util.SqlImporter를 클릭합니다:
1. SQL 데이터베이스에 연결합니다.
2. 카우치베이스에 연결
3. 테이블 목록 가져오기
4. 각 테이블에 대해 "테이블에서 * 선택"을 실행합니다.
4.1. ResultSetMetadata를 분석하여 열 목록 가져오기
4.2. 키가 열의 이름이고 값...이 값인 각 행에 대한 Java 맵을 만듭니다.
4.3. 이 맵을 GSON 문서로 직렬화하고 Couchbase에 저장합니다.
이 코드는 ImportTable(문자열 테이블) Java 메서드.
한 가지 흥미로운 점은 애플리케이션을 처리하기 위해 코드를 사용하고 확장할 수 있다는 점입니다.
결론
커뮤니티의 일부 사람들을 돕기 위해 이 도구를 빠르게 만들었으니, 이 도구를 사용 중이거나 새로운 기능이 필요한 경우 댓글이나 풀 리퀘스트를 통해 알려주세요.