개요
이 가이드 에서는 쓰기 고려 (write concern), 읽기 고려 (read concern) 및 읽기 설정 (read preference) 옵션을 구성하여 코틀린 동기 (Kotlin Sync) 운전자 복제본 세트에서 읽기 및 쓰기 (write) 작업을 실행하는 방식을 수정하는 방법을 학습 수 있습니다.
읽기 및 쓰기 설정 우선 순위
다음 수준에서 쓰기 고려, 읽기 고려, 읽기 설정 옵션을 설정할 수 있습니다.
재정의되지 않는 한 모든 작업 실행에 대한 기본값을 설정하는 클라이언트
트랜잭션
Database
컬렉션
이 목록은 옵션 설정의 우선 순위가 높아지는 순서도 나타냅니다. 예시 들어, 트랜잭션 에 대해 읽기 고려 (read concern) 설정하다 클라이언트 에서 상속된 읽기 고려 (read concern) 설정이 재정의됩니다.
쓰기 고려, 읽기 고려 (read concern) 및 읽기 설정 (read preference) 옵션을 사용하면 복제본 세트에 있는 데이터의 인과적 일관성 과 가용성을 사용자 지정할 수 있습니다. 이러한 옵션의 전체 목록을 보려면 MongoDB Server 매뉴얼에서 다음 가이드를 참조하세요.
읽기 및 쓰기 작업 구성
읽기 설정 (read preference) 설정하여 운전자 복제본 세트 멤버 간에 읽기 작업을 라우팅하는 방법을 제어할 수 있습니다. 또한 읽기 및 쓰기 (write) 고려를 설정하여 운전자 복제본 세트 에서 읽기 및 쓰기 (write) 작업의 승인을 기다리는 방법을 제어할 수도 있습니다.
다음 섹션에서는 다양한 수준에서 이러한 읽기 및 쓰기 (write) 설정을 구성하는 방법을 보여줍니다.
클라이언트 구성
이 예시 MongoClientSettings
인스턴스 MongoClient.create()
메서드에 전달하여 MongoClient
인스턴스 의 읽기 설정 (read preference), 읽기 고려 (read concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여줍니다. 이 코드는 다음 설정을 구성합니다.
secondary
읽기 설정 (read preference) : 읽기 작업은 세컨더리 복제본 세트 멤버에서 데이터를 조회 .LOCAL
읽기 고려 (read concern): 읽기 작업은 데이터가 대부분의 복제본 세트 멤버에 기록되었음을 보장하지 않고 인스턴스의 가장 최근 데이터를 반환합니다.W2
쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버와 한 명의 세컨더리 멤버가 쓰기 (write) 작업을 확인해야 합니다.
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://localhost:27017/")) .readPreference(ReadPreference.secondary()) .readConcern(ReadConcern.LOCAL) .writeConcern(WriteConcern.W2) .build() val mongoClient = MongoClient.create(settings)
또는 MongoClient.create()
메서드에 매개변수로 전달되는 연결 URI에 읽기 및 쓰기 (write) 설정을 지정할 수 있습니다.
val uri = "mongodb://localhost:27017/?readPreference=secondary&w=2&readConcernLevel=local" val uriClient = MongoClient.create(uri)
트랜잭션 구성
이 예시 TransactionOptions
인스턴스 withTransaction()
메서드에 전달하여 트랜잭션 의 읽기 설정 (read preference), 읽기 고려 (read concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여 줍니다. 트랜잭션은 세션 내에서 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업을 그룹화한 세션 내에서 실행 . 트랜잭션 옵션을 적용하기 전에 startSession()
메서드를 사용하여 세션을 시작합니다.
팁
세션에 대해 자세히 학습 MongoDB Server 매뉴얼의 서버 세션을 참조하세요.
이 예시 다음 설정을 구성합니다.
primary
읽기 설정 (read preference) : 읽기 작업은 프라이머리 복제본 세트 멤버에서 데이터를 조회 .MAJORITY
읽기 고려 (read concern): 읽기 작업은 대부분의 복제본 세트 멤버에 기록된 인스턴스의 가장 최근 데이터를 반환합니다.W1
쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버는 쓰기 (write) 작업을 확인해야 합니다.
mongoClient.startSession().use { session -> try { // Sets transaction read and write settings val txnOptions = TransactionOptions.builder() .readPreference(ReadPreference.primary()) .readConcern(ReadConcern.MAJORITY) .writeConcern(WriteConcern.W1) .build() session.withTransaction({ // Specify transaction operations here }, txnOptions) } catch (e: Exception) { println("Transaction failed: ${e.message}") } }
데이터베이스 구성
이 예시 setter 메서드를 getDatabase()
메서드에 연결하여 test_database
데이터베이스 의 읽기 설정 (read preference), 읽기 고려 (read concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여 줍니다. 이 코드는 다음 설정을 구성합니다.
primaryPreferred
읽기 설정 (read preference) : 읽기 작업은 프라이머리 복제본 세트 멤버에서 데이터를 조회 , 프라이머리 사용할 수 없는 경우 세컨더리 멤버에서 데이터를 검색합니다.AVAILABLE
읽기 고려 (read concern): 읽기 작업은 데이터가 대부분의 복제본 세트 멤버에 기록되었음을 보장하지 않고 인스턴스의 가장 최근 데이터를 반환합니다.MAJORITY
쓰기 고려 (write concern): 모든 복제본 세트 멤버의 대다수가 쓰기 (write) 작업을 승인해야 합니다.
val database = mongoClient.getDatabase("test_database") .withReadPreference(ReadPreference.primaryPreferred()) .withReadConcern(ReadConcern.AVAILABLE) .withWriteConcern(WriteConcern.MAJORITY)
collection 구성
이 예시 setter 메서드를 getCollection()
메서드에 연결하여 test_collection
컬렉션 의 읽기 설정 (read preference), 읽기 고려 (read concern) 및 쓰기 고려 (write concern) 설정하다 방법을 보여 줍니다. 이 코드는 다음 설정을 구성합니다.
secondaryPreferred
읽기 설정 (read preference) : 읽기 작업은 세컨더리 복제본 세트 멤버 또는 사용 가능한 세컨더리 멤버가 없는 경우 프라이머리 멤버에서 데이터를 조회 .AVAILABLE
읽기 고려 (read concern): 읽기 작업은 데이터가 대부분의 복제본 세트 멤버에 기록되었음을 보장하지 않고 인스턴스의 가장 최근 데이터를 반환합니다.UNACKNOWLEDGED
쓰기 고려 (write concern): 복제본 설정하다 멤버는 쓰기 (write) 작업을 승인할 필요가 없습니다.
val collection = database.getCollection<Document>("test_collection") .withReadPreference(ReadPreference.secondaryPreferred()) .withReadConcern(ReadConcern.AVAILABLE) .withWriteConcern(WriteConcern.UNACKNOWLEDGED)
고급 읽기 구성
다음 섹션에서는 코틀린 동기 (Kotlin Sync) 운전자 읽기 작업을 라우팅하는 방법을 추가로 사용자 지정하는 방법을 설명합니다.
샤딩된 클러스터
샤딩된 클러스터 에 연결할 때 읽기 설정 (read preference) 지정할 수 있습니다. MongoDB 샤딩 사용하여 데이터 세트를 키 범위별로 나누고 여러 데이터베이스 인스턴스에 데이터를 분산합니다. 샤딩된 클러스터 또는 샤딩된 배포서버 의 노드 설정하다 에는 다음과 같은 구성 요소가 포함됩니다.
샤드: 샤딩된 데이터의 하위 집합을 포함하는 복제본 세트 입니다.
Mongos: 애플리케이션 과 샤딩된 클러스터 간의 인터페이스를 제공하는 쿼리 라우터입니다.
구성 서버: 클러스터의 구성 설정 및 메타데이터 저장 서버입니다.
팁
샤딩된 클러스터에 대해 자세히 학습하려면 MongoDB Server 매뉴얼의 샤딩 을 참조하세요.
복제본 세트 샤드에서 읽을 때 mongos
은(는) 지정된 읽기 설정 (read preference) 적용합니다. 읽기 설정 (read preference) 각 작업마다 다시 평가됩니다.
다음 예시 샤딩된 클러스터 에 연결하고 연결 문자열 에 secondary
읽기 설정 (read preference) 지정하는 방법을 보여 줍니다.
val shardedClient = MongoClient.create( "mongodb://user:password@mongos1.example.com,mongos2.example.com/?readPreference=secondary" )
태그 세트
MongoDB Server 에서는 선택한 기준에 따라 복제본 세트 멤버에 키-값 태그를 적용 할 수 있습니다. 그런 다음 해당 태그를 사용하여 읽기 작업의 멤버를 한 명 이상 대상으로 지정할 수 있습니다.
기본값 으로 코틀린 동기 (Kotlin Sync) 운전자 읽을 멤버를 선택할 때 태그를 무시합니다. 코틀린 동기 (Kotlin Sync) 운전자 특정 태그를 선호하도록 지시하려면 읽기 설정 (read preference) 설정자 메서드에 태그를 목록으로 전달합니다.
미국 전역의 여러 데이터 센터에서 호스팅되는 멤버가 포함된 복제본 세트 에 연결되어 있다고 가정해 보겠습니다. 운전자 다음 순서로 세컨더리 복제본 세트 멤버로부터 읽기를 선호하도록 하려고 합니다.
다음과 같이 태그가 지정된 뉴욕 데이터 센터 의 멤버
("dc", "ny")
다음과 같이 태그가 지정된 샌프란시스코 데이터 센터 의 멤버
("dc", "sf")
모든 세컨더리 멤버
이 코드 예시 이전 복제본 세트 멤버를 나타내는 태그 목록을 ReadPreference.secondary()
setter 메서드에 전달합니다. 그런 다음 이 코드는 읽기 설정 (read preference) 정보를 withReadPreference()
메서드에 전달하여 데이터베이스 에서 읽기 순서를 설정하다 .
val tag1 = TagSet(Tag("dc", "ny")) val tag2 = TagSet(Tag("dc", "sf")) val tag3 = TagSet() // Empty tag set as fallback val readPref = ReadPreference.secondary(listOf(tag1, tag2, tag3)) val taggedDb = mongoClient.getDatabase("test_database") .withReadPreference(readPref)
부하 분산
샤딩된 클러스터 또는 복제본 세트에 연결할 때 코틀린 동기 (Kotlin Sync) 운전자는 로드 밸런싱 을 사용하여 읽기 및 쓰기 (write) 요청을 처리하다. 로드 밸런싱을 통해 운전자 이러한 요청을 여러 서버에 분산할 수 있으므로 하나의 서버 부담을 주지 않고 최적의 성능을 보장할 수 있습니다.
샤딩된 클러스터 에 연결할 때 코틀린 동기 (Kotlin Sync) 운전자 네트워크 왕복 시간이 가장 짧은 인스턴스를 계산하여 가장 가까운 mongos
인스턴스 결정합니다. 그런 다음 운전자가 이 mongos
의 평균 왕복 시간을 localThresholdMS 값에 추가하여 지연 시간 창을 결정합니다. 운전자 지연 시간 창 내에 속하는 최대 2개의 무작위 mongos
인스턴스에 요청을 로드 밸런싱합니다. 각 요청 에 대해 운전자 operationCount
값을 결정하여 작업 부하가 낮은 서버 선택합니다.
복제본 세트 에 연결할 때 코틀린 동기 (Kotlin Sync) 운전자 먼저 읽기 설정 (read preference) 에 따라 복제본 세트 멤버를 선택합니다. 그런 다음 운전자 이전 단락에서 설명한 것과 동일한 프로세스 따릅니다. 지연 시간 창 계산한 후 운전자 이 창 에 속하는 무작위 복제본 세트 멤버를 최대 두 개 선택하고 operationCount
값이 더 낮은 멤버를 선택하여 요청 받습니다.
팁
로드 밸런싱에 대해 자세히 학습하려면 MongoDB Server 매뉴얼에서 샤드 클러스터 밸런서 를 참조하세요.
LocalThreshold
코틀린 동기 (Kotlin Sync) 운전자 로컬 임계값을 사용하여 서버 선택의 지연 시간 창 계산합니다. 이 값은 읽기 및 쓰기 (write) 요청을 수신할 수 있는 서버를 결정합니다.
기본값 으로 운전자 핑 시간이 가장 가까운 서버 에서 15 밀리초 이내인 mongos
인스턴스 또는 복제본 세트 멤버만 사용합니다. 지연 시간이 더 긴 서버 간에 읽기를 분산하려면 MongoClientSettings
인스턴스 에서 localThreshold
옵션을 설정하다 연결 URI에서 localThresholdMS
옵션을 설정합니다.
참고
단일 mongos
인스턴스 에서 복제본 세트 멤버를 선택할 때 코틀린 동기 (Kotlin Sync) 운전자 localThresholdMS
옵션을 무시합니다. 이 경우 localThreshold 명령줄 옵션을 사용합니다.
다음 예시 에서는 복제본 세트 에 연결하고 로컬 임계값을 35 밀리초로 지정합니다. MongoClientSettings 또는 Connection URI 탭 선택하여 각 접근 방식에 해당하는 코드를 확인합니다.
val latencySettings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://localhost:27017/")) .applyToClusterSettings { builder -> builder.localThreshold(35, TimeUnit.MILLISECONDS) } .build() val latencyClient2 = MongoClient.create(latencySettings)
val latencyClient1 = MongoClient.create( "mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35" )
앞의 예시 에서 코틀린 동기 (Kotlin Sync) 운전자 가장 가까운 멤버의 핑 시간 35 밀리초 이내에 일치하는 멤버에게 읽기를 분산합니다.
재시도 가능 읽기 및 쓰기
코틀린 동기 (Kotlin Sync) 운전자 네트워크 또는 서버 오류로 인해 특정 읽기 및 쓰기 (write) 작업이 실패할 경우 자동으로 한 번만 자동으로 재시도합니다.
MongoClientSettings
인스턴스 에서 retryReads
또는 retryWrites
옵션을 false
로 설정하여 재시도 가능 읽기 또는 재시도 가능 쓰기를 명시적으로 비활성화할 수 있습니다. 연결 URI에서 retryReads
또는 retryWrites
옵션을 설정하다 수도 있습니다.
다음 예시 재시도 가능 읽기와 재시도 가능 쓰기를 모두 false
로 설정합니다. MongoClientSettings 또는 Connection URI 탭 선택하여 각 접근 방식에 해당하는 코드를 확인합니다.
val retrySettings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://localhost:27017/")) .retryReads(false) // Disables automatic retries of read operations .retryWrites(false) // Disables automatic retries of write operations .build() val retryClient = MongoClient.create(retrySettings)
val retryUri = "mongodb://localhost:27017/?retryReads=false&retryWrites=false" val retryUriClient = MongoClient.create(retryUri)
지원되는 재시도 가능 읽기 작업에 대해 자세히 학습 MongoDB Server 매뉴얼의 재시도 가능 읽기를 참조하세요. 지원되는 재시도 가능 쓰기 (write) 작업에 대해 자세히 학습 MongoDB Server 매뉴얼의 재시도 가능 쓰기 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.