202000981 김지섭
코드리뷰 및 수행 영상:
Redis 와 같이 저지연 In-Memory Key-Value 데이터베이스 시스템을 구축하고자 합니다. Write 에 대해서는 Append Only 파일 시스템에 먼저 작성되고, 메모리에 적용하는 방식인 write ahead log 시스템을 적용할 것이며, read 에 대해서는 memory 에서 빠르게 읽어오게 됩니다. 프로그램 시작 시 .wal
파일을 지정해주어, 트랜잭션을 기록할 대상을 지정할 수 있으며, 프로그램이 다시 시작되면, wal 을 replay 해서 메모리 상태를 다시 복구하게 됩니다.
이 프로젝트는 간단한 데이터베이스 시스템을 구축하는 것입니다. 시스템은 모든 트랜잭션을 디스크에 로그로 기록하고, 시스템이 시작될 때 이 로그를 메모리에 재구성하는 기능을 포함합니다. 디스크 파일은 append-only 모드로 작성됩니다. 이 시스템은 두 개의 내부 프로세스로 구성됩니다: 하나는 파일 입출력과 트랜잭션을 처리하는 코어 프로세스, 다른 하나는 사용자와 상호작용하는 프론트엔드 프로세스입니다.
- 파일 입출력: wal 파일 read / append
- 시스템/파일 정보: wal 파일 크기 확인을 위해 stat 명령어 사용
- 프로세스 생성/exec 함수군: 코어 프로세스 생성을 위해 사용
- IPC/시스템 V 통신: 프론트엔드와 코어 프로세스간 통신을 위해 사용
평가기준 관련하여 코드를 찾으실 때에 !평가기준
을 검색하시면 됩니다.
-
코어 프로세스
- 트랜잭션을 처리하고 디스크에 로그를 기록하는 역할.
- 트랜잭션 로그 파일을 관리하고, 시스템 시작 시 로그 파일을 재생하여 메모리에 데이터베이스 상태를 재구성.
-
프론트엔드 프로세스
- 사용자로부터 트랜잭션을 입력받아 코어 프로세스에 전달하는 역할.
- 코어 프로세스로부터 응답을 받아 사용자에게 출력.
명령줄 | 설명 | 구분 (Command or Query) |
---|---|---|
SET <key> <value> |
key 에 value 를 저장 |
Command |
GET <key> |
key 에 저장된 va 가져오기 |
Query |
DEL <key> |
key 삭제 |
Command |
EXIST <key> |
key 가 존재하는지 확인 (T | F ) |
Query |
FLUSHALL |
모든 key 제거 | Command |
wal 은 command 에 대해서만 작성됩니다.
-
시스템 시작
- 코어 프로세스가 시작되면, 로그 파일을 열고 모든 트랜잭션을 메모리에 재생하여 데이터베이스 상태를 재구성.
- 프론트엔드 프로세스가 시작되면, 사용자로부터 트랜잭션을 입력받을 준비를 함.
-
트랜잭션 처리
- 프론트엔드 프로세스는 사용자로부터 트랜잭션을 입력받아 파이프를 통해 코어 프로세스에 전달.
- 코어 프로세스는 트랜잭션을 처리하고 그 결과를 로그 파일에 기록.
- 코어 프로세스는 처리 결과를 프론트엔드 프로세스에 전달하여 사용자에게 출력.
-
시스템 종료 및 재시작
- 시스템 종료 시, 모든 로그 파일을 유지.
- 시스템 재시작 시, 로그 파일을 읽어 모든 트랜잭션을 메모리에 재생하여 데이터베이스 상태를 복원.
프로그램을 컴파일하고 실행하려면 아래 명령어를 사용합니다.
make
./memwaldb --disk-io-latency <ms> <db.wal>
이 시스템은 트랜잭션 로그를 WAL 파일에 기록하고, 프로그램 재시작 시 로그를 재생하여 메모리 상태를 복구합니다. 사용자 입력을 통해 트랜잭션을 처리하고 결과를 반환합니다.