본문 바로가기

분류 전체보기

(87)
[8] 분산 시스템의 골칫거리 3가지 분산시스템은 잘못될 수 있는 새롭고 흥미진진한 방법이 많다. 하지만 우리는 모든 게 잘못되더라도 사용자의 기대를 보장하는 시스템을 구축해야 한다. 대규모 컴퓨팅 시스템 구축 방법에 따른 장애 대응 차이 1. 고성능 컴퓨팅 슈퍼컴퓨터 같이 수천 개 CPU 가진 컴퓨터 작업 상태를 체크 포인트로 저장한다. 부분 장애(어떤 부분은 동작하나 다른 부분은 예측 할 수 없게 나는 장애) 나면 전체 장애로 확대해서 전체가 죽게 한다. 나중에 체크포인트 기준으로 복구한다. 2. 클라우드 컴퓨팅 상용 컴퓨터 애플리케이션은 24시간 낮은 지연시간으로 운영돼야하기 때문에 고성능 처럼 전체가 죽게 하면 안된다! 신뢰성 없는 네트워크 우리가 주로 다루는 분산시스템은 네트워크로 통신하는 비공유 시스템이다. 보통 비동기 패킷 네트..
[7] 트랜잭션 데이터 시스템에서는 발생 가능한 문제가 있고, 이 결함들을 해결하기 위해 트랜잭션이 메커니즘으로 채택돼왔다. ※ 트랜잭션: 앺에서 몇개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법. 전체가 성공(커밋)하거나 실패(abort, 롤백) ※ 발생 가능한 문제 DB hw, sw 은 언제라도 실패할 수 있다. 앺은 연산 도중 언제라도 죽을 수 있다. 네트워크 끊기면 노드 사이 통신 안 될 수 있다. 여러 클라가 동시에 쓰기를 해서 내용을 덮어쓸 수 있다. 부분적으로만 갱신돼서 클라가 비정상 데이터를 읽을 수 있다. 클라 사이의 경쟁 조건이 버그 유발할 수 있다. 이번 장에서는 특히 동시성 관련해서 생길 수 있는 여러 문제들과 이를 방지하기 위한 DB에서 사용하는 알고리즘을 알려주겠다. ACID의 의미 트랜잭션..
[6] 파티셔닝 하는 방법, 리밸런싱 전략, 요청 라우팅 전략 파티셔닝 하는 방법, 리밸런싱 전략, 요청 라우팅 전략을 알려줄게 데이터셋이 매우 크거나 질의 처리량이 높다면 데이터를 파티션으로 쪼갤 필요가 있다. 파티션으로 쪼개는 작업을 샤딩이라고 부른다. ※ 파티션 = 샤드 (몽고DB, ES, 솔라클라우드) = 리전 (HBase) = 태블릿 (빅테이블) = 브이노드 (카산드라, 브이악) = 브이버켓(카우치베이스) 파티션의 단위: 데이터 단위 (레코드, 문서, 로우) 파티션 장점: 확장성 -> 각 파티션에서 독립적인 질의 처리가 가능하므로 질의 처리량을 늘릴 수 있다. 어떤 파티션에 어떤 데이터를 넣을 것인가? (파티셔닝 하는 방법) 파티션의 목적은 데이터와 질의 부하를 노드에 고르게 분산시키는 것이다. 데이터를 고르게 분산시킬 수 있도록 기준을 잡아야 한다. 키-..
Azure OpenAI 사용법 튜토리얼 MicroSoft 의 Azure OpenAI 를 처음 접하는 입장에서 바로 따라할 수 있는 튜토리얼이 구글링으로 잘 나오지 않아 써보는 글이다. Azure OpenAI 는 OpenAI 의 chatGPT 모델을 API 나 라이브러리 형태로 제공하는 서비스이다. 채팅, 문장예측, 벡터표현 등의 기능을 제공하지만 이 글에선 채팅기능만 사용해볼 것이다. 이 글의 목적은 Azure OpenAI 를 처음 접해보는 분이 API 를 직접 호출할 수 있게 하는 것이다. 1. 권한 신청하기 2. 리소스 생성하기 3. 모델 배포하기 4. API 명세서 5. PlayGround 에서 API 확인하기 1. 권한 신청하기 Azure OpenAI Studio 에 진입하는 게 목적이다. 하지만 azure 첫 사용자라면 위 링크를 클..
[5] 복제를 구성하는 방법과 동기화를 위한 노력 복제는 여러 서버에 데이터의 복사본을 유지한다는 뜻 복제가 필요한 이유? 사용자 근처의 서버에 접근해 지연 시간을 줄일 수 있다 장애가 발생해도 복제본으로 대체할 수 있으므로 가용성을 높인다. 읽기 처리량을 높일 수 있다. 복제가 어려운 이유: 데이터의 변경이 일어나기 때문. 이 변경을 어떻게 복제본에서 처리하는지를 이 장에서 알려준다. (elsboo): 특수 상황에 대해 하나씩 접근하여 처리하는 방법을 제공하는 듯 복제에서 변경을 처리하는 방법 3가지: 단일 리더(single leader) ,다중 리더(multi leader), 리더 없는(leaderless) 리더와 팔로워 리더 기반 복제(= 마스터 슬레이브 복제, 능동 수동 복제) 리더에게만 쓰기 요청을 할 수 있다. 리더가 클라로부터 쓰기 요청을 ..
[4] 데이터를 다른 시스템에 전송하기 위한 부호화 (인코딩) 와 호환성 부호화와 발전 : 데이터 부호화를 위한 다양한 형식을 살펴본다. 데이터 스키마가 바뀌면 상위호환, 하위호환은 어떻게 하는지 알 수 있다. 웹서비스나 메시지 큐에서 부호화 형식이 데이터 저장, 통신에 어떻게 쓰이는지 알 수 있다. 시스템은 호환성이 유지될 수 있어야한다. ※ 호환성: 이전 버전과 새 버전의 데이터가 공존해도 시스템은 정상적으로 돌아가는것 관계형 DB 같이 쓰기 시점에 스키마가 정해지는 쓰기 스키마와 다르게 읽기 스키마(schemaless) 는 스키마를 강요하지 않으므로 한 컬렉션 안에 새로운 버전과 이전 버전의 데이터타입이 섞여들어갈수있다. 근데 애플리케이션 단에서는 새 버전에 대한 대응 코드를 즉시 반영할 수 없다. 왜? 서버 단: 대규모 시스템에서는 트래픽 처리를 위해 여러 개 서버군이..
[3] DB가 데이터를 어떻게 저장하고, 질의하면 데이터를 어떻게 찾을까? 3장에서 알려줄거: DB가 데이터를 어떻게 저장하는지, 질의하면 데이터를 어떻게 찾는지 → 개발자가 내부 구현을 알아야하는 이유는 적합한 DB를 선택하기 위해서! 색인에 대해 기본 데이터에서 파생된 추가적인 메타데이터이다. 색인이 필요한 이유는 질의 성능이 좋아지기 때문이다. 하지만 데이터를 쓸 때마다 색인에도 갱신해야 하기 때문에 쓰기 속도는 색인을 사용하지 않는 경우보다 느리다. 그래서 모든 데이터를 색인하지 않고 필요한 데이터만 수동으로 색인을 선택한다. 해시 색인 : 메모리에 키-값 형태로 저장 디스크에 색인 데이터가 계속 증가된다면 이걸 읽는 메모리는 결국 모자라게 되겠지 이 때 해결책은 컴팩션(compaction)! 디스크 공간 부족 해결 - 컴팩션 컴팩션 이란? 로그에 중복된 키는 버리고 제..
[2] 어떤 데이터 모델을 어떤 경우에 쓰면 좋을까? ✹ 데이터 모델이 중요한 이유: 해결하려는 문제를 어떻게 생각해야 하는지에 대해서도 영향을 미치기 때문 대부분의 애플리케이션은 데이터 모델간의 계층을 둬서 만든다. 하위 계층은 추상화 되어 있어 복잡성을 숨기고 효율적으로 일할 수 있게 한다. API 를 개발해서 인풋 아웃풋만 제공하고 내부 구조는 숨긴다거나 데이터 구조를 저장할 때는 범용 모델인 json, xml, 테이블, 그래프로 한다거나 json,xml,테이블,그래프 데이터를 디스크/메모리/네트워크 상태의 바이트 단위로 표현하는 방법을 결정해서 질의,처리 등을 할 수 있게 한다거나 이번 2장에서 할 것: 범용 데이터 모델 (관계형, 문서, 그래프기반) 비교 & 질의 언어 관계형 모델 vs. 문서 모델 관계형 데이터베이스(Relational Dateb..
[1] 데이터를 중심으로 하는 애플리케이션은 어떤 걸 생각해봐야할까? 데이터 중심 애플리케이션은 어떤 기능을 공통으로 필요할까? 데이터베이스 : 나중에 다시 데이터를 찾을 수 있도록 저장 캐시: 읽기 속도 향상을 위해 값이 비싼 수행 결과를 기억 검색 색인: 사용자가 데이터를 검색할 수 있는 기능 제공 스트림 처리: 비동기 처리를 위해 다른 프로세스로 메시지 보내기 일괄 처리: 주기적으로 대량의 데이터 분석 신뢰성, 확장성, 유지보수성 대부분의 소프트웨어 시스템은 신뢰성, 확장성, 유지보수성에 관심이 많다. 엔지니어링 관점에서 이 3가지를 어떻게 생각해야하는지 알려주겠다. (다음 장에서는 이를 잘 지키기위한 방법에 대해 말할 것이다.) 신뢰성 : 무언가 잘못되더라도 지속적으로 올바르게 동작해야한다. 올바르게 동작해야한다는 것은? 사용자가 기대한 기능을 수행해야 한다. 사용..
ListenableFuture 의 Callback Hell 해결하기 ※ 이 글은 정보 전달의 목적보다는 토비님의 강의를 참고하여 ListenableFuture 을 메소드 체이닝으로 리팩토링하는 과정 기록입니다. Future vs. ListenableFuture Future 멀티스레드 작업 시 사용하는 ExecutorService 에서 작업 결과를 받거나 기다리기 위해 Future 클래스의 future.get() 메소드를 사용했을 것이다. 하지만 get() 은 작업이 끝날 때 까지 blocking 되어 다음 라인으로 내려가지 못한다는 한계가 있다. ListenableFuture 하지만 ListenableFuture 은 가능하다! 비동기 프로그래밍 패턴으로 구현되어 있기 때문에 작업스레드! 너 끝나면 이 콜백메소드 실행해! 하고 던져주고 바로 다음으로 넘어가기 때문이다. 💡..