전체 글 1341

Ch09. 엘라스틱서치와 루씬 이야기- 샤드 최적화

운영 중에 샤드의 개수를 수정하지 못하는 이유클러스터에서 운영 중인 인덱스의 샤드 개수는 원칙적으로 수정이 불가능하다. 인덱스를 생성할 때 한번 설정된 샤드의 개수는 절대 변경이 불가능하기 때문에 데이터의 크기가 최대 얼마까지 증가할 것인지를 사전에 잘 계산하여 최초 인덱스를 생성할 때 샤드의 개수를 신중하게 결정해야 한다. 샤드의 종류프라이머리 샤드실제 서비스가 일어나는 샤드로 클러스터에서 실질적인 CRUD를 제공하는 샤드이다.레플리카 샤드장애 복구를 위한 샤드로, 프라이머리 샤드와 동일한 데이터를 가지고 있으며 평상시에는 읽기 분산에 사용된다.엘라스틱서치는 최초 인덱스를 생성할 때 settings 속성을 통해 프라이머리 샤드 개수(number_of_shards)와 레플리카 샤드 개수(number_of..

Elastic Search 2025.10.09

Ch03. 데이터 관리 - 제약 조건 활용

테이블을 만들 때 설정한 제약 조건(Constraints)은 실수로 혹은 의도적으로 잘못된 데이터가 들어오는 것을 막는 강력한 수문장 역할을 한다. 데이터베이스에 데이터를 저장하거나 변경할 때 이 규칙을 어기면 어떻게 될까? 데이터베이스는 단호하게 입력을 거부하며 오류를 발생시킨다NOT NULL 제약 조건 위반insert into customers(email, password, address)values('noname@example', 'password123', '서울시 마포구');실행 결과: Error Code: 1364. Field 'name' doesn't have a default value데이터베이스는 "name 필드에 기본값이 없다"라는 오류를 반환하며, insert를 거부한다. name 열은..

Ch03. 데이터 관리 - DML(등록, 수정, 삭제)

Insert 문법INSERT INTO table_name (column1, column2, column3, ...)VALUES (value1, value2, value3, ...);table_name : 데이터를 추가할 테이블의 이름이다.(column1, column2, ...): 값을 지정할 열의 목록이다. 이 목록을 생략하면 테이블의 모든 열에 순서대로 값을 넣어야 한다.VALUES (value1, value2, ...): 지정된 각 열에 삽입될 값이다. 열 목록과 값 목록은 순서와 개수가 정확히 일치해야 한다.모든 열(컬럼) 추가하기insert into customers values(null, '강감찬', 'kang@example.com', 'hashed_password_123', '서울시 관악구'..

Ch03. 데이터 관리 - DDL(테이블 변경, 제거)

Alert Table이미 만든 테이블의 구조 변경테이블 컬럼 추가alter table customersadd column point int not null default 0;customer 테이블을 확인해 보면 point 열이 추가된 것을 볼 수 있다.테이블 컬럼 수정alter table customersmodify column address varchar(500) not null;customer 테이블을 확인해 보면, address 컬럼의 길이가 500으로 변경된 것을 확인할 수 있다.테이블 컬럼 삭제alter table customersdrop column point;customer 테이블을 확인해보면, point 컬럼이 제거된 것을 확인할 수 있다.실무 경고ALTER TABLE은 유용한 기능이지만,..

Ch03. 데이터 관리 - DDL(테이블 생성)

쇼핑몰 테이블 실전 설계고객고객 id, 이름, 이메일, 비밀번호, 주소, 가입 시각이 관리되어야 한다.상품상품 id, 이름, 설명, 가격, 재고 수량이 관리되어야 한다.주문주문 id, 주문 고객, 주문 상품, 주문 수량, 주문 시각, 주문 상태가 관리되어야 한다.주문이 등록되면 최초의 주문 상태는 주문접수 상태가 된다.예제를 단순화 하기 위해 한 번의 주문 시에 한 종류의 상품만 주문할 수 있다. 한 종류의 상품을 여러 개 주문하는 것은 가능하다.고객 테이블create table customers( customer_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, ..

Ch09. 엘라스틱서치와 루씬 이야기- 고가용성을 위한 Translog의 비밀

엘라스틱서치는 분산 시스템이 지원해야 하는 고가용성을 제공하기 위해 내부적으로 Translog라는 특수한 형태의 파일을 유지하고 관리하고 있다. 장애 복구를 위한 백업 데이터 및 데이터 유실 방지를 위한 저장소로써 Translog를 적극 활용한다.Translog의 동작 순서엘라스틱서치 샤드는 내부에 Translog라는 특수 파일을 가지고 있으며, 샤드에 변경사항이 생길 경우 Translog 파일에 해당 내용을 기록한 후, 내부에 존재하는 루씬 인덱스로 데이터를 전달한다.엘라스틱서치는 기본적으로 1초마다 Refresh 작업이 수행되는데, 이때 Translog 파일에 기록된 내용은 삭제되지 않고 유지된다.Translog는 엘라스틱서치 샤드에서 일어나는 모든 변경사항을 담고 있는 특수한 형태의 로그이다.Tra..

Elastic Search 2025.10.08

Ch09. 엘라스틱서치와 루씬 이야기- 엘라스틱서치가 근실시간 검색을 제공하는 이유

엘라스틱서치는 다양한 데이터의 색인이 가능하고, 근실시간 검색을 제공을 목표로 개발되었다. 다수의 서버가 논리적으로 연결되어 수평 확장이 가능하도록 설계된 고가용성 플랫폼이다. 엘라스틱서치는 색인과 검색이 매우 빠르게 일어나는데, 색인 결과가 물리적인 디스크에 생성되는데 사용자에게 실시간에 가까운 검색이 제공될 수 있는 이유는 무엇인지 알아보자.!색인 작업 시 세그먼트의 기본 동작 방식하나의 루씬 인덱스는 내부적으로 다수의 세그먼트로 구성되어 있으며, 읽기 성능이 중요한 검색엔진에서는 다수의 세그먼트로 나누어져 있는 것이 더 효율적이다.루씬은 검색 요청을 받으면 다수의 작은 세그먼트 조각들이 각각 검색 결과 조각을 만들고, 이를 통합해 하나의 결과로 합쳐서 응답하도록 설계되어 있다.(세그먼트 단위 검색)..

Elastic Search 2025.10.07

모놀리식 지옥에 빠지다

FTGO 애플리케이션 아키텍처코어가 비즈니스 로직으로 구성된 육각형 아키텍처이다비즈니스 로직은 각자가 도메인 객체 컬렉션인 모듈로 구성되며, 외부 시스템과 연계하는 어댑터가 여러 개 달려 있다.RestApi/ WebUI 처럼 비즈니스 요청을 호출하여 처리하는 인바운드 어댑터가 있고, 그 밖에 비즈니스 로직에서 DB/서드 파트 서비스를 호출하게 해주는 아웃바운드 어댑터가 있다.논리적으로 모듈화한 아키텍처이지만 애플리케이션은 War 파일 하나로 패키징한다.모놀로식 아키텍처 장점개발이 간단하다:애플리케이션을 쉽게 변경할 수 있다.테스트하기 쉽다.배포하기 쉽다.확장하기 쉽다.하지만 시간이 지날수록 개발, 테스트, 배포, 확장하기가 점점 어려워진다.. 왜??모놀리식 지옥의 일상왜 FTGO 애플리케이션이 서비스 규..

Ch03. 시스템 설계 면접 공략

효과적 면접을 위한 4단계 접근법문제 이해 및 설계 범위 확정개략적인 설계안 제시 및 동의 구하기상세 설계마무리문제 이해 및 설계 범위 확정시스템 설계 면접을 볼 때는 생각 없이 바로 답을 내서는 좋은 점수를 받기 힘들다. 요구사항을 완전히 이해하고 답을 내놓자깊이 생각하고 질문하여 요구사항 가정들을 분명하게 하라엔지니어가 가져야 할 가장 중요한 기술은 올바른 질문을 하는 것, 적절한 가정을 하는 것, 시스템 구축에 필요한 정보를 모으는 것이다.예시 질문구체적으로 어떤 기능들을 만들어야 할까요?제품 사용자 수는 얼마나 될까요?회사의 규모는 얼마나 빨리 성장할 것이냐? 규모가 얼마로 예상되느냐?회사가 주로 사용하는 기술 스택은 무엇이며, 설계를 단순화하기 위해 활용할 수 있는 기존 서비스로는 어떤 것들이 ..

Ch09. 엘라스틱서치와 루씬 이야기 - 샤드 VS 루씬 인덱스

엘라서틱서치는 루씬 라이브러리를 샤드 내부에 가지고 있으며, 이 루씬 라이브러리가 핵심 모듈이다. 루씬은 다수의 클래스로 구성돼있는 검색 라이브러리고, 이 중 핵심은 indexwriter와 indexSearcher이다.indexwriter: 데이터를 색인하는 클래스indexSearcher: 색인된 데이터를 검색 결과로 제공하는 클래스indexwriter와 indexSearcher를 가지고 색인과 검색을 동시에 제공하는 루씬 인스턴스를 루씬 인덱스라고 하며, 하나의 샤드는 하나의 인덱스라고 보면 된다. 즉, 엘라스틱서치 인덱스는 물리적으로 분산된 엘라스틱서치 샤드를 논리적인 관점에서 하나의 거대한 데이터로 바라보는 것이다. 루씬 인덱스 상세루씬 인덱스 내부에는 세그먼트라는 특수한 자료구조가 다수 존재한다...

Elastic Search 2025.10.07