스토리지/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"
- PostgreSQL:
- Lambda: 연결 없이 세 서버 모두 바로 접속 가능 (편의를 위해 일부러 열어 둠). 코드에서
database_info("이름")으로 접속 정보를 받고, Lambda 상세 화면의 DB 연결 패널에 언어·종류별 전체 예시가 있음 — Lambda의 "DB 연결" 참고
격리와 보안
- 종류마다 공유 서버 하나에 DB마다 같은 이름의 계정 하나
- PostgreSQL: 계정이 자기 DB의 주인, 모든 DB에서
PUBLIC접속 권한 회수 → 다른 DB에는 접속 자체가 안 됨 - MySQL: 계정에 자기 DB(
이름.*) 권한만, 동시 접속 20개 - Redis: ACL 사용자, 키·채널
이름:*만, 위 명령들 차단
- PostgreSQL: 계정이 자기 DB의 주인, 모든 DB에서
- 웹 화면의 모든 작업은 그 DB 계정으로 실행 — 관리자 계정은 생성·삭제·비밀번호 재발급에만 씀. 콘솔에 무엇을 입력해도 자기 DB 밖으로는 못 나감 (QA 테스트로 확인: 다른 DB 조회, 계정·DB 생성, 시스템 테이블, Redis의 다른 접두어·SCAN·KEYS·FLUSHALL 등 전부 거부)
- 계정 비밀번호는 콘솔이 로그인하려고 포털 DB에 암호화해서 보관 (Fernet, 키
DB_CREDENTIAL_KEY) - 네트워크: 서버로 들어올 수 있는 건 포털, Lambda, 캔버스에서 이은 EC2뿐 — 인터넷에서는 불가
구조
- 서버: 네임스페이스
db, StatefulSetpostgres(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(categorydatabase리소스와 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만 개를 넘으면 거기까지 센 값에~,+표시
- PostgreSQL:
- 한도나 경고는 없음 — 서버 하나를 모두가 같이 쓰므로 관리자가 지켜봄
- 관리자 → DB (
/admin/databases): 서버별 상태(연결, 사용자 DB 수, 데이터 합계, 접속 수, 데이터 볼륨 사용률, Redis 메모리 한도 대비 사용률 — 80% 넘으면 빨간 막대), 사용자별 합계, 전체 DB 사용량 순 목록. 볼륨 사용률은 포털이 서버 파드에서df를 실행해서 얻음(이 세 파드에만pods/exec권한)
아직 없는 것
- 커넥션 풀러, DB 공유 (자동 백업·복원과 DB별 한도는 안 하기로 함)