Software Development/Database
-
[몽고디비] Query PlansSoftware Development/Database 2023. 5. 9. 14:58
https://www.mongodb.com/docs/manual/core/query-plans/ Query Plans — MongoDB Manual Docs Home → MongoDB Manual For a query, the MongoDB query optimizer chooses and caches the most efficient query plan given the available indexes. The evaluation of the most efficient query plan is based on the number of "work units" (works) performed by www.mongodb.com 위의 사이트에서 참고하였습니다. 쿼리 성능이 제대로 안나오는 원인은 인덱스랑 관련..
-
[MongoDB] createIndex commitQuorumSoftware Development/Database 2023. 3. 31. 23:00
몽고디비 인덱스 생성시에 commitQuorum 옵션이 있다. 기본값은 'votingMembers'인데, 데이터 보유 노드 전체에 인덱스를 생성해야 결과를 출력한다. 만약 데이터 보유 노드 중 한대가 RECOVERING 상태이고 commitQuorum: votingMembers 옵션으로 createIndex를 생성하면 결과를 반환하지 않는다. 결과를 반환하지 않는다고 해서 인덱스가 생성되지 않은 것은 아니다. 프라이머리노드 및 살아있는 세컨더리 노드는 인덱스가 생성됐을 수 있다. 그렇기 때문에 createIndex시에 응답이 필요한 경우는, commitQuorum옵션을 majority로 설정하는 것이 좋다. 만약 노드중 한대가 RECOVERING일 때, commitQuorum옵션을 votingMember..
-
-
[MongoDB] 재해복구 시스템을 위한 몽고디비 노드 설정.Software Development/Database 2023. 3. 10. 20:30
재해복구 시스템을 위해서는 다른 Zone 또는 Region에 클러스터를 배포해야 한다. 예를 들어, 데이터센터 A와 데이터센터 B가 있을 경우, A, B에 각각 2~3대의 노드를 배포하는 방식으로 동작한다. 몽고디비는 프라이머리 노드 선출을 위해 노드의 개수를 홀수로 설정하는 것을 권장한다. 만약 A, B에 2대 2대가 있다면, 4대의 노드로 짝수의 노드이기 때문에 해당 권장사항을 따르지 않는다. 이를 해결하기 위해서, A에 3대 B에 2대를 설정하여 홀수개의 노드로 해당 권장사항을 충족할 수 있다. 그런데 위의 방식은 문제점이 존재한다. 만약 A 데이터센터가 정전, 네트워크 이슈 같은 이유로 3대가 사용이 불가능하게 된다면 어떻게 될까? 5대의 노드 중에 총 B 데이터 센터의 2대의 노드만 살아있게 된..
-
[MongoDB] Compound Index 생성해도 왜 쿼리가 느리지?Software Development/Database 2022. 5. 31. 20:40
여러개의 field를 가지고 index를 생성할 때 compound index를 이용한다. 생성한 compound index의 field를 포함하는 조건을 가지고 query를 실행해도 느린 경우가 있다. 그 이유는 Query Selectivity과 관련이 있다. eplain('executionStats')로 쿼리플랜을 조회하면, totalKeysExamined, nReturned가 있다. 위 두 값의 차이가 크면 성능이 좋지 못한 것이다. 예를 들어 nReturned가 100이고, totalKeysExamined가 100,000이라면 100개의 문서를 찾는데 100,000개의 키를 스캔하게 되는 것이다. 인덱스를 타서 Collection Scan을 피하긴 했지만, 여전히 스캔하는 데이터의 양이 많은 것이..
-
데이터베이스 인터널스Software Development/Database 2022. 4. 27. 18:24
Database Internals를 읽고 주요 내용을 요약 정리합니다. 데이터베이스 비교 데이터베이스 시스템 선택은 장기적인 결과를 초래할 수 있다. 마이그레이션 작업은 쉬운 것이 아니기 때문에 개발 초기 단계에 성능, 일관성 문제 운영 문제 등 여러 요소를 고려해야 한다. 최악의 경우 애플리케이션의 많은 부분을 수정해야 한다. 데이터베이스를 비교하기 전에 목표를 명확하게 세우자. 성능과 확장성에 관련된 문제는 시간이 지나거나 사용량이 증가했을 때 나타난다. 운영 환경과 최대한 유사한 환경에서 오랫동안 테스트하는 것이 가장 좋다. 데이터베이스 선택은 장기적인 결정이라 최신 버전에 정확히 무엇이 변경됐고 왜 변경됐는지 파악하고 업그레이드 전략을 세워 두는 것이 좋다. 데이터베이스 개발업체가 지금까지 어떤 ..
-
[MongoDB] collection.count(), collection.countDocuments({})Software Development/Database 2022. 1. 14. 00:48
MongoDB에서 흔히 전체 문서가 얼마나 저장되어 있는지 세기 위해서 db.collection.find({}).count(), db.collection.count()를 실행합니다. 그러나 위의 방법은 권장하지 않습니다. 왜냐하면 find({}) 처럼 쿼리에 조건이 없거나 그냥 count()를 실행할 경우, 메타데이터에서 값을 가져오기 때문입니다. 메타데이터에서 값을 가져오기 때문에 실행하면 굉장히 빠르게 값을 반환하는 것을 볼 수 있습니다. 이런 현상은 몽고디비가 샤딩됐을 때, 고아 문서가 적절히 필터링되지 못하거나 몽고디비가 비정상적으로 종료하게 되면 count가 적절하지 않을 수 있습니다. Wired Tiger storage engine을 쓰는 mongod가 비정상적으로 종료됐을 때 count()가..
-
[데이터 중심 애플리케이션] 스트림 처리Software Development/Database 2022. 1. 9. 16:07
일간 일괄 처리의 문제점은 입력 변화가 하루가 지나야 반영된다는 것인데 성격 급한 사용자가 느끼기에는 너무 느리다. 고정된 시간 조각이라는 개념을 완전히 버리고 단순히 이벤트가 발생할 때마다 처리해야 한다. 이 방법이 스트림 처리의 기본 개념이다. "스트림"은 시간 흐름에 따라 점진적으로 생상된 데이터를 일컫는다. 이 개념은 유닉스의 stdin과 stdout, 자바의 FileInputsStream 같은 파일 시스템 API, TCP 연결, 인터넷 상의 오디오와 비디오 전송 등 많은 곳에서 등장한다. 이벤트 스트림 전송 일괄 처리 환경에서 작업은 입출력이 파일이다. 스트림 처리에서는 입력이 파일일 떄 대개 첫 번째 단계로 파일을 분석해 레코드의 연속으로 바꾸는 처리를 한다. 스트림 처리 문맥에서 레코드는 보..