Database

    Postgresql 외래키 제약조건 없애고 데이터 초기화하는 방법

    Postgresql을 사용할 때 마이그레이션, 리플리케이션 할 때나 테스트시 테이블을 수정하거나 데이터를 초기화할 때 외래키 제약조건때문에 복잡한 경우가 있습니다. MySQL에서는 SET FOREIGN_KEY_CHECKS 를 바꿈으로써 제약조건을 해제할 수 있는데요, -- foreign key 제약 체크(기본값) - 제약조건 체크함 SET FOREIGN_KEY_CHECKS = 1; -- foreign key 제약 미체크 - 제약조건 관계없이 데이터 조작 가능 SET FOREIGN_KEY_CHECKS = 0; Postgresql에서는 session_replication_role 명령어를 이용해서 제약조건을 해제할 수 있습니다. session_replication_role session_replication..

    레디스를 활용한 분산 락(Distrubuted Lock) feat lettuce, redisson

    레디스를 활용한 분산 락(Distrubuted Lock) 분산 락이란(Distributed Lock) 분산 락은 분산 환경에서 여러대의 서버와 여러 DB간의 동시성을 관리하는 데 사용됩니다. 일반적으로 분산환경이 아닌 DB 등과 같은 곳에서는 비관적 락 등을 이용하여 동시성을 제어할 수 있지만, 여러 대의 DB가 존재하는 분산 DB 환경에서는 동시성 문제를 해결할 수 없습니다. 분산 DB에서 비관적 락으로 해결할 수 없는 이유 성능 저하: 분산 환경에서의 비관적 락은 네트워크 지연, 노드 간의 통신 오버헤드 등으로 인해 더 큰 성능 저하를 초래할 수 있다 데드락 문제 네트워크 파티션 문제 두 노드 사이의 네트워크 연결이 끊긴다. 한 노드에서 데이터의 락을 설정했지만, 연결이 끊어진 노드에서는 이 락의 정..

    MySQL Named Lock 사용법 with Spring Boot

    목차 1. MySQL Named Lock 2. 사용법 - Named Lock Functions 2.1. GET_LOCK(lock_name, timeout) - 락 획득 시도 2.2. RELEASE_LOCK(lock_name) - lock_name으로 락 해제 시도 2.3. IS_FREE_LOCK(lock_name) - 락 획득 가능(사용 가능) 여부확인 2.4. IS_USED_LOCK(lock_name) - 락 사용중인지 여부 2.5. 네임드 락 중첩과 해제 2.5.1 네임드락이 관리되는 테이블 - performance_schema의 metadata_locks Table 2.6. 네임드락(Named Lock의) 단점 3. Spring에서의 구현 3.1. JdbcTemplate으로 구현 3.2. Entit..

    MySQL 실행계획(explain) 정리

    MySQL 실행계획 정리 쿼리 튜닝 검토 전, 실행계획(explain)을 보고 실행할 SQL이 DB에서 어떻게 처리될지 파악할 수 있습니다. MySQL 튜닝에서 가장 중요한 것은 쿼리와 스키마 설계인데, 스키마 설계는 한번 진행되면 그 테이블을 사용하는 모든 쿼리에 영향을 주기 때문에 좀처럼 변경하기 힘들지만 쿼리는 해당 쿼리만 수정하면 되므로 상대적으로 변경하기 쉽습니다. Slow Query를 없애고 어플리케이션의 성능을 향상 시키고 싶다면 우선적으로 쿼리의 튜닝을 검토해봐야 합니다. 이때 쿼리 튜닝 검토 전, 실행계획(explain)을 보고 실행할 SQL이 DB에서 어떻게 처리될지 파악할 수 있습니다. EXPLAIN 명령을 사용하면 MySQL 엔진이 쿼리를 어떻게 처리하는지에 대한 정보를 제공하는 쿼..

    MySQL 실행계획(explain) rows, filtered가 제대로 안나오고 1이거나 100.00일때 해결방법

    MySQL에서 쿼리 튜닝에 대해 공부하다가, 쿼리와 실행계획을 확인할 때 rows와 filtered값이 제대로 확인되지 않았습니다. rows는 항상 1 filtered는 항상 100.00 때문에 간단하게 발생한 상황과 정확한 값이 나오도록 해결한 방법에 대해 정리합니다. 상황 30만건의 데이터가 있는 사원 테이블이 존재합니다. mysql> describe 사원; +--------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------+------+-----+---------+-------+ | 사원번호 | int | NO ..

    Redis 캐시 전략

    캐시는 최근 웹 서비스 환경에서 시스템 성능 향상을 위해 가장 중요한 기술입니다. 캐시는 메모리를 사용함으로 디스크 기반 데이터베이스 보다 훨씬 빠르게 데이터를 반환할 수 있고 사용자에게 더 빠르게 서비스를 제공할 수 있음 메모리(RAM)을 사용한 기술로 데이터베이스보다 훨씬 빠르게 데이터를 제공할 수 있지만, 제공되는 물리 RAM의 용량에는 한계가 있기 때문에 모든 데이터를 RAM에 저장할 수는 없습니다. 때문에 다양한 전략들에 대해 알아보고 상황에 알맞게 사용해야 합니다. 또한 캐시를 사용할 때 데이터 정합성을 고려해야 합니다. 데이터 정합성 문제란 일반적으로, 캐시와 데이터베이스 두 곳에서 같은 데이터임에도 불구하고 데이터값이 서로 다른 다른 문제를 말합니다. DB에서 데이터 조회와 작성을 처리하면..

    Redis 자료구조와 트랜잭션

    Redis 자료구조 종류 Strings Lists Sets Hashes Sorted sets Streams Geospatial indexes Bitmaps Bitfields HyperLogLog Keys Redis의 키는 이진 안전(binary safe)하며, 이는 "foo"와 같은 문자열부터 JPEG 파일의 내용까지 모든 이진 시퀀스를 키로 사용할 수 있다는 것을 의미합니다. 빈 문자열도 유효한 키입니다. 바이너리 세이프 하단 뜻은 키 이름으로 어떠한 바이너리를 사용해도 무방하다는 뜻입니다. Redis Key에 대한 규칙 너무 긴 key는 좋지 않습니다. 예를 들어 1024바이트의 키는 메모리 측면에서 뿐만 아니라 데이터 세트에서 키를 조회하려면 비용이 많이 드는 몇 가지 키 비교가 필요할 수 있기 때..

    Redis 야무지게 사용하기

    nhn forward 의 영상인 Redis 야무지게 사용하기를 정리한 글입니다. NHN FORWARD - redis 야무지게 사용하기 다룰 내용 Redis 캐시로 사용하기 Redis 데이터 타입 야무지게 활용하기 Redis에서 데이터를 영구 저장 하려면? (RDB vs AOF) Redis 아키텍처 선택 노하우 (Replication VS Sentinel Vs Cluster) Redis 운영 꿀팁 + 장애 포인트 Redis 캐시로 사용하기 캐시 : 데이터의 원래 소스보다 더 빠르고 효율적으로 액세스할 수 있는 임시 데이터 저장소 캐시가 유용하게 사용되려면? 캐시 접근이 원본 접근보다 쉽고 빨라야 한다 동일한 데이터에 반복 액세스할 시 캐시가 유용하다 Redis s a cache Most poplar sof..

    랜덤액세스(랜덤 I/O)와 인덱스

    쿼리에서 참조되는 컬럼이 인덱스에 모두 포함되는 경우가 아니라면 인덱스 스캔 이후 '테이블 Random 액세스'가 발생합니다. 이는 잦은 블록 I/O를 발생시켜 성능 원인이 될 수 있으며 확인, 추출, 정렬 랜덤 액세스를 없애기 위해 노력해야 합니다. 그중에서 확인 랜덤 액세스를 줄이는 것이 가장 중요합니다. 랜덤액세스? 랜덤 액세스는 데이터를 저장하는 블록을 한 번에 여러 개 액세스 하는 것이 아니라 한 번에 하나의 블록만을 액세스 하는 싱글 블록 I/O 방식입니다. 블록 : hdd나 sdd에 저장되는 물리적인 단위. 일반적으로 몇 KB~ 몇 MB 크기. 반대로 테이블 풀 스캔(Table Full Scan)의 경우에는 한 번에 여러 개의 블록을 액세스 하는 멀티 블록 I/O 방식을 사용합니다. 랜덤 액..

    MySQL 낙관적 락과 데드락(dead lock) With JPA Hibernate

    프로젝트에서 모임 가입 기능을 구현하면서, 동시성 문제와 데드락까지 경험한 내용 그리고 어떻게 해결하였는지 고민과정과 해결방법을 정리하려고 합니다. 프로젝트 버전 SpringBoot 2.7.8 MySQL 8.028 Spring Data Jpa Hibernate 5.6.14 모임 가입 기능? 저희 프로젝트에는 모임과 모임에 가입할 수 있는 기능이 있습니다. 모임 가입에 대한 비즈니스 요구사항은 다음과 같습니다. 모임이 존재하고, 모임에는 인원제한이 있습니다. 인원제한이 다 찬 모임에 참여하려는 경우, 참여가 불가능 합니다. 모임에 여러명이 동시에 요청해도, 요청한 순서대로 모임에 가입되어야 합니다. 모임과 모임 구성원은 1:N 관계이며, 모임 제한 인원은 모임 테이블에 존재합니다. 동시성 문제가 발생할 것..