Database
[Elasticsearch] 정보 검색과 검색 쿼리
[Elasticsearch] 정보 검색과 검색 쿼리
2024.12.11저장된 데이터를 검색할 때는 엘라스틱서치 엔진이 제공하는 QueryDSL을 사용한다. 여기서 QueryDSL은 Domain Specific Language의 약자로 특정 기술에 종속되지 않고 도메인 모델과 쿼리 언어간 자연스러운 통합을 목표로 설계된 언어이다.여러 데이터 소스에서 사용할 수 있는 추상화된 쿼리 방법론이고, JPA Elasticsearch 등 각 기술 스택에 맞춰서 구현된 QueryDSL 구현체가 있다고 생각하면 된다. (인터페이스) Term-Level 쿼리 analyzed 되지 않은 필드에 대해 검색할 때 사용되는 쿼리.keyword, integer, date, boolean 값으로 데이터를 찾을 때 사용하자. term, terms. range, exists, prefix, wi..
[Elasticsearch] 매핑과 데이터 타입
[Elasticsearch] 매핑과 데이터 타입
2024.11.27Document에 텍스트가 저장될 때, 엘라스틱서치의 analyzer가 작동해 텍스트가 인덱싱되기 전에 analyze, tokenize 과정을 거치게 된다. 인덱스를 생성할 때 각 필드에 대한 analyzer를 설정할 수 있다.Document가 저장될 때 마다 설정된 analyzer는 텍스트를 토큰화하고 지정된 token filter와 character filter를 통해 텍스트를 처리한 후 인덱싱이 가능한 형태로 저장한다. character filter - 텍스트의 특정 문자나 패턴을 변경하거나 제거하는 역할을 수행한다. (HTML태그 제거)tokenizer - 텍스트를 토큰 단위로 분할하는 역할을 수행한다. (단어 단위로 구분, 구분자 단위로 구분)token filter - 분할된 토큰에 대해 변..
[Elasticsearch] 아키텍처와 동작 원리
[Elasticsearch] 아키텍처와 동작 원리
2024.11.07Cluster데이터를 다루는 노드들로 구성되며 엘라스틱서치는 클러스터로 대규모 데이터를 효율적으로 관리한다. Node클러스터의 구성 요소로 데이터를 다루는 단일 실행 인스턴스이다.클러스터 내 각 노드들은 다른 노드들과 통신한다. IndexRDB의 테이블과 유사한 개념으로 Document를 모아둔 집합이다.인덱스는 샤드로 분할돼 클러스터 내 여러 노드에 분산 저장해 데이터를 효율적으로 처리한다. 각 샤드에는 레플리카가 설정돼 특정 노드에 장애가 발생했을 때 데이터를 보존하거나 읽기 부하를 분산시킨다.인덱스에 Document를 저장하는 과정을 인덱싱이라고 부른다. Document엘라스틱서치에서 다루는 데이터의 기본 단위로 인덱스에 저장된 JSON 형식의 레코드이다. 도큐먼트는 인덱스에 저장되고, 인덱스는 노..
[Redis] Stream
[Redis] Stream
2024.10.10실시간 데이터 처리, 메세지 큐, 이벤트 스트리밍을 구현할 때 사용된다. Redis Core 내부에 포함되어있어 RediSearch 처럼 별도의 모듈로 설치되지 않아도 사용할 수 있다. Message Producer / Redis / Worker 로 구성된 시스템에서 서는 Redis가 메세지 큐 역할을 수행해 생산자가 생산한 메세지를 큐에 저장하고 소비자가 큐에서 메세지를 가져가 처리할 수 있도록 도와준다. 스트림에 데이터를 추가할 때는 XADD 명령어를 사용한다. 스트림 명과 고유 ID를 지정한 후 key - value 쌍을 입력받는다.고유 ID를 * 로 지정할 경우 Redis는 내부에서 Unix Timestamp 기반 ID를 생성하는데, ID가 겹치는 경우 -0, -1 처럼 옵션이 함께 붙어 ..
[Redis] Module - RediSearch
[Redis] Module - RediSearch
2024.10.06Redis Core는 Redis의 핵심 기능을 담당하는 부분으로 메모리 기반의 키-값 저장소를 의미한다.Redis Modules는 Redis Core의 기본 기능을 확장하기 위해 개발된 모듈 시스템으로, Redis Core가 제공하는 기본 데이터 타입 이외에 다른 특화된 기능을 제공한다. 모듈은 독립적인 C/C++ 기반 프로그램으로 Redis 서버가 시작할 때 해당 모듈을 가져와서 Redis 내부에 포함시키는 방식으로 사용한다. RediSearch : Redis에 검색 기능을 추가해 전체 텍스트 검색, 자동완성, 필터링, 정렬 등을 제공한다.RediSQL : Redis에서 SQL을 사용할 수 있게 해 주는 모듈이다.RedisJson : JSON 데이터를 Redis에서 다룰 수 있게 해 준다. Redis..
[Redis] 동시성 제어
[Redis] 동시성 제어
2024.05.25Redis는 캐시 저장소로 사용되지만.. 일단 "데이터베이스" 이니 일관성, 동시성, 신뢰성을 보장하기 위해 트랜잭션을 지원한다. await isolatedClient.watch(itemsKey(attrs.itemId));return isolatedClient .multi() .rPush(bidHistoryKey(attrs.itemId), serialized) .hSet(itemsKey(item.id), { bids:item.bids + 1, price: attrs.amount, highestBidUserId: attrs.userId }) .zAdd(itemsByPriceKey(), { value: item.id, ..
[Redis] 파이프라인과 자료구조
[Redis] 파이프라인과 자료구조
2024.05.15자바, 파이썬, 자바스크립트 등 백엔드를 구축할 때 사용되는 다양한 프로그래밍 언어와 프레임워크 수준에서 Redis를 사용할 수 있도록 지원하는 라이브러리를 제공한다. 자바는 Jedis 라이브러리로 Redis를 사용하는 직관적인 API를 제공하고, 스프링 프레임워크는 Spring Data Redis 라이브러리를 사용해 스프링에서 Redis를 더 쉽게 다룰 수 있다. 이 라이브러리들은 내부적으로 Redis 명령어를 사용해 Redis 서버와 상호작용하니.. Redis의 명령어 구성을 추상화하고 프로그래밍 언어와 프레임워크의 특성에 맞춘 직관적인 API를 제공한다고 생각하면 된다. const cacheRoutes = [ '/about', '/privacy', '/auth/signin', '/auth/..
[Redis] 캐시 서버와 명령어
[Redis] 캐시 서버와 명령어
2024.04.27Redis는 다른 데이터베이스들과 마찬가지로 데이터를 저장하고 쿼리를 통해 데이터를 가져올 수 있는 데이터베이스지만, Redis의 몇 가지 특징 덕분에 다른 데이터베이스들보다 속도가 빠르다. 기본적으로 많은 DBMS는 데이터를 HDD나 SSD에 저장해 데이터의 영속성을 보장한다.반면 Redis는 데이터를 RAM에 저장해 HDD나 SSD에 데이터를 저장할 때 보다 읽기 및 쓰기 작업을 훨씬 빠르게 수행할 수 있다. 이 외에도 다른 DBMS와는 다르게 Redis는 스키마 대신 key-value 쌍으로 데이터를 저장하고 각 key에 대해 여러 자료구조를 선택해서 사용할 수 있는 등 여러 차별화된 특징을 가지고, 이 특징 덕분에 높은 성능을 보장한다. Redis에서는 문자열인 키..
[Database] Database Engine
[Database] Database Engine
2024.04.17기본적으로 데이터를 컴퓨터의 디스크에 안전하게 저장하는 역할을 수행한다. 트랜잭션 관리 / 캐시 관리 / 동시성 제어 / 복구 관리 등.. 디스크 저장과 관련된 전략을 결정하고, B-Tree / B+Tree 등 데이터를 저장할 때 어떤 자료구조를 사용할 지도 결정한다. 디스크 저장과 관련된 모든 작업을 총괄한다고 생각하면 된다. DBMS의 주요한 차이점 중 하나는 DBMS가 사용하는 데이터베이스 엔진의 구현과 특성이다. PostgreSQL, MySQL, Oracle 등 여러 DBMS는 데이터베이스 엔진이 제공하는 데이터 처리 위에서 사용자와 애플리케이션의 요구사항에 맞춘 다양한 기능을 제공한다. (GUI, Session, 스키마, Query...) MyISAM MySQL 및 MySQL의 fork 버전인 ..
[Database] 동시성 처리
[Database] 동시성 처리
2024.04.13Exclusive Lock은 락을 소유한 트랜잭션만 해당 데이터 항목을 읽거나 쓸 수 있고, 다른 트랜잭션들은 그 데이터 항목에 대해 접근을 차단한다. Shared Lock은 여러 트랜잭션이 동시에 같은 데이터 항목을 읽을 수 있도록 허용하지만 해당 데이터 항목이 읽기 작업 중 변경됨을 방지한다. 보통 트랜잭션의 격리 수준으로 간접적으로 락의 동작 방식을 제어할 수 있고, SELECT ... FOR UPDATE / LOCK IN SHARE MODE 구문을 사용해 쿼리 수준에서 명시적으로 락을 요청할 수도 있다. 예약 사이트를 개발하는 경우 이중 예약이 불가능해야 하니.. SELECT ... FOR UPDATE 구문으로 조회 쿼리에서도 명시적으로 Exclusive Lock을 사용하자. 데이터베이스의 동시성..
[Database] Sharding
[Database] Sharding
2024.04.08파티셔닝은 하나의 데이터베이스 서버에서 논리적이나 물리적으로 데이터를 분할해 데이터를 관리하는 방식이다. 반면 샤딩은 데이터를 여러 데이터베이스 서버에 걸쳐 분산시켜 저장하는 방식으로, 각 샤드는 전체 데이터의 부분집합을 가지고 있어 데이터베이스를 수평적으로 확장할 때 유용하다. 샤딩으로 같은 스키마를 가지는 데이터베이스를 여러 서버에 분산시킨 후 각 데이터베이스 서버에 값이 균등하게 저장되도록 하기 위해 Consistent Hashing 기법을 함께 사용한다. 데이터를 분산시키는 기준을 해시 함수가 정하고 해시 값으로 데이터가 저장될 샤드를 결정한다. const HashRing = require("hashring"); const hr = new HashRing(); app.get("/:urlId", a..
[Database] Partitioning
[Database] Partitioning
2024.04.04파티셔닝은 데이터베이스의 데이터를 논리적 또는 물리적으로 분할해서 관리하는 작업을 의미한다. 대량의 데이터가 저장되어있는 테이블에서 조회 쿼리를 실행시켰을 때 파티셔널으로 검색 성능을 향상시킬 수 있다. 1,000,000 개의 데이터가 들어있는 테이블에서 id가 700,001 인 데이터를 조회한다고 생각해보자. 세부적인 내용은 DBMS 설정에 따라 다르겠지만.. id 컬럼에 인덱스가 있으면 인덱스를 사용해서 데이터를 조회하겠고.. 인덱스가 없으면 Full Table Scan을 수행한다. 인덱스가 있든 없든 파티셔닝을 사용하면 성능 향상에 도움이 된다. 1,000,000 개의 데이터를 저장하고 있는 테이블을 파티셔닝을 통해 5의 파티션으로 분할한다. 각 파티션은 데이터의 특정 범위를 담당하게 되고, 이런 ..