본문 바로가기

Studying/Data System Design

(11)
스트림 처리 [데이터 중심 애플리케이션 설계 11장] 이벤트 스트림 전송: 생산자가 이벤트를 만들면 소비자가 처리한다. 토픽이나 스트림으로 관련 이벤트를 묶는다. 메시징 시스템: 생산자와 소비자 사이에 직접 통신 채널을 사용하는 방식을 기본으로 확장된다. 생산자에서 소비자로 메시지를 직접 전달: 설계 상황에서는 잘 작동하지만, 메시지 유실 가능성을 고려해서 애플리케이션 코드를 작성해야 한다. 오프라인 상태에 취약하다 메시지 브로커: 직접 방식의 대안으로 중간에 메시지 브로커를 통해 메시지를 보내는 방식이다. 메시지 브로커는 일종의 데이터베이스다. 브로커에 메시지가 모이기 때문에 클라이언트의 상태에 쉽게 대처가 가능하다. 비동기로 작동한다. 복수 소비자: 여러 소비자가 같은 토픽에서 메시지를 읽는 패턴 로드 밸런싱: 소비자 중 하나로 전달되고 소비자들끼리 메..
일괄 처리 [데이터 중심 애플리케이션 설계 10장] 데이터 처리 방식 서비스(온라인 시스템): 클라이언트가 요청이 올 때까지 기다리는 방식 일괄 처리 시스템(오프라인 시스템): 큰 입력을 받아 처리하는 방식으로 사용자가 대기 하지 않고 주기적으로 실행됨 스트림 처리 시스템(준실시간 시스템): 온라인과 오프라인 사이로 요청에 대해 응답이 아닌 입력 데이터를 소비하여 출력 데이터 생산 유닉스 도구 일괄 처리 일반적인 프로그래밍 언어에선 메모리에 데이터를 올리고 작업을 하지만, 메모리 보다 큰 데이터셋을 자동으로 디스크로 보내고 자동으로 여러 CPU코어에서 병렬로 정렬한다. (메모리 부족 없이 큰 데이터셋을 처리 가능) 각 프로그램이 하나의 일만 하게 한다. 모든 출력이 다른 프로그램의 입력이 되게 한다. 맵리듀스와 분산 파일 시스템 맵리듀스: 맵퍼 + 리듀서..
일관성과 합의 [데이터 중심 애플리케이션 설계 9장] 선형성: 시스템에 데이터 복사본이 하나만 있고 모든 연산은 원자적인 것처럼 보이게 만드는 것 (최신성 보장) 유용한 예 잠금과 리더 선출 제약 조건과 유일성 보장 채널 간 타이밍 의존성 선형성과 가용성은 트레이드 오프가 있다. 선형성을 보장하려 하면 네트워크 문제 등에 약해지게 된다. CAP 정리가 이런 개념을 설명한다. 심지어 RAM조차도 선형적이지 않음 순서화 보장 인과성을 보존하는 데 도움을 준다. 인과성은 이벤트에 순서를 부과한다. 선형성: 전체 순서를 정할 수 있다. 인과성: 인과적인 관계가 있을 경우에만 순서를 비교할 수 있다. 선형성은 인과성을 내포한다. 일련번호나 타임스탬프를 써서 이벤트의 순서 정하는 식으로 구현된다. 노드별로 독립적인 일련번호 집합 생성 (홀짝) 각 연산에 물리적 시계에..
분산 시스템의 골칫거리 [데이터 중심 애플리케이션 설계 8장] 결함과 부분 장애 단일 컴퓨터에서의 소프트웨어는 항상 같은 결과를 내는 결정적이다. 완전하게 동작하거나 전체 장애가 발생한다. 분산 시스템에서는 부분 장애가 발생한다. (비결정적) 신뢰성 없는 구성 요소를 사용해 신뢰성 있는 시스템 구성한다. 오류 수정 코드 (error-correcting code): 데이터를 정확하게 전송하게 해줌 IP(Internet protocol)은 신뢰성이 없으나 TCP에서 신뢰성을 제공한다. 결함 감지 네트워크에선 몇 번 시도해보고 타임아웃이 발생하면 결함으로 감지 동기 네트워크 대 비동기 네트워크 전화는 동기 네트워크로 통화마다 회선을 만들어서 할당한다. 지연 시간 최대치가 보장이 돼서 제한있는 지연이라 한다. TCP는 비동기 네트워크로 패킷 교환 네트워크이다. 데이터 전송..
트랜잭션 [데이터 중심 애플리케이션 설계 7장] 애매모호한 트랜잭션의 개념 ACID A(원자성)은 어보트(abortability)가 더 어울린다. C(일관성)는 데이터베이스에서 달성할 수 있는 게 아니고 애플리케이션 속성이다. C는 약어를 만들기 위해서 사용됐고 중요하게 생각되지 않았다고 한다. I(격리성)은 성능 저하를 초래해서 아예 구현하지 않거나 완화된 것을 사용한다. D(지속성)은 신뢰성을 토대로 완벽한 지속성은 불가하다. 트랜잭션 격리: 동시성 문제를 감추기 위한 것으로 동시성이 없는 것처럼 한다. 대표적으로 직렬성 격리인데 현실적으로 비용이 크다. 커밋 후 읽기: 읽을 때 커밋된 데이터만 읽고, 쓸 때는 커밋된 데이터만 덮어쓴다. (더티 읽기, 더티 쓰기 방지) 더티 읽기: 커밋이나 어보트되지 않은 데이터를 읽는 것 로우 수준 잠금: 해당 ..
파티셔닝 [데이터 중심 애플리케이션 설계 6장] 파티셔닝 확장성 (복제와 비슷) 키-값 데이터 파티셔닝 키 범위 기준 파티셔닝: 특정 알파벳끼리 한 파티션에 넣는 형식 범위 스캔에 유리 특정 기준으로 검색 시, 핫스팟 유발 키의 해시값 기준 파티셔닝: 키를 해시 함수로 변환하여 분산시키는 파티셔닝 파티션끼리 균일하게 분산시키는 데 좋다. 범위 질의를 효과적으로 수행할 수 없다. 카산드라에서는 키의 첫부분만 해싱하고 나머지 컬럼은 SS테이블로 색인을 사용하여 첫번째 컬럼만 고정하면 나머지 컬럼에는 범위 스캔을 효율적으로 하게 한다. 핫스팟 완화: 보통 하나의 키에 데이터가 많은 경우 애플리케이션에서 해결: 키에 임의의 숫자등을 붙여서 분산 시킨다. → 읽기에 오버헤드가 생겨 일부 키에만 적용하는 게 좋다. 파티셔닝과 보조 색인 문서 기반 보조 색인 파티..
복제 [데이터 중심 애플리케이션 설계 5장] 동기식과 비동기식 동기식: 안정성이 높으니 느림 비동기식: 내구성이 약하기 때문에 나빠보이지만 분산을 위해선 어쩔 수 없는 선택 장애 복구 리더가 장애인 지 판단 → 새로운 리더 선출 → 새로운 리더 사용 리더가 변경되면서 그 동안의 쓰기를 수신 하지 못 하는 문제 발생 스플릿 브레인: 리더가 서로 자신이 리더인 줄 아는 상황 복제 로그 구문 기반 복제: 실제 사용된 insert, update, delete 등 그대로 사용 간편하지만 비결정적인 함수 문제나 성능 등에 영향이 있음 쓰기 전 로그(WAL) 저수준의 데이터를 기술함으로 엔진이 밀접하게 엮여 버전 등에 의존성이 높음 논리적 (로우 기반) 로그 엔진과의 분리를 위해 다른 로그 형식 사용 (RDB) 삽입된 로우는 전체, 삭제된 로우는 식별값, 갱신..
부호화와 발전 [데이터 중심 애플리케이션 설계 4장] 데이터 부호화 형식 부호화(직렬화, 마샬링): 인메모리 표현을 바이트열로 변환하는 작업 복호화(역직렬화, 파싱, 언마샬링): 바이트열을 표현으로 변환하는 작업 언어별 형식: 언어에서 제공하는 만큼 편리하지만, 특정 언어에 적합한 형식으로 다른 언어나 상위/하위 호환 등에 문제가 발생한다. JSON, XML: 수를 표현할 때 애매한 문제가 있다, 유니코드는 잘 지원하나 바이너리는 잘 지원하지 않아서 base64를 사용하게 된다. 이진부호화: json의 경우 여러가지 이진 부호화가 있었지만 널리 채택되진 못 했고, 대부분 성능상의 큰 이점은 없음 스리프트(Thrift)와 프로토콜 버퍼(Protocol Buffers) 같은 원리를 기반으로 함. 이름 대신 필드 태그를 사용함 required의 경우 이진 데이터..