@Hudi
꾸준히, 의미있는 학습을 기록하기 위한 공간입니다.

Elasticsearch는 왜 검색속도가 빠를까? - Inverted Index

November 20, 2022

역 인덱스 (Inverted Index) 흔히들 인덱스는 책 앞부분의 목차로 빗댄다. 그렇다면 역 인덱스는 책 뒷부분의 찾아보기에 빗댈 수 있다. 책에서 목차는 어떤 챕터나 문단 등의 유일한 정보인 제목을 데이터베이스의 PK와 같이 사용한다. 반면, 찾아보기는 특정 키워드가 어떤 페이지들에서 등장했는지를 나타낸다. 일반적인 RDBMS에서 텍스트로 데이터를…


데이터베이스 파티셔닝과 샤딩

November 19, 2022

데이터베이스 분할에 대한 고민 전체 데이터베이스에 모든 데이터를 한 테이블 혹은 데이터베이스에서 관리하기가 어려워진다. 데이터베이스 볼륨이 커지면 커질수록 데이터베이스 읽기/쓰기 성능은 감소할 것이고, 데이터베이스가 병목 지점이 될 것이다. 따라서 이를 적절히 분할할 필요가 있다. 데이터베이스를 분할하는 방법은 크게 샤딩(sharding)과 파티셔닝(pa…


무중단 배포 중 구버전 프로세스를 그냥 종료해도 괜찮을까? (feat. Kill, Graceful Shutdown)

November 17, 2022

학습 배경 우테코 달록 프로젝트에서는 8080 포트와 8081 포트를 번갈아 사용하는 방식의 Blue/Green 무중단 배포 전략을 사용하여, 신 버전 배포시의 다운타임을 최소화하였다. 무중단 배포 프로세스를 간략히 정리하자면 아래와 같다. Github 브랜치에 새로운 버전이 병합된다. Github는 달록 Jenkins에 Webhook 요청을 보낸다. J…


분산 환경에서 Redis pub/sub을 활용한 로컬 캐시 동기화

November 17, 2022

배경 상황 일반적으로 데이터베이스 부하 감소를 위하여 캐시를 고려하게 된다. 캐시에는 애플리케이션 서버 메모리에 저장하는 로컬 캐시 방식과 애플리케이션 서버와 독립적으로 존재하는 글로벌 캐시 방식으로 나뉜다. 로컬 캐시 같은 경우 구현이 쉬우나, scale-out된 분산 환경에서 각 애플리케이션 서버가 서로 다른 캐시 데이터를 갖는 데이터 일관성 문제가 …


MySQL 복제 동기화 방식 - 비동기와 반동기

November 15, 2022

비동기 복제 방식 특징 소스 서버에서 트랜잭션은 바이너리 로그에 저장되고, 레플리카 서버는 주기적으로 바이너리 로그를 요청한다. 비동기 복제 방식에서는 레플리카로 바이너리 로그에 저장된 이벤트가 (1) 잘 전달 되었는지, (2) 실제로 적용이 되었는지 알지 못하며 보장도 하지 않는다. 단점 소스 서버에 장애 발생 시 레플리카 서버로 이벤트가 제대로 전달되…


Redis로 분산 락을 구현해 동시성 이슈를 해결해보자!

November 13, 2022

분산 락이란? 자바 스프링 기반의 웹 애플리케이션은 기본적으로 멀티 쓰레드 환경에서 구동된다. 따라서 여러 쓰레드가 함께 접근할 수 있는 공유자원에 대해 경쟁 상태(race condition)이 발생하지 않도록 별도의 처리가 필요하다. 자바는 라는 키워드를 언어 차원에서 제공해, 모니터 기반으로 상호 배제(mutual exclusion) 기능을 제공한다…


[가상면접 사례로 배우는 대규모 시스템 설계 기초] Chap08. URL 단축기 설계

November 12, 2022

문제 이해 및 설계 범위 확정 이번 챕터에서는 긴 URL을 짧은 URL로 바꿔주는 URL 단축기를 설계한다. 전체적인 요구사항은 아래와 같다. 매일 1억개의 단축 URL을 생성할 수 있어야 한다. 단축 URL은 짧으면 짧을수록 좋다. 생성된 단축 URL은 삭제하거나 갱신할 수 없다. 높은 가용성(HA, High Availability)과 규모 확장성(Sc…


[가상면접 사례로 배우는 대규모 시스템 설계 기초] Chap07. 분산 시스템을 위한 유일 ID 생성기 설계

November 12, 2022

문제 이해 및 설계 범위 확정 이번 챕터에서는 분산 시스템에서 유일한 ID를 생성하는 방법에 대해 공부해본다. 요구사항을 정리하면 아래와 같다. ID는 유일해야한다. ID는 숫자로만 구성되어야 한다. ID는 64비트로 표현될 수 있는 값이어야 한다. ID는 발급 날짜에 따라 정렬 가능해야 한다. 초당 10,000개의 ID를 만들 수 있어야 한다. 설계안1…


MySQL 레플리케이션 토폴로지

November 12, 2022

이번 포스팅에서는 MySQL의 레플리케이션 기능을 활용하여 어떤 토폴로지를 구성할 수 있을지 알아본다. 용도에 따라 다양한 토폴로지가 존재한다. 싱글 레플리카 복제 구성 가장 기본적인 형태이며 가장 많이 쓰이는 형태이다. 싱글 레플리카 복제 구성에서 웹 서버가 레플리카 서버에 읽기 요청을 전달하면, 레플리카 서버에 문제가 발생했을 때 서비스 장애 상황이…


스프링 로컬 캐시를 사용한 외부 캘린더 API 호출 최적화

November 10, 2022

이 글은 우아한테크코스 4기 달록팀의 기술 블로그에 게시된 글 입니다. 구글 캘린더 연동 기능의 성능 저하 저희 달록은 유저의 구글 캘린더를 가져와 달록의 일정과 함께 볼 수 있는 기능을 제공합니다. 그리고 유저가 일정을 요청하면, 달록 서버가 직접 구글 캘린더의 API를 호출하여 달록 일정과 구글 캘린더 일정을 함께 응답하는 구죠이죠. 편리한 기능이지…