본문 바로가기

SearchDeveloper/데이터 중심 애플리케이션 설계

(12)
[12] 데이터 시스템의 미래 (끝) 지금까지 책의 내용은 현재 존재하는 것을 설명했다면 이번 장은 미래에는 어떻게 돼야 하는지 설명한다. 지금까지 설명했던 아이디어들을 함께 모아 그걸 기반으로 미래를 고찰한다. 데이터 통합 파생 데이터 시스템과의 결합 전문 검색 색인 같은 복잡한 검색 기능이 필요하면 전문적인 정보 탐색 도구가 필요하고, 이 시스템에 사본을 유지해야 한다. 데이터 사본을 여러 저장소 시스템에 유지해야할 때 입력과 출력을 분명히 해야한다. 어디서 처음 기록하는제, 원본 출처, 올바른 형식으로 어떻게 넣는지 등 ex. CDC 를 활용하면 색인은 전적으로 DB 에서 파생되므로 일관성이 보장된다. 근데 앺이 색인, DB에 직접 기록하게 하면 둘의 동기화가 깨질 수 있다. → 파생 데이터 시스템은 이벤트 로그를 기반으로 갱신하면 결..
[11] 스트림 처리 일괄 처리의 한계 및 스트림이 필요한 이유 일괄 처리는 사전에 입력을 유한한 크기로 한정한다. 데이터는 끊임없이 많기 때문에 일 단위 나 일정 기간씩 청크를 나눈다. 문제는 하루가 지나야 반영된다는 것이다. 대신 스트림은 고정된 시간 조각의 개념을 버리고 이벤트가 발생할 때마다 처리한다. 스트림 표현/저장/전송 하기 이벤트 스트림 생김새 하나의 레코드를 이벤트라고 한다. 작고 독립된 불변 객체이며 타임스탭프를 포함한다. 텍스트 문자열 or JSON or 이진 형태 등으로 부호화된다. 이벤트 전송 컨슈머 쪽에서 폴링하며 새 이벤트를 직접 가져올 수도 있지만 오버헤드가 커지기 때문에 프로듀서가 알려주는 편이 낫다. 메시징 시스템 이벤트 알림 전달 목적으로 개발된 발행/구독 모델 여러 프로듀서가 같은 토픽으로..
[10] 일괄 처리 시스템을 세 가지 유형으로 나눌 수 있다. 서비스 (온라인) - 클라이언트로부터 요청이 들어오면 실시간으로 응답해야 함. 성능 지표: 응답 시간 일괄 처리 시스템 (오프라인) - 정해진 시간에 매우 큰 입력 데이터를 받아 처리하고 결과 데이터를 생성함. 성능 지표: 처리량 (10장) 스트림 처리 (준실시간) - 입력 이벤트가 발생한 직후 데이터를 받아 처리하고 생성함. (11장) 맵리듀스 2번 일괄 처리 알고리즘 "구글을 대규모로 확장 가능하게 만든 알고리즘" 하둡, 카우치DB, 몽고DB 에서 구현됨 더 자세하게 알아보기 전에, 일괄 처리의 아이디어를 준 유닉스 시스템부터 살펴보자 유닉스 철학 유닉스의 데이터 처리 방식 로그 파일 분석 명령어 공백 분리 7번째 문자열을 정렬 → 중복 제거→ 내림 차순 정..
[9] 일관성과 합의 일관성과 합의: 분산 시스템에서 결함이 나더라도 올바르게 동작하게 할 방법들 내결함성을 지닌 시스템을 구축하는 좋은 방법: 문제를 추상화해라! 트랜잭션 추상화: 트랜잭션이라는 개념으로 인해 원자성, 격리성, 지속성을 보장한다. 합의: 모든 노드가 어떤 것에 동의하게 만들어, 리더가 두 개가 되는 스플릿 브레인 같은 문제를 해결할 수 있다. (후반부에서 합의 알고리즘을 알려줄게) 일관성 보장 최종적 일관성 동시에 DB 노드 두 대를 본다면 두 노드에서 서로 다른 데이터를 볼 가능성이 있다. 근데 시간이 지나면 대부분 최신데이터가 반영이 돼 스스로 같은 값을 반환하게 해소된다. "기다리면 최종적으로 값이 일치하는 일관성을 보장한다" 라는 의미 → 근데 이건 언제까지 기다려야할지 아무도 모르기 때문에 약한 보..
[8] 분산 시스템의 골칫거리 3가지 분산시스템은 잘못될 수 있는 새롭고 흥미진진한 방법이 많다. 하지만 우리는 모든 게 잘못되더라도 사용자의 기대를 보장하는 시스템을 구축해야 한다. 대규모 컴퓨팅 시스템 구축 방법에 따른 장애 대응 차이 1. 고성능 컴퓨팅 슈퍼컴퓨터 같이 수천 개 CPU 가진 컴퓨터 작업 상태를 체크 포인트로 저장한다. 부분 장애(어떤 부분은 동작하나 다른 부분은 예측 할 수 없게 나는 장애) 나면 전체 장애로 확대해서 전체가 죽게 한다. 나중에 체크포인트 기준으로 복구한다. 2. 클라우드 컴퓨팅 상용 컴퓨터 애플리케이션은 24시간 낮은 지연시간으로 운영돼야하기 때문에 고성능 처럼 전체가 죽게 하면 안된다! 신뢰성 없는 네트워크 우리가 주로 다루는 분산시스템은 네트워크로 통신하는 비공유 시스템이다. 보통 비동기 패킷 네트..
[7] 트랜잭션 데이터 시스템에서는 발생 가능한 문제가 있고, 이 결함들을 해결하기 위해 트랜잭션이 메커니즘으로 채택돼왔다. ※ 트랜잭션: 앺에서 몇개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법. 전체가 성공(커밋)하거나 실패(abort, 롤백) ※ 발생 가능한 문제 DB hw, sw 은 언제라도 실패할 수 있다. 앺은 연산 도중 언제라도 죽을 수 있다. 네트워크 끊기면 노드 사이 통신 안 될 수 있다. 여러 클라가 동시에 쓰기를 해서 내용을 덮어쓸 수 있다. 부분적으로만 갱신돼서 클라가 비정상 데이터를 읽을 수 있다. 클라 사이의 경쟁 조건이 버그 유발할 수 있다. 이번 장에서는 특히 동시성 관련해서 생길 수 있는 여러 문제들과 이를 방지하기 위한 DB에서 사용하는 알고리즘을 알려주겠다. ACID의 의미 트랜잭션..
[6] 파티셔닝 하는 방법, 리밸런싱 전략, 요청 라우팅 전략 파티셔닝 하는 방법, 리밸런싱 전략, 요청 라우팅 전략을 알려줄게 데이터셋이 매우 크거나 질의 처리량이 높다면 데이터를 파티션으로 쪼갤 필요가 있다. 파티션으로 쪼개는 작업을 샤딩이라고 부른다. ※ 파티션 = 샤드 (몽고DB, ES, 솔라클라우드) = 리전 (HBase) = 태블릿 (빅테이블) = 브이노드 (카산드라, 브이악) = 브이버켓(카우치베이스) 파티션의 단위: 데이터 단위 (레코드, 문서, 로우) 파티션 장점: 확장성 -> 각 파티션에서 독립적인 질의 처리가 가능하므로 질의 처리량을 늘릴 수 있다. 어떤 파티션에 어떤 데이터를 넣을 것인가? (파티셔닝 하는 방법) 파티션의 목적은 데이터와 질의 부하를 노드에 고르게 분산시키는 것이다. 데이터를 고르게 분산시킬 수 있도록 기준을 잡아야 한다. 키-..
[5] 복제를 구성하는 방법과 동기화를 위한 노력 복제는 여러 서버에 데이터의 복사본을 유지한다는 뜻 복제가 필요한 이유? 사용자 근처의 서버에 접근해 지연 시간을 줄일 수 있다 장애가 발생해도 복제본으로 대체할 수 있으므로 가용성을 높인다. 읽기 처리량을 높일 수 있다. 복제가 어려운 이유: 데이터의 변경이 일어나기 때문. 이 변경을 어떻게 복제본에서 처리하는지를 이 장에서 알려준다. (elsboo): 특수 상황에 대해 하나씩 접근하여 처리하는 방법을 제공하는 듯 복제에서 변경을 처리하는 방법 3가지: 단일 리더(single leader) ,다중 리더(multi leader), 리더 없는(leaderless) 리더와 팔로워 리더 기반 복제(= 마스터 슬레이브 복제, 능동 수동 복제) 리더에게만 쓰기 요청을 할 수 있다. 리더가 클라로부터 쓰기 요청을 ..
[4] 데이터를 다른 시스템에 전송하기 위한 부호화 (인코딩) 와 호환성 부호화와 발전 : 데이터 부호화를 위한 다양한 형식을 살펴본다. 데이터 스키마가 바뀌면 상위호환, 하위호환은 어떻게 하는지 알 수 있다. 웹서비스나 메시지 큐에서 부호화 형식이 데이터 저장, 통신에 어떻게 쓰이는지 알 수 있다. 시스템은 호환성이 유지될 수 있어야한다. ※ 호환성: 이전 버전과 새 버전의 데이터가 공존해도 시스템은 정상적으로 돌아가는것 관계형 DB 같이 쓰기 시점에 스키마가 정해지는 쓰기 스키마와 다르게 읽기 스키마(schemaless) 는 스키마를 강요하지 않으므로 한 컬렉션 안에 새로운 버전과 이전 버전의 데이터타입이 섞여들어갈수있다. 근데 애플리케이션 단에서는 새 버전에 대한 대응 코드를 즉시 반영할 수 없다. 왜? 서버 단: 대규모 시스템에서는 트래픽 처리를 위해 여러 개 서버군이..
[3] DB가 데이터를 어떻게 저장하고, 질의하면 데이터를 어떻게 찾을까? 3장에서 알려줄거: DB가 데이터를 어떻게 저장하는지, 질의하면 데이터를 어떻게 찾는지 → 개발자가 내부 구현을 알아야하는 이유는 적합한 DB를 선택하기 위해서! 색인에 대해 기본 데이터에서 파생된 추가적인 메타데이터이다. 색인이 필요한 이유는 질의 성능이 좋아지기 때문이다. 하지만 데이터를 쓸 때마다 색인에도 갱신해야 하기 때문에 쓰기 속도는 색인을 사용하지 않는 경우보다 느리다. 그래서 모든 데이터를 색인하지 않고 필요한 데이터만 수동으로 색인을 선택한다. 해시 색인 : 메모리에 키-값 형태로 저장 디스크에 색인 데이터가 계속 증가된다면 이걸 읽는 메모리는 결국 모자라게 되겠지 이 때 해결책은 컴팩션(compaction)! 디스크 공간 부족 해결 - 컴팩션 컴팩션 이란? 로그에 중복된 키는 버리고 제..