YWS 문서
YWS 콘솔로 이동
스토리지/DB (PostgreSQL · MySQL · Redis)

DB (PostgreSQL · MySQL · Redis)

앱을 만들 때 EC2 안에 DB를 직접 설치하지 않고, 상단 DB 탭에서 바로 만들어 씁니다. 종류는 PostgreSQL, MySQL, Redis. 인터넷에서는 접속할 수 없습니다.

만들기

DB 탭 → 종류 선택 → 이름 입력 → DB 만들기 (영문 소문자로 시작, 소문자·숫자·_ 3~40자, 세 종류 통틀어 전체에서 고유, 한 사람당 5개). 만들자마자 접속 비밀번호를 한 번만 보여줌 — 잃어버리면 "접속 정보"에서 재발급(기존 비밀번호는 바로 무효, 열려 있던 접속도 끊김).

PostgreSQL · MySQL 화면

  • 테이블: 왼쪽에 테이블 목록(PostgreSQL은 스키마별), 고르면 컬럼 구조와 데이터(50행씩). 테이블 삭제, PostgreSQL은 스키마 만들기·삭제도
  • + 새 테이블: 컬럼(이름, 타입, NULL 허용, 기본값, PK)을 폼으로. 기본으로 id(PK, 자동 증가)와 created_at(현재 시각)이 채워져 있음
  • SQL 콘솔: 아무 SQL이나 (여러 문장은 ;, 문장마다 바로 반영). 15초 제한(MySQL은 SELECT에 적용), 결과는 500행까지, Ctrl+Enter로 실행
  • 접속 정보: 주소와 CLI·Python·Node 예제

MySQL은 DB가 곧 스키마라서 스키마 기능이 없습니다. PostgreSQL은 uuid-ossp, pgcrypto가 미리 켜져 있음.

Redis 화면

이 DB의 키는 모두 DB이름:으로 시작해야 합니다 (예: my_cache:user:1). 다른 키는 읽거나 쓸 수 없습니다.

  • 키: 접두어 안에서 패턴 검색(user:* 등), 키를 고르면 타입별 값(문자열·해시·리스트·셋·정렬 셋·스트림, 최대 200개)과 TTL, 키 삭제
  • 명령 콘솔: redis-cli처럼 한 줄에 명령 하나 (최대 50줄)
  • 쓸 수 없는 명령: SCAN, KEYS, RANDOMKEY, SELECT, FLUSHDB/FLUSHALL, CONFIG, CLIENT, ACL 등 관리·위험 명령. Redis는 키 권한과 상관없이 SCAN·KEYS가 서버의 모든 키 이름을 보여주기 때문에, 같은 서버를 쓰는 다른 DB를 보호하려고 막음. 웹의 키 목록은 포털이 대신 DB이름:* 범위로만 조회해서 보여줌. 앱에서 키 목록이 필요하면 SET 등으로 직접 관리
  • 서버 전체 메모리 256MB, 가득 차면 쓰기가 거부됨(자동 삭제 안 함). 데이터는 AOF로 디스크에 저장

앱에서 접속

종류 주소
PostgreSQL postgresql://이름:비밀번호@postgres:5432/이름
MySQL mysql://이름:비밀번호@mysql:3306/이름
Redis redis://이름:비밀번호@redis:6379/0 (사용자 이름도 필요)
  • EC2 (추천): 네트워크 캔버스에 EC2와 DB를 올리고 EC2 → DB로 선을 이으면, 그 EC2만 그 DB 서버에 접속이 열리고 EC2 안에 ~/.yws/databases/이름.env가 생김 — set -a; . ~/.yws/databases/이름.env; set +a 후 CLI나 앱에서 DATABASE_URL
    • PostgreSQL: PGHOST·PGUSER·PGPASSWORD 등 → psql 바로 접속
    • MySQL: MYSQL_HOST·MYSQL_USER·MYSQL_PWD·MYSQL_DATABASE
    • Redis: REDIS_URL, REDISCLI_AUTH, REDIS_KEY_PREFIX → redis-cli -u "$REDIS_URL"
  • Lambda: 연결 없이 세 서버 모두 바로 접속 가능 (편의를 위해 일부러 열어 둠). 코드에서 database_info("이름")으로 접속 정보를 받고, Lambda 상세 화면의 DB 연결 패널에 언어·종류별 전체 예시가 있음 — Lambda의 "DB 연결" 참고

격리와 보안

  • 종류마다 공유 서버 하나에 DB마다 같은 이름의 계정 하나
    • PostgreSQL: 계정이 자기 DB의 주인, 모든 DB에서 PUBLIC 접속 권한 회수 → 다른 DB에는 접속 자체가 안 됨
    • MySQL: 계정에 자기 DB(이름.*) 권한만, 동시 접속 20개
    • Redis: ACL 사용자, 키·채널 이름:*만, 위 명령들 차단
  • 웹 화면의 모든 작업은 그 DB 계정으로 실행 — 관리자 계정은 생성·삭제·비밀번호 재발급에만 씀. 콘솔에 무엇을 입력해도 자기 DB 밖으로는 못 나감 (QA 테스트로 확인: 다른 DB 조회, 계정·DB 생성, 시스템 테이블, Redis의 다른 접두어·SCAN·KEYS·FLUSHALL 등 전부 거부)
  • 계정 비밀번호는 콘솔이 로그인하려고 포털 DB에 암호화해서 보관 (Fernet, 키 DB_CREDENTIAL_KEY)
  • 네트워크: 서버로 들어올 수 있는 건 포털, Lambda, 캔버스에서 이은 EC2뿐 — 인터넷에서는 불가

구조

  • 서버: 네임스페이스 db, StatefulSet postgres(17)·mysql(8.4)·redis(7.4), 모두 jimmy-worker-1 (부하에 따라 메모리가 흔들려서, 예약 여유가 없는 master에는 안 올림), 데이터는 Ceph 블록 볼륨. 매니페스트 k8s/16-database.yaml. Redis 사용자는 볼륨의 ACL 파일에 저장(ACL SAVE)
  • 포털: app/managed_db.py(종류별 분기 + PostgreSQL), app/managed_mysql.py, app/managed_redis.py, app/routers/managed_db.py, 모델 ManagedDatabase(category database 리소스와 1:1, engine 열)
  • 이름 postgres·mysql·redis는 ec2 네임스페이스의 별칭 Service(EC2에 열지 않는 시스템 서비스 — open_to_ec2s = False), 캔버스 연결은 서버마다 정책 하나(network-db-access-<종류>)

사용량

  • DB 탭: 목록 위 내 사용량에 전체 합계와 종류별 합계, 목록과 각 DB 화면 제목 옆에 DB별 사용량
    • PostgreSQL: pg_database_size (테이블·인덱스·시스템 카탈로그 포함)
    • MySQL: 테이블 데이터 + 인덱스 (information_schema.tables)
    • Redis: 키 개수와 메모리 (MEMORY USAGE 합계). 키가 5만 개를 넘으면 거기까지 센 값에 ~, + 표시
  • 한도나 경고는 없음 — 서버 하나를 모두가 같이 쓰므로 관리자가 지켜봄
  • 관리자 → DB (/admin/databases): 서버별 상태(연결, 사용자 DB 수, 데이터 합계, 접속 수, 데이터 볼륨 사용률, Redis 메모리 한도 대비 사용률 — 80% 넘으면 빨간 막대), 사용자별 합계, 전체 DB 사용량 순 목록. 볼륨 사용률은 포털이 서버 파드에서 df를 실행해서 얻음(이 세 파드에만 pods/exec 권한)

아직 없는 것

  • 커넥션 풀러, DB 공유 (자동 백업·복원과 DB별 한도는 안 하기로 함)