Software Development/Database
-
[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 연결, 인터넷 상의 오디오와 비디오 전송 등 많은 곳에서 등장한다. 이벤트 스트림 전송 일괄 처리 환경에서 작업은 입출력이 파일이다. 스트림 처리에서는 입력이 파일일 떄 대개 첫 번째 단계로 파일을 분석해 레코드의 연속으로 바꾸는 처리를 한다. 스트림 처리 문맥에서 레코드는 보..
-
[데이터 중심 애플리케이션] 일괄 처리Software Development/Database 2021. 12. 26. 01:36
시스템의 3가지 유형 서비스(온라인 시스템) 클라이언트로부터 요청이나 지시가 올 때까지 기다린다. 요청 하나가 들어오면 서비스는 가능한 빨리 요청을 처리해서 응답을 되돌려 보내려 한다. 응답 시간은 서비스 성능을 측정할 때 중요한 지표다. 일괄 처리 시스템(오프라인 시스템) 일괄 처리 시스템은 매우 큰 입력 데이터를 받아 데이터를 처리하는 작업을 수행하고 결과 데이터를 생산한다. 수 분에서 수 일이 걸리기 때문에 대개 사용자가 작업이 끝날 때까지 대기하지 않는다. 일괄 처리 작업의 주요 성능 지표로는 처리량이 대표적이다. 처리량은 입력 데이터 중 특정 크기만큼 처리할 때 걸리는 시간으로 나타낸다. 스트림 처리 시스템(준실시간 시스템) 일괄 처리 시스템과 마찬가지로 요청에 대해 응답하지 않으며 입력 데이터..
-
[데이터 중심 애플리케이션 설계] 일관성과 합의Software Development/Database 2021. 12. 5. 04:29
내결함성을 지닌 분산 시스템을 구축하는 데 스이는 알고리즘과 프로토콜의 몇 가지 에를 얘기한다. 네트워크에서 패킷이 손실되고, 순서가 바뀌고, 중복되거나 임의의 시간 동안 지연이 발생할 수 있다. 시간은 최선을 다하더라도 근사치밖에 쓸 수 없다. 노드는 멈출 수 있고 언제라도 죽을 수 있다. 내결함성을 지닌 시스템을 구축하는 가장 좋은 방법은 유용한 보장을 해주는 범용 추상화를 찾아 이를 구현하고 애플리케이션에서 이 보장에 의존하게 하는 것이다. 트랜잭션을 사용함으로써 애플리케이션은 충돌이 없고 다른 누구도 데이터베이스에 동 시 접근하지 않으며 저장 서비스는 완전히 믿을 수 있는 것처럼 행동할 수 있다. 충돌, 경쟁 조건, 디스크 장애가 발생하더라도 트랜잭션 추상화가 이런 문제들을 숨겨서 애플리케이션이 ..
-
[데이터 중심 애플리케이션] 분산 시스템의 골칫거리Software Development/Database 2021. 11. 20. 23:43
분산 시스템을 다루는 것은 한 컴퓨터에서 실행되는 소프트웨어를 작성하는 일과는 근본적으로 다르다. 핵심적인 차이는 뭔가 잘못될 수 있는 방법이 많다는 것이다. 결함과 부분 장애 단일 머신의 프로그램은 돌아가거나 안 돌아가거나 둘 중 하나다. 분산 시스템에서는 예측할 수 없는 방식으로 고장난다. 이를 부분 장애라 한다. 클라우드 컴퓨팅과 슈퍼컴퓨팅 고성능 컴퓨팅: 일기예보, 분자 동력학과 같은 계산 비용이 매우 높은 과학 계산 작업. 단일 노드 컴퓨터에 가깝다. 공유 메모리와 원격 직접 메모리 접근(RDMA)을 사용해 통신. 클라우트 컴퓨팅: 온라인, 상용장비, 낮은 비용으로 동일한 성능을 제공하나 실패율이 높음. 고장난 상태를 가정. 신뢰성 없는 네트워크 분산 시스템은 비공유 시스템, 즉 네트워크로 연결..
-
MongoDB 읽기 성능에 관하여.Software Development/Database 2021. 11. 8. 21:40
몽고디비에 많은 데이터가 들어가 있는 경우에 전체 데이터를 애플리케이션의 메모리에 올리는데 꽤나 많은 시간이 걸린다. 꽤나 많다는 것은 상대적이지만 어쨋든 여러가지를 시도하면서 느낀 점을 적어보려고 한다. 파이썬의 pymongo 라이브러리를 이용해서. 전체 콜렉션에서 모든 도큐먼트를 가져올 수 있다. 대략 300초의 시간이 걸린다고 할 때, 시간을 더 줄이기 위해서 multi-threading을 쓸 수 있다. 그러나 파이썬의 GIL 때문에 multi-threading으로는 모든 도큐먼트를 읽는데 더 빨라지진 않았다. 왜냐하면 DB에서 읽은 데이터를 파이썬 오브젝트로 저장해야 하는데 GIL 때문에 single-thread로 결국 데이터를 저장한다고 보면 된다. multi-threading이 CPU Boun..
-
[데이터 중심 애플리케이션] 트랜잭션Software Development/Database 2021. 11. 7. 19:39
트랜잭션은 데이터베이스에 접속하는 애플리케이션에서 프로그래밍 모델을 단순화하려는 목적으로 만든 것이다. 애매모호한 트랜잭션의 개념 트랜잭션은 이점과 한계가 있다. ACID의 의미 ACID를 준수한다? 모호할 수 있다. 그저 마케팅 용어로 사용된다. ACID를 따르지 않는 시스템을 BASE라고 한다. 가용성, 유연한 상태, 최종적 일관성을 가진다. 원자성 오류가 생겼을 때 트랜잭션을 어보트하고 해당 트랜잭션에서 기록한 모든 내용을 취소하는 능력. 일관성 항상 진실이어야 하는, 데이터에 관한 어떤 선언이 있다는 것. 일관성은 애플리케이션의 불변식 개념에 의존, 일관성은 애플리케이션이 정의하는 것이지 데이터베이스가 보장하는 것이 아니다. 일관성은 애플리케이션의 속성이다. 격리성 동시에 실행되는 트랜잭션은 서로..
-
[데이터 중심 애플리케이션] 파티셔닝(분산 데이터)Software Development/Database 2021. 10. 31. 16:12
파티션이라는 용어는 몽고DB, 엘라스틱서치, 솔라의 샤드(Shard), HBase에서는 리전(Region), 빅테이블에서는 태블릿(tablet), 카산드라와 리악에서는 브이노드(vnode), 카우치베이스에서는 브이버켓(vbucket)이라고 부른다. 데이터 파티셔닝을 원하는 주된 이유는 확장성이다. 대용량 데이터셋이 여러 디스크에 분산될 수 있고 질의 부하는 여러 프로세서에 분산될 수 있다. 파티셔닝과 복제 보통 복제와 파티셔닝을 함께 적용하여 각 파티션의 복사본을 여러 노드에 저장한다. 각 레코드는 정확히 한 파티션에 속하더라도 이를 여러 다른 노드에 저장해서 내결함성을 보장할 수 있다. 한 노드에 여러 파티션을 저장할 수도 있다. 키-값 데이터 파티셔닝 대량의 데이터를 파티셔닝할 경우, 어떤 레코드를 ..