Database
[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의 파티션으로 분할한다. 각 파티션은 데이터의 특정 범위를 담당하게 되고, 이런 ..
[Database] B+Tree 자료구조
[Database] B+Tree 자료구조
2024.03.30데이터베이스에서 특정 값을 검색할 때 해당 컬럼에 인덱스가 없는 경우 전체 테이블을 처음부터 끝까지 탐색하는 Full Table Scan을 수행한다. 테이블에 데이터가 많이 저장되어있고 해당 컬럼에 인덱스가 없으면 쿼리 실행 속도가 매우 느리다. 물론 DBMS가 내부적으로테이블을 쪼개서 멀티쓰레딩 및 병렬처리를 수행하겠지만.. 전체 테이블을 탐색하는 작업은 오버헤드가 크다. 효과적인 탐색을 위해 컬럼마다 인덱스를 구축하고 사용한다. 인덱스 구축에 사용되는 내부 자료구조는 B+Tree / 해시 인덱스 / GIN / R-Tree 등 다양한 등 다양하다. 그 중 범용적으로 사용되는 B+Tree에 대해 살펴보자. B-Tree 데이터의 삽입, 삭제, 검색을 효율적으로 수행할 수 있게 설계된 이진 트리의 일종으로 ..
[Database] 내부 저장 구조
[Database] 내부 저장 구조
2024.01.29관계형 데이터베이스에서 테이블을 정의하고 데이터를 저장할 때, 일부 데이터베이스에서는 테이블의 PK와는 별개로 내부적으로 rowid라는 개념을 사용해서 데이터를 저장한다. 사용자가 테이블을 정의할 때 row_id 라는 컬럼을 지정하지 않았지만 데이터베이스가 내부적으로 row_id를 컬럼을 만들고 각 row을 식별할 때 사용한다. 이 rowid는 row의 물리적인 위치를 가리키고, 위치 기반 접근으로 디스크에서 데이터를 더 빠르게 찾고 조작할 수 있다. rowid 개념을 사용하는 데이터베이스는 아래와 같다. SQLite 모든 테이블은 기본적으로 rowid라는 숨겨진 컬럼을 가지고, 이 rowid로 각 행을 식별한다. rowid 기반 쿼리는 매우 빠르게 동작해 대규모 데이터셋에서 유리하다. PostgreSQ..
[Database] ACID
[Database] ACID
2024.01.21트랜잭션은 데이터베이스 작업의 단위로, 여러 쿼리의 집합으로 생각하면 편하다. 가장 쉽게 설명하는 예시로는 계좌이체가 있는데.. 계좌이체 예시와 트랜잭션을 안전하게 처리하는 주요 특성인 ACID에 대해 살펴보자. RDB는 ACID 속성을 엄격하게 준수하고, 락 기반으로 동시성을 제어하지만 NoSQL 기반 데이터베이스는 종류에 따라 ACID 속성을 사용하지 않고 확장성과 성능을 향상시키는 경우도 있다. Atomicity 트랜잭션 안에 있는 모든 쿼리는 모두 성공하거나 실패해야한다는 속성이다. 계좌이체는 출금과 입금으로 이루어지는데.. 출금 쿼리만 성공하고 DB서버가 죽어버리면 DB서버가 다시 시작할 때 트랜잭션을 롤백한다. (clean up) 낙관적 트랜잭션 처리를 사용하는 데이터베이스에서는 트랜잭션이 실..
[MySQL] 인덱스
[MySQL] 인덱스
2023.08.30컴퓨터에서 CPU나 메모리같은 주요 장치는 전자식이지만, 데이터를 저장하는 HDD는 기계식이다. 이런 HDD를 대체하기 위해 전자식 저장 도구인 SSD가 등장했다. SSD는 전자식으로 데이터에 접근해 훨신 빠르고, 플래시 메모리를 장착하고 있어 전원이 공급되지 않아도 데이터가 삭제되지 않는다. MySQL에서 인덱스는 테이블에서 칼럼의 값과 해당 레코드가 저장된 주소를 키 - 값으로 저장하는 자료구조이다. 인덱스는 정렬된 상태로 보관되기에 특정 레코드에 접근할 때 인덱스를 사용하면 빠르게 접근할 수 있다. 데이터베이스 테이블에 대한 참조로 생각하면 된다. B-Tree 인덱스 B-Tree는 데이터베이스의 인덱싱 알고리즘 중 가장 일반적으로 사용되고 가장 먼저 도입된 알고리즘이다. (Balanced Tree)..
[MySQL] 트랜잭션과 락
[MySQL] 트랜잭션과 락
2023.08.28데이터베이스에서 트랜잭션은 하나 이상의 SQL 그룹으로, 그룹 단위로 실행이 성공하거나 실패함을 보장한다. 트랜잭션의 주요 속성으로는 ACID가 있다. Atomicity : 트랜잭션 단위 작업은 모두 완료되거나 모두 실패한다. Consistency : 데이터베이스를 일관성 있는 상태로만 다뤄야 한다. (계좌이체에서 인출됐지만 입금되지 않은 상태가 없어야 함) Isolation : 동시에 실행되는 트랜잭션들끼리는 서로 영향을 주지 않는다 Durability : 트랜잭션이 커밋된 후 해당 내용은 영구적으로 보존되어야 한다. 트랜잭션이 길어질수록 리소스를 많이 사용하게 되니 최소한의 코드에 트랜잭션을 적용하자. 특히 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제하자. 락 (Lock) 은 데이터베이스에서 ..