전체 글 158

Redis, Valkey 리더 엔드포인트로 secondary로 부하 나누기

[ 배경: Redis Read Replica 분산을 통한 부하 분산 시도 ]앞서서 Redis 장애 리포트에 기재했지만... Redis 장애로 인해 회사 서버에 장애가 발생했었다.근본적으로 호출량이 늘었던 것이 원인이 되었지만, 더 큰 문제는 Primary에서... Read, Write가 모두 일어나고 있었다는 것..참고로 클러스터모드 : 비활성화 상태입니다. 이에 Redis 부하를 Secondary로 나누기 작업을 진행한다. ( 호스트 확인을 위한 이미지 ) 1. 기술적으로 이해해야 할 점: Reader Endpoint란?공식 문서를 보면 위 내용으로 적혀있지만, 더 중요한 부분은 아래와 같다. 즉 엔드포인트는 DNS 레코드로 Secondary Node의 주소로 라운드 로빈을 해주는거지, 자체적으로 내용..

트러블슈팅 2025.07.25

Redis OSS -> Valkey로 이전 과정

1. Valkey란?Redis가 8.0 버전부터 상용 라이선스로 전환되면서, 무료 오픈소스가 아니게 되었다.이에 따라서 무료버전인 7.24 version Redis를 포크따서 Amazon 등등에서 협력해서 만든 것이 Valkey이다.심지어 동일한 인메모리DB 구조이지만, Redis는 디스크 백업이나 복구를 포함한 ( 범용 인메모리 + 디스크 백업 지원형 DB ) 이고,Valkey는 순수 인메모리 기반이기에 성능이 극대화 되었다.2. Valkey의 호환성과 전환 용이성Valkey는 Redis 7.2.4 버전을 포크하여 만들어졌기 때문에, 기존 Redis OSS에서 사용하던 대부분의 기능을 그대로 지원합니다.덕분에 별도의 코드 수정 없이 엔진만 교체하는 방식으로 쉽게 변경할 수 있었습니다.- 무조건 개발 환..

카테고리 없음 2025.07.25

회사 서버 장애 대처 리포트 (2) - 미들웨어 Init 과정

📌 배경현재 회사에서는 fastify 프레임워크를 기반으로 하되,사내 MSA 구조인 서버 전반에서 공통 기능을 모듈화하기 위해 자체 패키지인 fastify-xingxing을 사용 중입니다.fastify-xingxing은 내부적으로 Fastify 인스턴스를 초기화한 후,공통 미들웨어 (Kafka 통신, Logger, 모니터링 등)를 플러그인 형태로 등록(register) 하고,MSA 구조 내 다른 서버들이 이를 import하여 사용합니다.이 구조에서 MongoDB의 환경 전환 이후 Init과정이 문제가 됨.⚠️ 문제 요약6월 23일, MongoDB를 Atlas → EC2 온프레미스 환경으로 전환fastify-xingxing에서 Fastify 인스턴스를 초기화할 때,미들웨어 등록(register)이 비동기..

트러블슈팅 2025.07.16

회사 서버 장애 대처 리포트 (1) - REDIS 네트워크 초과

회사에서는 정적인 데이터를 빠르게 불러오기 위해 Redis를 캐시 서버로 사용하고 있었습니다. 구조는 다음과 같았습니다:정적 DB 데이터 업데이트 시 → Redis 갱신 -> API에서 Redis 사용하는 API 호출 -> Redis 캐시 확인 → 존재 시 Redis 응답 사용 06.27 장애 발생의 배경15:00 – 안드로이드 앱 운영 배포배포 이후 안드로이드 앱에서 Redis API 호출량이 폭증이에 따라 Redis의 네트워크 출력량(NetworkMaxBytesOut) 및 초과 사용량(NetworkBandwidthOutAllowanceExceeded) 지표가 비정상적으로 증가 Redis 인스턴스 스펙 문제Redis 인스턴스 사양: t3.small (스펙 확인 주소)T3 시리즈 특성상 BaseLin..

트러블슈팅 2025.07.16

회사 서버 장애 대처 리포트 (0)

📌 장애 요약 타임라인📌 장애 요약 타임라인🔹 06.23 (사전 작업)사내 DB 비용 절감을 위해 MongoDB Atlas → EC2 자체 운영 환경으로 이전MongoDB 연결 방식 및 init() 흐름 변경→ 배포 직후에는 별다른 이상 징후 없음🔹 06.27 (1차 장애)15:00안드로이드 앱 운영 배포→ Redis를 자주 참조하는 API 호출이 급증하는 구조로 변경하여 배포21:56 ~ 익일 04:00 (6시간 4분)1차 장애 발생Redis 부하 증가 → 서버 CPU 사용량 급등ECS 태스크 다운 발생Mongo 연결 방식 변경으로 인해 Fastify 인스턴스 재부팅 실패서버 재시작 루프 발생 → AWS Parameter Store 호출 과다🔹 06.28 (2차 장애)16:46 ~ 익일 00:..

트러블슈팅 2025.07.16

Django - PostgreSQL 연동하기, VScode에서 Psql 사용하기

자!! 이번에 Django에 postgreSQL을 연동하기 위하여 여기까지 달려왔다!! 지난시간에 PostgreSQL에 유저와 DB까지 생성해 놓았다는 가정하에 적도록 하겠다. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'test_db', 'USER': 'test_user', 'PASSWORD': 'test_user', 'HOST': localhost, 'PORT': '', } } Name에는 내가 생성해둔 Database의 이름을, User에는 내가 사용할 User의 이름을, Password에는 내가 사용할 User의 비밀번호를 입력하여준다. 여기서는 직접 값을 입력해주었지만!!! 꼭 .env에 관리하도록 ..

카테고리 없음 2022.10.22

PostgreSQL 유저생성 및 권한 설정해주기

저번시간에 PostgreSQL을 이용하여서 DataBase를 만드는 방법을 알아보았다. 이번에는 PostgreSQL에서 유저의 권한 설정을 하여 알아보겠다!!! Psql 새로운 유저 만들기 create user ${username} with password '${password}'; # 데이터베이스에 새로운 유저를 만들어주는데, passwrod는 ''로 감싸준다. alter role ${username} set client_encoding to 'utf-8'; alter role ${username} set timezone to 'Asia/Seoul'; grant all privileges on database ${데이터베이스 이름} to ${username}; 저번시간에 이어서 DB에 접속한 후부터 이..

카테고리 없음 2022.10.22

PostgreSQL DB 생성, 접속하기

PostgreSQL을 사용하기 위해서는 처음에 PSQL(shell)을 요구로한다. 우선 PSQL에서 우리가 사용할 DataBase를 만들어 주기로 하자!! 우선 PSQL에 접속을 해주길 바란다. 성공적으로 접속이 되었다면!! 이렇게 기본 상태가 될 것이다. 1. DataBase 생성하기 CREATE DATABASE ${데이터베이스 이름} ; 성공적으로 실행이 되었다면, CREATE DATABASE라는 문구가 뜬다. (PSQL은 소문자로 입력을 해도 먹어요 ^^) 2. 생성한 DataBase의 목록을 보고 접속하기 \l # 데이터베이스 목록을 보기 \c ${데이터베이스 이름} # 데이터베이스에 접속하기 기본적으로 PSQL문은 '\'로 시작한다고 익혀두면 좋다고 생각한다. \l 명령어를 통해 현재 내가 가지..

카테고리 없음 2022.10.22

Django - seed를 이용한 더미데이터 생성하기

많은 양의 데이터를 다루기 위해서는 많은 유저들이 있으면 좋다! 오늘은 Django에서 사용이 가능한, 더미데이터 생성을 알아보도록 하자! from faker import Faker from django.core.management.base import BaseCommand from django_seed import Seed from user.models import User class Command(BaseCommand): def add_arguments(self, parser) -> None: parser.add_argument( "--total", default=1000, type=int, ) def handle(self, *args, **options) -> None: total = options..

카테고리 없음 2022.10.22