지속적 통합과 지속적 배포는 이제 일반적인 소프트웨어 개발 관행입니다. 데이터베이스의 세계에서 이는 온디맨드, 상태 저장, 임시 환경이 필요하다는 의미로 해석됩니다.
상태 비저장 환경 프로비저닝은 특정 데이터 소스에 종속되지 않습니다. CI 환경에서 테스트하려는 코드를 실행하기만 하면 됩니다. 이는 대부분의 CI/CD 도구의 기본이며 이 문서에서는 다루지 않습니다.
조금 더 어려운 부분은 애플리케이션을 제대로 테스트해야 하는 종속성에서 비롯되는데, 이를 종종 외부 서비스라고 합니다. 카우치베이스도 그중 하나입니다. 예를 들어 Docker 컨테이너를 사용하거나 테스트 인프라에서 호스팅하거나 서비스형 외부 솔루션을 사용하는 등 다양한 방법이 있습니다. 테스트를 실행하는 동안 사용할 수만 있다면 어떤 방식이든 상관없습니다. 환경 변수를 사용하여 이러한 인스턴스를 참조하는 것이 좋습니다.
이러한 서비스가 Couchbase 무료 티어 인스턴스 또는 Docker 컨테이너와 같이 실행 중이라고 가정하면 다음 단계는 이러한 서비스가 올바르게 구성되고 테스트에 필요한 데이터가 시딩되었는지 확인하는 것입니다.
얼마 전에 GitHub 작업의 Couchbase 셸. 여기서는 GitHub Actions와 함께 Couchbase Shell을 사용하는 기본 사항을 설명했지만, 대부분의 CI/CD 솔루션에도 적용할 수 있습니다. 오늘은 여기서 더 나아가 온디맨드 환경에서 클러스터 또는 클러스터의 요소를 복제하는 데 유용한 몇 가지 스크립트를 보여드리고자 합니다.
Couchbase Shell을 사용하여 환경 복제하기
카우치베이스 셸을 사용할 때 어떤 작업을 하고 싶을 때 가장 먼저 떠오르는 것이 바로 그런 기능이 있나요? 현재로서는 무언가를 복제할 수 있는 함수가 없습니다. 사용 가능한 대부분의 함수는 API 기능을 반영하며 현재로서는 복제 API가 없습니다. 하지만 스크립트를 작성할 수 있는 기능이 있으므로 직접 만들 수도 있습니다!
데이터베이스를 관리할 때 가장 먼저 떠오르는 것은 구조와 스키마를 다시 만드는 일입니다. Couchbase는 스키마가 없기 때문에 소스 클러스터의 기존 버킷, 범위, 컬렉션 및 인덱스로만 구성됩니다. 첫 번째 단계는 나중에 다시 가져올 수 있도록 해당 구조를 내보내는 것입니다. 이 함수는 모든 버킷을 나열한 다음 내부 범위와 컬렉션을 나열하고 배열에 추가합니다. 그런 다음 모든 인덱스를 나열하고 출력 JSON에 추가합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# 모든 버킷, 범위, 컬렉션 및 인덱스를 내보냅니다. 주어진 클러스터에 대한 # def 내보내기-클러스터-구조체 [ 출처: 문자열 # 내보낼 클러스터 ] { mut 내보내기 = [] let 버킷 = 버킷 --클러스터 $출처 # 주어진 클러스터의 버킷을 나열합니다. 에 대한 버킷 in $버킷 { mut 범위_구조 = [] let 범위 = 범위 --클러스터 $출처 --버킷 $버킷.이름 에 대한 범위 in $범위 { let 컬렉션 = (컬렉션 --클러스터 $출처 --버킷 $버킷.이름 --범위 $범위.범위 | 거부 -i 클러스터) $범위_구조 ++= [{ 범위: $범위.범위, 컬렉션: $컬렉션 }] } # 범위를 버킷 객체와 병합하고 내보내기 배열에 추가합니다. let buc = ( $버킷 | 병합 {범위: $범위_구조 } ) $내보내기 ++= [ $buc ] } let 인덱스 = 쿼리 인덱스 --정의 --비활성화-컨텍스트 --클러스터 $출처 let 출력 = { 버킷: $내보내기, 인덱스: $인덱스 } 반환 $출력 } |
이는 내부적으로 Couchbase Shell이 이식성이 있고(즉, Linux, Windows 또는 OS X에서 동일한 방식으로 작동하므로 다양한 OS를 지원해야 하는 CI/CD 스크립트에 적합), 모든 구조 데이터를 DataFrame으로 간주하여 JSON을 매우 쉽게 조작할 수 있는 새로운 유형의 셸인 Nushell을 사용하기 때문에 가능한 일입니다.
사용해 보려면 다음을 실행하세요. cbsh, 를 클릭한 다음 함수가 포함된 파일을 소싱하세요. 저에게는 ci_scripts.nu. 내 cbsh 구성에 이미 다음과 같은 클러스터가 구성되어 있습니다. local
|
1 2 3 4 |
Laurent 도긴 에서 local in 여행-샘플.인벤토리._기본값 > 출처 ci-스크립트.nu Laurent 도긴 에서 local in 여행-샘플.인벤토리._기본값 > 내보내기-클러스터-구조체 local | 저장 local-클러스터-내보내기.json |
이제 다음을 열면 local-cluster-export.json, 를 클릭하면 클러스터의 구조를 확인할 수 있습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 |
{ "buckets": [ { "클러스터": "local", "name": "travel-sample", "type": "couchbase", "replicas": 0, "최소_내구성_레벨": "none", "ram_quota": 209715200, "flush_enabled": false, "cloud": false, "max_expiry": 0, "범위": [ { "범위": "인벤토리", "컬렉션": [ { "컬렉션": "공항", "max_expiry": "상속된" }, { "컬렉션": "항공사", "max_expiry": "상속된" }, { "컬렉션": "경로", "max_expiry": "상속된" }, { "컬렉션": "랜드마크", "max_expiry": "상속된" }, { "컬렉션": "호텔", "max_expiry": "상속된" } ] }, { "범위": "tenant_agent_00", "컬렉션": [ { "컬렉션": "users", "max_expiry": "상속된" }, { "컬렉션": "예약", "max_expiry": "상속된" } ] }, { "범위": "tenant_agent_01", "컬렉션": [ { "컬렉션": "users", "max_expiry": "상속된" }, { "컬렉션": "예약", "max_expiry": "상속된" } ] }, { "범위": "tenant_agent_02", "컬렉션": [ { "컬렉션": "users", "max_expiry": "상속된" }, { "컬렉션": "예약", "max_expiry": "상속된" } ] }, { "범위": "tenant_agent_03", "컬렉션": [ { "컬렉션": "users", "max_expiry": "상속된" }, { "컬렉션": "예약", "max_expiry": "상속된" } ] }, { "범위": "tenant_agent_04", "컬렉션": [ { "컬렉션": "users", "max_expiry": "상속된" }, { "컬렉션": "예약", "max_expiry": "상속된" } ] }, { "범위": "_default", "컬렉션": [ { "컬렉션": "_default", "max_expiry": "상속된" } ] }, { "범위": "_system", "컬렉션": [ { "컬렉션": "_query", "max_expiry": "" }, { "컬렉션": "_모바일", "max_expiry": "" } ] } ] } ], "인덱스": [ { "bucket": "travel-sample", "범위": "_system", "컬렉션": "_query", "name": "#primary", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`_system`.`_query`에 주 인덱스 `#primary` 생성", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_에어포트명", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`(`에어포트명`)에 `def_airportname` 인덱스 생성 { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_city", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`(`city`)에 `def_city` 인덱스 생성 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_faa", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`(`faa`)에 `def_faa` 인덱스 생성 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_icao", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`(`icao`)에 `def_icao` 인덱스 생성 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "항공사", "name": "def_inventory_airline_primary", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`inventory`.`airline`에 주 인덱스 `def_inventory_airline_primary`를 생성하고 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "공항", "name": "def_inventory_에어포트_에어포트명", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`inventory`.`airport`(`에어포트명`) ON `def_inventory_airport_airportname` INDEX CREATE { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "공항", "name": "def_inventory_airport_city", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`inventory`.`airport`(`city`) ON `def_inventory_airport_city` INDEX CREATE { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "공항", "name": "def_inventory_airport_faa", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`inventory`.`airport`(`faa`) ON `def_inventory_airport_faa` INDEX CREATE { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "공항", "name": "def_inventory_airport_primary", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`여행 샘플`.`인벤토리`.`에어포트`에 주 인덱스 `def_inventory_airport_primary`를 생성하고 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "호텔", "name": "def_inventory_hotel_city", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`inventory`.`hotel`(`city`) ON `def_inventory_hotel_city` INDEX CREATE { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "호텔", "name": "def_inventory_hotel_primary", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`여행 샘플`.`인벤토리`.`호텔`에 주 인덱스 `def_inventory_hotel_primary`를 생성하고 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "랜드마크", "name": "def_inventory_랜드마크_도시", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`inventory`.`landmark`(`city`) ON `def_inventory_landmark_city` INDEX CREATE WITH { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "랜드마크", "name": "def_inventory_랜드마크_기본", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`여행 샘플`.`인벤토리`.`랜드마크`에 주 인덱스 `def_inventory_랜드마크_primary`를 생성하고 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "경로", "name": "def_inventory_route_primary", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`여행 샘플`.`인벤토리`.`경로`에 주 인덱스 `def_inventory_route_primary`를 생성하고 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "경로", "name": "def_inventory_route_route_src_dst_day", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "CREATE INDEX `def_inventory_route_route_src_dst_day` ON `travel-sample`.`inventory`.`route`(`원점공항`,`목적지공항`,(distinct (`v`.`day`) for `v` in `schedule` end)))) WITH { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "경로", "name": "def_inventory_route_schedule_utc", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "CREATE INDEX `def_inventory_route_schedule_utc` ON `travel-sample`.`inventory`.`route`(array (`s`.`utc`) for `s` in `스케줄` end) WITH { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "인벤토리", "컬렉션": "경로", "name": "def_inventory_route_sourceairport", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`.`inventory`.`route`(`sourceairport`) ON `def_inventory_route_sourceairport` INDEX CREATE { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_name_type", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "CREATE INDEX `def_name_type` ON `travel-sample`(`name`) WHERE (`_type` = \"User\") WITH { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_primary", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`에 `def_primary` 주 인덱스 만들기 { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_route_src_dst_day", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "CREATE INDEX `def_route_src_dst_day` ON `travel-sample`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WHERE (`type` = \"route\") WITH { \"defer_build\":true }", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_schedule_utc", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "CREATE INDEX `def_schedule_utc` ON `travel-sample`(array (`s`.`utc`) for `s` in `스케줄` end) WITH { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_sourceairport", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "CREATE INDEX `def_sourceairport` ON `travel-sample`(`sourceairport`) WITH { \"defer_build\":true }"", "클러스터": "local" }, { "bucket": "travel-sample", "범위": "_default", "컬렉션": "_default", "name": "def_type", "status": "준비 완료", "storage_mode": "memory_optimized", "replicas": 0, "정의": "`travel-sample`(`유형`) ON `def_type` 인덱스 생성 { \"defer_build\":true }", "클러스터": "local" } ] } |
이 테스트의 목적을 위해 나중에 다시 가져오기 위해 해당 버킷을 삭제했습니다: 버킷 드롭 여행 샘플.
다음 논리적 단계는 이 파일을 입력으로 받아 다른 클러스터에서 전체 구조를 다시 생성하는 함수를 만드는 것입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# 모든 버킷, 범위 및 컬렉션 구조 가져오기 주어진 클러스터의 # def 가져오기-클러스터-구조체 [ 목적지: 문자열 # 가져올 클러스터 ] { let 구조 = $in # 변수에 파이프 구조 할당하기 let 버킷 = $구조.버킷 에 대한 버킷 in $버킷 { $버킷 | create-버킷-정의 $목적지 에 대한 범위 in ($버킷.범위 | 어디 not ( $it.범위 | str 시작-와 함께 "_" ) ) { 인쇄 $"범위 만들기 ($대상)_($버킷.이름)_($scope.scope)" 범위 create --클러스터 $목적지 --버킷 $버킷.이름 $범위.범위 에 대한 col in $범위.컬렉션 { 인쇄 $"컬렉션 만들기 ($대상)_($버킷.이름)_($scope.범위)_($col.컬렉션)" 컬렉션 create --클러스터 $목적지 --버킷 $버킷.이름 --범위 $범위.범위 $col.컬렉션 } } } let 인덱스 = $구조.인덱스 $인덱스 | create-인덱스 $목적지 # Nushell을 사용하면 사용자가 만든 다른 기능을 사용할 수 있습니다. } def create-인덱스 [ 목적지: 문자열 # 인덱스를 생성할 클러스터 ] { let 인덱스 = $in 에 대한 색인 in $인덱스 { 인쇄 $"클러스터($대상)에서 인덱스($index.name)를 다음과 같이 다시 만듭니다: " 인쇄 $색인.정의 쿼리 $색인.정의 --비활성화-컨텍스트 --클러스터 $목적지 } } |
이제 해당 함수를 실행합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
Laurent 도긴 에서 local in 여행-샘플.인벤토리._기본값 > 열기 local-클러스터-내보내기.json | 가져오기-클러스터-구조체 아카펠라 Laurent 도긴 에서 local in 여행-샘플.인벤토리._기본값 > 열기 local-클러스터-내보내기.json | 가져오기-클러스터-구조체 local 만들기 버킷 지역_여행-샘플 와 함께 200 할당량, 유형 카우치베이스, 0 복제본, 없음 내구성, 0 만료 만들기 범위 지역_여행-샘플_인벤토리 만들기 컬렉션 지역_여행-샘플_인벤토리_공항 만들기 컬렉션 지역_여행-샘플_인벤토리_항공사 만들기 컬렉션 지역_여행-샘플_인벤토리_경로 만들기 컬렉션 지역_여행-샘플_인벤토리_랜드마크 만들기 컬렉션 지역_여행-샘플_인벤토리_호텔 만들기 범위 지역_여행-샘플_테넌트_에이전트_00 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_00_사용자 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_00_부킹 만들기 범위 지역_여행-샘플_테넌트_에이전트_01 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_01_사용자 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_01_부킹 만들기 범위 지역_여행-샘플_테넌트_에이전트_02 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_02_사용자 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_02_부킹 만들기 범위 지역_여행-샘플_테넌트_에이전트_03 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_03_사용자 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_03_부킹 만들기 범위 지역_여행-샘플_테넌트_에이전트_04 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_04_사용자 만들기 컬렉션 지역_여행-샘플_테넌트_에이전트_04_부킹 재창조 색인 #로 클러스터 로컬의 기본: 만들기 기본 INDEX `#primary` ON `travel-sample`.`_system`.`_query` 재창조 색인 def_공항명 on 클러스터 local 와 함께: 만들기 INDEX `def_공항명` 켜기 `여행-샘플`(`공항명`) WITH { "defer_build":true } 재창조 색인 def_city on 클러스터 local 와 함께: 만들기 INDEX `def_city` 켜기 `여행-샘플`(`도시`) WITH { "defer_build":true } 재창조 색인 def_faa on 클러스터 local 와 함께: 만들기 INDEX `def_faa` 켜기 `여행-샘플`(`faa`) WITH { "defer_build":true } 재창조 색인 def_icao on 클러스터 local 와 함께: 만들기 INDEX `def_icao` 켜기 `여행-샘플`(`icao`) WITH { "defer_build":true } 재창조 색인 def_inventory_airline_primary on 클러스터 local 와 함께: 만들기 기본 INDEX `def_inventory_airline_primary` 켜기 `여행-샘플`.`인벤토리`.`항공사` WITH { "defer_build":true } 재창조 색인 def_inventory_에어포트_에어포트명 on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_에어포트_에어포트명` 켜기 `여행-샘플`.`인벤토리`.`공항`(`공항명`) WITH { "defer_build":true }재창조 색인 def_inventory_airport_city on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_airport_city` 켜기 `여행-샘플`.`인벤토리`.`공항`(`도시`) WITH { "defer_build":true } 재창조 색인 def_inventory_airport_faa on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_airport_faa` 켜기 `여행-샘플`.`인벤토리`.`공항`(`faa`) WITH { "defer_build":true } 재창조 색인 def_inventory_airport_primary on 클러스터 local 와 함께: 만들기 기본 INDEX `def_inventory_airport_primary` 켜기 `여행-샘플`.`인벤토리`.`공항` WITH { "defer_build":true } 재창조 색인 def_inventory_hotel_city on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_hotel_city` 켜기 `여행-샘플`.`인벤토리`.`호텔`(`도시`) WITH { "defer_build":true } 재창조 색인 def_inventory_hotel_primary on 클러스터 local 와 함께: 만들기 기본 INDEX `def_inventory_hotel_primary` 켜기 `여행-샘플`.`인벤토리`.`호텔` WITH { "defer_build":true } 재창조 색인 def_inventory_랜드마크_도시 on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_랜드마크_도시` 켜기 `여행-샘플`.`인벤토리`.`랜드마크`(`도시`) WITH { "defer_build":true } 재창조 색인 def_inventory_landmark_primary on 클러스터 local 와 함께: 만들기 기본 INDEX `def_inventory_landmark_primary` 켜기 `여행-샘플`.`인벤토리`.`랜드마크` WITH { "defer_build":true } 재창조 색인 def_inventory_route_primary on 클러스터 local 와 함께: 만들기 기본 INDEX `def_inventory_route_primary` 켜기 `여행-샘플`.`인벤토리`.`경로` WITH { "defer_build":true } 재창조 색인 def_inventory_route_route_src_dst_day on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_route_route_src_dst_day` 켜기 `여행-샘플`.`인벤토리`.`경로`(`소스공항`,`목적지공항`,(distinct (배열 (`v`.`일`) 에 대한 `v` in `일정` 끝))) WITH { "defer_build":true } 재창조 색인 def_inventory_route_schedule_utc on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_route_schedule_utc` 켜기 `여행-샘플`.`인벤토리`.`경로`(배열 (`s`.`UTC`) 에 대한 `s` in `일정` 끝) WITH { "defer_build":true } 재창조 색인 def_inventory_route_sourceairport on 클러스터 local 와 함께: 만들기 INDEX `def_inventory_route_sourceairport` 켜기 `여행-샘플`.`인벤토리`.`경로`(`소스공항`) WITH { "defer_build":true } 재창조 색인 def_name_type on 클러스터 local 와 함께: 만들기 INDEX `def_name_type` 켜기 `여행-샘플`(`이름`) 어디 (`_유형` = "사용자") WITH { "defer_build":true } 재창조 색인 def_primary on 클러스터 local 와 함께: 만들기 기본 INDEX `def_primary` 켜기 `여행-샘플` WITH { "defer_build":true } 재창조 색인 def_route_src_dst_day on 클러스터 local 와 함께: 만들기 INDEX `def_route_src_dst_day` 켜기 `여행-샘플`(`소스공항`,`목적지공항`,(distinct (배열 (`v`.`일`) 에 대한 `v` in `일정` 끝))) 어디 (`유형` = "경로") WITH { "defer_build":true } 재창조 색인 def_schedule_utc on 클러스터 local 와 함께: 만들기 INDEX `def_schedule_utc` 켜기 `여행-샘플`(배열 (`s`.`UTC`) 에 대한 `s` in `일정` 끝) WITH { "defer_build":true } 재창조 색인 def_sourceairport on 클러스터 local 와 함께: 만들기 INDEX `def_sourceairport` 켜기 `여행-샘플`(`소스공항`) WITH { "defer_build":true } 재창조 색인 def_type on 클러스터 local 와 함께: 만들기 INDEX `def_type` 켜기 `여행-샘플`(`유형`) WITH { "defer_build":true } |
이제 한 클러스터에서 다른 클러스터로 데이터 구조를 내보내고 가져올 수 있는 함수가 완성되었습니다. 이것은 좋은 출발점이지만, 데이터를 다시 가져오는 방법이나 세분성에 대한 질문이 여전히 남아 있습니다. 또한 전체 클러스터를 내보내고 가져오고 싶지 않을 수도 있습니다.
Nushell을 사용하면 데이터 프레임을 필터링할 수 있으므로 가져올 버킷을 필터링하는 것은 매우 쉽습니다:
|
1 2 |
Laurent 도긴 에서 local in 여행-샘플.인벤토리._기본값 > 열기 local-클러스터-내보내기.json | { 버킷: ( $in.버킷 | 어디 이름 == 'travel-sample'), 인덱스 :( $in.인덱스 | 어디 버킷 == 'travel-sample') } |
이렇게 하면 버킷 이름이 여행 샘플 및 이 버킷에 대한 인덱스.
이제 기본적인 클러스터 구조를 관리할 준비가 완료되었습니다. 데이터는 어떻게 가져오나요? 대부분의 키/값 연산은 물론 INSERT/UPSERT 쿼리도 지원하므로 cbsh로 데이터를 가져올 수 있는 방법은 여러 가지가 있습니다. 그리고 문서 가져오기 명령. 사용법은 매우 간단하며 식별된 ID 필드가 있는 행 목록만 있으면 됩니다. 이 목록은 Nushell용 데이터 프레임으로 변환할 수 있는 모든 것(XML, CSV, TSV, Parquet 등)이 될 수 있습니다. 물론 Couchbase SQL++ 쿼리의 JSON 파일일 수도 있습니다. 다음은 쿼리 결과를 파일에 저장하고 해당 파일을 컬렉션으로 다시 가져오는 예제입니다:
|
1 2 3 4 5 6 7 8 |
# 파일 이름에 파일 콘텐츠 저장 let 파일 이름 = $"temp_($src_버킷)_($src_범위)_($src_컬렉션).json" let 쿼리 = "SELECT meta().id as meta_id, meta().expiration as expiration, c.* FROM `" + $src_버킷 + "`." + $src_scope + "." + $src_collection + " c" 쿼리 --비활성화-컨텍스트 --클러스터 $p.src $쿼리 | 저장 -f $파일 이름 # 파일 콘텐츠 가져오기 및 결과 인쇄하기 인쇄 $"($src)_($src_버킷)_($src_범위)_($src_컬렉션)에서 ($dest)_($dest_버킷)_($dest_범위)_($dest_컬렉션)으로 컬렉션 콘텐츠 가져오기" 인쇄 ( doc 가져오기 --버킷 $p.dest_bucket --범위 $p.dest_scope --컬렉션 $p.목적지_컬렉션 --클러스터 $p.dest --id-열 메타_id $파일 이름 ) |
이는 하나의 구체적인 예시이지만 스크립팅 언어 사용의 요점은 자신만의 것으로 만드는 것입니다. 더 완전한 예제는 다음에서 찾을 수 있습니다. 이 깃허브 요점. 소스 및 대상에 대한 환경 변수를 지원하며 클러스터의 모든 버킷, 특정 버킷, 범위 또는 컬렉션을 복제할지 여부를 결정할 수 있습니다.
주저하지 마시고 여기 또는 다음에 의견을 남겨 주세요. 불화, 를 통해 글로벌 카우치베이스 경험을 개선하기 위한 제안을 항상 찾고 있습니다.