Database
-
[MySQL] #2 ProxySQL를 통한 DB Read/Write 분리 및 캐싱Database 2026. 4. 11. 21:01
들어가며이전 글에서 MySQL Replication(Source / Replica)을 구성하여 데이터가 복제되는 구조를 확인했습니다.하지만 실제 서비스에서는 Replication를 구성하는 것만으로는 부족합니다.애플리케이션이 직접 다음과 같은 사항을 판단해야 한다면 관리가 어려워집니다.어떤 쿼리를 Source로 보낼지어떤 쿼리를 Replica로 보낼지장애 서버를 어떻게 제외할지DB 연결 수를 어떻게 제어할지이 문제를 해결하는 대표적인 솔루션이 ProxySQL 입니다.ProxySQL은 DB 앞단에 위치하여 SQL을 분석하고, 상황에 따라 적절한 DB 서버로 전달하는 Layer 7 DB Proxy 입니다.ProxySQL 역할ProxySQL은 MySQL 앞단에 위치하는 DB Proxy로서 다음 역할을 수행합니..
-
[MySQL] #1 Replication(Source/Replica) 구축과 동작 원리 이해Database 2026. 4. 11. 21:00
들어가며서비스 규모가 커질수록 데이터베이스는 단일 인스턴스로 감당하기 어려운 한계에 직면하게 됩니다.트래픽 증가로 인한 성능 저하장애 발생 시 서비스 중단백업 및 복구의 어려움이러한 문제를 해결하기 위한 가장 기본적인 접근 방식이 바로 Replication(Source/Replica) 구조입니다.이번 글에서는 MySQL의 Replication을 직접 구성하고, 데이터가 어떤 방식으로 복제되는지 그 동작 원리를 함께 확인해보겠습니다.구조 (Topology)Source / Replica: MySQL Replication은 서비스의 원천 데이터를 보유한 하나의 Source와 이를 실시간으로 복제하는 하나 이상의 Replica로 구성됩니다. 주요 역할Source (Write & Logging)데이터의 변경 작..
-
[MySQL] #0 MySQL HA + ProxySQL + 모니터링 + 자동화 구축기Database 2026. 4. 11. 21:00
시작하며데이터베이스를 다루는 업무에 종사하며, 성능에 대해 자주 고민하게 됩니다.하나의 SELECT 쿼리가 수행되는데 10분이 소요된다고 가정했을 때, 과연 그 10분이 해당 쿼리의 최소 수행 시간인지, 아니면 튜닝을 통해 더 단축할 수 있는지, 혹은 데이터베이스 엔진의 문제(버그)인지 고민하게 됩니다.수많은 트래픽이 몰리는 대규모 서비스에서 쿼리 하나가 1분 늦어지는 차이는 결코 1분으로 끝나지 않습니다.동시다발적인 요청이 서로 얽히기 시작하면 전체 처리 시간이 10분, 나아가 1시간 이상으로 확장되는 이른바 ‘스노우볼 현상’이 발생할 수 있기 때문입니다. 이처럼 데이터베이스 성능은 곧 서비스 품질과 직결되는 핵심 요소이며, 문제를 빠르게 식별하고 정확하게 분석하는 능력이 매우 중요합니다. "측정할 ..
-
[mongodb] MongoDB Docker 설치 및 실습Database 2025. 5. 4. 17:44
docker pull mongodb/mongodb-community-server:latestdocker run --name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latestdocker exec -it mongodb mongoshtest> show dbsadmin 40.00 KiBconfig 60.00 KiBlocal 40.00 KiBtest> use myappswitched to db myappmyapp> db.user.insertMany([... {name:"Tom",age:15},... {name:"Sara",age:28}... ]){ acknowledged: true, insertedIds: { '0': Objec..
-
[mongodb] Python에서 MongoDB 연동, 기초 실습 (pymongo)Database 2025. 5. 4. 17:33
pymongo : Python에서 MongoDB와 연결하고 데이터를 다룰 수 있게 해주는 라이브러리pip install pymongofrom pymongo import MongoClient# MongoDB에 연결 (localhost:27017)client = MongoClient("mongodb://localhost:27017/")#데이터베이스 - testdb = client["test"]#컬렉션(like 테이블) - poeplecollection = db["people"]# data insertcollection.insert_one({"name":"Alice","age":30})# 조회for doc in collection.find(): print(doc) {'_id': ObjectId('681..
-
[Oracle] Predicate Information - Access, FilterDatabase 2024. 7. 13. 15:59
Access : 데이터를 접근하는 방법인덱스를 사용하거나 테이블 전체를 스캔하는 등의 방식으로 데이터를 읽는 작업을 설명합니다.Index Access: 인덱스를 사용하여 데이터를 읽는 방식 ex) Index Scan, Index Range Scan 등Table Access: 테이블에서 데이터를 직접 읽는 방식 ex) Full Table Scan, Index Lookup 등Filter : 이미 접근된 데이터에 대해 추가적인 조건을 적용하여 데이터를 필터링하는 작업 where절에서 지정된 조건이나 조인 조건 등을 적용하는 과정을 포함합니다. ex) t1_n1 인덱스를 이용하여 INDEX RANGE SCAN 으로 접근 (access) where 절의 C2='dummy'로 필터링한다 (filter) drop t..
-
[Oracle] Optimizer 관련 parameterDatabase 2024. 7. 13. 14:44
Optimizer 관련 parameter는 v$sys_optimizer_env 에서 알 수 있다.SQL> col NAME for a50SQL> col VALUE for a10SQL> col DEFAULT_VALUE for a10SQL> select NAME,VALUE,DEFAULT_VALUE from v$sys_optimizer_env;NAME VALUE DEFAULT_VA-------------------------------------------------- ---------- ----------parallel_execution_enabled false falseoptimizer_features_enable 23.1.0 23.1.0cpu_cou..
-
[Oracle] unnest, no_unnestDatabase 2024. 4. 9. 00:43
unnest : 서브쿼리를 unnesting 함으로써 join방식으로 최적화하도록 유도 no_unnest : 서브쿼리를 그대로 둔 상태에서 필터 방식으로처리 drop table t1; drop table t2; create table t1(c1 number, c2 number); create table t2(c1 number, c2 number); insert into t1 select level, level from dual connect by level