목록책 정리/데이터 중심 애플리케이션 설계 (10)
개발일기장
실제로는 많은 데이터가 시간이 지나면서 점진적으로 도착하기 때문에 한정되지 않는다. 사용자는 데이터를 어제는 물론 오늘도 생산한다. 그리고 내일도 데이터 생산을 계속할 것이다. 사업을 중단하지 않는 한 그 과정은 절대 끝나지 않는다. 절대 “완료”되지 않는다. 인위적으로 일정 기간씩 데이터 청크를 나눠야 한다. 이런 지체를 줄이려면 좀 더 자주 처리를 실행해야 한다. 고정된 시간 조각이라는 개념을 완전히 버리고 단순히 이벤트가 발생할 때마다 처리해야 하는 방법이 스트림 처리의 기본이다. 이벤트 스트림 전송 입력이 파일일 때 대개 첫 번째 단계로 파일을 분석해 레코드의 연속으로 바꾸는 처리를 한다. 스트림 처리 문맥에서 레코드는 보통 이벤트라고 하지만 특정 시점에 일어난 사건에 대한 세부 사항을 포함하는,..
큰 애플리케이션에서는 데이터를 접근하고 처리하는 데 다양한 방법이 필요하다 하지만 동시에 다른 모든 요구사항을 만족하는 하나의 데이터베이스는 없다. 대게 여러 다른 데이터스토어, 색인, 캐시, 분석 시스템 등 몇 가지를 조합해서 사용하고 한 저장소에서 다른 저장소로 데이터를 이동하는 메커니즘을 구현한다. 복잡한 시스템에서 수행해야 하는 가장 중요한 일이 서로 다른 시스템을 통합하는 작업이다. 레코드 시스템 믿을 수 없는 데이터 버전을 저장한다. 레코드 시스템은 진실의 근원이라고도 하는데 예를 들어 사용자의 입력과 같은 새로운 데이터가 들어오면 먼저 레코드 시스템에 저장된다. 각 사실은 일반적으로 정규화를 거쳐 정확하게 한번 표현된다. 레코드 시스템과 다른 시스템 간에 차이가 난다면 정의에 따라 레코드 시..
분산 시스템을 다루는 것은 한 컴퓨터에서 실행되는 SW를 작성하는 일과는 근본적으로 다르다. 핵심적인 차이는 뭔가 잘못될 수 있고 새롭고 흥미진진한 방법이 많다는 점. 엔지니어는 모든 게 잘못되더라도 제 역할을 해내는 시스템을 구축하는 것이다. 결함과 부분 장애 대부분 잘못 작성한 소프트웨어의 결과일 뿐이다. 하드웨어가 올바르게 동작하면 같은 연산은 항상 같은 결과를 낸다.(결정적) 네트워크로 연결된 여러 컴퓨터에서 실행되는 소프트웨어를 작성할 때는 근본적으로 상황이 다르다. 분산 시스템에서는 더 이상 이상화된 시스템 모델에서 동작하지 않는다. 분산 시스템에서는 시스템의 어떤 부분은 잘 동작하지만 다른 부분은 예측할 수 없는 방식으로 고장나는 것도 무리가 아니다. 이를 부분 장애(partial failu..
데이터 시스템은 여러 가지 문제가 생길 수 있다. 1. SW, HW는 언제라도 실패할 수 있다. 2. application은 언제라도 죽을 수 있다. 3. 네트워크가 끊기면 애플리케이션과 데이터베이스의 연결이 갑자기 끊기거나 데이터베이스 노드 사이의 통신이 안 될 수 있다. 등등. 시스템이 신뢰성을 지니려면 이런 결함을 처리해서 전체 시스템의 치명적인 장애로 이어지는 것을 막아야 한다. 내결함성을 갖춘 시스템을 구현하려면 할 일이 많다. 잘못될 수 있는 모든 것에 대해 신중하게 생각해야 하며 테스트를 여러 번 해서 해결책이 실제로 동작하는지 확인해야 한다. 트랜잭션은 이런 문제를 단순화하는 메커니즘, 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법이다. 전체가 성공(commit)하거나 실패(abo..
동일한 데이터의 복사본 여러 개를 다른 노드에 저장하는 복제할 때 데이터셋이 매우 크거나 질의 처리량이 매우 높다면 복제만으로는 부족하고 데이터를 파티션으로 쪼갤 필요가 있다. 이를 샤딩이라 한다. 각 데이터 단위(레코드, 로우, 문서)가 하나의 파티션에 속하게 한다. 결과적으로 각 파티션은 그 자체로 작은 데이터베이스가 된다. 데이터 파티션을 원하는 주된 이유는 확장성. 비공유 클러스터에서 다른 파티션은 다른 노드에 저장될 수 있다. 따라서 대용량 데이터셋이 여러 디스크에 분산, 질의 부하는 여러 프로세서에 분산될 수 있다. 파티셔닝과 복제 보통 복제와 파티셔닝을 함께 적용해 각 파티션의 복사본을 여러 노드에 저장한다. 내결함성을 보장할 수 있다는 의미이다. 한 노드에 여러 파티션을 저장할 수 있고, ..
Part2 분산 데이터 여러 장비간 분산된 데이터베이스를 필요로 하는 이유는 여러가지이다. 확장성 : 단일 장비에서 다룰 수 있는 야보다 커지면 부하를 여러 장비로 분배할 수 있다. 내결함성/고가용성 : 장비 하나가 죽더라도 애플리케이션이 계속 동작해야 한다면 여러 장비를 사용해 중복성을 제공할 수 있다. 장비 하나가 실패하면 다른 하나가 이어받는다. 지연시간 : 전 세계에 사용자가 있다면 사용자와 지리적으로 가까운 곳의 데이터센터에서 서비스를 제공한다. 고부하로 확장 더 강력한 장비를 구매하는 것이 가장 간단한 방법(수직확장, 용량확장). 많은 CPU, 많은 메모리 칩, 많은 디스크를 하나의 운영체제로 함께 결합할 수 있다. 빠른 상호 연결로 모든 CPU가 메모리나 디스크의 모든 부분에 접근. 공유 메..
애플리케이션 기능을 변경하려면 저장하는 데이터도 변경해야 한다. 새로운 필드나 레코드 유형을 저장해야 하거나 기존 데이터를 새로운 방법으로 제공해야 할지 모른다. 시스템이 계속 원활하게 실행되게 하려면 양방향으로 호환성을 유지해야 한다. 하위 호환성 : 새로운 코드는 예전 코드가 기록한 데이터를 읽을 수 있어야 한다. 상위 호환성 : 예전 코드는 새로운 코드가 기록한 데이터를 읽을 수 있어야 한다. 하위 호환성은 쉬우나 상위 호환성은 어렵다. 데이터 부호화 형식 메모리에 객체, 구조체, 목록, 배역, 테이블, 트리 등으로 데이터를 유지하고 최적화하는데 파일에 쓰거나 네트워크를 통해 전송하려면 스스로를 포함한 일련의 바이트열의 형태로 부호화해야 한다. 인메모리 표현에서 바이트열로의 전환을 부호화(직렬화, ..
기본적으로 데이터베이스는 데이터를 저장하고, 데이터를 제공하는 작업을 수행한다. 이 방법을 개발자가 주의해야하는 이유는 직접 저장소 엔진을 구현하기 보다는 사용 가능한 여러 저장소 엔진 중에 적합한 엔진을 선택하기 때문이다. 특정 작업부하 유형에서 좋은 성능을 내게끔 저장소 엔진을 조정하려면 내부에서 수행되는 작업에 대해 이해할 필요가 있다. 색인은 기본 데이터에서 파생된 추가적인 구조. 쓰기 속도를 느리게 만든다. 데이터를 쓸 때마다 매번 색인도 갱신해야 하기 때문. 중요한 트레이드 오프이다. 읽기는 빨라지지만 쓰기는 느려진다. 그래서 보통 자동으로 모모든 것 색인하지 않고, 관리자가 수동으로 색인을 선택하거나 만든다. 해시 색인 키-값 데이터의 경우 사전 타입과 매우 유사하다. 보통 해시 맵으로 구현..