MySQL 서버는 크게 머리 역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구성된다. 기본으로 제공되는 스토리지 엔진에는 InnoDB와 MyISAM 등이 있다. MySQL의 구조 MySQL 엔진 MySQL 엔진은 다음과 같은 구성요소가 중심을 이룬다. MySQL 엔진은 다음과 같은 구성 요소들이 중심을 이룬다. 접속 및 쿼리 요청을 처리하는 커넥션 핸들러 SQL 파서 전처리기 옵티마이저 또한, ANSI SQL 문법을 지원하기 때문에 다른 DBMS와 호환되어 실행될 수 있다. MySQL 엔진은 SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌 역할을 맡고 있다고 보면 된다. 우리의 머리가 하나인 것처럼 MySQL 서버에서도 MySQL 엔진은 하나만 존재한다. 스토리지 엔진 ..
채팅 앱은 우리가 가장 많이 사용하고 있는 서비스 중 하나다. 채팅 앱에는 1:1 채팅이나 그룹 채팅같이 업무 혹은 개인 메시지에 특화된 채팅 시스템이나 게임 등에 특화된 음성 채팅 등이 존재하는데, 이번장에서는 카카오톡이나 페이스북 메신저와 같은 1:1 채팅과 그룹 채팅에 특화된 채팅 앱을 개략적으로 알아본다. 개략적인 요구사항 응답 지연이 낮은 1:1 채팅 기능 제공 최대 100명까지 참여할 수 있는 그룹 채팅 기능 제공 사용자 접속 상태 표시 하나의 계정으로 여러 단말에서 동시 접속 지원 푸시 알림 채팅의 기본 기능과 프로토콜 채팅 서비스가 갖춰야 할 기본 기능은 아래와 같다. 클라이언트들로부터 메시지 수신 메시지 수신자 결정 및 전달 수신자가 접속 상태가 아닌 경우 접속할 때까지 보관 채팅 서비스..
페이스북이나 인스타그램, 트위터 같은 SNS들은 사용자 상태 정보나 스토리 업데이트 등 다양한 콘텐츠 정보들을 뉴스 피드 시스템을 통해 쉽고 빠르게 전달한다. 우리는 개발자이므로 수 백 ~ 수 천만의 사용자들의 피드들을 어떻게 안정적으로 발행하고 생성할 것인지에 대해 고민해봐야 한다. 만약 우리가 이런 시스템을 설계한다고 생각했을 때 어떤 부분을 고려해야 할까? 우선, 뉴스 피드 시스템의 핵심 기능은 피드 발행과 뉴스 피드 생성으로 나눌 수 있다. 피드 발행 사용자가 스토리를 포스팅하면 해당 데이터를 캐시와 데이터베이스에 기록한다. 이렇게 포스팅된 정보는 친구 목록의 뉴스 피드에 전송돼야 한다. 다음은 개략적인 피드 발행 시스템 설계안이다. 웹 서버 인증이나 처리율 제한 등의 기능을 수행한다. 포스팅 저..
알림 시스템은 고객들에게 중요한 정보를 비동기적으로 제공하기에 애플리케이션에서 많이 사용하는 기능 중 하나이다. 모바일 푸시 알림이나 SMS, 이메일 등의 알림 시스템은 이미 우리 일상 속에 아주 익숙하고 중요한 부분으로 자리 잡았다. 애플리케이션의 규모가 클수록, 또 사용자가 많을수록 알림 시스템에 걸리는 부하가 커지기 때문에 확장성과 안정성이 중요해진다. 어떻게 확장성과 안정성을 모두 갖춘 알림 시스템을 구축할 수 있을까? 알림 유형별 지원 방안 알림 유형에는 모바일 푸시 알람, SMS, 이메일 등이 있다. 우선 각 알림 유형에서 알림 메커니즘이 어떻게 동작하는지 대략적으로 알아보자. iOS 푸시 알림 알림 제공자 - 알림 요청을 만들어 애플 푸시 알림 서비스(APNS)로 보내는 주체 APNS(App..
자바가 제공하는 다중 구현 매커니즘에는 추상 클래스와 인터페이스가 있다. 아주 친숙한 개념이지만 막상 다중 구현을 할 때 어떤 매커니즘을 사용해야 할지 의문이 생길 때가 많다. Java8부터는 인터페이스가 디폴트 메서드를 제공하게 되면서 추상 클래스와 인터페이스 간의 차이가 더 줄어들었다. 이 말은, 추상 클래스가 할 수 있는 일은 인터페이스도 할 수 있게 되었다는 뜻이다. 그렇다면 대체 언제 추상 클래스를 사용하고 언제 인터페이스를 사용해야 하는 것일까? 추상 클래스 추상 클래스의 핵심 목적 추상 클래스는 자신을 상속받아 구현하는 모든 클래스가 자신의 하위 타입이 되는 것에 목적을 가지고 있다. 즉, 하위 클래스가 자신의 기능을 상속받아 그 기능을 확장을 하는 것에 목적을 가지고 있다. 따라서 추상 클..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 우리가 일반적으로 데이터베이스 ID 생성에 사용하는 auto_increment 속성은 분산 환경에서 사용하기 힘들다. 여러 데이터베이스 서버를 사용하는 경우 ID의 일관성을 유지하기 어렵고 지연 시간을 낮추기 힘들기 때문이다. 유일 ID 생성기 설계는 분산 시스템에서 달성하고자 하는 요구사항마다 달라질 수 있다. 따라서 학습을 위해 다음과 같은 요구사항이 있다고 가정하고 설계를 진행해보자. 유일 ID 생성 요구사항 예시 ID는 유일해야 한다. ID는 숫자로만 구성되어야 한다. ID는 64비트로 표현될 수 있는 값이어야 한다. ID는 발급 날짜에 따라 정렬이 가능해야 한다. 초당 10,000개의 ID를 만들 수 있어야 한다. 유일성이 보..
수평적 규모 확장을 위해서는 요청 또는 데이터를 서버에 균등하게 나누는 것이 중요하다. 안정 해시는 이 목표를 달성하기 위해 보편적으로 사용되는 기술이다. 일반적인 해시 함수의 문제점 N개의 캐시 서버가 있다고 해보자. 이 서버들에 부하를 균등하게 나누는 보편적인 방법은 hash_key % 서버 개수와 같은 해시 함수를 사용하는 것이다. 하지만 이러한 해시 함수는 서버가 추가되거나 삭제되는 경우에 문제가 생긴다. 서버가 추가되거나 삭제되는 경우 해시 키의 재배치가 일어나는데, 이때 데이터의 불균형이 발생할 수 있기 때문이다. 다음 예시는 4대의 서버 구성에서 서버 1대가 장애를 일으킨 경우의 해시 키 재배치의 문제점을 나타낸다. 해시 키가 서버 0에는 4개, 서버 3에는 1개 재배치되었다. 만약 서비스 ..
처리율 제한 장치는 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하는 장치이다. HTTP를 예로 들면 특정 기간 내에 전송되는 클라이언트의 요청 횟수를 제한하는 식이다. API 요청 횟수가 임계치를 넘어서면 이후 모든 호출은 중단된다. 구체적인 사례를 보면 다음과 같다. 사용자는 초당 2회 이상 새 글을 올릴 수 없다. 같은 IP로 하루에 10개 이상의 계정을 생성할 수 없다. 같은 디바이로 주 5회 이상 리워드를 요청할 수 없다. 거의 대부분의 대형 IT 서비스 기업들은 처리율 제한 장치를 가지고 있다. 그렇다면 처리율 제한 장치를 둠으로써 얻는 이점은 어떤 것들이 있을까? 크게 3가지의 이점을 말할 수 있다. DoS 공격에 의한 서버 자원 고갈을 방지할 수 있다. 비용을 절감할 수 있다. 서..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 시스템 용량이나 성능 요구사항을 개략적으로 추정하는 능력은 중요하다. 어떤 설계가 요구사항에 부합할 것인지 추정할 수 있기 때문이다. 개략적 규모 추정을 효과적으로 하기 위해서는 2의 제곱수나 응답 지연 값, 가용성에 관계된 수치들을 기본적으로 잘 이해하고 있어야 한다. 2의 제곱수 제대로 된 계산 결과를 얻으려면 데이터 볼륨의 단위를 2의 제곱수로 표현하면 어떻게 되는지를 이해하고 있어야 한다. 최소 단위는 1 Byte이고, 이는 8 Bit로 구성된다. ASCII 문자 하나가 차지하는 메모리 크기가 1 Byte라고 보면 된다. 1 Byte가 1000개 모이면 1KB가 된다. (1000 Byte = 1 KB) 우리가 흔히 알고 있는 데..